@t4dhg/mcp-holded
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@@t4dhg/mcp-holdedlist my recent invoices"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
MCP Holded
Model Context Protocol server for Holded, on the v2 API
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,keyheader). New tokens arepat_<id>_<secret>and authenticate only against v2. This server speaks v2 and nothing else.Thirteen hierarchical tools with an
actionparameter, 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.
|
|
|
| |
API version | v2 | v2 | v1 (deprecated) | v1 (deprecated) |
Auth | Bearer | Bearer |
|
|
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, | 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; | No confirmation gate; | No confirmation gate; |
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-holdedCursor
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 |
| yes | none | v2 Personal Access Token. A v1 key is rejected at startup. |
| no |
| Override the API base, for testing. |
| no |
| Per-request timeout. |
| no |
| Attempts for GET requests. Writes are never retried. |
| no |
| 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 |
| Lists the domains below. |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| Any v2 endpoint: |
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 |
| Verified v2 behaviour: Bearer auth and the 403-not-401 quirk, cursor pagination, the two decimal conventions, |
| 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. |
| 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. |
| The account's tax keys, names and percentages. A document line needs the key verbatim, for example |
| The numbering series configured for each document type, with their formats and last-used numbers. |
| Payment method ids, needed by |
| 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 |
|
| Outstanding sales invoices bucketed by days overdue and grouped by contact, worst first. Counts the unpaid remainder, not the document total. |
|
| 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. |
|
| Proposes matches between bank movements and recorded payments, then lists what is unmatched on both sides. Defaults to the previous month. |
|
| 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. |
|
| 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. |
|
| 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 };cursoris the last item id and goes back as?cursor=.limitdefaults to 50 and is capped at 200;pageandoffsetare 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,qandsearchon/contactsfilter nothing; usesearch(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_idand more.Not every verb exists for every document type. Purchase refunds are listed at
/purchase-refundsbut 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 callTests 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 toolsholded_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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Record id (24 hex characters) | |
| data | No | Payload for create and update actions, following the Holded v2 request contract | |
| name | No | Tag name for create_tag and delete_tag | |
| limit | No | Page size, 1 to 200 (default 50) | |
| action | Yes | ||
| cursor | No | Cursor from the previous page to continue listing | |
| account | No | Account number filter for list_ledger | |
| confirm | No | Required for gated actions. The first call without it sends nothing and explains what would happen. | |
| country | No | ISO country code for tax_keys | |
| section | No | ||
| archived | No | ||
| end_date | No | ||
| start_date | No | ||
| series_type | No | Numbering series document type | |
| include_empty | No |
TDQS
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.
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.
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.
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.
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.
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 }).
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Record id (24 hex characters) | |
| data | No | Payload for create and update actions, following the Holded v2 request contract | |
| limit | No | Page size, 1 to 200 (default 50) | |
| action | Yes | ||
| cursor | No | Cursor from the previous page to continue listing | |
| confirm | No | Required for gated actions. The first call without it sends nothing and explains what would happen. | |
| end_date | No | ||
| service_id | No | ||
| sort_field | No | ||
| sort_order | No | ||
| start_date | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Record id (24 hex characters) | |
| data | No | Payload for create and update actions, following the Holded v2 request contract | |
| name | No | Product name filter | |
| limit | No | Page size, 1 to 200 (default 50) | |
| action | Yes | ||
| cursor | No | Cursor from the previous page to continue listing | |
| confirm | No | Required for gated actions. The first call without it sends nothing and explains what would happen. | |
| include_archived | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Record id (24 hex characters) | |
| ids | No | Contact ids for bulk actions | |
| code | No | Tax id (NIF/CIF) exact match | |
| data | No | Payload for create and update actions, following the Holded v2 request contract | |
| name | No | Name fragment for search | |
| No | |||
| limit | No | Page size, 1 to 200 (default 50) | |
| phone | No | ||
| action | Yes | ||
| cursor | No | Cursor from the previous page to continue listing | |
| mobile | No | ||
| confirm | No | Required for gated actions. The first call without it sends nothing and explains what would happen. | |
| custom_id | No | ||
| file_path | No | Local file to upload for attach |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Record id (24 hex characters) | |
| data | No | Payload for create and update actions, following the Holded v2 request contract | |
| limit | No | Page size, 1 to 200 (default 50) | |
| action | Yes | ||
| cursor | No | Cursor from the previous page to continue listing | |
| confirm | No | Required for gated actions. The first call without it sends nothing and explains what would happen. | |
| task_id | No | ||
| due_date | No | ||
| stage_id | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Record id (24 hex characters) | |
| data | No | Payload for create and update actions, following the Holded v2 request contract | |
| limit | No | Page size, 1 to 200 (default 50) | |
| action | Yes | ||
| cursor | No | Cursor from the previous page to continue listing | |
| status | No | ||
| confirm | No | Required for gated actions. The first call without it sends nothing and explains what would happen. | |
| user_id | No | ||
| end_date | No | ||
| filename | No | Stored filename for download | |
| file_path | No | Local file to upload | |
| start_date | No | ||
| output_path | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Record id (24 hex characters) | |
| data | No | Payload for create and update actions, following the Holded v2 request contract | |
| limit | No | Page size, 1 to 200 (default 50) | |
| action | Yes | ||
| cursor | No | Cursor from the previous page to continue listing | |
| confirm | No | Required for gated actions. The first call without it sends nothing and explains what would happen. | |
| end_date | No | ||
| start_date | No | ||
| document_id | No | ||
| banking_account_id | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Record id (24 hex characters) | |
| data | No | Payload for create and update actions, following the Holded v2 request contract | |
| limit | No | Page size, 1 to 200 (default 50) | |
| action | Yes | ||
| cursor | No | Cursor from the previous page to continue listing | |
| status | No | ||
| confirm | No | Required for gated actions. The first call without it sends nothing and explains what would happen. | |
| time_id | No | ||
| project_id | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Record id (24 hex characters) | |
| data | No | Payload for create and update actions, following the Holded v2 request contract | |
| sort | No | ||
| type | No | purchase | |
| limit | No | Page size, 1 to 200 (default 50) | |
| action | Yes | ||
| cursor | No | Cursor from the previous page to continue listing | |
| status | No | ||
| confirm | No | Required for gated actions. The first call without it sends nothing and explains what would happen. | |
| end_date | No | YYYY-MM-DD, inclusive | |
| file_path | No | ||
| contact_id | No | ||
| start_date | No | YYYY-MM-DD, inclusive | |
| output_path | No | ||
| pipeline_id | No | ||
| due_date_end | No | ||
| due_date_start | No | ||
| approval_status | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| body | No | ||
| path | Yes | ||
| query | No | ||
| method | Yes | ||
| confirm | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Record id (24 hex characters) | |
| ids | No | Invoice ids for bulk actions | |
| data | No | Payload for create and update actions, following the Holded v2 request contract | |
| date | No | Occurrence date for skip | |
| sort | No | ||
| type | No | Document type (default invoice) | invoice |
| limit | No | Page size, 1 to 200 (default 50) | |
| action | Yes | ||
| cursor | No | Cursor from the previous page to continue listing | |
| status | No | ||
| confirm | No | Required for gated actions. The first call without it sends nothing and explains what would happen. | |
| end_date | No | YYYY-MM-DD, inclusive | |
| file_path | No | Local file to upload for attach | |
| contact_id | No | ||
| start_date | No | YYYY-MM-DD, inclusive | |
| output_path | No | Where to save the PDF | |
| pipeline_id | No | ||
| due_date_end | No | ||
| due_date_start | No | ||
| approval_status | No | ||
| document_number | No | For find_by_number |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Record id (24 hex characters) | |
| data | No | Payload for create and update actions, following the Holded v2 request contract | |
| kind | No | ||
| limit | No | Page size, 1 to 200 (default 50) | |
| action | Yes | ||
| cursor | No | Cursor from the previous page to continue listing | |
| search | No | ||
| confirm | No | Required for gated actions. The first call without it sends nothing and explains what would happen. | |
| end_date | No | ||
| is_draft | No | ||
| payment_id | No | ||
| start_date | No | ||
| employee_id | No | ||
| output_path | No |
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Record id (24 hex characters) | |
| data | No | Payload for create and update actions, following the Holded v2 request contract | |
| type | No | ||
| limit | No | Page size, 1 to 200 (default 50) | |
| action | Yes | ||
| cursor | No | Cursor from the previous page to continue listing | |
| status | No | ||
| confirm | No | Required for gated actions. The first call without it sends nothing and explains what would happen. | |
| archived | No | ||
| end_date | No | ||
| start_date | No | ||
| movement_id | No | ||
| remittance_type | No |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Record id (24 hex characters) | |
| data | No | Payload for create and update actions, following the Holded v2 request contract | |
| limit | No | Page size, 1 to 200 (default 50) | |
| action | Yes | ||
| cursor | No | Cursor from the previous page to continue listing | |
| confirm | No | Required for gated actions. The first call without it sends nothing and explains what would happen. | |
| usage_type | No |
TDQS
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.
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.
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.
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.
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.
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.
15 tool updates
v2.1.1- First observed
holded_accounting - First observed
holded_calendar - First observed
holded_catalog - First observed
holded_contacts - First observed
holded_crm - First observed
holded_discover - First observed
holded_inbox - First observed
holded_payments - First observed
holded_projects - First observed
holded_purchases - First observed
holded_request - First observed
holded_sales - First observed
holded_team - First observed
holded_treasury - First observed
holded_webhooks
TDQS
Scored across 15 tools
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.
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.
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.
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
Related MCP Connectors
MCP server for Quaderno — tax-rate calculation, invoices, contacts, products, receipts & expenses.
MCP server for Codat — companies, connections, invoices, bills and financial statements.
API-first CRM for LLMs - contacts, companies, deals and activities over a native MCP server.
MCP server for Hostinger API
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceMCP server for Holded — invoicing, accounting, CRM, projects, and team771MIT
- AlicenseBqualityAmaintenanceA 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.785819MIT
- AlicenseAqualityDmaintenanceMCP server that connects Claude Code to the Holded API for natural language financial, accounting, and invoicing queries, with built-in Spanish PGC context.132Apache 2.0
- FlicenseNot gradedqualityDmaintenanceAn open-source MCP server for the Holded API that enables natural language management of invoicing, CRM, projects, team, and accounting.-