Skip to main content
Glama
t4dhg

@t4dhg/mcp-holded

MCP Holded

Model Context Protocol server for Holded, on the v2 API

License: MIT CI codecov TypeScript Node.js npm version npm downloads MCP Compatible

A community project. Not affiliated with, endorsed by, or supported by Holded. "Holded" and the Holded logo are trademarks of their owner, used here to identify the API this server speaks to.

An MCP server for the Holded API v2: contacts, sales and purchase documents, payments, treasury, accounting, catalog, team, CRM, projects, calendar, inbox and webhooks. Thirteen hierarchical tools with an action parameter, Zod validation of every request and response, retries on reads, and a confirmation gate on every destructive operation.

Holded deprecated its classic API (/api/invoicing/v1, key header). New keys use the format pat_<id>_<secret> and only authenticate against v2 (https://api.holded.com/api/v2, Authorization: Bearer). This server speaks v2 only.

Why this one

  • v2 only, which is the API that still works. Holded deprecated the classic API (/api/invoicing/v1, key header). New tokens are pat_<id>_<secret> and authenticate only against v2. This server speaks v2 and nothing else.

  • Thirteen hierarchical tools with an action parameter, not one tool per endpoint, so the tool list stays small in a model's context while covering contacts, sales, purchases, payments, treasury, accounting, catalog, team, CRM, projects, calendar, inbox and webhooks.

  • Seven MCP resources and six MCP prompts. The resources carry the account's own tax keys, numbering series, payment methods and chart of accounts, plus the API behaviour a schema cannot express. The prompts run the real workflows: aged receivables, VAT summary, bank reconciliation, statements, month-end close.

  • A confirmation gate on every destructive operation, with a structural test that keeps the documented list equal to the code. Nothing that deletes, overwrites, approves or emails goes through without confirm: true.

  • Zod validation of every request and every response. A shape the server has not seen surfaces as a clear schema error rather than a silent success.

  • Over 200 tests against anonymised real v2 responses, npm provenance via trusted publishing, and Node 18 or later.

Related MCP server: MCP Holded

How it compares

Four MCP servers for Holded exist on npm. This compares the published code of each, not their descriptions, as at 2026-09-08: @t4dhg/mcp-holded 2.1.1, @nubiia/mcp-holded 2.0.2, @energio/holded-mcp 1.5.1 and holded-mcp 1.0.0. It is a snapshot and will age; check the current versions yourself before relying on it.

@t4dhg/mcp-holded

@nubiia/mcp-holded

@energio/holded-mcp

holded-mcp

API version

v2

v2

v1 (deprecated)

v1 (deprecated)

Auth

Bearer pat_

Bearer pat_

key header

key header

Domains covered

13

18 tool-module files (no calendar, bookings, inbox, webhooks or CRM)

5 API sections (accounting, CRM, invoicing, projects, team)

5 API sections (accounting, CRM, invoicing, projects, team)

Tool shape

13 hierarchical, action parameter (15 tools total)

119 flat tools, one per operation

139 flat tools, one per operation

136 flat tools, one per operation

MCP resources

7

0

0

0

MCP prompts

6

0

0

0

Destructive operations gated

Every one, structurally tested

No confirmation gate; destructiveHint annotation and per-tool rate limits only

No confirmation gate; destructiveHint annotation only

No confirmation gate; destructiveHint annotation only

Response validation

Zod, requests and responses

Zod, requests only

Zod, requests only

Zod, requests only

Minimum Node

18

22.14

20

18

Tests

234

389, across 23 files, shipped in the package and passing

None shipped

None shipped

npm provenance

Yes

Yes

No

No

Licence

MIT

MIT

MIT

MIT

Last publish

2026-09-08

2026-07-07

2026-07-01

2026-02-25

Where this differs most: the v1 servers are on an API Holded has deprecated, and new pat_ tokens do not authenticate against it at all, so they cannot work with a newly issued key. Against @nubiia/mcp-holded, which is current, the differences are breadth (this server covers calendar and bookings, inbox, webhooks, and CRM leads and funnels, none of which appear in nubiia's tool list), the resource and prompt surface, the hierarchical tool shape, and a gated raw-request escape hatch. Nubiia's own Node floor is 22.14, genuinely higher than the 18 this server and holded-mcp both support.

Quick start

Install nothing. Every client below runs the server through npx. Create the token in Holded under Settings, Developers, API and use the full pat_..._... value.

Claude Desktop

Edit ~/Library/Application Support/Claude/claude_desktop_config.json on macOS, or %APPDATA%\Claude\claude_desktop_config.json on Windows:

{
  "mcpServers": {
    "holded": {
      "command": "npx",
      "args": ["-y", "@t4dhg/mcp-holded"],
      "env": { "HOLDED_API_KEY": "pat_xxxxxxxx_xxxxxxxx" }
    }
  }
}

Claude Code

claude mcp add holded --env HOLDED_API_KEY=pat_xxxxxxxx_xxxxxxxx -- npx -y @t4dhg/mcp-holded

Cursor

Edit ~/.cursor/mcp.json for every project, or .cursor/mcp.json for one:

{
  "mcpServers": {
    "holded": {
      "command": "npx",
      "args": ["-y", "@t4dhg/mcp-holded"],
      "env": { "HOLDED_API_KEY": "pat_xxxxxxxx_xxxxxxxx" }
    }
  }
}

VS Code

Edit .vscode/mcp.json. Note the key is servers, not mcpServers:

{
  "servers": {
    "holded": {
      "command": "npx",
      "args": ["-y", "@t4dhg/mcp-holded"],
      "env": { "HOLDED_API_KEY": "pat_xxxxxxxx_xxxxxxxx" }
    }
  }
}

Requires Node.js 18 or later.

Environment variables

Variable

Required

Default

Purpose

HOLDED_API_KEY

yes

none

v2 Personal Access Token. A v1 key is rejected at startup.

HOLDED_BASE_URL

no

https://api.holded.com/api/v2

Override the API base, for testing.

HOLDED_TIMEOUT_MS

no

30000

Per-request timeout.

HOLDED_MAX_RETRIES

no

3

Attempts for GET requests. Writes are never retried.

DEBUG

no

false

Log requests to stderr.

What people use it for

Chasing unpaid invoices. Run the holded_aged_receivables prompt. You get every outstanding invoice bucketed by how late it is and grouped by customer, worst first, counting only the unpaid remainder of part-paid invoices. Then ask for a statement for the worst offender with holded_contact_statement, in a form you can send them.

Reconciling a bank month. Run holded_bank_reconciliation for the period. It matches bank movements against recorded payments on amount and date, then shows you the two lists that matter: movements with no payment recorded, and payments the bank has not shown. Reconciling stays behind a confirmation, so nothing is matched in your books until you approve it.

Preparing the quarterly VAT figures. Run holded_vat_summary. It groups sales and purchases by tax key for the quarter and gives base and quota for each, which is the shape Modelo 303 wants. It is a working aid, not a filing, and it says so.

Closing a month. Run holded_month_end_close. It tells you what is still in draft, what is past due, and what is sitting in the inbox, each with the exact call that clears it.

Tools

Every tool takes an action. List actions accept limit (1 to 200) and cursor; the response says how to continue. Create and update actions take the payload in data, following the Holded v2 request contract, and return the record re-read from the API. Gated actions take confirm: true.

Tool

Actions

holded_discover

Lists the domains below.

holded_contacts

list (exact filters email, code, phone, mobile, custom_id), search (substring on name), get, create, update, delete, bulk_archive, bulk_delete, list_attachments, attach (file_path), portal_link, list_groups, get_group, create_group, update_group, delete_group

holded_sales

type in invoice, credit_note, estimate, proforma, sales_receipt, sales_order, waybill, receipt_note, recurring_invoice. list (contact_id, status, start_date, end_date, due_date_start, due_date_end, sort, approval_status), get, find_by_number, pdf (output_path), list_attachments, attach, schedule, create, update, delete, approve, cancel, send, set_pipeline, record_payment, convert, accept, reject, skip, bulk_approve, bulk_cancel, bulk_delete

holded_purchases

type in purchase, purchase_refund, purchase_order, purchase_shipment. list (same filters), get, pdf, list_attachments, attach, received_items, create, update, delete, approve, send, set_pipeline, record_payment, receive

holded_payments

list (start_date, end_date, banking_account_id, document_id), get, create, update, delete, list_methods, get_method

holded_treasury

list_accounts (type, archived), get_account, create_account, update_account, archive_account, delete_account, list_movements (start_date, end_date), list_cash_movements, create_movements, reconcile (movement_id), list_remittances, get_remittance, list_forecasts, get_forecast, create_forecast, update_forecast, delete_forecast

holded_accounting

list_accounts (start_date and end_date add debit, credit and balance; include_empty), create_account, list_ledger (start_date and end_date required, account), create_ledger_entry, list_taxes, tax_keys, list_expenses_accounts, get_expenses_account, create_expenses_account, update_expenses_account, delete_expenses_account, list_sales_channels, get_sales_channel, create_sales_channel, update_sales_channel, delete_sales_channel, list_numbering_series (series_type), create_numbering_series, update_numbering_series, delete_numbering_series, list_tags, create_tag, delete_tag

holded_catalog

list_products (name), get_product, product_stock, create_product, update_product, update_stock, delete_product, list_services, get_service, create_service, update_service, delete_service, list_warehouses, get_warehouse, warehouse_stock, create_warehouse, update_warehouse, delete_warehouse, list_price_lists, get_price_list, create_price_list, update_price_list, delete_price_list, list_production_orders, get_production_order, create_production_order, update_production_order, delete_production_order

holded_team

list_employees (search), get_employee, employee_contract, create_employee, list_times, list_salary_records (employee_id, start_date, end_date), get_salary_record, salary_record_pdf, list_payslips, get_payslip, payslip_pdf, create_payslip_payment, delete_payslip_payment

holded_crm

list_funnels, get_funnel, create_funnel, update_funnel, delete_funnel, list_leads, get_lead, create_lead, update_lead, delete_lead, move_stage, update_dates, add_note, update_note, add_task, update_task, delete_task

holded_projects

list_projects (status), get_project, project_summary, create_project, update_project, delete_project, list_tasks, get_task, create_task, update_task, delete_task, list_times, get_time, create_time, update_time, delete_time

holded_calendar

list_events, get_event, create_event, update_event, delete_event, list_bookings, get_booking, create_booking, update_booking, cancel_booking, list_locations, slots

holded_inbox

list (status, start_date, end_date, user_id), get, upload (file_path), download (filename, output_path), update, attach, delete

holded_webhooks

list, get, events, create, update, enable, disable, delete, usage

holded_request

Any v2 endpoint: method, path, query, body. See below.

Example

{
  "action": "list",
  "type": "invoice",
  "status": "pending",
  "start_date": "2026-01-01",
  "sort": "-date",
  "limit": 50
}
{
  "action": "create",
  "type": "invoice",
  "data": {
    "contact_id": "5ff44eb88ec0b10f326e3213",
    "date": "2026-09-06",
    "items": [{ "name": "Licence", "units": 1, "price": 1000, "taxes": ["s_iva_21"] }]
  }
}

Resources

Seven MCP resources give a model the context it needs before it can make a correct call. Attach them in your client, or read them by URI.

URI

What it holds

holded://guide/api-behaviour

Verified v2 behaviour: Bearer auth and the 403-not-401 quirk, cursor pagination, the two decimal conventions, DD/MM/YYYY ledger dates, RFC 7807 errors, silently ignored query parameters, the 100 request per minute limit, and why writes are never retried.

holded://guide/document-types

The nine sales and four purchase types with their Spanish names, and which verbs each supports. Recurring invoices, purchase refunds and estimates each lack verbs the others have.

holded://guide/irreversible-operations

Every gated operation with its risk and effect, generated from the policy table so it cannot drift, plus why approving a sales document is irreversible under Verifactu.

holded://reference/taxes

The account's tax keys, names and percentages. A document line needs the key verbatim, for example s_iva_21.

holded://reference/numbering-series

The numbering series configured for each document type, with their formats and last-used numbers.

holded://reference/payment-methods

Payment method ids, needed by record_payment and by a document's payment_method_id.

holded://reference/accounting-accounts

The chart of accounts, needed for ledger entries. Spanish PGC numbering, which cannot be guessed.

The three guides are static. The four references read the account's own configuration and are cached for fifteen minutes, because clients re-read resources at the start of every conversation. A reference whose read fails returns an explanation and the tool to fall back to; it never throws.

Prompts

Six MCP prompts run the workflows this server exists for. Each one pre-reads the facts and hands back a report plus the exact tool calls to act on it. None of them writes. Where a change is needed, the prompt emits the gated call for you to approve.

Prompt

Arguments

What it does

holded_aged_receivables

as_of, contact_id

Outstanding sales invoices bucketed by days overdue and grouped by contact, worst first. Counts the unpaid remainder, not the document total.

holded_vat_summary

start_date, end_date

Output and input VAT by tax key for a period, with base and quota. A working aid for preparing Modelo 303, not a filing and not tax advice. Defaults to the previous calendar quarter.

holded_bank_reconciliation

start_date, end_date, account_id

Proposes matches between bank movements and recorded payments, then lists what is unmatched on both sides. Defaults to the previous month.

holded_contact_statement

contact_id or name

Invoiced, paid and outstanding for one contact, document by document, with the oldest unpaid item called out. When the API omits a document's pending figure, derives it as total less paid and discloses which rows were derived.

holded_month_end_close

start_date, end_date

What is still open at the end of a period: documents in draft, invoices past due, inbox documents, each with the call that resolves it.

holded_draft_invoice

contact, description, date

Resolves the contact, offers only the tax keys usable on a sales document, and assembles a create payload for you to review. Creates nothing, and never approves.

Safety

Operations that require confirmation

These actions delete, overwrite, lock or email something. Without confirm: true the tool sends nothing and explains what would happen; the same call with confirm: true proceeds. A structural test keeps this list equal to the gated actions in the code.

  • holded_contacts({ action: 'update' }), holded_contacts({ action: 'delete' }), holded_contacts({ action: 'bulk_archive' }), holded_contacts({ action: 'bulk_delete' }), holded_contacts({ action: 'update_group' }), holded_contacts({ action: 'delete_group' })

  • holded_sales({ action: 'update' }), holded_sales({ action: 'delete' }), holded_sales({ action: 'approve' }) (assigns the legal number; irreversible under Verifactu), holded_sales({ action: 'cancel' }), holded_sales({ action: 'send' }) (emails the customer), holded_sales({ action: 'set_pipeline' }), holded_sales({ action: 'skip' }), holded_sales({ action: 'bulk_approve' }), holded_sales({ action: 'bulk_cancel' }), holded_sales({ action: 'bulk_delete' })

  • holded_purchases({ action: 'update' }), holded_purchases({ action: 'delete' }), holded_purchases({ action: 'approve' }), holded_purchases({ action: 'send' }), holded_purchases({ action: 'set_pipeline' })

  • holded_payments({ action: 'update' }), holded_payments({ action: 'delete' })

  • holded_treasury({ action: 'update_account' }), holded_treasury({ action: 'archive_account' }), holded_treasury({ action: 'delete_account' }), holded_treasury({ action: 'reconcile' }), holded_treasury({ action: 'update_forecast' }), holded_treasury({ action: 'delete_forecast' })

  • holded_accounting({ action: 'update_expenses_account' }), holded_accounting({ action: 'delete_expenses_account' }), holded_accounting({ action: 'update_sales_channel' }), holded_accounting({ action: 'delete_sales_channel' }), holded_accounting({ action: 'update_numbering_series' }), holded_accounting({ action: 'delete_numbering_series' }), holded_accounting({ action: 'delete_tag' })

  • holded_catalog({ action: 'update_product' }), holded_catalog({ action: 'update_stock' }), holded_catalog({ action: 'delete_product' }), holded_catalog({ action: 'update_service' }), holded_catalog({ action: 'delete_service' }), holded_catalog({ action: 'update_warehouse' }), holded_catalog({ action: 'delete_warehouse' }), holded_catalog({ action: 'update_price_list' }), holded_catalog({ action: 'delete_price_list' }), holded_catalog({ action: 'update_production_order' }), holded_catalog({ action: 'delete_production_order' })

  • holded_team({ action: 'delete_payslip_payment' })

  • holded_crm({ action: 'update_funnel' }), holded_crm({ action: 'delete_funnel' }), holded_crm({ action: 'update_lead' }), holded_crm({ action: 'delete_lead' }), holded_crm({ action: 'move_stage' }), holded_crm({ action: 'update_dates' }), holded_crm({ action: 'update_note' }), holded_crm({ action: 'update_task' }), holded_crm({ action: 'delete_task' })

  • holded_projects({ action: 'update_project' }), holded_projects({ action: 'delete_project' }), holded_projects({ action: 'update_task' }), holded_projects({ action: 'delete_task' }), holded_projects({ action: 'update_time' }), holded_projects({ action: 'delete_time' })

  • holded_calendar({ action: 'update_event' }), holded_calendar({ action: 'delete_event' }), holded_calendar({ action: 'update_booking' }), holded_calendar({ action: 'cancel_booking' })

  • holded_inbox({ action: 'update' }), holded_inbox({ action: 'attach' }), holded_inbox({ action: 'delete' })

  • holded_webhooks({ action: 'update' }), holded_webhooks({ action: 'disable' }), holded_webhooks({ action: 'delete' })

Creates are not gated, including record_payment, create_movements and create_ledger_entry: they add records that can be deleted afterwards. The gate reduces accidents; it is not an authorization boundary, and the token grants whatever Holded grants it.

The raw request tool

holded_request reaches every v2 endpoint with correct Bearer auth and returns the response unvalidated. DELETE, PUT and PATCH require confirm: true, and so does a POST to any path containing bulk, cancel, archive, approve, send, reconcile, ship, skip, clock-in or clock-out, because Holded hides destructive operations behind those. The refused call returns the exact method, URL and body it would have sent.

How the API really behaves

Everything below was verified against live v2 responses on 2026-09-06 and is what the schemas are built from.

  • Pagination is cursor based. Lists return { items, cursor, has_more }; cursor is the last item id and goes back as ?cursor=. limit defaults to 50 and is capped at 200; page and offset are ignored. Configuration lists (taxes, tags, warehouses, accounting accounts, expenses accounts, sales channels, numbering series, price lists, booking locations) return { items } with no cursor.

  • Amounts are strings, with two decimal conventions. Sales and purchase documents, their lines and salary records use a comma ("63500,00"). Payments, treasury accounts, bank movements, accounting accounts and ledger entries use a dot ("8.3", "0.00"). The server passes them through unchanged and never converts, so nothing is rounded.

  • Ledger dates are DD/MM/YYYY. Everything else is ISO 8601.

  • Errors are RFC 7807 ({ type, title, status, detail }) for 400, 403 and 404. A bad or missing key gives 403 "Access denied", not 401. Unknown routes give 404 { message: "No route found..." }. Some malformed paths return Holded's HTML app shell with a 200 or 405; the server turns that into an error instead of returning HTML.

  • Undocumented query parameters are silently ignored. query, q and search on /contacts filter nothing; use search (which calls /contacts/search?name=) or the exact-match filters.

  • Get-by-id returns more than list for documents: accounting_date, approved_at, notes, language, payments_detail, payments_refunds, shipping, design_id, pipeline_id and more.

  • Not every verb exists for every document type. Purchase refunds are listed at /purchase-refunds but read and created under /purchases/refund, and offer nothing else (no update, delete, pdf, attachments or approve). Purchases have no pdf or send route. Recurring invoices have update, delete, skip and schedule only. Estimates, proformas, orders and waybills have no payments. The tools refuse an unsupported combination with a message listing what is available, before sending anything.

  • Numbering series types are invoice, purchase, estimate, creditnote, salesorder, waybill, salesreceipt and purchaserefund.

  • Rate limit is 100 requests per minute per key. GETs retry on 429 (honouring Retry-After), 5xx, timeouts and network errors with exponential backoff and jitter. Writes are sent exactly once because Holded has no idempotency key.

  • Creates return { id } with a 201. The server re-reads the record so the tool returns the validated object.

  • Schemas for CRM leads, projects, tasks, events, bookings, webhooks, payslips, price lists, production orders, sales orders, sales receipts, receipt notes, purchase shipments and remittances come from the OpenAPI document rather than live records, because the account used for verification has none. They are loose objects, so extra fields pass through, and any mismatch surfaces as a clear schema error rather than a silent success.

Troubleshooting

The server exits immediately with a message about the key

HOLDED_API_KEY must be a v2 Personal Access Token, in the form pat_<id>_<secret>. The server checks this at startup and refuses to run on anything else, rather than failing later on every call. A classic v1 key is 32 hex characters and does not authenticate against v2 at all.

Everything returns 403 "Access denied"

That is what a bad, revoked or wrong-scope token looks like on v2. Holded returns 403, not 401, so it reads like a permissions problem when it is usually an authentication one. Regenerate the token in Holded under Settings, Developers, API, and check you copied the whole pat_..._... value including both underscores.

A tool says an action is not available for that document type

Not every verb exists for every type. Purchase refunds have no update, delete, pdf, attachment or approve. Purchases have no pdf or send. Recurring invoices have only update, delete, skip and schedule. Estimates, proformas, sales orders and waybills have no payments. The tool refuses before sending anything and lists what is available. The full matrix is in the holded://guide/document-types resource.

A filter seems to be ignored

It probably is. Holded silently ignores undocumented query parameters: query, q and search on /contacts filter nothing and return everything. Use the search action, which calls /contacts/search?name=, or the exact-match filters email, code, phone, mobile and custom_id. page and offset are ignored everywhere; pagination is by cursor.

A resource says it could not be read

The four holded://reference/... resources read live configuration, so they need a working token. They return an explanation rather than throwing, so the server keeps working. The three holded://guide/... resources are static and always readable.

Set DEBUG=true

Every request is then logged to stderr. Never to stdout, which is the MCP transport.

FAQ

Does it work with the old v1 API key? No, deliberately. v1 is deprecated and new keys do not authenticate against it. Supporting both would mean two code paths where one is a dead end.

Can it delete things by accident? Every operation that deletes, overwrites, approves, cancels or emails requires confirm: true. Without it the tool sends nothing and tells you what it would have done. The list is generated from the code into holded://guide/irreversible-operations, and a test fails if the documented list and the code disagree.

What happens if a write times out? It is not retried. Holded has no idempotency key, so a retried write could double-charge or double-issue. Reads retry with backoff; writes are sent exactly once. If a write times out, read the record before trying again.

Why does approving an invoice need confirmation? It assigns the legal invoice number. Under Verifactu that is part of an immutable chained record and cannot be undone: a mistake needs a credit note, not an edit.

Are amounts safe to round-trip? Yes. Amounts are strings and the server passes them through unchanged, so nothing is rounded. Be aware there are two conventions: documents and salary records use a comma, payments, treasury and accounting use a dot.

Can I reach an endpoint that has no dedicated action? Yes, holded_request reaches any v2 path with correct auth. Destructive methods and paths are gated there too.

Is it affiliated with Holded? No. It is a community project that speaks their public API.

Development

npm install
npm run lint && npm run typecheck && npm run format:check && npm test && npm run build
HOLDED_API_KEY=pat_..._... npm run smoke   # spawns the built server over stdio and makes one read call

Tests run against anonymised fixtures in src/__tests__/fixtures, each a real v2 response with names, tax ids, addresses, bank details and amounts replaced. Add a fixture when you add an endpoint; the schema test fails on any fixture without a schema.

Releasing

Releases are staged by CI and promoted by a human. Bump package.json, commit, tag vX.Y.Z and push the tag. The publish workflow authenticates to npm over OIDC as a trusted publisher (no token anywhere), runs tests and build, and runs npm stage publish. Nothing is installable until a maintainer runs npm stage approve <stage-id> locally, which is where 2FA is proved. See CONTRIBUTING.md for the exact steps.

Security

Report vulnerabilities through GitHub Security Advisories; see SECURITY.md.

License

MIT

Available Tools

15 tools
holded_accountingHolded accountingC

Chart of accounts, journal, taxes and configuration lists. Actions: list_accounts (start_date and end_date add debit, credit and balance for the window; include_empty), create_account, list_ledger (start_date and end_date required; account), create_ledger_entry, list_taxes, tax_keys (country), list_expenses_accounts, get_expenses_account, create_expenses_account, update_expenses_account, delete_expenses_account, list_sales_channels, get_sales_channel, create_sales_channel, update_sales_channel, delete_sales_channel, list_numbering_series (series_type), create_numbering_series, update_numbering_series, delete_numbering_series, list_tags, create_tag, delete_tag (name). Ledger dates are DD/MM/YYYY; amounts use a dot decimal separator.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoRecord id (24 hex characters)
dataNoPayload for create and update actions, following the Holded v2 request contract
nameNoTag name for create_tag and delete_tag
limitNoPage size, 1 to 200 (default 50)
actionYes
cursorNoCursor from the previous page to continue listing
accountNoAccount number filter for list_ledger
confirmNoRequired for gated actions. The first call without it sends nothing and explains what would happen.
countryNoISO country code for tax_keys
sectionNo
archivedNo
end_dateNo
start_dateNo
series_typeNoNumbering series document type
include_emptyNo

TDQS

C2.8/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It does add some useful details: ledger dates use DD/MM/YYYY and amounts use a dot decimal separator, and it notes that start_date/end_date add debit/credit/balance for list_accounts. However, it omits critical behaviors such as the confirm gating mechanism (mentioned in the schema but not the description), pagination semantics (cursor/limit), side effects of create/update/delete actions, and reversibility. The coverage is thin for a tool with 23 actions.

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 a single block that lists the general purpose then a long list of actions with parenthetical parameter hints. It is not verbose, but it is not well-structured; it could be broken into logical sections (e.g., accounts, ledger, taxes, etc.). The front-loaded purpose is helpful, but the dense list makes scanning harder. It earns a middling score for being concise yet poorly organized.

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?

Given the complexity (23 actions, 15 parameters, no output schema, no annotations), the description is notably incomplete. It does not explain return values or pagination behavior, does not mention the confirm gating flow, does not describe error cases, and leaves many parameters undefined in context. An agent would need to rely heavily on the schema and possibly make trial calls to understand expected behavior. The description provides only a high-level list of actions and a few formatting notes, which is insufficient for a tool of this scope.

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 60%, so the description must compensate for the missing 40%. It does add meaning to several parameters: it explains that start_date and end_date add debit/credit/balance for list_accounts, that list_ledger requires them, that tax_keys takes a country, that series_type is used for list_numbering_series, and that delete_tag requires name. However, many parameters (id, data, section, archived, include_empty, cursor, limit) are not addressed in the description, and the meaning of the 'data' object is left to the schema. It provides partial compensation but not full.

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 opens with 'Chart of accounts, journal, taxes and configuration lists', which clearly scopes the tool to accounting data and configuration. The long action list reinforces the domain. It distinguishes from siblings like holded_sales and holded_contacts by focusing on accounting-specific entities. However, the purpose is stated as a list of domains rather than a single unified verb+resource, so it's not perfectly crisp.

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

Usage Guidelines2/5

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

There is no explicit guidance on when to use this tool versus alternatives. The description never mentions other Holded modules or conditions that would route an agent to a sibling. The only implicit cue is the domain name, which is not enough for clear decision-making. It does not state exclusions or alternatives.

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

holded_calendarHolded calendarC

Events and bookings. Actions: list_events, get_event, create_event, update_event, delete_event, list_bookings (start_date, end_date, service_id, sort_field, sort_order), get_booking, create_booking, update_booking, cancel_booking, list_locations, slots (id is the location id; data carries the query, for example { date, service_id }).

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoRecord id (24 hex characters)
dataNoPayload for create and update actions, following the Holded v2 request contract
limitNoPage size, 1 to 200 (default 50)
actionYes
cursorNoCursor from the previous page to continue listing
confirmNoRequired for gated actions. The first call without it sends nothing and explains what would happen.
end_dateNo
service_idNo
sort_fieldNo
sort_orderNo
start_dateNo

TDQS

C2.4/5.0
Behavior2/5

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

Annotations are absent, so the description carries the full burden. It provides some behavioral details, such as the parameters for list_bookings and the special handling for slots (id is location id, data carries the query). However, it does not disclose the confirm/confirmation flow for gated actions, the side effects of delete/cancel, or the meaning of the data object for other create/update actions. The description fails to explain how the action dispatch works beyond listing actions.

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

Conciseness2/5

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

The description is a single run-on sentence listing actions with parenthetical details. It is not front-loaded with a clear statement of purpose; instead, it immediately dives into a list. The formatting is cluttered and difficult to parse quickly. While it is compact, it lacks a clear structure that would aid an agent's comprehension.

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?

Given the tool's complexity (11 parameters, 12 actions, nested data object) and no output schema, the description is insufficient. It covers only a few actions in detail (list_bookings, slots) and leaves other actions' semantics to the schema. It does not explain pagination, the confirm flow, or return values. For a dispatcher tool, this is a significant gap that would require the agent to experiment or look elsewhere.

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

Parameters3/5

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

Schema coverage is only 45%, and the description partially compensates. It explicitly lists the parameters for list_bookings (start_date, end_date, service_id, sort_field, sort_order) and clarifies the slots action's id and data fields. It also notes that data is the payload for create/update actions. However, it does not add semantics for the other actions' parameters, such as what fields are required for create_event or how confirm works.

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

Purpose3/5

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

The description states the tool handles 'Events and bookings' and lists specific actions, which gives a general sense of purpose. It distinguishes from sibling tools like sales or contacts because it is the only calendar/booking domain. However, it lacks a clear verb+resource statement (e.g., 'Manage calendar events and bookings') and the purpose is implied through the action list rather than explicitly articulated.

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

Usage Guidelines2/5

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

There is no explicit guidance on when to use this tool versus alternatives. The sibling tools are clearly different domains (contacts, sales, etc.), so an agent could infer from the name and actions that this is for calendar/booking operations. But the description does not state any conditions for use, exclusions, or when to prefer another tool. No alternatives are mentioned.

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

holded_catalogHolded catalogC

Products, services, warehouses, price lists and production orders. Actions: list_products (name), get_product, product_stock, create_product, update_product, update_stock (data.warehouse_id, data.stock_variation), delete_product, list_services (include_archived), get_service, create_service, update_service, delete_service, list_warehouses, get_warehouse, warehouse_stock, create_warehouse, update_warehouse, delete_warehouse, list_price_lists, get_price_list, create_price_list, update_price_list, delete_price_list, list_production_orders, get_production_order, create_production_order, update_production_order, delete_production_order.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoRecord id (24 hex characters)
dataNoPayload for create and update actions, following the Holded v2 request contract
nameNoProduct name filter
limitNoPage size, 1 to 200 (default 50)
actionYes
cursorNoCursor from the previous page to continue listing
confirmNoRequired for gated actions. The first call without it sends nothing and explains what would happen.
include_archivedNo

TDQS

C2.4/5.0
Behavior2/5

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

No annotations are provided, so the description must carry the full behavioral disclosure burden. It gives no information about side effects, idempotency, authentication needs, or the confirm gate for gated actions (despite the confirm parameter existing). It also does not mention pagination or cursor behavior.

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

Conciseness2/5

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

The description is a long list that duplicates the schema enum, making it redundant and poorly structured. It is not front-loaded with a clear purpose, and every sentence is not earning its place since it repeats schema information. The wall-of-text format is not concise or organized.

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 28 actions and 8 parameters, the description is highly insufficient. It does not explain how to compose calls, how to use pagination, or the gated confirm flow. It relies entirely on the schema, but the schema lacks context for many parameters (like the data object), leaving the agent with too many unknowns.

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 75%, so the description only needs to add marginal value. It mentions specific parameters for some actions (name for list_products, include_archived for list_services, data fields for update_stock), but it does not explain the data object structure or the confirm parameter. It adds a little beyond the schema but not enough to compensate for the coverage gaps.

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

Purpose3/5

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

The description lists the resources (products, services, warehouses, price lists, production orders) and enumerates all actions, but it does not state a single clear purpose like 'Manage catalog entities'. The action list duplicates the schema enum, so it adds little beyond what the schema already provides. It distinguishes from siblings only by domain, not explicitly.

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

Usage Guidelines2/5

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

There is no guidance on when to use this tool versus alternatives. It does not mention any conditions, prerequisites, or scenarios where this tool is appropriate. The description is purely a listing with no usage context.

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

holded_contactsHolded contactsC

Customers and suppliers. Actions: list (filters email, code, phone, mobile, custom_id are exact matches), search (substring on name), get, create, update, delete, bulk_archive, bulk_delete, list_attachments, attach, portal_link, list_groups, get_group, create_group, update_group, delete_group.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoRecord id (24 hex characters)
idsNoContact ids for bulk actions
codeNoTax id (NIF/CIF) exact match
dataNoPayload for create and update actions, following the Holded v2 request contract
nameNoName fragment for search
emailNo
limitNoPage size, 1 to 200 (default 50)
phoneNo
actionYes
cursorNoCursor from the previous page to continue listing
mobileNo
confirmNoRequired for gated actions. The first call without it sends nothing and explains what would happen.
custom_idNo
file_pathNoLocal file to upload for attach

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations, the description carries the full burden of behavioral disclosure. It does add some useful detail about exact-match filters and substring search, but it omits critical behavioral facts such as side effects of delete/bulk actions, the confirm-based gating behavior where the first call sends nothing, pagination via cursor, and attachment file upload 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 compact and front-loads the resource scope before listing actions. The long action enumeration is dense but not padded, and every clause carries information about what the tool can do.

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

Completeness2/5

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

For a tool with 16 actions, 14 parameters, no annotations, and no output schema, this description is underspecified. It does not explain when confirm is required, what bulk_archive or portal_link do, how responses are structured, or how pagination works, leaving an agent without enough context to safely invoke destructive or gated operations.

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

Parameters3/5

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

The description adds meaningful semantics beyond the input schema by stating that email, code, phone, mobile, and custom_id are exact-match filters and that name is a substring search. However, with 14 parameters and only 64% schema description coverage, many parameters such as data, ids, file_path, and cursor receive no additional context in the description.

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

Purpose4/5

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

The description clearly identifies the resource scope ('Customers and suppliers') and enumerates the full set of operations available, from list/search to groups and attachments. It distinguishes the tool from sibling modules by domain, though it lacks a concise verb phrase because it is a multi-action tool.

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 is provided on when this tool should be used instead of sibling tools such as holded_crm, holded_sales, or holded_purchases. The only usage-related information is internal to this tool: list filters are exact matches while search performs substring on name, which does not help an agent choose between tools.

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

holded_crmHolded CRMC

Funnels and leads. Actions: list_funnels, get_funnel, create_funnel, update_funnel, delete_funnel, list_leads, get_lead, create_lead, update_lead, delete_lead, move_stage (stage_id), update_dates (due_date), add_note, update_note, add_task, update_task, delete_task (task_id).

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoRecord id (24 hex characters)
dataNoPayload for create and update actions, following the Holded v2 request contract
limitNoPage size, 1 to 200 (default 50)
actionYes
cursorNoCursor from the previous page to continue listing
confirmNoRequired for gated actions. The first call without it sends nothing and explains what would happen.
task_idNo
due_dateNo
stage_idNo

TDQS

C2.8/5.0
Behavior2/5

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

With no annotations, the description must disclose behavioral traits itself. It does not mention destructive actions (delete_funnel, delete_lead, delete_task), the need for confirm on gated actions, pagination via cursor/limit, or any side effects. It only hints at required parameters for a few actions (stage_id, due_date, task_id). This is insufficient for an agent to safely invoke these actions.

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 extremely concise, a single sentence, which is efficient. It front-loads the domain ('Funnels and leads') before listing actions. However, it is a flat list without grouping or hierarchy, and it omits important contextual details that would make it more useful. It earns a middle score for being brief but not optimally structured.

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?

This tool has 17 actions, no output schema, and no annotations. The description merely lists actions without explaining their behavior, prerequisites, error handling, or return values. It does not mention confirm, pagination, or the data contract. For a complex multi-action tool, this is severely incomplete and leaves the agent guessing about how to call most actions 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?

The schema leaves task_id, due_date, and stage_id without descriptions (coverage 56%). The description partially compensates by noting these parameters are required for specific actions (move_stage, update_dates, delete_task), adding meaning beyond the schema. However, it does not explain the data payload structure or other parameters, so it only marginally improves clarity.

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 identifies the tool's domain as 'Funnels and leads' and enumerates the specific actions it supports. This distinguishes it from sibling tools like contacts or sales, and the action names themselves are self-explanatory verbs on resources. It avoids tautology and gives a concrete idea of what the tool does, though it lacks a more formal 'verb+resource' structure.

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

Usage Guidelines2/5

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

There is no guidance on when to use this tool versus the many sibling Holded tools (contacts, sales, etc.). The description implies it's for CRM funnel/lead management but doesn't state when it should be chosen or when an alternative is more appropriate. 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.

holded_discoverDiscover Holded toolsA

List the Holded tool domains. Each domain is one tool named holded_ with an action parameter; call it with no action to see the actions in its error message, or read the tool description.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.1/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden. It states the tool lists domains, which is inherently read-only, but it does not explicitly disclose that this operation has no side effects or require any authentication. The absence of an explicit read-only statement is a minor gap, though the verb 'List' strongly implies a safe query.

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 with zero fluff. The primary purpose is front-loaded, and the second sentence adds useful operational detail about sibling tools. Every word earns its place.

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 does not specify the output format of this tool (e.g., a list of domain names). While the agent can infer the result from the purpose, with no output schema, the description should at least hint at the return structure. The guidance on sibling tools is useful but does not fully compensate for this missing detail.

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

Parameters4/5

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

The tool has no parameters, and the schema coverage is 100% (empty object), so the description need not add anything. However, it goes beyond the schema by explaining that domain tools take an `action` parameter, which is valuable context for the agent to understand the broader tool ecosystem.

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: 'List the Holded tool domains.' It specifies a verb (list) and a resource (tool domains). It also differentiates itself from its siblings by explaining that each domain is a separate tool, making it the entry point for discovering the available domains.

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 guidance on how to interact with the sibling tools: call a domain tool with no action to see its actions in the error message, or read the tool description. While it doesn't explicitly say 'use this when you need to discover domains,' the purpose is implied, and the instructions for using alternatives are directly helpful.

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

holded_inboxHolded inboxC

Incoming documents scanned by Holded. Actions: list (status, start_date, end_date, user_id), get, upload (file_path), download (filename, output_path), update, attach (data.documentId, data.documentType), delete.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoRecord id (24 hex characters)
dataNoPayload for create and update actions, following the Holded v2 request contract
limitNoPage size, 1 to 200 (default 50)
actionYes
cursorNoCursor from the previous page to continue listing
statusNo
confirmNoRequired for gated actions. The first call without it sends nothing and explains what would happen.
user_idNo
end_dateNo
filenameNoStored filename for download
file_pathNoLocal file to upload
start_dateNo
output_pathNo

TDQS

C2.7/5.0
Behavior2/5

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

No annotations are provided, and the description only names actions like delete, update, upload, and attach without explaining side effects, destructive potential, gating, or return behavior. The action names imply modification but do not disclose consequences or safety mechanisms.

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 a single compact sentence with no redundant wording. The action-to-parameter mapping is telegraphic but efficient, making it easy to scan.

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?

Given the multi-action dispatcher design, nested data object, and absence of an output schema, the description is too sparse to be fully actionable. It omits expected outcomes, error behavior, pagination details, and confirmation workflows.

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

Parameters2/5

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

Schema description coverage is only 54%, and the description mostly repeats parameter names without explaining formats, allowed values, or the structure of the nested 'data' object. It adds little beyond what the schema already provides.

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 identifies the resource as 'Incoming documents scanned by Holded' and enumerates the supported actions, distinguishing this tool from the sibling Holded tools by resource domain. However, it does not explain the individual action semantics in any detail.

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 lists actions and their associated parameters but provides no guidance on when to choose one action over another, no workflow context, and no mention of confirmation requirements or pagination. An agent would have to infer usage from the action names alone.

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

holded_paymentsHolded paymentsB

Payments (money out) and collections (money in). Actions: list (start_date, end_date, banking_account_id, document_id), get, create, update, delete, list_methods, get_method. Amounts are strings with a dot decimal separator.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoRecord id (24 hex characters)
dataNoPayload for create and update actions, following the Holded v2 request contract
limitNoPage size, 1 to 200 (default 50)
actionYes
cursorNoCursor from the previous page to continue listing
confirmNoRequired for gated actions. The first call without it sends nothing and explains what would happen.
end_dateNo
start_dateNo
document_idNo
banking_account_idNo

TDQS

B3/5.0
Behavior2/5

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

With no annotations, the description must disclose side effects and operational details, but it only mentions the amount format. It does not explain the consequences of create/update/delete, the confirm mechanism, or any authentication or rate-limit requirements.

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, with the core purpose front-loaded and no wasted words. It efficiently conveys the resource and a key data format.

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?

Given the tool's complexity (10 parameters, 7 actions, no output schema, no annotations), the description is far too sparse. It omits pagination behavior, confirm semantics, data payload expectations, and per-action outcomes, leaving an agent under-informed.

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

Parameters2/5

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

The description lists some list parameters but adds no semantic detail beyond their names. The schema already covers id, data, limit, cursor, and confirm, but the date, document, and banking parameters remain undocumented in both schema and description, leaving a coverage gap unaddressed.

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 identifies the resource (payments and collections) and enumerates the available actions. It distinguishes the tool's scope from other modules, though it does not explicitly name alternatives like treasury or accounting.

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?

There is no explicit guidance on when to use this tool versus its siblings. The purpose is implied by the resource name, but no conditions or exclusions are given, leaving the choice to inference.

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

holded_projectsHolded projectsB

Projects, tasks and time tracking. Actions: list_projects (status), get_project, project_summary, create_project, update_project, delete_project, list_tasks, get_task, create_task, update_task, delete_task, list_times (project_id optional), get_time (project_id, time_id), create_time (project_id), update_time, delete_time.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoRecord id (24 hex characters)
dataNoPayload for create and update actions, following the Holded v2 request contract
limitNoPage size, 1 to 200 (default 50)
actionYes
cursorNoCursor from the previous page to continue listing
statusNo
confirmNoRequired for gated actions. The first call without it sends nothing and explains what would happen.
time_idNo
project_idNo

TDQS

B3/5.0
Behavior1/5

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

With no annotations, the description carries the full burden of behavioral disclosure, but it provides none. It does not mention side effects, permission requirements, pagination behavior, or consequences of actions like delete_project or create_project.

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, well-structured sentence that front-loads the purpose and lists actions efficiently. It avoids redundancy and is easy to parse.

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

Completeness2/5

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

For a tool with 9 parameters and 16 actions, the description is far too sparse. It lacks guidance on constructing payloads, using pagination (cursor, limit), handling the confirm gate, and typical usage patterns, making it incomplete for an agent to call 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?

The description adds some parameter context by linking actions to parameters (e.g., 'list_projects (status)', 'list_times (project_id optional)'), but it does not explain most parameters or the data payload structure. With only 56% schema coverage, this partial compensation is insufficient.

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 domain as 'Projects, tasks and time tracking' and enumerates all actions, making its purpose unambiguous. This differentiates it from sibling tools like holded_contacts or holded_sales by resource type.

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

Usage Guidelines2/5

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

There is no guidance on when to use this tool versus alternatives. The description only lists actions without providing context, prerequisites, or exclusions, leaving the agent to infer usage from the domain alone.

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

holded_purchasesHolded purchase documentsC

Purchase documents by type: purchase (supplier bill), purchase_refund, purchase_order, purchase_shipment. Actions: list, get, pdf (output_path), list_attachments, attach (file_path), received_items (orders), create, update, delete, approve, send, set_pipeline, record_payment, receive (orders). Amounts in responses are strings with a comma decimal separator.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoRecord id (24 hex characters)
dataNoPayload for create and update actions, following the Holded v2 request contract
sortNo
typeNopurchase
limitNoPage size, 1 to 200 (default 50)
actionYes
cursorNoCursor from the previous page to continue listing
statusNo
confirmNoRequired for gated actions. The first call without it sends nothing and explains what would happen.
end_dateNoYYYY-MM-DD, inclusive
file_pathNo
contact_idNo
start_dateNoYYYY-MM-DD, inclusive
output_pathNo
pipeline_idNo
due_date_endNo
due_date_startNo
approval_statusNo

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It adds only one useful trait: amounts in responses use comma decimals. It does not mention side effects of actions like delete, approve, or send, the confirm-gating mechanism, pagination behavior, or any permission requirements.

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

Conciseness4/5

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

The description is compact and every phrase adds information: types, action-to-parameter hints, and a response format note. It is a single dense run-on sentence, which slightly hurts scannability, but there is minimal waste.

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

Completeness2/5

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

For a tool with 18 parameters, nested objects, no output schema, and no annotations, the description is skeletal. It fails to explain the data payload contract, gated actions, status filters, pagination semantics, or what responses look like beyond the amount format. An agent would still face significant uncertainty when invoking most actions.

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

Parameters2/5

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

Schema description coverage is only 39%, so the description should compensate. It does associate output_path with the pdf action and file_path with attach, and clarifies type values, but it leaves many parameters (contact_id, pipeline_id, due_date_start/end, approval_status, data, status) without additional meaning or 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 names the specific resource ('Purchase documents') and enumerates the exact document types it covers, differentiating it from sibling Holded tools like holded_sales or holded_contacts. It also lists the available actions, making the tool's scope and responsibility 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 lists actions and types but gives no guidance on when to use this tool instead of alternatives, nor does it explain which action to choose for a given task. There are no exclusions, conditions, or comparisons to sibling tools, so an agent gets no routing help beyond the resource name.

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

holded_requestCall any Holded v2 endpointA

Low-level escape hatch for the ~350 v2 operations. path is relative to https://api.holded.com/api/v2 and must start with "/". Responses are returned unvalidated. DELETE, PUT, PATCH, and POST to paths containing bulk, cancel, archive, approve, send, reconcile, ship, skip, clock-in or clock-out require confirm: true; the first call returns the exact request and sends nothing. Prefer the domain tools, which validate inputs and responses.

ParametersJSON Schema
NameRequiredDescriptionDefault
bodyNo
pathYes
queryNo
methodYes
confirmNo

TDQS

A4.6/5.0
Behavior5/5

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

With no annotations provided, the description fully bears the burden of behavioral disclosure. It discloses that responses are returned unvalidated, that destructive operations require a confirm step that sends nothing on the first call, and that this tool bypasses the validation of domain tools. These are critical behavioral traits communicated clearly.

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 compact, delivering the purpose, path rule, confirm mechanism, and usage preference in just two sentences. It is front-loaded with the core concept ('low-level escape hatch') and packs essential details without fluff. 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?

For a low-level tool with no output schema and no annotations, the description covers the most critical operational details: path prefix, confirm requirement, and unvalidated responses. It omits guidance on constructing body and query objects and does not mention authentication or error handling, but these are less essential for an escape hatch given its intended use after domain tools are exhausted.

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 has no descriptions (coverage 0%), so the description must compensate. It clarifies the path parameter (must be relative to base URL and start with '/') and explains the confirm parameter's role for specific paths. However, it does not elaborate on the body, query, or method parameters beyond the schema's enum for method and generic object types for body/query, leaving some ambiguity.

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 as a 'low-level escape hatch for the ~350 v2 operations', specifying the verb (call) and resource (any endpoint). It distinguishes itself from the domain tools by noting that those validate inputs and responses, making the purpose unambiguous and differentiating from siblings.

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

Usage Guidelines5/5

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

It explicitly advises to prefer domain tools when possible, establishing when not to use this tool. It also provides concrete usage conditions: the path must start with '/', and certain methods and path keywords require 'confirm: true', with the first call returning the request without sending. This gives clear when-to-use and when-not-to-use guidance.

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

holded_salesHolded sales documentsB

Sales documents by type: invoice, credit_note, estimate, proforma, sales_receipt, sales_order, waybill, receipt_note, recurring_invoice. Actions: list, get, find_by_number (invoices), pdf (needs output_path), list_attachments, attach (file_path), schedule (recurring), create, update, delete, approve, cancel (invoices), send (emails), set_pipeline, record_payment, convert, accept, reject (estimates), skip (recurring), bulk_approve, bulk_cancel, bulk_delete (invoices). Amounts in responses are strings with a comma decimal separator.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoRecord id (24 hex characters)
idsNoInvoice ids for bulk actions
dataNoPayload for create and update actions, following the Holded v2 request contract
dateNoOccurrence date for skip
sortNo
typeNoDocument type (default invoice)invoice
limitNoPage size, 1 to 200 (default 50)
actionYes
cursorNoCursor from the previous page to continue listing
statusNo
confirmNoRequired for gated actions. The first call without it sends nothing and explains what would happen.
end_dateNoYYYY-MM-DD, inclusive
file_pathNoLocal file to upload for attach
contact_idNo
start_dateNoYYYY-MM-DD, inclusive
output_pathNoWhere to save the PDF
pipeline_idNo
due_date_endNo
due_date_startNo
approval_statusNo
document_numberNoFor find_by_number

TDQS

B3.2/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It discloses one important behavioral trait: 'Amounts in responses are strings with a comma decimal separator.' It also hints at parameter requirements ('pdf (needs output_path)', 'attach (file_path)') and type-specific actions. However, it does not disclose side effects (e.g., delete is permanent, send emails), prerequisites, or the confirm gate, leaving significant gaps.

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 a single dense sentence listing types and actions. It is compact but not well-structured; the information is front-loaded but could be presented as a list for better readability. It's not overly verbose, but the lack of structure reduces clarity.

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?

This is a complex tool with 21 parameters, 22 actions, no output schema, and no annotations. The description provides a high-level list but omits crucial usage context: how to use actions together, required fields for create/update, pagination, the confirm gate, and typical workflows. It fails to give an agent enough to call it correctly without further exploration.

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 62%, so the description must compensate. It adds some meaning by linking actions to parameters (e.g., 'pdf (needs output_path)', 'attach (file_path)', 'find_by_number (invoices)' implying document_number). However, many parameters (contact_id, pipeline_id, due_date_start/end, etc.) are left without explanation, and the description does not cover all 21 parameters.

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's domain: 'Sales documents by `type`' and lists all supported document types and actions. It distinguishes from siblings like holded_purchases by explicitly naming the sales domain, though it doesn't explicitly say 'use this for sales, not purchases'. The purpose is clear and specific.

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 its domain focus and action list, but it does not explicitly state when to use this tool versus alternatives like holded_purchases. It provides some per-action type restrictions (e.g., 'find_by_number (invoices)'), but no general when/when-not guidance or exclusions.

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

holded_teamHolded teamC

Employees and payroll records. Actions: list_employees (search), get_employee, employee_contract, create_employee, list_times (employee_id optional), list_salary_records (employee_id, start_date, end_date), get_salary_record, salary_record_pdf (output_path), list_payslips (employee_id, dates, kind, is_draft), get_payslip, payslip_pdf, create_payslip_payment, delete_payslip_payment (payment_id). Salary amounts use a comma decimal separator.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoRecord id (24 hex characters)
dataNoPayload for create and update actions, following the Holded v2 request contract
kindNo
limitNoPage size, 1 to 200 (default 50)
actionYes
cursorNoCursor from the previous page to continue listing
searchNo
confirmNoRequired for gated actions. The first call without it sends nothing and explains what would happen.
end_dateNo
is_draftNo
payment_idNo
start_dateNo
employee_idNo
output_pathNo

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden of disclosing behavior. It only notes the comma decimal separator for salary amounts, which is a useful detail. It fails to mention side effects (e.g., delete_payslip_payment is destructive), authentication needs, rate limits, pagination behavior, or the gating mechanism of the 'confirm' parameter. This is a significant gap for a tool with many actions.

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 a single paragraph that front-loads the domain ('Employees and payroll records') and then lists actions with parameter hints. It is efficient and avoids filler, but the action list is lengthy and could benefit from grouping or structured formatting. Still, it is appropriately sized and does not waste 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?

Given no output schema, no annotations, and only partial parameter mapping, the description is insufficient for an agent to call the tool correctly across all actions. It does not specify required parameters per action, return formats, error handling, or how to handle pagination (cursor/limit are mentioned in schema but not in description). The description is a catalog but not a complete usage guide.

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

Parameters3/5

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

Schema coverage is only 36%, so the description must compensate. It maps some actions to their relevant parameters (e.g., list_salary_records to employee_id, start_date, end_date; salary_record_pdf to output_path), which adds value. However, it omits parameter semantics for many actions and does not explain generic fields like 'data', 'confirm', 'kind', or 'search'. The comma decimal separator note adds useful context for salary-related parameters.

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 identifies the resource domain as 'Employees and payroll records' and enumerates the available actions, making the tool's scope apparent. However, it lacks a specific verb like 'manage' or 'retrieve' and does not explicitly differentiate from sibling tools beyond the domain, so it is clear but not maximally distinguishing.

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

Usage Guidelines2/5

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

There is no guidance on when to use this tool versus alternatives. The description is a flat list of actions without selection criteria, exclusions, or prerequisites. An agent must infer from the domain that this tool handles employee/payroll data, but there is no explicit routing instruction to aid decision-making.

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

holded_treasuryHolded treasuryC

Banking accounts and their movements. Actions: list_accounts (type, archived), get_account, create_account, update_account, archive_account, delete_account, list_movements (bank movements of account id, start_date, end_date), list_cash_movements, create_movements (manual movements), reconcile (movement_id plus data.documents), list_remittances, get_remittance, list_forecasts, get_forecast, create_forecast, update_forecast, delete_forecast. Amounts are strings with a dot decimal separator.

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoRecord id (24 hex characters)
dataNoPayload for create and update actions, following the Holded v2 request contract
typeNo
limitNoPage size, 1 to 200 (default 50)
actionYes
cursorNoCursor from the previous page to continue listing
statusNo
confirmNoRequired for gated actions. The first call without it sends nothing and explains what would happen.
archivedNo
end_dateNo
start_dateNo
movement_idNo
remittance_typeNo

TDQS

C2.8/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden of disclosing behavioral traits. It mentions that amounts are strings with a dot decimal separator, which is a useful detail. However, it does not disclose that delete and archive actions are destructive, that some actions require confirmation (confirm parameter is in schema but not echoed here), or any other side effects. The description is sparse on behavior beyond the amount 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?

The description is a single paragraph that front-loads the resource definition and then lists actions. It is reasonably concise but lacks structure; grouping actions by category (e.g., accounts, movements, remittances, forecasts) would improve readability. The note on amount format is placed at the end, which is acceptable but could be more prominent. No fluff, but it reads as a dense list.

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?

Given the tool's complexity—13 parameters, 17 actions, no output schema, and no annotations—the description is incomplete. It does not cover pagination (cursor, limit), status filtering, destructive-action warnings, confirmation requirements, or return value shapes. An agent would need to consult the schema extensively and still might miss behavioral nuances. The description lists actions but does not provide enough detail for correct invocation in many 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 coverage is only 38%, so the description must compensate. It adds meaning for several parameters by tying them to actions: list_movements uses account id, start_date, end_date; create_movements is manual; reconcile uses movement_id plus data.documents. It also clarifies amount format. However, many parameters (cursor, limit, status, remittance_type, archived) are not explained in the description, leaving gaps that the low-coverage schema does not fill.

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 identifies the resource as 'Banking accounts and their movements' and lists the supported actions, making its purpose evident. It is distinguishable from sibling modules by the treasury-specific domain, though it does not explicitly contrast with them. A specific verb and resource are present, but the description is more of an enumeration than a precise purpose statement.

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 alternative modules like holded_accounting or holded_payments. It only lists actions without any contextual routing, such as 'use this for treasury operations, use that for accounting.' Some action-specific parameter hints exist (e.g., list_movements uses id, start_date, end_date), but there is no explicit when/when-not guidance.

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

holded_webhooksHolded webhooksC

Webhooks and API usage. Actions: list, get, events (supported event types), create, update, enable, disable, delete, usage (API quota for the current month).

ParametersJSON Schema
NameRequiredDescriptionDefault
idNoRecord id (24 hex characters)
dataNoPayload for create and update actions, following the Holded v2 request contract
limitNoPage size, 1 to 200 (default 50)
actionYes
cursorNoCursor from the previous page to continue listing
confirmNoRequired for gated actions. The first call without it sends nothing and explains what would happen.
usage_typeNo

TDQS

C2.6/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden of disclosing behavior. It mentions that 'usage' provides API quota for the current month, but it does not disclose destructive nature of delete, side effects of enable/disable, confirmation requirements, or any auth or rate-limit considerations. The list of actions is present but lacks any behavioral context beyond the bare action names.

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, using a single sentence with a list of actions. It front-loads the resource and then lists actions, which is efficient. However, the list format is a bit cryptic and could be more readable with separators or short explanations. It is not verbose, but the structure could be improved for clarity.

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?

Given the tool has 7 parameters, a nested data object, no output schema, and no annotations, the description is significantly incomplete. It does not explain return formats, pagination behavior, error conditions, or how actions map to parameters. The 'confirm' parameter behavior is only in the schema, not the description. The agent lacks enough context to call this tool correctly across all actions.

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 71%, and the schema already documents most parameters clearly (id, data, limit, cursor, confirm). The description adds no parameter-specific meaning; it only repeats the action names. Since the schema covers the parameters well, the description does not need to compensate, but it also does not enhance understanding. The 'usage' action hint about API quota is in the description but not linked to the usage_type parameter, leaving a minor ambiguity.

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

Purpose3/5

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

The description states the resource (webhooks and API usage) and lists actions, but it is a generic enumeration rather than a specific verb+resource statement. It does not clearly distinguish itself from sibling tools beyond the resource name, and the inclusion of 'API usage' is a separate concern that muddies the focus. The description is adequate but not precise.

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 versus alternatives. The description implies that webhook management or API quota checks should use this tool, but it does not name any sibling or condition for selection. There are no exclusions or alternative recommendations, leaving the agent to infer usage from the resource name.

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. 15 tool updatesv2.1.1
    • First observedholded_accounting
    • First observedholded_calendar
    • First observedholded_catalog
    • First observedholded_contacts
    • First observedholded_crm
    • First observedholded_discover
    • First observedholded_inbox
    • First observedholded_payments
    • First observedholded_projects
    • First observedholded_purchases
    • First observedholded_request
    • First observedholded_sales
    • First observedholded_team
    • First observedholded_treasury
    • First observedholded_webhooks

TDQS

B3.4/5.0

Scored across 15 tools

Disambiguation4/5

Each top-level tool maps to a distinct Holded domain, so the primary purposes are clear. A few action names recur across domains (e.g., list_accounts in accounting vs. treasury, task actions in CRM vs. projects), which could cause occasional misselection without careful attention to the tool context.

Naming Consistency5/5

All tools follow the same `holded_<domain>` snake_case pattern, and actions within each tool use consistent lowercase snake_case verbs and nouns. The meta tools holded_discover and holded_request also fit the prefix convention cleanly.

Tool Count5/5

15 tools is at the upper end of the ideal range but appropriate for a broad ERP suite covering contacts, sales, purchases, payments, treasury, accounting, catalog, team, CRM, projects, calendar, inbox, and webhooks. Each domain tool earns its place, and the discover and request tools provide useful navigation and escape-hatch roles.

Completeness5/5

The domain tools provide broad lifecycle coverage: create, read, update, delete, list, and domain-specific actions like approve, send, reconcile, and attach. The low-level holded_request tool also covers the remaining ~350 v2 operations, so there are no dead ends and the set is effectively complete for the stated API surface.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    A
    maintenance
    A Model Context Protocol (MCP) server for the Holded Invoice API. This server allows AI assistants like Claude to interact with Holded's invoicing, contacts, products, and more.
    78
    58
    19
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    MCP server that connects Claude Code to the Holded API for natural language financial, accounting, and invoicing queries, with built-in Spanish PGC context.
    13
    2
    Apache 2.0