MCP Holded
This MCP server connects AI assistants to the Holded business management platform, enabling full control over invoicing, contacts, products, accounting, and more through 76+ tools.
π Documents β List, create, update, and delete documents (invoices, estimates, credit notes, purchase orders, etc.); pay, email, and PDF documents; ship items; attach files; update tracking info and pipeline stages.
π₯ Contacts β List, create, update, and delete contacts (clients, suppliers, leads, etc.); manage contact persons and attachments.
π¦ Products β List, create, update, and delete products; manage product images; update stock quantities per warehouse.
π¦ Treasuries β List, create, and retrieve treasury accounts.
πΈ Expenses Accounts β List, create, get, update, and delete expense account categories.
π’ Numbering Series β Get, create, update, and delete document numbering series per document type.
π Sales Channels β List, create, get, update, and delete sales channels.
π Warehouses β List, create, get, update, and delete warehouses; view stock levels per warehouse.
π³ Payments β List, create, get, update, and delete payment methods.
π§Ύ Taxes β Retrieve all available taxes.
π« Contact Groups β List, create, get, update, and delete contact groups.
π¬ Remittances β List all remittances or retrieve a specific one by ID.
π οΈ Services β List, create, get, update, and delete services.
β±οΈ Time Tracking (read-only) β List time-tracking entries across all projects or for a specific project.
π Accounting (read-only) β Retrieve the chart of accounts and the daily ledger.
π§ Banking (experimental) β Reconcile bank-feed transactions against accounting entries (requires HOLDED_ENABLE_EXPERIMENTAL_BANKING=true).
Click on "Deploy 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., "@MCP HoldedList my unpaid 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
A Model Context Protocol (MCP) server for the Holded API. This server lets AI assistants like Claude interact with Holded's invoicing, accounting, contacts, products, treasury, HR, time tracking and more.
Built and maintained by Nubiia β automatizaciΓ³n e integraciones con IA para negocios (MCP, Holded, Pipedrive y mΓ‘s). ΒΏQuieres algo asΓ para tu empresa? EscrΓbenos en nubiia.es.
Features
This MCP server provides access to the Holded API v2 across all supported modules:
Documents (16 tools): Create, list, update, delete invoices, estimates, credit notes, etc. Also pay, send, get PDF, ship items, and more.
Contacts (7 tools): Manage clients and suppliers with attachments.
Products (9 tools): Full product management including images and stock.
Treasuries (3 tools): Manage legacy treasury accounts.
Treasury v2 (15 tools): Bank accounts, bank movements, cash movements, invoicing forecasts and reconciliation.
Expenses Accounts (5 tools): Handle expense account categories.
Numbering Series (4 tools): Configure document numbering.
Sales Channels (5 tools): Manage sales channels.
Warehouses (6 tools): Warehouse management.
Payments (5 tools): Payment method configuration.
Taxes (1 tool): Get available taxes.
Contact Groups (5 tools): Organize contacts into groups.
Remittances (2 tools): Access remittance data.
Services (5 tools): Manage services.
Time Tracking (3 tools): List time-tracking entries and project times (read and write).
Accounting (2 tools, read-only): Get the chart of accounts and the daily ledger.
Ledger (4 tools): List and create accounting/ledger entries.
Team/HR (22 tools): Employee management, payroll records, employee time entries and clock in/out.
Total: 119 tools β all registered unconditionally once a valid v2 key is configured.
Related MCP server: invoiceninja-mcp
Installation
Prerequisites
Node.js 22.14 or higher
A Holded account with API access
A Holded API v2 key (
pat_β¦orsk_live_β¦) β generate it in Holded β Settings β API
Install from npm
npm install -g @nubiia/mcp-holdedInstall from source
git clone https://github.com/nubiia-dev/mcp-holded.git
cd mcp-holded
npm install
npm run buildConfiguration
Environment Variables
All tools call the Holded API v2 (Bearer auth, cursor pagination). You need a single v2 key:
# Recommended β primary key name
export HOLDED_API_KEY=pat_your_v2_key_here
# Alternative β accepted as an alias; wins over HOLDED_API_KEY if both are set
export HOLDED_API_KEY_V2=sk_live_your_v2_key_hereGenerate the key in Holded β Settings β API. The key must start with pat_ or sk_live_. A 403 response means the key is missing a required scope.
For multi-tenant setups use the same logic per tenant:
export TENANT_1_NAME=company-a
export TENANT_1_API_KEY=pat_key_for_company_a
export TENANT_2_NAME=company-b
export TENANT_2_API_KEY=sk_live_key_for_company_bTENANT_N_API_KEY_V2 is accepted as an alias for TENANT_N_API_KEY (wins if both are set).
Claude Desktop Configuration
Add to your Claude Desktop config file:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"holded": {
"command": "npx",
"args": ["-y", "@nubiia/mcp-holded"],
"env": {
"HOLDED_API_KEY": "pat_your_v2_key_here"
}
}
}
}Or if installed from source:
{
"mcpServers": {
"holded": {
"command": "node",
"args": ["/path/to/mcp-holded/dist/index.js"],
"env": {
"HOLDED_API_KEY": "pat_your_v2_key_here"
}
}
}
}Migrating from 1.x
API key
The server now calls the Holded API v2 exclusively. Your 1.x API key (a plain hex string like abc123β¦) no longer works. Generate a v2 key in Holded β Settings β API; the key will start with pat_ or sk_live_.
Set it as HOLDED_API_KEY (or the alias HOLDED_API_KEY_V2). The separate HOLDED_API_KEY_V2 variable used in 1.x to opt-in to HR/Ledger/Treasury tools is no longer needed β all 119 tools are always registered.
Pagination
List tools changed from page-based to cursor-based pagination:
1.x argument | 2.x argument | Notes |
| (removed) | Server no longer accepts offset pages |
|
| Server-paginated; use limit to control page size |
(none) |
| Pass the |
Responses now follow this envelope:
{
"items": [...],
"nextCursor": "opaque-string-or-null",
"hasMore": true
}Iterate by passing nextCursor as cursor until hasMore is false.
Response format
Field names are
snake_casethroughout (e.g.contact_id,created_at).Monetary amounts are strings with a decimal comma (e.g.
"1.234,56") β parse with your locale-aware number parser before doing arithmetic.
Removed or changed operations
Operation | 1.x behaviour | 2.x behaviour |
| Supported | Removed β create only via |
| All document types | Only |
Ship operations | All document types | Only |
Experimental banking ( | Opt-in via env flag | Removed β use |
| Unix timestamps ( | ISO 8601 strings ( |
| Paginated | Returns all taxes in one call (no pagination args) |
| Optional warehouse |
|
List tools field projections | Reduced default set of fields | Full v2 payload returned; use |
Contact attachments
Attachments are now fetched by filename instead of attachment ID. Use get_contact_attachment with the filename field returned by list_contact_attachments.
Usage Examples
Once configured, you can ask Claude to:
Documents
"List all my invoices from Holded"
"Create an invoice for client X with 2 items"
"Send invoice #123 to the client by email"
"Get the PDF of invoice #456"
"Mark invoice #789 as paid"
Contacts
"List all my clients in Holded"
"Create a new client named Acme Corp"
"Update the email for contact #123"
Products
"Show me all products"
"Create a new product called Widget with price 50 EUR"
"Update stock for product #123 adding 10 units in warehouse W1"
HR & Payroll
"List all employees"
"Clock in employee #456"
"Get the salary record for employee #789 for June 2025"
Reports
"Get all my taxes"
"List all treasury bank accounts"
"Show me the daily ledger for January 2025"
"Get the chart of accounts"
Document Types
The API supports these document types:
Type | Description |
| Sales invoices |
| Sales receipts |
| Credit notes (refunds) |
| Receipt notes |
| Estimates/Quotes |
| Sales orders |
| Packing lists |
| Proforma invoices |
| Purchases |
| Purchase refunds (create only in v2) |
| Purchase orders |
API Reference
Base URL
https://api.holded.com/api/The server routes each tool to the appropriate v2 sub-path (e.g. /invoicing/v2/, /team/v2/, /accounting/v2/).
Authentication
All requests use Bearer authentication with your v2 key:
Authorization: Bearer pat_your_v2_key_herePagination
List endpoints use cursor-based pagination via limit and cursor arguments (see Migrating from 1.x).
Development
# Install dependencies
npm install
# Build
npm run build
# Watch mode
npm run devWrite Safety
Create/update/delete tools modify real data in Holded. The server applies per-tool rate limits (stricter for destructive operations) to prevent accidental bulk mutations. Destructive operations are capped at 10 requests/minute by default; update operations at 30 requests/minute.
Privacy Policy
Data Collection: This MCP server requires your Holded API key to function. The API key is read from your local environment variable (HOLDED_API_KEY) and is never stored by this server. All API requests and responses are passed through in real-time to facilitate communication between your AI assistant and the Holded API.
Data Usage & Sharing: Your API key and all data processed through this server are used exclusively to interact with the Holded API on your behalf. The server acts as a pass-through proxy - it does not store, log, or retain any data. Your Holded API key and data are transmitted only to Holded's official API endpoints (api.holded.com). No data is shared with any third parties beyond Holded.
Your Security: We recommend following security best practices: store your API key in environment variables (never commit it to version control), regularly update to the latest version, and review the permissions granted to this MCP server in your AI assistant. For more information, see our full Privacy Policy.
Support
For questions, issues, or feature requests:
GitHub Issues: Report an issue
Email: hola@nubiia.es
Documentation: Holded API Docs
About Nubiia
This MCP server is built and maintained by Nubiia.
Nubiia ayuda a empresas a automatizar procesos e integrar sus herramientas con IA: servidores MCP a medida, integraciones con Holded, Pipedrive y otros ERPs/CRMs, y agentes que conectan tus datos de negocio con asistentes como Claude. Este @nubiia/mcp-holded es un ejemplo open source de lo que hacemos.
π ΒΏQuieres una integraciΓ³n o automatizaciΓ³n con IA para tu negocio? nubiia.es Β· βοΈ hola@nubiia.es
License
MIT - See LICENSE file for details.
Author
Built by Nubiia β nubiia.es Β· hola@nubiia.es
Maintainer: Samuel Fraga β GitHub Β· LinkedIn
Links
Available Tools
119 toolsarchive_bank_accountA
WRITE: archives a treasury bank account in Holded (API v2). Reversible alternative to delete_bank_account.
| Name | Required | Description | Default |
|---|---|---|---|
| accountId | Yes | Bank account ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It does valuable work by tagging this as a WRITE operation and disclosing reversibility, but it doesn't explain what archiving actually does downstream (e.g., whether the account disappears from list_bank_accounts, how restoration works, 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?
Two compact sentences, with the WRITE marker and the core function front-loaded, followed immediately by the disambiguation. Every clause carries signal; nothing is redundant.
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 mutation tool with no annotations and no output schema, the description covers the essentials (what it does, that it's reversible, which sibling it replaces) but leaves behavioral gaps: state after archiving, restoration path, and error/permission conditions are unaddressed.
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?
There is a single parameter, accountId, fully documented in the schema at 100% coverage, so the schema already does the work. The description adds no format, ID-source, or constraint detail beyond what the schema supplies, which is the baseline 3 for high schema coverage.
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 a specific verb ('archives') and resource ('treasury bank account in Holded, API v2'), and explicitly contrasts it with the sibling delete_bank_account. An agent can distinguish this from the delete/create/update bank account siblings without inspecting schemas.
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 routes the agent: use this as the 'reversible alternative to delete_bank_account,' which is a clear when-to-use signal against the most likely competing tool. It stops short of stating prerequisites (permissions, whether archived accounts remain visible or can be unarchived), so no full 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
attach_file_to_documentA
Attach a file to a document (Holded API v2). POST ${docBase}/{id}/attachments multipart. Supported for all docTypes except purchaserefund (v2 has no purchase-refund CRUD beyond creation).
| Name | Required | Description | Default |
|---|---|---|---|
| docType | Yes | Type of document | |
| filename | Yes | Name of the file | |
| documentId | Yes | Document ID | |
| fileBase64 | Yes | File content as base64 encoded string |
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 the multipart POST mechanics and the docType support restriction, which is useful, but omits permissions/auth requirements, file size limits, and what happens on failure or what the response contains.
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?
Front-loaded with the purpose, then endpoint mechanics and the docType caveat. Dense and mostly earns its place, though the raw endpoint path is implementation detail an agent may not need.
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?
A 4-param mutation tool with no annotations and no output schema. The description covers purpose, endpoint, and the docType restriction, but leaves notable gaps around auth, size limits, and response/failure behavior.
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 100%, so the baseline is 3. The description adds genuinely useful meaning beyond the enum: purchaserefund is in the schema enum but not actually supported, which prevents a likely incorrect invocation.
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?
States a specific verb and resource (attach a file to a document) and specifies the API version. It's clearly distinguishable from read-only siblings like list_contact_attachments, though it doesn't name any sibling alternatives 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?
Provides one explicit when-not condition ('supported for all docTypes except purchaserefund'), which is valuable. But there's no general guidance on when to use this vs. other document tools or prerequisites (e.g., that the document must exist).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clock_in_employeeB
WRITE: registers a clock-in for an employee in Holded time tracking (API v2). Affects real working-time records.
| Name | Required | Description | Default |
|---|---|---|---|
| employeeId | Yes | Employee ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does usefully flag WRITE and "Affects real working-time records," making the side effect clear. However, it omits behavior an agent needs: what happens on duplicate clock-ins, whether the operation is idempotent, required permissions, and what an error looks like.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short fragments with zero waste, and the WRITE marker is front-loaded so the mutation nature is immediately visible. It leans slightly toward under-specification rather than verbosity.
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 one-parameter mutation tool with no annotations and no output schema, the description covers purpose and side effect but not result shape, duplicate-handling, or permissions. Adequate as a minimum, but there are clear gaps for a write operation.
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?
There is only one parameter (employeeId) and schema description coverage is 100%, so the baseline is 3. The description adds no meaning beyond the schema β it doesn't say where the employee ID comes from or what happens if it's invalid.
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?
States a specific verb+resource ("registers a clock-in for an employee") and names the system (Holded time tracking, API v2). It implicitly distinguishes itself from clock_out_employee and pause_employee via the direction of the action, though it doesn't name those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 versus clock_out_employee, create_employee_time, or pause_employee, and no exclusions or preconditions. The closest thing is the warning "Affects real working-time records," which is a side-effect note rather than routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clock_out_employeeB
WRITE: registers a clock-out for an employee in Holded time tracking (API v2).
| Name | Required | Description | Default |
|---|---|---|---|
| employeeId | Yes | Employee ID |
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. The explicit 'WRITE:' prefix usefully signals a mutation and naming API v2 adds a little context, but it omits whether the clock-out timestamp is auto-generated, whether it fails when no open clock-in exists, and whether it is idempotent.
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?
One tight sentence with the mutation type front-loaded as 'WRITE:' and no filler. Every clause carries information about the action, target, and system.
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 single-parameter, no-output-schema tool this covers the essentials of what it does, but with no annotations the description should also say what happens on a failed clock-out or how the timestamp is determined. It is adequate but leaves real behavioral questions open.
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 100% for the single employeeId parameter, so the schema already documents it. The description adds no meaning about the parameter, which is the baseline-3 case when the schema does the work.
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 gives a specific verb ('registers a clock-out') and resource ('an employee in Holded time tracking'), which is clearly distinguishable from siblings such as clock_in_employee or pause_employee. It stops short of explicitly naming those siblings as alternatives, so it lands just below the top band.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 versus clock_in_employee, pause_employee, unpause_employee, or create_employee_time. Nothing states preconditions such as an employee having an open clock-in, so the agent must infer all conditions for use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_accounting_accountB
WRITE: creates a real accounting account in the Holded chart of accounts (API v2). data is sent verbatim as the request body β see https://www.holded.com/es/desarrolladores/referencia-api (Contabilidad β Crear cuenta).
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | Account payload, sent verbatim as body |
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 does disclose the key trait that this is a write and that `data` is sent verbatim as the raw request body, which tells the agent it must assemble a complete payload itself. However, it says nothing about required permissions, duplicate-name handling, or what a successful call returns.
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?
Two sentences, front-loaded with the 'WRITE:' mutation marker, with no filler. The only structural weakness is outsourcing the substantive payload detail to an off-tool documentation link.
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 mutation tool with no annotations, no output schema, and a nested `data` object whose fields are undefined in the schema. The description's answer to that gap is a URL, which an agent may not be able to fetch, leaving it unable to construct a valid payload from the definition alone.
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?
Only one parameter exists and schema coverage is nominally 100%, so the baseline is 3. The description adds the meaningful detail that the object is passed through verbatim with no transformation, but the nested payload's actual fields are documented nowhere in the schema and are deferred entirely to an external URL.
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?
States a specific verb and resource: creates an accounting account in the Holded chart of accounts, plus the API version. It is clear what it does, but it never distinguishes itself from nearby siblings such as create_expenses_account, create_ledger_entry, or the read-side list_accounting_accounts / get_chart_of_accounts.
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 when-to-use or when-not-to-use guidance, no prerequisites, and no mention of alternatives. The 'WRITE:' prefix implies mutation, but an agent choosing among several create_* accounting-adjacent siblings gets no routing help.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_bank_accountB
WRITE: creates a real treasury bank account in Holded (API v2). data is sent verbatim as the request body β see https://www.holded.com/es/desarrolladores/referencia-api (TesorerΓa β Crear cuenta).
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | Bank account payload, sent verbatim as body |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden; it does disclose that this persists a real account ('real', 'WRITE') and that the body is passed verbatim without validation or transformation. It omits permissions/auth requirements, what the response contains (e.g., created ID), and error behavior, which matter for a mutation endpoint.
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?
Two short sentences, front-loaded with the WRITE marker, with a documentation pointer instead of bloated prose. Slight redundancy between the description and the schema's 'sent verbatim as body' wording keeps it from a 5.
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 mutation tool with no annotations, no output schema, and an unconstrained nested payload, the external reference link is the right compensation for field-level detail. Still missing is any statement of what a successful call returns or what failure looks like, which leaves the agent guessing about verification after the call.
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 100% and the nested `data` object is intentionally opaque, so baseline is a 3. The description reinforces 'sent verbatim as the request body' but largely repeats the schema text; the added value is the external API reference where the payload shape is actually documented.
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?
States a specific verb and resource ('creates a real treasury bank account in Holded') and flags the write nature up front. It does not, however, differentiate itself from the sibling create_treasury, which an agent could reasonably confuse with it.
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 statement of when to use this tool versus create_treasury, update_bank_account, or the other creation tools in the family, and no prerequisite or verification guidance. The 'WRITE:' prefix signals impact but not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_bank_movementC
WRITE: creates a real bank movement in a treasury account (Holded API v2). data is sent verbatim as the request body β see https://www.holded.com/es/desarrolladores/referencia-api (TesorerΓa β Crear movimiento).
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | Movement payload, sent verbatim as body | |
| accountId | Yes | Bank account ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It usefully discloses that this creates a real bank movement and that data is sent verbatim, but it does not explain permissions, idempotency, side effects, validation behavior, or what happens on failure, which are important for an unannotated write operation.
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 compact sentences with the mutating nature and resource front-loaded. Every element, including the documentation link, serves a clear purpose without repetition.
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 write tool with a required nested data object, no output schema, and no annotations, the description delegates the payload structure entirely to an external URL. An agent can identify the tool's high-level purpose but lacks enough local detail to confidently construct a valid bank movement payload.
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 100%, so the schema already documents both parameters. The description reinforces that data is sent verbatim and provides an external documentation link, but it adds little beyond what the schema fields state, especially for the nested data object whose allowed fields are not described.
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 a specific verb and resource: 'creates a real bank movement in a treasury account,' and identifies the API version. It is clearly distinguishable from read-oriented siblings like list_bank_movements, but it does not explicitly contrast itself with reconcile_bank_movement or explain when this creation path is appropriate.
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 'WRITE' prefix signals a mutating operation, but there is no explicit guidance on when to use this tool versus alternatives such as create_treasury or reconcile_bank_movement. It also omits prerequisites, constraints, and when-not-to-use conditions for creating a real bank movement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_contactC
Create a new contact (Holded API v2)
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | NIF / CIF / VAT number or tax identification code for the contact. This is the correct Holded API field for tax IDs. Note: the legacy "vatnumber" field does not exist in Holded and is silently ignored. | |
| name | Yes | Contact name | |
| note | No | Notes about the contact | |
| type | No | Contact type | |
| No | Contact email | ||
| phone | No | Contact phone number | |
| tradename | No | Trade name | |
| billAddress | No | Billing address | |
| contactPersons | No | List of contact persons associated with this contact |
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 signals a mutation only through the word 'Create' and gives no information about side effects, duplicate/tax-ID conflicts, error behavior, required permissions, or what the call returns --- all of which matter for a 9-parameter create tool with nested objects.
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?
Six words and a version tag for a tool with 9 parameters, a nested address object, and an array of contact persons. Nothing is wasted, but the definition is grossly under-sized relative to the operation's complexity rather than truly concise.
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 annotations, no output schema, and a nested-object payload, the description should explain creation semantics (what is returned, duplicate handling, whether type defaults apply). The API-version parenthetical is the only extra context provided, leaving significant gaps.
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 100% and includes notable guidance (the 'code' vs legacy 'vatnumber' caveat, the type enum, nested contactPersons). The description adds nothing on top of the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Create a new contact'), which an agent can match to the create/list/update/delete_contact family. It does not explicitly distinguish itself from siblings such as update_contact or create_contact_group, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 rather than update_contact (for an existing contact) or create_contact_group, nor any prerequisites, duplicate-handling notes, or mention that only 'name' is required. The agent must infer everything from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_contact_groupC
Create a new contact group (Holded API v2)
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Contact group name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations and no output schema, so the description carries the full behavioral burden, yet it discloses only that a creation occurs. It says nothing about required permissions, duplicate-name behavior, idempotency, or what the response containsβsignificant gaps for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no wasted clauses. It is appropriately brief, though the API-version parenthetical contributes little for tool selection.
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 create operation with no annotations and no output schema, the description leaves key call-time facts undisclosed: what happens on duplicate names, whether auth scopes matter, and what is returned. A simple schema doesn't fully compensate for those behavioral omissions.
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?
There is one parameter with 100% schema description coverage, so the schema already defines the meaning of 'name'. The description adds no additional semantic detail beyond that, making the baseline 3 appropriate.
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?
States a specific verb (Create) and resource (contact group), which implicitly distinguishes it from the list_contact_group, get_contact_group, update_contact_group, and delete_contact_group siblings. The parenthetical API version is noise but doesn't obscure purpose.
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 on when to create a group versus using an existing one, no prerequisites, no mention of duplicate handling, and no explicit alternative named. The agent must infer usage from the verb alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_documentA
Create a new document (invoice, estimate, purchase, etc.). By default the document is approved (finalized) so it appears in the Holded UI; pass approveDoc:false to create a draft instead. Set the expense/income account at document level via expAccountId (it cascades to all lines); a per-line account is rejected because Holded ignores it. On SALES documents an auto-incrementing numbering series may OVERRIDE the requested invoiceNum β the tool re-reads the created document and returns a _warnings note if that happened. On purchases the supplier number in invoiceNum is preserved. retention (IRPF) is accepted on sales but rejected on purchases (Holded ignores it there).
| Name | Required | Description | Default |
|---|---|---|---|
| date | Yes | Document date as Unix timestamp | |
| items | Yes | Array of line items | |
| notes | No | Notes for the document | |
| docType | Yes | Type of document to create | |
| currency | No | Currency code (e.g., EUR, USD) | |
| contactId | Yes | Contact ID for the document | |
| retention | No | IRPF retention percentage. Accepted on SALES documents only; rejected on purchases because Holded silently ignores it there. | |
| approveDoc | No | Whether to immediately approve (finalize) the document instead of saving it as a draft. Defaults to true so the document is visible in the Holded UI. When the Holded API receives no value it defaults to draft, and drafts do not appear in Sales > Invoices, the contact Sales tab or global search. Pass false only when you intentionally want a draft. Note: approved documents are permanently locked by Holded. | |
| invoiceNum | No | Document reference number (e.g. invoice number from supplier) | |
| expAccountId | No | Expense account ID for expense documents | |
| salesChannelId | No | Sales channel ID to associate with the document |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description bears full burden and excels. It discloses default approval, draft behavior, numbering override for sales, preservation for purchases, retention rules, expAccountId cascading, per-line account rejection, and permanent locking of approved documents.
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 paragraph of five sentences covering many points without wasted words. It could be slightly improved with structure (e.g., bullet points), but it remains efficient and readable.
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, multiple behaviors), the description covers all key aspects: approval, numbering, retention, account cascading, and warning mechanism. No gaps are evident for typical use.
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?
Although schema coverage is 100%, the description adds significant value beyond schema descriptions by explaining the practical implications of approveDoc (default behavior, draft visibility), invoiceNum (override warning), retention (accepted/rejected), and expAccountId cascading.
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 'Create a new document (invoice, estimate, purchase, etc.)' with a specific verb and resource. It lists the docType enum values, covering all document types, and distinguishes itself from sibling tools like update_document and delete_document.
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 explicit guidance on when to use approveDoc:false for drafts, explains numbering behavior for sales vs purchases, and notes retention acceptance/rejection. While it doesn't directly compare to alternatives, the context is clear enough for most use cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_employeeA
WRITE: creates a real employee record in Holded (API v2). data is sent verbatim as the request body β see https://www.holded.com/es/desarrolladores/referencia-api (Empleados β Crear) for the payload fields (name, email, etc.).
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | Employee payload, sent verbatim as body |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose two real traits: the operation is a write that creates a genuine (non-dry-run) record, and `data` is passed straight through with no validation or field mapping. It omits permissions/auth requirements, duplicate handling, and what happens on failure or success β meaningful gaps for an unannotated mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with zero filler; the WRITE marker and the persistence fact are front-loaded, and the pass-through semantics follow immediately.
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 one-parameter write tool with no annotations and no output schema, the description should say more about the RESULT (does it return the created employee ID?) and about error or duplicate behavior. The external documentation link partially compensates for the free-form payload, but the return contract is entirely unaddressed.
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 defines only a free-form object with a terse description, so the field-level burden falls on the description. Saying the payload is 'sent verbatim as the request body' is valuable β it tells the agent there is no server-side transformation β and the external reference plus sample fields (name, email) gives a path to the required shape, though the agent must leave the context to get the full field list.
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?
States a specific verb and resource ('creates a real employee record in Holded') plus the API version. It differentiates against siblings implicitly by naming the resource 'employee record' rather than employee_time or salary_record, but never names an alternative tool 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?
The 'WRITE:' prefix and 'real employee record' imply a persisting mutation, which is enough to infer when to use it over read tools like list_employees/get_employee. However, no exclusions are given β nothing about when to use update_employee instead, or preconditions such as whether the employee must not already exist.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_employee_timeA
WRITE: creates a manual time-tracking record for an employee (Holded API v2). data is sent verbatim as the request body β see https://www.holded.com/es/desarrolladores/referencia-api (Control horario β Crear registro).
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | Time record payload, sent verbatim as body | |
| employeeId | Yes | Employee ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden; it does lead with 'WRITE', which correctly signals a mutation, and explains that `data` is forwarded verbatim. It does not disclose permission requirements, whether the operation is idempotent, error behavior, or what the call returns β gaps that matter for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences, mutation intent front-loaded in the first word, and no filler. The docs pointer is the only reference and it is doing necessary work for the free-form payload.
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?
No output schema exists and the nested `data` payload is defined only by an external link, which the description correctly flags. Complete enough to call correctly, but an agent must leave the tool to learn the payload shape, and no failure or permission context is given.
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 100%, but `data` is a free-form nested object whose fields are undocumented in the schema; the description adds real value by stating it is sent verbatim as the request body and pointing to the exact API reference section for its shape. That is meaningfully beyond what the schema 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?
States a specific verb and resource: 'creates a manual time-tracking record for an employee', with API version provenance. The word 'manual' implicitly separates it from clock_in_employee/clock_out_employee, but the description never names a sibling explicitly, so an agent must infer the boundary itself.
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?
'Manual' hints at the contrast with clock-in/clock-out/pause flows, which is a useful implicit cue. However, there is no explicit when-to-use / when-not-to-use statement and no named alternative such as update_employee_time or clock_in_employee, leaving routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_expenses_accountC
Create a new expenses account (Holded API v2)
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | PGC account number (e.g. "62900000"). This is the value surfaced as `accountNum` by list_expenses_accounts β Holded accepts it under the `code` key on create/update. | |
| name | Yes | Expenses account name |
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, and it only implies a write operation via "Create". It says nothing about permission requirements, idempotency, duplicate-name/code handling, or what the call returns on success or failure.
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?
One short sentence with zero waste and the verb front-loaded. Its brevity borders on under-specification, but nothing extraneous is present.
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 mutation tool with no annotations and no output schema, the description should disclose side effects or expected response, which it does not. The rich parameter schema offsets this somewhat, but the behavioral picture an agent needs to call a create endpoint safely is missing.
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 100%, and the schema itself carries the meaningful semantics (notably the `code`/`accountNum` mapping to list_expenses_accounts). The description adds no parameter meaning beyond that, so the baseline 3 applies.
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?
States a specific verb ("Create") and resource ("expenses account"), so an agent knows the operation immediately. However it does not distinguish this from adjacent siblings such as create_accounting_account or create_bank_account, leaving the agent to infer which account type applies.
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 create_accounting_account, create_bank_account, or update_expenses_account. No prerequisites (e.g. existing chart of accounts, required permissions) or exclusions are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_invoicing_forecastA
WRITE: creates an invoicing forecast in Holded cashflow (API v2). data is sent verbatim as the request body β see https://www.holded.com/es/desarrolladores/referencia-api (TesorerΓa β Previsiones).
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | Forecast payload, sent verbatim as body |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden. It does add real behavioral detail: the operation is a write, targets API v2, and `data` is passed through verbatim with no validation or transformation. It omits whether the created record is returned, what errors look like, and any permission or irreversibility notes.
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?
Two short sentences with the operation type and destination front-loaded and no filler. The external link is compressed rather than inlined as a long URL block or prose.
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 a single required nested-object parameter, no annotations, and no output schema, an agent still lacks the payload fields and the success response shape. The description acknowledges this by deferring to the Holded API reference, which is honest but requires an outbound lookup before the tool can be called 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?
Schema coverage is 100% and the schema already states "Forecast payload, sent verbatim as body," which the description largely repeats. The added value is the external API reference link, which is the only route to the nested object's field semantics since the schema defines no properties.
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?
States a specific verb and resource ("creates an invoicing forecast in Holded cashflow") and flags it as a WRITE, which cleanly separates it from get_invoicing_forecast, list_invoicing_forecasts, update_invoicing_forecast and delete_invoicing_forecast. It stops short of naming those siblings explicitly, so differentiation is implicit in the name.
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 "WRITE:" prefix implies when the tool applies (creating new vs. updating existing forecasts) and the docs pointer tells the agent where to resolve the payload shape, but there is no explicit statement of prerequisites, when-not-to-use, or a named alternative such as update_invoicing_forecast.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_ledger_entryA
WRITE: creates a real journal entry in Holded accounting (API v2). Incorrect entries directly distort the company books β double-check accounts and amounts. data is sent verbatim as the request body β see https://www.holded.com/es/desarrolladores/referencia-api (Contabilidad β Crear asiento).
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | Journal entry payload, sent verbatim as body |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose the key traits: it is a real write to production books, incorrect entries distort the company accounts, and the payload is forwarded verbatim. Missing are idempotency/duplicate behavior, auth or scope requirements, and what the call returns on failure.
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?
Three short sentences, front-loaded with the WRITE verb and the consequence warning immediately after. No filler, and the external reference is the last item where it belongs.
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 write tool with a nested unstructured body, no annotations and no output schema, the description covers risk and payload handling but leaves the actual body shape entirely to an external URL. An agent cannot construct a valid entry from the definition alone, which is a meaningful gap.
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 100% and there is only one parameter, so the baseline is 3. The description does add genuine meaning by stating the object is sent verbatim as the request body and pointing to the official endpoint reference for field structure, but it never enumerates or constrains the nested fields an agent must supply.
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?
Names a specific verb and resource (creates a journal entry), pins the target system and API version, and prefixes with an explicit WRITE marker that separates it from read-side siblings like list_ledger_entries. Nothing about intent is ambiguous.
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 conveys the context (booking a journal entry in Holded accounting) and warns to double-check accounts and amounts, but never states when to prefer this over alternatives or what prerequisites exist β e.g. whether accounts must exist first via list_accounting_accounts, or how it relates to list_ledger_entries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_numbering_serieC
Create a new numbering serie (Holded API v2)
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Serie name | |
| prefix | No | Serie prefix | |
| docType | Yes | Document type | |
| nextNumber | No | Next number in the serie |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden, yet it says nothing about side effects, whether serie names must be unique per docType, what happens on conflict, or what permissions are required. Only the word "Create" signals a mutation, which the tool name already conveys.
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?
It is a single short sentence, but it is under-specified rather than efficient β there is no front-loaded detail an agent could act on and the parenthetical adds no operational 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 four-parameter mutation tool with no annotations and no output schema, the description should at minimum explain what is created and any constraints or return shape. It provides none of that, leaving the agent to rely solely on schema field names.
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 100%, with all four parameters (name, prefix, docType, nextNumber) documented in the schema including a full enum for docType. The description adds no semantics beyond that, so the baseline of 3 applies.
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 a verb and resource ("Create a new numbering serie"), so the basic action is identifiable, but it adds nothing beyond what the tool name already says and does not distinguish it from siblings such as get_numbering_series, update_numbering_serie, or delete_numbering_serie. The parenthetical "(Holded API v2)" is provenance, not purpose.
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 create a serie versus updating an existing one, no mention of prerequisites (e.g., that docType determines which documents the serie applies to), and no reference to any alternative tool. The agent must infer usage entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_paymentC
Create a new payment (Holded API v2)
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Days until due | |
| name | Yes | Payment method name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries the full burden, yet it only names the API version (v2). It says nothing about whether duplicates are rejected, what permissions are required, whether the created entity is immediately visible to list_payments, or what the response contains.
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?
It is a single short sentence with no waste and the resource is front-loaded, but the brevity comes at the cost of under-specification rather than efficient density. The "(Holded API v2)" parenthetical is the only content beyond the title.
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 two-parameter mutation tool with no annotations and no output schema, the description should at minimum disambiguate the entity created and note mutation/auth behavior. Neither is present, leaving the agent dependent entirely on the schema.
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 100%, so the baseline is 3: both parameters ("name", "days") are documented inline. The description adds no extra meaning, and notably does not resolve the conflict between "payment" in the description and "Payment method name" in the schema.
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 verb+resource is stated ("Create a new payment"), which is more than a tautology, but the term "payment" is ambiguous against the schema, which describes a payment *method* (required field is "Payment method name", plus "days until due"). No distinction is drawn from siblings like update_payment, list_payments, or list_payment_methods, so an agent cannot confidently tell which entity is being created.
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 when-to-use guidance, no prerequisite or permission context, and no named alternative. With siblings including list_payment_methods, update_payment, and get_document_payments, the agent is left to guess whether this creates a payment record or a payment method.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_productC
Create a new product (Holded API v2)
| Name | Required | Description | Default |
|---|---|---|---|
| sku | No | Product SKU | |
| tax | No | Tax percentage | |
| kind | No | Product kind | |
| name | Yes | Product name | |
| price | No | Product price | |
| stock | No | Initial stock quantity | |
| barcode | No | Product barcode | |
| costPrice | No | Cost price | |
| description | No | Product description |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden and delivers almost nothing. It does not state that only 'name' is required, what happens if the SKU already exists, whether the call is idempotent, what permissions are required, or what the response contains. 'Create' implies mutation but nothing else is disclosed.
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?
A single short sentence with the verb front-loaded and zero waste. Efficiency here comes at the cost of substance, but structurally it is clean and not padded.
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 9 parameters, no annotations, and no output schema, the description should do meaningful work. It omits the required-parameter constraint, default behavior for stock/price/tax, and the return value shape β leaving an agent to reverse-engineer semantics from the schema alone before a mutating call.
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 100% β all nine properties carry inline descriptions including the product/service enum for 'kind'. The description adds no additional meaning beyond the schema, so baseline 3 applies. It could have added value by highlighting that only 'name' is mandatory.
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?
States a specific verb and resource: 'Create a new product'. An agent knows immediately what the tool does. However, it does nothing to distinguish itself from siblings like update_product, list_products, or create_service, which share the same product domain.
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 on when to use this versus update_product, create_service, or list_products. The parenthetical '(Holded API v2)' is provenance, not usage direction. The agent has to infer everything from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_salary_recordA
WRITE: creates a real payroll record in Holded (API v2) β affects accounting and HR data. Use get_salary_record_defaults first to obtain a valid base payload. data is sent verbatim as the request body β see https://www.holded.com/es/desarrolladores/referencia-api (Registros de nΓ³mina β Crear).
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | Salary record payload, sent verbatim as body |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose the key trait: the call writes a real payroll record affecting accounting and HR data, and `data` is sent verbatim. It leaves out auth/permission requirements, error behavior on invalid payloads, and what the response returns, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short clauses, front-loaded with the WRITE marker and the highest-stakes fact (real payroll/accounting impact), followed by the prerequisite and the payload pointer. Nothing is redundant.
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 mutation tool with a free-form nested body, no annotations and no output schema, the description covers impact, prerequisite, and where to find the payload spec. Missing only response/return behavior and permission scope to be fully complete.
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 100%, so baseline is 3, and the description adds real value by explaining the single param is passed verbatim as the request body and by pointing to the external API reference and defaults tool for the nested object's expected shape β something the flat schema cannot express.
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 a specific verb and resource ('creates a real payroll record in Holded') plus the API version, and the 'WRITE' prefix makes the mutating nature unmistakable against read siblings like get_salary_record or list_salary_records.
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 names a prerequisite path β 'Use get_salary_record_defaults first to obtain a valid base payload' β which routes the agent to the right sibling before calling. It doesn't spell out the create-vs-update decision, but the verb plus the defaults prerequisite gives clear context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_sales_channelC
Create a new sales channel (Holded API v2)
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Sales channel name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden and does not meet it. It doesn't state whether the name must be unique, whether duplicates are rejected or merged, what permissions are needed, or whether the created channel is returned with an ID.
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?
A single short sentence with no padding, though the parenthetical '(Holded API v2)' is metadata rather than guidance an agent needs to select or call the tool.
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 mutation tool with no annotations and no output schema. The description should say what a successful call yields (e.g. the new channel's ID) and any constraints on the name, and it says neither.
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 100% and there is only one parameter, 'name', which the schema already documents as 'Sales channel name.' The description adds no semantics beyond that, so the baseline 3 applies.
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?
States a specific verb and resource: 'Create a new sales channel.' The create/list/get/update/delete siblings are distinguished by name alone, so the description doesn't need to do that work, but it also adds nothing beyond the name itself.
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 indication of when to use this versus update_sales_channel or how it relates to list_sales_channel. No prerequisites, no duplicate-handling guidance, no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_serviceC
Create a new service (Holded API v2)
| Name | Required | Description | Default |
|---|---|---|---|
| sku | No | Service SKU | |
| tax | No | Tax percentage | |
| name | Yes | Service name | |
| price | No | Service price | |
| description | No | Service description |
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 does not disclose what happens on duplicate names/SKUs, whether the call is idempotent, what permissions are needed, or what the response contains β significant gaps for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no padding; the '(Holded API v2)' parenthetical is the only near-wasted token. Brevity here reflects terseness rather than sprawl.
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 should do more for a five-parameter mutation tool with no annotations and no output schema. It never says what is returned (e.g., the created service with its id) or which fields matter most, leaving the agent to infer the post-call state.
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 100%, so all five fields (name, sku, tax, price, description) are already documented in the schema. The description adds no meaning beyond that; baseline 3 is appropriate.
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 a specific verb and resource ('Create a new service'), which is enough to distinguish it from list_services, get_service, update_service and delete_service by verb alone. Sibling differentiation is implicit rather than explicit, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 instead of update_service or create_product, no prerequisites, and no note about required permissions. The only routing signal is the verb 'create'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_treasuryC
Create a new treasury account (Holded API v2). Overlaps with list_bank_accounts/get_bank_account/create_bank_account (official treasury tools); consolidation planned for 2.1.
| Name | Required | Description | Default |
|---|---|---|---|
| bic | No | BIC/SWIFT code | |
| iban | No | IBAN number | |
| name | Yes | Treasury account name | |
| balance | No | Initial balance |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden. It says 'create' (a mutation) but omits required permissions, duplicate-name behavior, whether an initial balance impacts anything downstream, and what the call returns β the only extra context is the API version tag.
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 purpose sentence is front-loaded and efficient, but the second sentence is internal roadmap/consolidation commentary that doesn't help the agent call the tool correctly, weakening the 'every sentence earns its place' test.
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 four-parameter mutation tool with no annotations and no output schema, the description should cover side effects, return shape, and failure modes. It covers none of these, leaving the agent without what it needs to invoke confidently.
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 100% and all four fields (bic, iban, name, balance) are documented in the schema itself. The description adds no parameter meaning beyond that, so baseline 3 applies.
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?
States a specific verb+resource: 'Create a new treasury account', plus API provenance (Holded API v2). It names the overlapping siblings (list_bank_accounts/get_bank_account/create_bank_account), so an agent can see potential alternatives, though it doesn't resolve which to prefer.
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 overlap note flags that alternatives exist but gives no condition for choosing this tool over create_bank_account, nor any prerequisites. 'Consolidation planned for 2.1' is internal roadmap trivia, not when-to-use guidance, and arguably leaves the agent more uncertain about which tool to pick.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_warehouseC
Create a new warehouse (Holded API v2)
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | City | |
| name | Yes | Warehouse name | |
| address | No | Warehouse address | |
| country | No | Country | |
| province | No | Province | |
| postalCode | No | Postal code |
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 and it drops it: nothing about what the call returns, whether the name must be unique, what happens on duplicate/permission errors, or which fields are optional beyond the schema's `required` list. Only "Create" hints that this is a mutation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the parenthetical API version is mild overhead but not wasteful. Efficient, though it is efficient at saying very little.
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 mutation tool with no annotations and no output schema, the definition should say what a successful create yields (an id? the full warehouse object?) and any constraints on the name. Those gaps are not covered anywhere else in the structured data.
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 100% with six plainly named fields (name required, address fields optional), so the schema does the parameter work. The description adds no semantics beyond it β no format hints for country/province/postalCode or whether name collisions are rejected.
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?
Names a specific verb and resource ("Create a new warehouse") plus the backing API version. The CRUD naming and the presence of update_warehouse/delete_warehouse siblings make the intent unambiguous, though the description never names those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No statement of when to use this versus update_warehouse, create_product, or the other create_* tools, and no prerequisites (auth, account scope, whether the warehouse must be unique by name). The agent must infer usage from the verb alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_bank_accountA
DESTRUCTIVE: permanently deletes a treasury bank account in Holded (API v2). Prefer archive_bank_account to keep history. This cannot be undone.
| Name | Required | Description | Default |
|---|---|---|---|
| accountId | Yes | Bank account ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full safety burden and does so well by labeling the tool DESTRUCTIVE and stating that the deletion cannot be undone. It stops short of explaining side effects on related records such as bank movements, but the core irreversibility warning is explicit.
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 three short sentences with no wasted text. It front-loads the destructive warning and immediately follows with the safer alternative.
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 simple one-parameter delete operation with no output schema, the description contains everything needed: what it deletes, that it is permanent, and which safer sibling to use instead. No critical context is missing for correct tool selection.
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?
There is only one parameter and schema description coverage is 100%, so the schema already defines accountId sufficiently. The description does not add format or behavioral detail about the identifier beyond what the schema provides, which matches the baseline for high schema coverage.
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 gives a specific verb and resource: permanently deletes a treasury bank account in Holded. It also distinguishes this tool from the sibling archive_bank_account, so an agent can tell exactly what this operation is for.
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 routes the agent toward the safer alternative: prefer archive_bank_account to keep history. This makes the when-to-use-this-vs-alternative decision clear without needing to infer it from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_contactC
Delete a contact (Holded API v2)
| Name | Required | Description | Default |
|---|---|---|---|
| contactId | Yes | Contact ID to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description alone must carry the full behavioral burden for a destructive operation, but it only repeats the action verb. It does not say whether deletion is permanent or soft, what happens to associated documents or attachments, or whether confirmation is required. Because it does not contradict anything, this is 2 rather than 1.
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 short phrase with the action front-loaded and no wasted words. It is efficient, though its brevity leaves required context uncovered rather than including too much.
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 destructive mutation with no annotations and no output schema, the description is too thin. It omits permission requirements, irreversibility, side effects on related records, and the expected response. This is not enough for an agent to invoke the tool safely.
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 100%, so the single contactId parameter is already fully documented. The description adds nothing about the ID format or its source. A baseline of 3 applies because the schema does the documentation work.
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 a specific verb and resource: "Delete a contact." This is distinct from siblings like delete_contact_group or delete_product because it names the target resource explicitly. It does not, however, explain how it differs from those adjacent delete tools, which keeps it from a 5.
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 gives no guidance on when to use this tool, what prerequisites apply (such as the contact existing), or what alternatives exist. There is no warning that deletion is permanent, and no instruction on verifying the contact ID first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_contact_groupC
Delete a contact group (Holded API v2)
| Name | Required | Description | Default |
|---|---|---|---|
| groupId | Yes | Contact group ID to delete |
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 not state whether deletion is permanent, what happens to associated contacts, or what permissions are required. For a destructive operation, this is a significant gap.
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 short sentence with no wasted words and is front-loaded. It could be slightly more informative without sacrificing conciseness, but it is appropriately sized.
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 destructive tool with no annotations and no output schema, the description lacks essential context such as irreversibility, side effects, or error conditions. It is incomplete for an agent to call it safely.
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 provides 100% description coverage for the single 'groupId' parameter, so the baseline is 3. The description adds no additional meaning beyond what the schema already documents.
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 a specific verb and resource ('Delete a contact group'), making the action unambiguous. It does not explicitly differentiate from siblings like update_contact_group, but the intent is clear from the name alone.
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, no mention of prerequisites, and no indication of when deletion is appropriate. The description merely restates the action.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_documentC
Delete a document
| Name | Required | Description | Default |
|---|---|---|---|
| docType | Yes | Type of document | |
| documentId | Yes | Document ID to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description only states the obvious destructive nature of the operation, without disclosing any side effects, permanence, or authorization requirements. With no annotations, more behavioral context is needed.
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?
While extremely short, the description fails to provide useful information beyond the tool name, making it insufficiently informative for its length.
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 lack of annotations and output schema, the description does not adequately explain the implications of deletion (e.g., reversibility, effects on related data), leaving the agent underinformed.
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 100% and the schema already describes both parameters. The description adds no additional meaning, so the baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description 'Delete a document' is a tautology that merely restates the tool name, with no additional specificity about the document types involved that could distinguish it from similar delete tools for other entities.
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 to use this tool versus alternatives, such as prerequisites, required permissions, or conditions for deletion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_employeeA
DESTRUCTIVE: permanently deletes an employee record in Holded (API v2). This cannot be undone.
| Name | Required | Description | Default |
|---|---|---|---|
| employeeId | Yes | Employee ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does well: it declares destruction, permanence, and irreversibility upfront. It does not mention permission requirements or side effects on related records (e.g., salary records, time entries), which keeps it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero padding, and the destructive warning is front-loaded so the agent sees the risk before anything else.
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 single-parameter destructive tool with no output schema, the essential information (permanent, irreversible, scoped to an employee record) is present. Missing only ancillary details such as authorization needs or downstream effects on linked records.
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?
There is only one parameter and schema description coverage is 100%, so the schema already documents employeeId. The description adds no format hints or constraints beyond that, so the baseline of 3 applies.
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 uses a specific verb (permanently deletes) and resource (an employee record in Holded, API v2), so it is clearly differentiated from temporal siblings like delete_employee_time. It stops short of explicitly contrasting itself with sibling deletion tools, but the resource is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states that the operation is destructive and irreversible, but gives no guidance on when to choose this over alternatives such as update_employee for deactivation, nor any prerequisites. The agent has to infer usage context entirely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_employee_timeA
DESTRUCTIVE: permanently deletes a time-tracking record in Holded (API v2). This cannot be undone.
| Name | Required | Description | Default |
|---|---|---|---|
| timeId | Yes | Time record ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full load and does disclose the most important behavioral trait: the operation is destructive and irreversible. It also names the target system and API version. It omits what permissions are required and what happens to records on failure, so it is strong but not complete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, with the destructive nature front-loaded before the resource and the irreversibility caveat. Nothing is redundant.
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 single-parameter delete with no output schema, the description covers the essential facts: what is deleted, that it is permanent, and which system it applies to. Missing only secondary detail such as permission requirements or behavior on an invalid ID.
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 100% description coverage for the single timeId parameter, so the baseline is 3. The description's phrase 'time-tracking record' adds a small amount of framing but no format, source, or lookup guidance beyond what the schema already says.
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?
States a specific verb (permanently deletes) and resource (a time-tracking record in Holded), which cleanly separates it from get_employee_time, update_employee_time, and list_employee_times. It does not explicitly name a sibling it should be preferred over, but the delete semantics make the distinction obvious.
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 word DESTRUCTIVE and the irreversibility warning imply caution, but the description gives no explicit guidance on when to delete versus update or archive a time record, and names no alternatives. Usage is inferred from the verb rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_expenses_accountC
Delete an expenses account (Holded API v2)
| Name | Required | Description | Default |
|---|---|---|---|
| accountId | Yes | Expenses account ID to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden for a destructive mutation. Beyond the word 'Delete', it discloses nothing about irreversibility, required permissions, failure modes for accounts in use, or confirmation 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?
A single short sentence with the verb and resource front-loaded and no filler; the '(Holded API v2)' parenthetical is minor but harmless. It is terse rather than padded.
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 one-parameter tool with a fully documented schema and no output schema, the structural information is adequate. However, as an unannotated destructive operation it should say more about consequences and error conditions before an agent commits to calling it.
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 100% with a single well-described `accountId` parameter, so the baseline is 3. The description adds no extra meaning (e.g., where to obtain the ID), leaving the schema to do all the work.
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 a specific verb+resource ('Delete an expenses account'), which is unambiguous and lets an agent distinguish it from the list/create/get/update_expenses_account siblings. It doesn't explicitly name those alternatives, but the operation is clear from the name and description.
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 on when to use this versus the other expenses-account tools, no prerequisites, and no mention of what happens if the account still has movements or associations. The agent must infer the whole usage context from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_invoicing_forecastA
DESTRUCTIVE: permanently deletes an invoicing forecast in Holded cashflow (API v2).
| Name | Required | Description | Default |
|---|---|---|---|
| forecastId | Yes | Forecast ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose the single most important trait: the deletion is permanent and cannot be undone. It omits everything else an agent needs β whether linked cashflow records cascade, error behavior for a missing/invalid forecastId, and what (if anything) is returned.
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?
One front-loaded sentence that leads with the destructive warning β the highest-value information for an agent deciding whether to call it. Zero padding.
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?
Small surface area (one required param, no output schema, no nesting) means little needs explaining, and the irreversibility warning is the crucial piece. Slightly short of complete because it says nothing about failure modes or outcome, which matter for a destructive operation with no annotations.
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?
Only one parameter (forecastId) and schema description coverage is 100%, so the schema already documents it fully; this is the baseline case. The description adds no format hints (e.g. ID shape) or guidance on obtaining the ID from list_invoicing_forecasts, so it does not exceed the schema.
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?
Specific verb + resource: 'permanently deletes an invoicing forecast' plus the domain 'Holded cashflow (API v2)'. An agent can distinguish it from get_invoicing_forecast / update_invoicing_forecast / list_invoicing_forecasts by name alone, though the description never explicitly routes to those 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?
Usage is only implied: the delete verb plus the 'DESTRUCTIVE' prefix signal caution, but there is no explicit when-to-use vs. when-not guidance, no mention of the alternative (e.g. update_invoicing_forecast to modify rather than remove), and no prerequisites such as required permissions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_numbering_serieC
Delete a numbering serie (Holded API v2)
| Name | Required | Description | Default |
|---|---|---|---|
| docType | Yes | Document type | |
| serieId | Yes | Serie ID to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full behavioral burden and largely defaults to it. It does not state that the operation is irreversible, whether deletion fails when documents reference the series, what error shape to expect, or what permissions are required. The 'Holded API v2' suffix is citation, not behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the verb first and no filler; it is easy to parse. The parenthetical API version adds little, but nothing is padded or buried.
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 destructive two-parameter mutation with no annotations and no output schema, the description should say more about consequences and failure modes. An agent knows what it deletes but not what it risks or what it will get back.
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 100% and both parameters are documented in the schema, including an 11-value enum for docType, so the baseline of 3 applies. The description adds no meaning beyond the schema β it does not explain why the document type must accompany the serie id or how the pair is scoped.
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?
Specific verb (Delete) plus specific resource (numbering serie), and the (Holded API v2) tag scopes the API generation. It is clearly distinguishable from get/create/update_numbering_serie siblings by the verb alone, but the description never names or contrasts those alternatives.
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 when-to-use, when-not-to-use, or prerequisite guidance. There is no warning about deleting a series that may be assigned to documents, and no pointer to the safer siblings (get_numbering_series, update_numbering_serie) for callers who only want to inspect or modify.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_paymentC
Delete a payment (Holded API v2)
| Name | Required | Description | Default |
|---|---|---|---|
| paymentId | Yes | Payment ID to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, and it discloses almost nothing. It conveys only that the operation is destructive; there is no mention of irreversibility, required permissions, side effects on linked documents/ledger entries, or error behavior for a nonexistent or in-use payment.
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?
A single short sentence with the verb front-loaded and zero filler. It is efficient, though the brevity borders on under-specification for a destructive operation.
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 destructive tool with no annotations and no output schema, the description should warn about irreversibility and downstream effects (e.g., on documents or ledger entries). Those are absent, leaving an agent unable to assess risk before calling it.
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?
With a single required parameter at 100% schema description coverage, the schema fully documents paymentId. The description adds no format, ID-source, or validation detail beyond that, so baseline 3 applies.
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?
States a specific verb and resource ("Delete a payment") with API version context, which clearly separates it from siblings like update_payment, get_payment, list_payments, and delete_document. It does not explicitly name any sibling as an alternative, but the distinction is unambiguous from the verb.
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 on when to use this versus update_payment, delete_document, or other payment operations, and no preconditions stated (e.g., whether a payment linked to a document can be deleted). The agent must infer everything from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_productC
Delete a product (Holded API v2)
| Name | Required | Description | Default |
|---|---|---|---|
| productId | Yes | Product ID to delete |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden, yet only the verb "Delete" implies destructiveness β information already in the name. It says nothing about irreversibility, required permissions, or side effects on related images, stock, or documents that reference the product.
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?
A single short clause with the action front-loaded and zero filler. Its brevity is efficient, though it borders on under-specification for a destructive operation.
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 destructive, non-annotated tool with no output schema, the description is too thin β it omits permanence warnings, failure conditions, and what happens to dependent resources. An agent could invoke it correctly but without understanding the consequences.
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 single parameter is fully documented in the schema (100% coverage, "Product ID to delete"). The description adds no format, sourcing, or lookup guidance, so baseline 3 applies.
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?
States a specific verb and resource ("Delete a product"), which is unambiguous. However, it offers no differentiation from siblings like delete_service, delete_document, or delete_warehouse, and the "(Holded API v2)" tag is provenance rather than disambiguation.
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 on when to use this versus update_product, or archived alternatives. No prerequisites stated, such as whether the product must have no pending documents or stock before deletion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_salary_recordA
DESTRUCTIVE: permanently deletes a payroll record in Holded (API v2). This cannot be undone and affects accounting data.
| Name | Required | Description | Default |
|---|---|---|---|
| salaryRecordId | Yes | Salary record ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well by disclosing permanence, irreversibility, and impact on accounting data. It stops short of mentioning permission requirements, related-record side effects, or the return value, which would push it to a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the critical 'DESTRUCTIVE' tag, no wasted words, and essential warnings immediately visible.
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 simple one-parameter delete tool with no output schema or annotations, the description covers the critical safety profile (destructive, irreversible, affects accounting). It could mention return behavior or auth requirements, but is nearly complete.
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 100% and the single parameter (salaryRecordId) is documented in the schema. The description adds no extra meaning about the ID's format or source, so the baseline of 3 applies.
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 a specific verb (permanently deletes) and a specific resource (payroll record), with additional context (Holded API v2). This clearly distinguishes it from siblings like delete_employee_time or update_salary_record.
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 'DESTRUCTIVE' warning and 'cannot be undone' imply caution, suggesting the tool should be used only for permanent removal. However, it does not explicitly state when to use this versus update_salary_record or other siblings, nor does it name alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_sales_channelC
Delete a sales channel (Holded API v2)
| Name | Required | Description | Default |
|---|---|---|---|
| channelId | Yes | Sales channel ID to delete |
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 says 'delete' but does not disclose whether deletion is permanent or reversible, what permissions or scopes are required, what happens to dependent records, or what an error looks like β all critical for a destructive operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single terse sentence with no wasted words, and the verb plus resource are front-loaded. It is arguably too brief rather than padded, so the structure itself is efficient.
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 destructive single-parameter tool with no annotations and no output schema, the description should at minimum mention irreversibility, required permissions, or failure behavior. None of that is present, leaving the agent under-informed about the consequences of calling it.
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 single parameter is fully documented in the schema (ID of the sales channel to delete) at 100% coverage. The description adds no extra meaning such as ID format or where to obtain the ID, so baseline 3 applies.
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?
States a specific verb (delete) and resource (sales channel) plus API version context, so the action is unambiguous. It does not explicitly distinguish itself from siblings like list_sales_channel, create_sales_channel, or update_sales_channel, though the verb makes the intent obvious.
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 versus the other sales_channel tools, no prerequisites stated, and no caveats about when deletion is appropriate. The agent must infer everything from the tool name and schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_serviceC
Delete a service (Holded API v2)
| Name | Required | Description | Default |
|---|---|---|---|
| serviceId | Yes | Service ID to delete |
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 and falls well short. It does not say whether deletion is permanent or reversible, what happens if the service is referenced by invoices, whether confirmation or elevated permissions are required, or what a successful response looks like.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One short, front-loaded sentence with no filler. Its brevity is efficient rather than padded, though it is arguably too thin to be maximally useful.
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 destructive mutation with no annotations, no output schema, and no explanation of failure modes or consequences. For a delete operation, the description should disclose far more than it does.
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?
There is a single parameter at 100% schema description coverage ('Service ID to delete'), so the schema already fully documents it. The description adds no meaning beyond that, making the baseline 3 appropriate.
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?
States a specific verb and resource ('Delete a service'), which distinguishes it cleanly from create_service, update_service, get_service and list_services in the sibling list. The API version tag adds identifying context, though no explicit sibling routing is given.
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 versus update_service or the other lifecycle operations, and no preconditions such as whether the service must be unused by documents. The agent must infer everything about appropriate timing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_warehouseC
Delete a warehouse (Holded API v2)
| Name | Required | Description | Default |
|---|---|---|---|
| warehouseId | Yes | Warehouse ID to delete |
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 of behavioral disclosure for a destructive mutation. It says nothing about irreversibility, required permissions, what happens to associated stock records (list_warehouse_stock exists), or whether the call fails if the warehouse is in use.
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 sentence is short and front-loaded with the action and resource, with no filler. Its brevity is not bloated, though the parenthetical API-version tag contributes little.
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 destructive, non-annotated tool with no output schema, the description should at minimum confirm the effect and any caveats. Instead it offers a four-word restatement, leaving the agent without the information needed to call it safely.
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 100% for the single warehouseId parameter, so the schema already explains the input. The description adds no format hints (ID shape, where to obtain it) beyond what the schema provides, making the baseline 3 appropriate.
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?
"Delete a warehouse" names a verb and a resource, but it is essentially a restatement of the tool name with an API-version tag appended. It gives no scope details (hard vs soft delete, what a warehouse represents in Holded) and does not distinguish it from the sibling delete_* tools beyond the resource noun.
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 when-to-use guidance, no prerequisites, and no mention of alternatives such as update_warehouse or list_warehouses for verifying the target first. The agent must infer everything from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_bank_accountB
Get a treasury bank account by ID (Holded API v2).
| Name | Required | Description | Default |
|---|---|---|---|
| accountId | Yes | Bank account ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. 'Get' implies a read operation, but the description says nothing about permissions, error behavior when the ID is missing, or what information is returned.
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 front-loaded sentence with no wasted words. It is appropriately sized for a simple one-parameter retrieval tool.
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 simple get-by-ID tool, the description is minimally adequate. However, with no annotations and no output schema, it could usefully clarify what is returned or how missing accounts are handled.
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 100%, so the single accountId parameter is already documented as 'Bank account ID'. The description adds only the phrase 'by ID', which confirms the parameter's role but contributes no format or syntax detail beyond the schema.
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 a specific verb and resource ('Get a ... bank account') and scopes it to retrieval 'by ID'. This implicitly separates it from the list/create/update/delete bank-account siblings, though calling it a 'treasury bank account' slightly blurs the line with the separate treasuries tools.
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 when-to-use guidance, no statement of prerequisites, and no mention of alternatives such as list_bank_accounts. The phrase 'by ID' weakly implies the required input but does not tell the agent when this tool is the right choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_chart_of_accountsA
Get accounting accounts (Holded API v2, GET /accounting-accounts). Returns every account with num (PGC number, e.g. 40000000), name, group, debit, credit, and balance. Unlike list_expenses_accounts (group-6 only), this includes all groups (assets, liabilities, income, expenses). Cursor-paginated: pass nextCursor from the previous response as cursor. Optional annex filters: archived (include archived accounts), start_date/end_date (ISO 8601, filter by activity period), include_empty (include zero-balance accounts). See also: list_accounting_accounts in ledger tools β both tools target the same v2 endpoint; consolidation is planned for release 2.1. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max items per page | |
| cursor | No | Cursor token from a previous response nextCursor | |
| archived | No | Include archived accounts (default: false) | |
| end_date | No | Filter end date (ISO 8601, YYYY-MM-DD) | |
| start_date | No | Filter start date (ISO 8601, YYYY-MM-DD) | |
| include_empty | No | Include zero-balance accounts (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and does so well: it declares the tool read-only, explains cursor pagination, describes the returned account fields, and clarifies that all account groups are included. It stops short of covering auth requirements or rate limits, but the core behavior is disclosed.
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 front-loaded with the purpose and return shape, then moves into pagination, filters, and sibling notes. Most sentences earn their place; the consolidation note is slightly extraneous but useful for disambiguating a duplicate tool.
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 six-parameter read-only list tool with no output schema, the description is complete enough: it describes return fields, pagination handling, optional filters, account-group scope, read-only behavior, and sibling alternatives.
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 100%, so the baseline is 3. The description adds meaning beyond the schema by explaining that `start_date`/`end_date` filter by activity period, that `include_empty` includes zero-balance accounts, and that `cursor` should be taken from the previous response's `nextCursor`.
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 a specific verb and resource ('Get accounting accounts'), identifies the underlying API endpoint, and lists the returned fields. It also explicitly distinguishes this tool from the sibling `list_expenses_accounts` by noting that this one includes all account groups rather than group-6 only.
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 gives a clear contrast with `list_expenses_accounts` and explains that the tool covers all groups. It also names `list_accounting_accounts` as a same-endpoint alternative and mentions planned consolidation, though it does not fully tell the agent which duplicate to choose in practice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_contactB
Get a specific contact by ID (Holded API v2)
| Name | Required | Description | Default |
|---|---|---|---|
| contactId | Yes | Contact ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, yet it discloses almost nothing beyond the operation itself. It is silent on error behavior for unknown IDs, authentication needs, and what a returned contact includes; the only added context is an API version tag.
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?
A single front-loaded sentence with no wasted words; the operation and its selector appear immediately. The parenthetical API version is a minor extra but costs nothing.
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 one-parameter getter with full schema coverage this is close to sufficient, but with no output schema the description could have indicated what a contact record contains or what happens on a bad ID. It is minimally viable rather than complete.
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 100% for the single contactId parameter, so the schema already documents it fully. The description's "by ID" merely restates the schema and adds no format or sourcing detail (e.g., where to obtain a contactId).
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?
States a specific verb and resource ("Get a specific contact") and adds the selector ("by ID"), which implicitly separates it from the sibling list_contacts. It does not explicitly name its siblings, but the single-record-by-ID scope is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the agent must infer that this tool is for when a contactId is known and that list_contacts is the alternative for discovery. No explicit when-to-use or when-not-to-use guidance is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_contact_attachmentA
Get a specific attachment from a contact by filename (Holded API v2). BREAKING CHANGE from v1: the path parameter changed from attachmentId (numeric/UUID) to filename (string). Obtain filenames from list_contact_attachments first.
| Name | Required | Description | Default |
|---|---|---|---|
| filename | Yes | Attachment filename as returned by list_contact_attachments | |
| contactId | Yes | Contact ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the entire behavioral burden. It discloses the v1-to-v2 signature change, but says nothing about what the call returns (file bytes vs. metadata), whether the attachment is downloaded or merely referenced, or what happens on an unknown filename β significant gaps for a fetch tool with zero annotation coverage.
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?
Three short sentences, front-loaded with the core action and the alternative tool. The breaking-change note is marginally tangential for an agent with no v1 context, but it is compact and does not bloat the definition.
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?
Both required parameters are documented and the prerequisite tool is named, which is enough to invoke it. However, with no output schema and no annotations, the description leaves the return value and error semantics unstated β the main remaining deficiency for a simple two-parameter fetch.
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 100%, so both parameters are already documented, including that filename comes from list_contact_attachments. The description's note that filename is the path parameter and the historical change from attachmentId adds minor context but largely repeats the schema.
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?
States a specific verb+resource (get a specific attachment from a contact) narrowed by an explicit lookup key (filename), and names the sibling list_contact_attachments that produces that key. This lets an agent distinguish it from the listing tool without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete ordering requirement: 'Obtain filenames from list_contact_attachments first,' which routes the agent to the sibling tool. It doesn't state failure behavior or when this tool should not be used (e.g., missing contact), so it stops short of full when/when-not coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_contact_groupB
Get a specific contact group by ID (Holded API v2)
| Name | Required | Description | Default |
|---|---|---|---|
| groupId | Yes | Contact group ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden, and it discloses almost nothing beyond 'Get' β no statement on read-only safety, permission requirements, or what happens when the ID is unknown. 'Holded API v2' is provenance, not 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?
A single front-loaded sentence with the resource named first and no filler. It is terse to the point of thinness, but nothing is wasted.
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 one-parameter read lookup with full schema coverage and no output schema, this is minimally sufficient to call the tool. It is missing the returned-object note and error behavior that would make it fully self-contained.
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 100%, so the schema already describes groupId fully. The description's 'by ID' adds only a mild restatement of the required key; baseline 3 applies.
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?
States a specific verb and resource ('Get a specific contact group') plus the lookup key ('by ID'), which sets it apart from sibling list_contact_groups. It never explicitly names siblings, but the singular/plural distinction is inferable from the wording.
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?
Usage is only implied: the agent gathers that this is the ID-based lookup rather than the list endpoint. There is no explicit statement of when to prefer it over list_contact_groups, nor any prerequisite or failure guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_daily_ledgerA
Get ledger entries / journal (asientos) for a date range (Holded API v2, GET /ledger-entries). Returns one row per ledger line with entryNumber, line, timestamp, type (collect/payment/purchase/β¦), description, account (PGC num), debit, and credit. This is the authoritative source for balance-sheet and tax-return figures.
Date arguments (at least one form of each bound is required β the v2 API returns 422 without both):
β’ Primary form : start_date / end_date β ISO 8601 date strings (YYYY-MM-DD)
β’ Legacy form : starttmp / endtmp β Unix timestamps in seconds; converted automatically to ISO
If both forms are supplied for the same bound, the ISO string takes precedence.
Cursor-paginated: pass nextCursor from a previous response as cursor to retrieve subsequent pages. Large date ranges may require multiple pages. Set groupByEntry to nest lines into full double-entry entries with per-entry debit/credit totals (applied page-scoped).
See also: list_ledger_entries in ledger tools β both tools target the same v2 endpoint. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max items per cursor page (server-paginated; use limit to control page size) | |
| cursor | No | Cursor token from a previous response nextCursor | |
| endtmp | No | Range end as a Unix timestamp in seconds (legacy form, converted to ISO). Use end_date when possible. | |
| end_date | No | Range end as an ISO 8601 date (YYYY-MM-DD, inclusive). Required unless endtmp is provided. | |
| starttmp | No | Range start as a Unix timestamp in seconds (legacy form, converted to ISO). Use start_date when possible. | |
| start_date | No | Range start as an ISO 8601 date (YYYY-MM-DD, inclusive). Required unless starttmp is provided. | |
| groupByEntry | No | Group lines by entryNumber into full journal entries (each with totalDebit/totalCredit), applied to the current page. Default: false (flat lines) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden and does so: it declares the tool read-only, warns the v2 API returns 422 without both bounds, documents automatic timestamp conversion and ISO precedence, and flags that `groupByEntry` is applied page-scoped β a genuinely non-obvious caveat.
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?
Front-loads purpose and return shape, then uses a short bulleted block for the date-form rules and a compact paragraph for pagination/grouping. Slightly dense but every sentence carries operational information.
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 7-parameter, no-annotation, no-output-schema tool, the description covers purpose, return fields, required argument combinations, precedence, error behavior, pagination, and the grouping mode. An agent could invoke it correctly without opening the schema.
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 100%, so baseline would be 3, but the description adds real meaning beyond the schema: the dual date-input forms, their precedence order, and the page-scoped nature of `groupByEntry`. Pagination interplay between `limit` and `cursor` is left to the schema.
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?
States a specific verb and resource ('Get ledger entries / journal for a date range') plus the exact API endpoint, and lists the returned fields. It names the sibling `list_ledger_entries` and admits both hit the same endpoint, but never says which to prefer, so differentiation is only partial.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete operational guidance: at least one bound per date form is required, ISO takes precedence over the legacy Unix form, and `cursor`/`nextCursor` drives pagination. It lacks explicit when-to-use guidance against `list_ledger_entries`, which is the one clear gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_documentB
Get a specific document by ID
| Name | Required | Description | Default |
|---|---|---|---|
| docType | Yes | Type of document | |
| documentId | Yes | Document ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are absent, so description must fully disclose behavior. It only says 'Get a specific document by ID' without stating it is read-only, what happens on failure (e.g., 404), or authentication requirements. Minimal behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single short sentence with no superfluous words. Efficient, but could include more information without becoming verbose.
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?
Tool has two required parameters and no output schema. Description lacks details about expected output format, error handling, or any limitations. Incomplete for an agent to fully understand the tool's behavior.
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 100%, so baseline is 3. Description adds no extra meaning beyond what is in the schema; does not explain the enum values of docType or the format of documentId.
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?
Description clearly states the tool retrieves a specific document by ID, using action verb 'Get' and specifying resource 'document'. It differentiates from sibling tools like list_documents (list all) and get_document_pdf (get PDF).
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 on when to use this tool versus alternatives such as get_contact or get_product. Does not mention any prerequisites or context for invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_document_paymentsA
Get the payments registered against a specific document via the Holded API v2 GET endpoint. Returns { documentId, paymentsDetail } when the v2 response includes a paymentsDetail field; otherwise returns the whole document (v2 field name may differ from v1). Unlike list_payments β which is filtered to the ACTIVE fiscal year β this surfaces payments from ANY year, so use it for cross-year payment audits. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| docType | Yes | Type of document | |
| documentId | Yes | Document ID |
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 does declare 'Read-only' and, more valuably, discloses a genuinely non-obvious behavioral trait β the return shape is unstable, yielding `{documentId, paymentsDetail}` only when the v2 response includes that field, otherwise the whole document. It stops short of covering failure modes (invalid docType, missing document, pagination) or auth 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?
Three sentences, front-loaded with the core action and followed by the return-shape caveat and the sibling comparison. The 'via the Holded API v2 GET endpoint' clause is mildly redundant but signals endpoint version, which contextualizes the field-name warning.
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 no output schema and no annotations, the description compensates by explaining the possible return shapes and the read-only nature. Remaining gaps are error behavior and what happens across the 11 document types, but for a two-param read tool it is largely complete.
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 100% and the docType enum is fully enumerated in the schema, so the description adds nothing about parameter meaning beyond what the input schema already provides. Baseline 3 is appropriate when the schema does the heavy lifting.
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?
States a specific verb ('Get') and resource ('payments registered against a specific document'), and explicitly distinguishes itself from the nearest sibling by naming list_payments and its fiscal-year restriction. An agent can tell exactly what this returns without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Names the alternative (list_payments), states the differentiating condition (list_payments is scoped to the ACTIVE fiscal year; this spans ANY year), and gives a concrete use case ('cross-year payment audits'). That is the routing decision an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_document_pdfA
Get the PDF of a document as base64-encoded binary (Holded API v2). Returns { contentType, base64, bytes, filename }. Supported docTypes: invoice, salesreceipt, creditnote, receiptnote, estimate, proform, salesorder, waybill, purchaseorder. purchase is NOT supported β GET /purchases/{id}/pdf returns 404 for all purchases. purchaserefund has no CRUD support in v2.
| Name | Required | Description | Default |
|---|---|---|---|
| docType | Yes | Type of document (purchase is not supported β PDF endpoint returns 404) | |
| documentId | Yes | Document ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does well: it discloses the exact response payload keys and warns that unsupported types fail with a 404 rather than an empty result, which prevents a wasted retry loop. It does not cover auth/permission requirements or payload size limits for large PDFs, keeping it below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and return shape, then constraints. Every sentence carries real information, though the full docType enumeration partially duplicates the schema enum and could have been compressed if brevity were paramount.
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 two-parameter read tool with no output schema, the description supplies what the schema cannot: the decoded response structure and the known failure mode for unsupported document types. An agent has everything needed to call it correctly and interpret the result.
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 100%, so the enum and documentId are already documented structurally. The description restates the docType values and adds the useful caveat that purchase is excluded, but adds no new meaning for documentId β the baseline 3 applies.
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?
States a specific verb and resource ('Get the PDF of a document') plus the encoding format and API version. The named return shape ({ contentType, base64, bytes, filename }) makes it unmistakable from get_document, which returns document data rather than a binary artifact.
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 gives an explicit supported docType list and an explicit exclusion: 'purchase is NOT supported β GET /purchases/{id}/pdf returns 404', plus a note that purchaserefund has no v2 CRUD support. That is clear when/when-not guidance; what's missing is a pointer to a fallback tool for purchases, so it stops short of the top score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_employeeC
Get a single employee by ID (Holded API v2).
| Name | Required | Description | Default |
|---|---|---|---|
| employeeId | Yes | Employee ID (24-char hex ObjectId) |
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 implies a read-only lookup and gives an API version, but says nothing about behavior on missing/invalid IDs, permissions/scopes, or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the key scope ('single employee') first. The '(Holded API v2)' parenthetical is mildly dispensable but not costly.
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 one-parameter, schema-complete lookup with no output schema, this is minimally adequate. It leaves open what is returned and how not-found cases behave, which an agent would want to know before calling.
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 100% and the schema already specifies employeeId as a 24-char hex ObjectId; the description's 'by ID' adds nothing beyond that. Baseline 3 applies since the schema does the heavy lifting.
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?
Specific verb+resource: 'Get a single employee by ID'. The word 'single' implicitly distinguishes it from list_employees, but no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No statement of when to use this versus list_employees or get_employee_contract, and no prerequisites (e.g., needing an ID obtained from list_employees). Usage is only inferable from 'by ID'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_employee_contractA
Get the contract details of an employee (Holded API v2). A 404 response means the employee has no contract configured in Holded, not that the employee ID is wrong.
| Name | Required | Description | Default |
|---|---|---|---|
| employeeId | Yes | Employee ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full disclosure burden, and the 404 semantics note is genuinely valuable non-obvious behavior β it prevents an agent from misdiagnosing a bad employee ID. It stops short of covering permissions, rate limits, or what the payload contains, so it is not fully comprehensive.
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?
Two short sentences, the core action front-loaded and the 404 caveat placed immediately after. Every clause earns its place with no filler.
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?
There is no output schema and no annotations, so the description would ideally say what the contract payload contains (fields, structure) and whether reads require scoping to the account. The 404 note covers the most likely failure mode, but the return-value side is absent.
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 100% description coverage for the single employeeId parameter, so the schema already documents it. The description adds no format, source, or example detail beyond confirming that an employee ID is the input key.
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?
States a specific verb and resource ("Get the contract details of an employee") and narrows scope to contracts, which separates it from get_employee and update_employee_contract. It does not explicitly name those siblings, so differentiation is implicit rather than spelled out.
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?
Usage is only implied by the resource name: an agent can infer this is the read path for contract data. There is no explicit statement of when to prefer it over get_employee, nor any precondition such as the employee having a contract, though the 404 note hints at that case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_employee_timeB
Get a single time-tracking record by ID (Holded API v2).
| Name | Required | Description | Default |
|---|---|---|---|
| timeId | Yes | Time record ID |
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 confirms a read of a single record but says nothing about read-only semantics, not-found error behavior, authentication requirements, or what the fetched record contains.
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?
One short sentence, front-loaded with the verb and resource, with no waste. It is efficiently sized for such a simple tool, though the API version parenthetical adds little for tool selection.
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 tool is simple: one required ID parameter and no output schema. The description covers the core action but omits error behavior and any hint of the returned record's shape, leaving modest gaps without an output schema to fall back on.
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 100%, so the single timeId parameter is already fully documented in the schema. The description adds only the 'by ID' framing, which matches rather than extends the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Get a single time-tracking record') and scopes it to 'by ID', which implicitly distinguishes it from the list_employee_times sibling. It does not explicitly name the alternative, so it stops short of full disambiguation.
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 'by ID' phrasing implies retrieval of a known record, which is a usable usage signal. However, no explicit when-to-use guidance, prerequisites, or named alternatives (e.g. list_employee_times for browsing) are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_expenses_accountA
Get a single account by its Holded id (Holded API v2). Despite the "expenses" name, this endpoint serves ANY account (including income/group-7 accounts that list_expenses_accounts omits) when you already know its id.
| Name | Required | Description | Default |
|---|---|---|---|
| accountId | Yes | Account Holded id (the `id` field, not the PGC accountNum) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral burden. It usefully discloses the surprising scope: despite the expenses name, it serves any account and covers income/group-7 accounts omitted by list_expenses_accounts. However, it does not describe return shape, error behavior, auth requirements, or rate limits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences, front-loaded with the core action and followed by the important scope caveat. Every sentence adds useful information with no filler.
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 simple one-parameter lookup with no output schema, the description gives enough context to call it correctly, including its unusual account coverage and the id requirement. It could mention the returned account object or invalid-id behavior, but the key selection context is present.
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 100% and the single accountId parameter is already well documented in the schema, including the distinction between Holded id and PGC accountNum. The description reinforces that this is a Holded id but adds no syntax or format details beyond the schema.
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 uses a specific verb and resource ('Get a single account') and explicitly distinguishes this tool from the sibling list_expenses_accounts by noting it serves ANY account, including income/group-7 accounts that the list endpoint omits. An agent can select it correctly when it already has an id.
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 states the key usage condition ('when you already know its id') and names list_expenses_accounts as the contrasting alternative for listing. It does not explicitly say to use the list tool when the id is unknown, but the contrast is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_invoicing_forecastB
Get a cashflow invoicing forecast by ID (Holded API v2).
| Name | Required | Description | Default |
|---|---|---|---|
| forecastId | Yes | Forecast ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, yet it discloses only that this is a lookup. It says nothing about read-only semantics, permission/auth needs, behavior on a nonexistent ID (e.g., 404 vs empty), or what the response contains.
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?
One compact sentence with the key qualifier ('by ID') front-loaded and no filler; the API version tag is minor but arguably useful provenance. Slightly terse for a tool lacking annotations, but nothing is wasted.
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 one-parameter, non-nested getter this is close to adequate, but with no output schema and no annotations, the description leaves the return shape and failure behavior undocumented. A sentence on what the forecast object contains or what happens for invalid IDs would close the gap.
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?
There is a single parameter with 100% schema description coverage, so baseline is 3. The description's 'by ID' merely restates forecastId's meaning and adds no format, sourcing, or example detail beyond the schema.
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?
States a specific verb (Get) and resource (cashflow invoicing forecast) plus the lookup key (by ID), which cleanly separates it from list_invoicing_forecasts and the create/update/delete siblings. It stops short of naming that sibling, so it is clear but not fully differentiated in-text.
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?
'by ID' implies this is for fetching a single known forecast, with listing delegated elsewhere, but no explicit when-to-use or when-not guidance is given. An agent can infer the usage from the sibling set but must do the inference itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_numbering_seriesA
List numbering series for a specific document type (Holded API v2). Cursor-paginated: pass the previous response nextCursor as cursor. Response fields are snake_case; amounts are strings with decimal comma.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max items per page (server-paginated; use limit to control page size) | |
| cursor | No | Cursor from a previous response nextCursor | |
| fields | No | Project only these fields per item (e.g. ["id", "name", "prefix", "nextNumber"]). Reduces response size. | |
| docType | Yes | Document type | |
| summary | No | Return only count and pagination metadata without items (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, yet the description discloses two non-obvious behaviors: responses are snake_case and monetary amounts are strings with decimal comma. It does not cover auth requirements, error modes, or default page size behavior, which leaves some of the burden unmet.
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?
Three compact sentences, front-loaded with the purpose, then pagination, then response-format notes. Minor redundancy with the schema around cursor, but no wasted prose.
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?
A read-only list tool with a fully documented 5-parameter schema and no output schema; the description compensates for the missing return schema by flagging field naming and amount formatting. Only failure and permission behaviors are left unspecified.
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 100%, so all five parameters are already documented. The sentence about passing nextCursor as cursor echoes the schema's cursor description rather than adding format or edge-case detail.
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?
States a specific verb (List) and resource (numbering series) plus the scoping key (document type). Against siblings create_numbering_serie / update_numbering_serie / delete_numbering_serie, 'List' makes the read-vs-mutate distinction immediate.
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?
Explains pagination mechanics (pass previous nextCursor as cursor) but never says when to reach for this tool over the sibling numbering-serie tools or any alternative listing path. Usage is implied by the verb rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_paymentA
Get a specific payment by ID (Holded API v2)
| Name | Required | Description | Default |
|---|---|---|---|
| paymentId | Yes | Payment ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden. The verb 'Get' reasonably signals a non-mutating single-record fetch, but nothing states behavior on a missing/invalid ID, whether lookup is case-sensitive, or what the response contains.
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?
One short sentence, front-loaded with the verb and resource, with no redundant text. The parenthetical API version is the only extra and is cheap.
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 simple one-parameter getter the description is adequate, but with no annotations and no output schema it never indicates what a payment record contains or how failures appear, leaving the agent to infer return behavior.
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 100% with a single required paymentId, so the schema already documents the parameter. The description only restates that the ID identifies the payment and adds no format or source hints (e.g., where payment IDs come from).
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?
States a specific verb ('Get') and resource ('a specific payment') plus the key selector ('by ID'), so its purpose is unambiguous. It does not explicitly contrast with near siblings like list_payments or get_document_payments, which keeps it short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'by ID' implies the prerequisite (a known payment ID) and implies the split from list_payments, but there is no explicit when-to-use/when-not-to-use guidance or mention of alternatives such as get_document_payments for document-scoped payments.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_productB
Get a specific product by ID (Holded API v2)
| Name | Required | Description | Default |
|---|---|---|---|
| productId | Yes | Product ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, and it discloses almost nothing: no return shape, no not-found/error behavior for an invalid ID, no permission or rate-limit context. "(Holded API v2)" adds only a versioning hint.
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?
One short, front-loaded sentence with zero padding. It is efficient, though the terseness borders on under-specification rather than deliberate concision.
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 single-parameter read with full schema coverage and no output schema, the definition is minimally viable. Missing is anything about what a successful response contains or how a bad ID is reported, which an agent calling blind would want.
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 100%, so the single parameter is structurally documented, and the description merely restates that lookup is by ID. The schema's own description ("Product ID") is tautological, so neither source clarifies format (numeric vs. string, ID source); baseline 3 applies.
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?
States a specific verb ("Get") and resource ("product") scoped to a single record by ID, which implicitly separates it from list_products. It does not name any sibling explicitly, so an agent must infer the list-vs-get split, but the core purpose is unmistakable.
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?
"By ID" implies the precondition (a known productId) and implies list_products is the path for discovery, but neither the alternative nor any exclusion is stated. Usage is inferable rather than guided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_product_main_imageC
Get the main image of a product (Holded API v2)
| Name | Required | Description | Default |
|---|---|---|---|
| productId | Yes | Product ID |
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, yet it discloses nothing beyond the one-line purpose. It doesn't say what is returned (URL, binary, metadata), what happens when a product has no main image, or what error surfaces for an invalid productId.
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?
A single front-loaded sentence with no filler. The parenthetical API version is minor but harmless vendor context.
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 tool is simple, but with no annotations and no output schema, the description should explain the return shape and the empty-image case. Neither is covered, leaving a real gap for an agent that must consume the result.
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?
Only one parameter, and the schema already documents it at 100% coverage as "Product ID". The description adds no format or sourcing detail beyond that, so the baseline 3 applies.
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?
States a specific verb and resource: retrieve the *main* image of a product. The qualifier "main" implicitly separates it from the sibling get_product_secondary_image and list_product_images, though it never names them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use, when-not-to-use, or alternative routing. An agent must infer from the word "main" that get_product_secondary_image and list_product_images cover the other cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_product_secondary_imageB
Get a secondary image of a product (Holded API v2)
| Name | Required | Description | Default |
|---|---|---|---|
| imageId | Yes | Image ID | |
| productId | Yes | Product ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, but it only states that an image is retrieved. It does not describe return format, image data vs URL, permissions, error behavior, or other retrieval traits.
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 front-loaded phrase with essentially no wasted text. The parenthetical API version adds minor context but is not essential for tool selection.
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 simple two-parameter retrieval tool with full schema coverage, the description is adequate for invocation. However, with no output schema and no annotations, it still leaves return-format expectations and sibling selection guidance incomplete.
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 100% description coverage for both required parameters, so the schema already explains productId and imageId. The description adds no additional parameter meaning beyond what the schema provides, making the baseline 3 appropriate.
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 gives a specific verb and resource: 'Get a secondary image of a product'. The word 'secondary' distinguishes it from siblings such as get_product_main_image and list_product_images without needing to open the schema.
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 does not say when to use this tool versus get_product_main_image or list_product_images, nor does it provide exclusions or prerequisites. Usage is only implied by the verb 'Get'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_project_timeA
Get a single time-tracking entry by project ID and time-tracking ID (Projects API v2). Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| projectId | Yes | The Holded project ID | |
| timeTrackingId | Yes | The time-tracking entry ID (timeId) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the behavioral burden. It does disclose 'Read-only,' which usefully signals no side effects, but it says nothing about error behavior when an ID is missing or what the returned entry contains.
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?
A single compact sentence that front-loads the core action and scope with zero filler. Every clause 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?
For a simple two-parameter, fully-documented getter with no output schema, the description gives enough to call it correctly and states its read-only nature. Only the return shape and not-found behavior are left unspecified, which is minor here.
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 100%, with both parameters documented in the schema. The description restates the parameter intent (project ID, time-tracking ID) but adds no format or syntax detail 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 names a specific verb (Get) and resource (a single time-tracking entry) scoped to project and time-tracking IDs, making it clearly distinguishable from the sibling list_project_times. The word 'single' effectively separates it from list-style operations.
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?
Usage is implied by 'single ... by project ID and time-tracking ID' β retrieve one known entry. However, it never explicitly states when to use this versus list_project_times or list_project_times_by_project, leaving the agent to infer the choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_remittanceB
Get a specific remittance by ID (Holded API v2). NOTE: route relocated to /treasury/remittances/{id} in v2.
| Name | Required | Description | Default |
|---|---|---|---|
| remittanceId | Yes | Remittance ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. 'Get' implies a safe read, but it says nothing about permissions, not-found behavior, or what is actually returned; the v2 route note is API-internal trivia that does not help an agent decide or invoke.
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?
Two short sentences with the core action front-loaded and no padding. The route-relocation note is marginal value for an agent but short enough not to be a real cost.
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 one-parameter getter with no output schema, the description tells the agent what it retrieves but not what the result looks like or how it relates to list_remittances. Adequate to invoke, incomplete for confident selection among siblings.
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 100% and the single parameter is documented as 'Remittance ID', so the schema already does the work. The description adds no format, provenance, or constraint details beyond what the schema provides, making the baseline 3 appropriate.
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?
States a specific verb and resource ('Get a specific remittance by ID'), so the agent knows this is a single-item lookup rather than a list. It does not name the sibling list_remittances, but the singular/ID framing implicitly separates it from the bulk 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?
Usage is only implied: retrieving one remittance requires an ID, which presumably comes from list_remittances, but the description never says that or states when not to use it. No prerequisites or error conditions are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_salary_recordA
Get a payroll salary record by ID (Holded API v2, scope accounting:payrolls.read). Returns line-by-line earnings and deductions, accounting accounts, totals and payment status.
| Name | Required | Description | Default |
|---|---|---|---|
| salaryRecordId | Yes | Salary record ID (24-char hex) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does reasonably well: it discloses the required OAuth scope (accounting:payrolls.read) and enumerates what the response contains (earnings/deductions lines, accounting accounts, totals, payment status). It omits failure behavior (not-found, cross-tenant access) and does not explicitly declare read-only semantics beyond the verb 'Get'.
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?
One tight sentence pair: identity and scope up front, return contents second. Every clause adds information; there is no filler or restatement of the title.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description correctly compensates by summarizing the return payload, and it also gives the auth scope. For a single-key read tool this is nearly complete; only error/empty-result behavior is unaddressed.
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 100% and the single parameter is already documented as a 24-char hex ID. The description adds nothing further about the identifier β no format, no example, no note on where an ID comes from (e.g. list_salary_records) β so baseline 3 applies.
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?
States a specific verb and resource ('Get a payroll salary record by ID'), which is enough to distinguish it from list_salary_records and get_salary_record_defaults by the 'by ID' single-record framing. It stops short of explicitly naming those siblings, so an agent must infer the split.
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?
Usage is only implied: fetch one record when you already hold its ID. There is no explicit when-to-use statement, no guidance on when to prefer list_salary_records or get_salary_record_defaults instead, and no prerequisites beyond the scope string.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_salary_record_defaultsA
Get the default data for creating a payroll record (Holded API v2). Useful as a base payload for create_salary_record.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description must carry the load: it discloses that the result is default/template data intended as a payload base, which implies a read-only, non-mutating call. It does not address whether defaults vary per account, permissions, or freshness of the returned values.
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?
Two short sentences with the purpose front-loaded and the follow-up telling the agent what to do with the output. Nothing is wasted.
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 no output schema, the agent does not learn the shape of the returned defaults beyond the hint that it matches a payroll record payload. For a zero-param getter this is serviceable but leaves the return structure underspecified.
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 takes zero parameters, so the baseline is 4; there is nothing for the description to disambiguate beyond confirming no input is needed.
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?
States a specific verb and resource ('Get the default data for creating a payroll record') and names the sibling it feeds into (create_salary_record). The agent can distinguish this template-fetch from the create/get/list salary tools, though it never explicitly contrasts with get_salary_record.
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?
'Useful as a base payload for create_salary_record' gives clear context for when to call it, and the zero-arg schema reinforces that it is a bootstrap step. No explicit when-not or edge-case exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sales_channelC
Get a specific sales channel by ID (Holded API v2)
| Name | Required | Description | Default |
|---|---|---|---|
| channelId | Yes | Sales channel ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description must carry the full burden of disclosure. It does not state that this is a read-only operation, what happens if the channelId does not exist, or what fields a sales channel carries. Only the '(Holded API v2)' tag adds any context.
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?
One short sentence with the resource and lookup key front-loaded. The parenthetical API-version tag is minor but arguably earns its place for versioning context; there is no wasted prose.
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 trivial single-parameter getter this is close to adequate, but with no annotations and no output schema the description should at least say it is a read-only lookup and what it returns. As it stands an agent knows the shape of the call but not the behavior or the response.
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 100% and the single channelId parameter is fully documented in-schema. The description adds nothing beyond 'by ID', so the baseline 3 applies.
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?
Specific verb+resource: 'Get a specific sales channel by ID'. The word 'specific' distinguishes it from the sibling list_sales_channels, and 'by ID' clarifies the lookup style. Slight gap only in that siblings like get_product/get_contact follow the same pattern without further differentiation.
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 statement of when to use this versus list_sales_channels or the create/update/delete siblings. The single-item fetch convention is implied by 'by ID' but never spelled out, and no prerequisites or error conditions are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_serviceB
Get a specific service by ID (Holded API v2)
| Name | Required | Description | Default |
|---|---|---|---|
| serviceId | Yes | Service ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden; 'Get' reasonably conveys a read-only single-record retrieval. However, it says nothing about behavior on a missing/invalid ID, permission or auth requirements, or whether the full service object is returned, which is a real gap for a zero-annotation tool.
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?
One short, front-loaded sentence with the key qualifier ('specific ... by ID') in the first clause. The trailing '(Holded API v2)' is mild context rather than content, but it costs almost nothing.
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 one-parameter read tool with no output schema, the definition is minimally sufficient β an agent knows what to pass and roughly what it gets back. It is missing error/not-found behavior and any indication of response shape, which matters slightly more given there are no annotations to fall back on.
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 100% but the only parameter description is the tautological 'Service ID'; the description's phrase 'by ID' adds no format, sourcing, or lookup guidance beyond the schema. With full coverage, baseline 3 applies even though the added value is nil.
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?
States a specific verb and resource ('Get a specific service') plus the lookup key ('by ID'), which implicitly separates it from list_services, update_service, and delete_service. It stops short of naming any sibling explicitly, so it is clear but not fully differentiated.
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?
'By ID' implies the precondition that you must already have a service identifier, which distinguishes it from list_services. There is no explicit when-to-use statement, no note about what to do when the ID is unknown, and no mention of alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_shipped_unitsA
Get shipped/received units for a document (Holded API v2). salesorder β GET /sales-orders/{id}/shipped-items. purchaseorder β GET /purchase-orders/{id}/received-items. All other docTypes are not supported.
| Name | Required | Description | Default |
|---|---|---|---|
| docType | Yes | Type of document | |
| documentId | Yes | Document ID |
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 does disclose the underlying API endpoints and the unsupported-docType failure mode, which is genuinely useful. It says nothing about response shape, pagination, or auth requirements for a read tool, so meaningful gaps remain.
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?
Three short, front-loaded sentences: purpose first, then the per-docType endpoint mapping, then the hard exclusion. No filler or restated title.
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 simple two-parameter read tool with no output schema, the definition covers the main invocation risk (unsupported docType) but never indicates what the returned 'units' look like, which an agent may need when deciding whether this tool answers their question.
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 100%, so the baseline is 3, but the description adds real semantic value: it narrows an 11-value docType enum down to the only two values that actually work and explains that documentId is interpreted against a different endpoint per type.
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?
States a specific verb and resource ('Get shipped/received units for a document') and immediately scopes it to two document types. The docType-to-endpoint mapping makes it unmistakable versus siblings like ship_items_by_line or ship_all_items.
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?
Explicitly declares the supported conditions (salesorder β shipped-items, purchaseorder β received-items) and an exclusion ('All other docTypes are not supported'). It does not name alternative siblings such as ship_items_by_line for the broader shipping case, but the when/when-not is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_taxesA
Get all available taxes (Holded API v2). The v2 /taxes endpoint returns the complete tax list in one response (no cursor, no pagination). Supports fields to select specific fields and summary to return only the item count. Amounts are strings with decimal comma. Each tax has: key (the stable identifier, e.g. "s_iva_21"/"p_iva_21" β this is the value used in a document line's taxes[]), id (mirrors key), name, amount (the percentage as a string, e.g. "21"), scope ("sales" or "purchase"), group (e.g. "iva"), and type.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | Select specific fields to return (e.g., ["key", "name", "amount", "scope"]). Reduces response size. If not provided, returns default fields: id, key, name, amount, scope, group, type. NOTE: the tax rate field is `amount` (not `percentage`) and the identifier is `key`. | |
| summary | No | Return only the item count without the full list (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full load and does substantial work: it discloses no pagination, single-response behavior, string-typed amounts with decimal comma (a real parsing trap), default field set, and the key-vs-id relationship. It stops short of stating auth requirements or that the operation is read-only, but the 'Get' framing makes the latter obvious.
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?
Front-loaded with purpose and pagination behavior, then the field inventory. Every clause carries information, though the long single-paragraph field enumeration would read better as a list; nothing is redundant.
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?
No output schema and no annotations, so the description must (and does) describe the return shape in full, including field meanings and value formats. Only auth/permission context is absent, which is a modest gap for a read endpoint with zero parameters required.
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 already 100%, so the baseline is 3; the description adds genuine meaning on top by warning that the rate field is `amount` not `percentage` and the identifier is `key`, and by naming the default field set returned when `fields` is omitted.
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?
States a specific verb and resource ('Get all available taxes') plus the API version, and immediately clarifies scope: the complete tax list in one response with no cursor or pagination. An agent knows exactly what it gets without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No competing tax sibling exists, so alternative routing isn't needed, and the description instead supplies the key usage hook: `key` is the value to place in a document line's `taxes[]`. It also tells when to use `fields` (reduce size) and `summary` (count only), but doesn't give an explicit 'use this before creating a document' framing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_treasuryA
Get a specific treasury account by ID (Holded API v2). WARNING: the balance field is a STATIC opening figure set on the account, not a live balance computed from transactions β do NOT use it for reconciliation or as the current cash position. Overlaps with list_bank_accounts/get_bank_account/create_bank_account (official treasury tools); consolidation planned for 2.1.
| Name | Required | Description | Default |
|---|---|---|---|
| treasuryId | Yes | Treasury account ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It usefully discloses a critical caveat: the `balance` field is a static opening figure, not a live transaction-derived balance. It also discloses overlap with official treasury tools and a planned consolidation, though it does not cover authentication, rate limits, or error 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 front-loaded with the core purpose and followed immediately by the important balance warning. The overlap/consolidation note is useful but slightly less essential. Overall it is efficient, with every sentence contributing context.
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 simple one-parameter retrieval tool with no output schema and no annotations, the description supplies the key purpose, a critical field-level caveat, and overlap context. It is nearly complete, though it stops short of describing the broader return shape or any failure behavior.
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?
There is one required parameter, and schema description coverage is 100%, so the schema already documents `treasuryId` as the account ID. The description adds only the phrase 'by ID' and does not provide additional syntax, format, or lookup constraints beyond the schema. This meets the baseline 3 for a fully documented single parameter.
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 a specific verb and resource β 'Get a specific treasury account by ID' β and scopes it to the Holded API v2. It also identifies overlapping sibling tools, which helps an agent distinguish this retrieval operation from related treasury and bank-account operations.
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 gives a clear usage condition: retrieve a treasury account by its ID. It also warns against using the `balance` field for reconciliation or as a live cash position. However, it does not explicitly say when to choose `get_treasury` versus `get_bank_account` or `list_treasuries`; it only notes that overlap exists and consolidation is planned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_warehouseA
Get a specific warehouse by ID (Holded API v2)
| Name | Required | Description | Default |
|---|---|---|---|
| warehouseId | Yes | Warehouse ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries the full disclosure burden and largely drops it. Nothing is said about behavior on a missing/invalid ID, permission requirements, or what is returned; the only added context is the '(Holded API v2)' tag, which conveys little.
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?
One short sentence, zero filler, with the resource and lookup key front-loaded. Nothing in the sentence could be removed without losing information.
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 single-parameter, single-record lookup with full schema coverage and a fully-described required key, the description says enough for an agent to invoke it correctly; the missing pieces (error semantics, return shape) are minor for a trivial read.
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 100% for the single parameter, so the schema already documents warehouseId. The description's "by ID" merely restates the parameter's purpose without adding format, sourcing, or validation meaning.
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?
States a specific verb (get) and resource (warehouse) with the lookup key (ID) made explicit, which cleanly separates it from list_warehouses and the create/update/delete siblings. It stops short of naming those siblings as alternatives, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"by ID" implies you need a known warehouse ID, which implicitly routes an agent here rather than to list_warehouses. There is no explicit when-to-use statement, no mention of the list/create/update/delete siblings, and no prerequisite or error guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_accounting_accountsA
List accounting accounts (Holded API v2). Cursor-paginated. For the v1 read-only chart of accounts see get_chart_of_accounts.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max items per page | |
| cursor | No | Cursor from a previous response nextCursor |
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 pagination behavior and the API version, but says nothing about return shape, default page size, whether archived/inactive accounts are included, or auth requirements. Enough for a trivial read, but thin for an unannotated tool.
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?
Three short sentences with zero waste; the resource identity and pagination scope are front-loaded, and the sibling routing follows immediately.
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 two-parameter, no-required-arg list tool with no output schema and no annotations, the description covers purpose, version, pagination, and the main alternative. A brief note on what a page item contains or the default limit would close the remaining gap.
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 100%, so both parameters (limit, cursor) are already documented in the schema. The description only restates pagination at a high level and adds no syntax, default, or max-limit guidance beyond what the schema provides. Baseline 3 applies.
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?
States a specific verb+resource ('List accounting accounts') and adds an API-version qualifier, then explicitly distinguishes itself from the sibling get_chart_of_accounts. An agent can tell the two apart without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It names one alternative explicitly and gives the condition that selects it ('For the v1 read-only chart of accounts see get_chart_of_accounts'). It does not address the other nearby accounting siblings (create_accounting_account, list_expenses_accounts, list_ledger_entries), so routing is clear but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_bank_accountsB
List treasury bank accounts (Holded API v2, official endpoint). Cursor-paginated.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max items per page | |
| cursor | No | Cursor from a previous response nextCursor |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It does disclose the key behavioral trait β cursor pagination β which tells the agent to loop on cursors, but says nothing about ordering, default page size, permissions, or whether it returns all accounts regardless of filters.
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?
Two short sentences, front-loaded with the resource and the pagination model. Slightly over-leveraged on the "official endpoint" parenthetical, which carries little selection value for an agent.
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?
There is no output schema and no annotations, so the description is the only place to learn return shape and list semantics. It covers pagination but omits what a record contains and whether the list is complete versus filtered β adequate but with clear gaps for a list tool with zero structured support.
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 100% and both parameters (limit, cursor) are documented inline, so the baseline is 3. The description's "cursor-paginated" phrasing reinforces the schema but adds no format, default, or max values beyond it.
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?
Specific verb + resource ("List treasury bank accounts") so an agent knows this is a read/list operation over bank accounts. It does not distinguish itself from nearby siblings such as list_treasuries or list_bank_movements, though the resource name is specific enough to be actionable.
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 on when to use this versus list_treasuries, list_bank_movements, or get_bank_account for a single record. The parenthetical about the API version/endpoint adds provenance but not usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_bank_movementsA
List bank movements of a treasury account (Holded API v2, official endpoint β replaces the experimental internal banking tools). Cursor-paginated.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max items per page | |
| cursor | No | Cursor from a previous response nextCursor | |
| accountId | Yes | Bank account ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden. It does add useful behavioral context ('Cursor-paginated') and identifies the official v2 endpoint, but does not disclose return format, permissions requirements, or ordering, leaving meaningful behavioral gaps for a discovery-oriented read tool.
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?
Two compact sentences, front-loaded with the core action and scope. The pagination behavior and endpoint provenance are stated without waste; every clause 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?
For a simple read tool with a fully documented schema and no output schema or annotations, the description covers purpose, scope, and pagination adequately. It stops short of explaining ordering or what fields movements contain, which keeps it from a 5.
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 100%, so the schema already documents all three parameters including limit and cursor. The description's 'Cursor-paginated' merely echoes the schema and adds no format or constraint detail beyond it; baseline 3 is appropriate.
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?
States a specific verb+resource ('List bank movements') scoped to 'a treasury account', which distinguishes it from create_bank_movement and reconcile_bank_movement. It notes it replaces experimental internal tools, but does not explicitly differentiate from the sibling list_cash_movements, so it is not fully sibling-differentiated.
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 parenthetical 'replaces the experimental internal banking tools' implies a migration preference for this endpoint, but gives no explicit when-to-use vs alternatives guidance (e.g., vs list_cash_movements) and no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_cash_movementsA
List cash movements of a treasury account (Holded API v2). Cursor-paginated. This endpoint applies to cash-type treasury accounts only; bank and card account types return 404.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max items per page | |
| cursor | No | Cursor from a previous response nextCursor | |
| accountId | Yes | Treasury account ID |
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 does add real value by disclosing cursor pagination and the 404 failure mode for wrong account types, but it says nothing about permissions, result volume, or the shape of a movement record.
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?
Three short sentences with zero padding; the resource and scope come first and the failure condition follows. Nothing could be cut without losing information.
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 read-only list tool with no output schema and full schema coverage, this is close to sufficient. The only real gap is that return content (movement fields, nextCursor presence) is left to the cursor hint rather than stated.
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 100%, so all three parameters are already documented. The description's mention of 'cursor-paginated' reinforces how cursor and limit are meant to be chained, but adds no format or range detail beyond the schema baseline.
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?
States a specific verb and resource ('List cash movements of a treasury account') plus the API version, so the agent knows exactly what is returned. The cash-only scope clause implicitly separates it from the sibling list_bank_movements, though it never names that sibling outright.
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 'cash-type treasury accounts only; bank and card account types return 404' sentence is a genuine when-not constraint. However, no alternative is named (e.g. 'for bank accounts use list_bank_movements'), so routing to the right sibling still requires inference from tool names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_contact_attachmentsA
Get list of attachments for a contact (Holded API v2). Use the filenames from the response with get_contact_attachment.
| Name | Required | Description | Default |
|---|---|---|---|
| contactId | Yes | Contact ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry behavioral disclosure. It does disclose that the response contains filenames and that they feed another tool, but it says nothing about pagination, ordering, permissions/auth, or behavior when a contact has no attachments.
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?
Two short sentences, front-loaded with the lookup and followed by the next-step hint. Nothing is redundant and the API-version tag is compact context.
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 single-parameter list tool with no output schema, this is nearly sufficient: purpose, input, and the follow-up tool are all covered. Only return-shape details (count, ordering, empty case) are missing, which is minor here.
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 100% for the single required contactId parameter, so the schema already does the work. The description adds no format, validation, or scoping detail about contactId beyond what the property entry provides, holding it at the baseline.
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?
States a specific verb and resource ('Get list of attachments for a contact'), scoped clearly to one entity type. It implicitly separates itself from the singular get_contact_attachment by pointing at it as the next step, though it never explicitly says 'this lists all attachments.'
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 sentence 'Use the filenames from the response with get_contact_attachment' gives an explicit chaining instruction naming the correct sibling tool. It does not cover when-not-to-use or whether the list is paginated, but the selection context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_contact_groupsB
List contact groups (Holded API v2). Cursor-paginated: pass the previous response nextCursor as cursor. Response fields are snake_case; amounts are strings with decimal comma.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max items per page (server-paginated; use limit to control page size) | |
| cursor | No | Cursor from a previous response nextCursor | |
| fields | No | Project only these fields per item (e.g. ["id", "name"]). Reduces response size. | |
| summary | No | Return only count and pagination metadata without items (default: false) |
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 usefully discloses cursor pagination and response conventions (snake_case fields, decimal-comma amounts), but omits permissions, rate limits, and full return shape.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences, front-loaded with purpose, then pagination, then response-format caveats. No filler or repetition.
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?
There is no output schema, so the description should explain return values more fully. It gives response formatting hints but does not describe the items/count/nextCursor structure, leaving a meaningful gap for a list endpoint.
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 100%, so the schema already documents all four parameters. The description only reiterates that cursor comes from nextCursor and does not add meaning for limit, fields, or summary beyond the schema.
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?
States a specific verb and resource: 'List contact groups', plus API version. The listing verb distinguishes it from create/get/update/delete_contact_group siblings, but it does not explicitly route to get_contact_group or list_contacts.
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?
Provides pagination mechanics but no when-to-use guidance or alternatives. It does not say when to use this instead of get_contact_group for a single group or list_contacts for contacts.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_contactsA
List contacts (Holded API v2). Cursor-paginated: pass the previous response nextCursor as cursor. Response fields are snake_case; amounts are strings with decimal comma.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max items per page (server-paginated; use limit to control page size) | |
| cursor | No | Cursor from a previous response nextCursor | |
| fields | No | Project only these fields per item (e.g. ["id", "name", "email"]). Reduces response size. | |
| summary | No | Return only count and pagination metadata without items (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does disclose real behavioural traits: cursor-based pagination, snake_case response fields, and amounts serialised as strings with decimal comma. It still omits ordering, default page size, and any error/permission behaviour, so it stops short of full disclosure.
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?
Three short sentences, none wasted: identity first, pagination mechanic second, response-format caveat third. Front-loaded and appropriately sized.
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?
No output schema and no annotations mean the description must cover return shape, and it does flag field casing and amount formatting. It is slightly thin on what a contact record contains and has no note on default limit, but overall sufficient to call the tool 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?
Schema description coverage is 100%, so limit, cursor, fields and summary are already documented in structured data; the description only restates the cursor contract. Baseline 3 applies since the schema does the heavy lifting.
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?
States a specific verb and resource ('List contacts') plus the backing API version, which is enough to distinguish it from create_contact/get_contact/update_contact/delete_contact by name alone. It does not explicitly address near-neighbours like list_contact_groups or list_contact_attachments, but the resource is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is self-evident for a list tool, and the description gives procedural guidance ('pass the previous response nextCursor as cursor'). However, it offers no explicit when-to-use/when-not guidance versus related siblings such as list_contact_attachments or list_contact_groups.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_documentsA
List documents of a specific type (Holded API v2). Cursor-paginated: pass the previous response nextCursor as cursor. Response fields are snake_case; amounts are strings with decimal comma. NOTE: purchaserefund is not listable in v2 β only creation is supported (POST /purchases/refund).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max items per page (server-paginated; use limit to control page size) | |
| cursor | No | Cursor from a previous response nextCursor for the next page | |
| fields | No | Project only these fields per item (e.g. ["id", "contact_name", "total"]). Reduces response size. | |
| docType | Yes | Type of document to list | |
| summary | No | Return only count and pagination metadata without items (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the behavioral burden and discloses important traits: cursor pagination, snake_case response fields, decimal-comma amount strings, and the purchaserefund limitation. It does not cover auth, rate limits, or default ordering, so it is useful but not fully exhaustive.
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-loaded: purpose first, then pagination mechanics, response-format caveats, and the purchaserefund exception. Every sentence adds operational 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 five-parameter list tool with no output schema, the description supplies useful pagination and response-format context. It is nearly complete, though it could mention default ordering or error behavior.
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 100%, so the schema already documents all five parameters. The description adds meaningful semantics beyond the schema by clarifying cursor usage and warning that purchaserefund appears in the enum but is not listable in v2.
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 a specific verb and resource: list documents of a specific type via the Holded API v2. It clearly distinguishes this from single-document siblings such as get_document by emphasizing listing and pagination.
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 explains how to paginate by passing the previous response nextCursor as cursor and explicitly warns that purchaserefund is not listable in v2. It does not name alternative tools such as get_document or create_document, but the usage context is otherwise clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_employeesA
List employees (Holded API v2, section Equipo y RRHH). Cursor-paginated: pass the previous response nextCursor as cursor to fetch the next page.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max items per page | |
| cursor | No | Cursor from a previous response nextCursor |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden; it does disclose the cursor-pagination contract, which is genuinely useful context. It says nothing about permissions, rate limits, default page size, or whether the list is workspace-scoped.
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?
Two tight sentences with the resource identity first and the pagination contract second; no filler and nothing repeated.
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 two-optional-param read-only listing with no output schema, the pagination behavior is the main thing an agent needs and it is covered. Only the shape of returned employee records is left implicit, which is a minor gap.
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 100% and both parameters are documented there, so the baseline is 3. The description slightly reinforces cursor semantics ('pass the previous response nextCursor'), but adds no format, unit, or default details beyond the schema.
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?
States a specific verb and resource ('List employees') and scopes it to the Holded API v2 'Equipo y RRHH' section. The 'List' prefix clearly separates it from get_employee, create_employee, update_employee and delete_employee in the sibling set, though it never names those alternatives 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?
Explains how to paginate (pass `nextCursor` as `cursor`) but gives no guidance on when to use this list endpoint versus get_employee for a single record or list_employee_times for related data. Usage is implied by the verb only.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_employee_timesA
List time-tracking records (Holded API v2). Without employeeId lists all records (/employee-times); with employeeId lists only that employee (/employees/{id}/times). Cursor-paginated.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max items per page | |
| cursor | No | Cursor from a previous response nextCursor | |
| employeeId | No | Optional employee ID to scope the list |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses that the tool is cursor-paginated and that the call routes to a different API endpoint depending on employeeId, which is real value beyond the schema. It says nothing about authentication/permission requirements, ordering, or what a returned record contains, leaving gaps for a read tool with zero annotation coverage.
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?
Three short sentences with zero filler, and the core identity of the tool is front-loaded before the branching detail. Every clause (endpoint paths, employeeId behavior, pagination) adds information an agent can act on.
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 three-parameter, optional-filter list tool with no annotations and no output schema, the description covers routing, filtering, and pagination adequately. The remaining shortfall is the shape of a returned time record, which is the one thing the agent cannot get from structured fields here.
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 100%, so the baseline would be 3; the description earns an extra point by explaining that employeeId does more than filter β it switches the underlying endpoint β and by framing limit/cursor as a cursor-pagination pair ('Cursor from a previous response nextCursor' is reinforced by 'Cursor-paginated'). That meaning is not derivable from the schema alone.
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?
States a specific verb and resource ('List time-tracking records') and goes further by explaining the two modes: all records via /employee-times vs. scoped via /employees/{id}/times. It does not name the confusable siblings (list_project_times, get_employee_time), so an agent still has to infer that this tool is not the project-time or single-record tool, but the verb+resource is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The employeeId conditional implicitly tells the agent when to pass a filter versus list everything, which is genuine usage guidance. However, in a sibling set containing get_employee_time, list_project_times, and several clock/pause mutation tools, there is no explicit statement of when to choose this tool over those alternatives, so selection still requires inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_expenses_accountsA
List expenses accounts (Holded API v2). Cursor-paginated: pass the previous response nextCursor as cursor. Response fields are snake_case; amounts are strings with decimal comma. Each account has id (Holded internal id), name, and accountNum (the PGC account number, e.g. 62900000). NOTE: this endpoint only returns expense/purchase accounts (PGC group 6). Income accounts (group 7, e.g. 700/705/759) are NOT listed here β fetch the full chart via get_chart_of_accounts, or read a known account by id via get_expenses_account.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max items per page (server-paginated; use limit to control page size) | |
| cursor | No | Cursor from a previous response nextCursor | |
| fields | No | Project only these fields per item (e.g. ["id", "name", "accountNum"]). Reduces response size. NOTE: the PGC number field is `accountNum` (not `code`). | |
| summary | No | Return only count and pagination metadata without items (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so: it discloses cursor pagination mechanics (pass previous nextCursor), response encoding conventions (snake_case, amounts as strings with decimal comma), and the endpoint's hard scope limit. It also describes the field set returned (`id`, `name`, `accountNum`) since no output schema exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the verb+resource, then pagination, then response shape, then the exclusion note β a good information order. Slightly dense and the cursor explanation mildly repeats the schema's own cursor description, but every sentence carries substantive detail.
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?
No output schema and no annotations exist, so the description must cover returns, pagination, and scope on its own β which it does, including the per-item field list and the group 6 restriction. An agent has everything needed to call it correctly and interpret the response.
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 100%, so the parameter definitions already do the work and a baseline 3 would be defensible. The description adds real value on top by explaining the cursor round-trip and warning that the PGC number field is `accountNum`, not `code` β a naming trap the schema alone could not resolve.
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?
States a specific verb and resource ('List expenses accounts') and immediately scopes it to the Holded API v2 expenses endpoint. The NOTE clarifies it returns only PGC group 6 accounts, which distinguishes it from get_chart_of_accounts and get_expenses_account.
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?
Explicitly names when-not-to-use this tool (income accounts, group 7, examples 700/705/759) and routes the agent to the correct alternatives: get_chart_of_accounts for the full chart, get_expenses_account for a known id. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_invoicing_forecastsB
List cashflow invoicing forecasts (Holded API v2). Cursor-paginated.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max items per page | |
| cursor | No | Cursor from a previous response nextCursor |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses that the tool is cursor-paginated, but does not state read-only safety, permissions, rate limits, or anything about the response shape.
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?
Two short sentences with the resource and pagination behavior front-loaded. There is no filler or redundant restatement.
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-complexity list tool with full schema coverage and only two optional parameters, the description adequately covers the resource and pagination. No output schema exists, but return-value details need not be explained; the lack of explicit read-safety information is a minor gap given the 'List' verb.
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 100%, and both 'limit' and 'cursor' are documented in the schema. The description's 'Cursor-paginated' reinforces how pagination works but adds no parameter syntax or meaning beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb ('List') and specific resource ('cashflow invoicing forecasts'), and identifies the API version. It does not explicitly distinguish itself from the sibling get_invoicing_forecast, but the plural 'List' wording makes the distinction reasonably clear.
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?
Provides no explicit when-to-use guidance, prerequisites, or comparison to alternatives such as get_invoicing_forecast or update_invoicing_forecast. Usage is only implied by the verb 'List'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_ledger_entriesA
List journal/ledger entries (Holded API v2). Cursor-paginated: pass the previous response nextCursor as cursor. Optionally filter by start_date/end_date (ISO 8601, e.g. 2025-01-01) β the v2 endpoint returns 422 if neither date is provided. For the read-only daily-ledger tool with groupByEntry support and Unix-timestamp backward compat see get_daily_ledger.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max items per page | |
| cursor | No | Cursor from a previous response nextCursor | |
| end_date | No | Filter end date (ISO 8601, YYYY-MM-DD) | |
| start_date | No | Filter start date (ISO 8601, YYYY-MM-DD) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does disclose a key behavioral trait: the v2 endpoint returns 422 when neither start_date nor end_date is supplied, which materially affects how an agent must call it. It does not cover auth requirements or the shape of returned entries, keeping it short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with purpose, then pagination mechanics, then the date constraint and the sibling pointer. No filler or repetition of schema text.
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 4-param, no-annotations, no-output-schema read tool, the definition covers purpose, pagination, the mandatory date constraint, and tool selection. Only the item-level return shape is left implicit, which is a minor gap for a list endpoint.
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 100%, so baseline is 3. The description goes beyond the schema by stating the cross-parameter constraint (neither date β 422) and the cursor round-trip convention (previous response's nextCursor), which the per-field schema descriptions cannot express.
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?
States a specific verb and resource ('List journal/ledger entries') plus the API version, and explicitly differentiates itself from the sibling get_daily_ledger. An agent can pick the right tool without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives concrete when-to-use guidance: paginate via nextCursor/cursor, optionally filter by date range, and it names the alternative tool (get_daily_ledger) with the exact condition that selects it (groupByEntry support, Unix-timestamp compat). Both the 'use this' and 'use that instead' paths are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_payment_methodsA
List available payment methods (Holded API v2). GET /payment-methods. Returns an array of {id, name, type, status, isDefault, bankingAccountId} β the v2 {items:[...]} envelope is normalized to a bare array.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden and it does disclose the return shape ({id, name, type, status, isDefault, bankingAccountId}) and the notable normalization of the v2 {items:[...]} envelope into a bare array β a real behavioral trait an agent would otherwise get wrong. It does not mention auth requirements, pagination, or ordering, keeping it below a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences: identity/endpoint first, then the return contract, then the one non-obvious quirk. No filler and the most surprising fact is not buried.
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 no output schema, the description compensates by enumerating the returned fields and explaining the envelope normalization, which is exactly what an agent needs to consume the result. Minor gaps remain around pagination, ordering, and permissions.
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 zero parameters, so the baseline is 4; there is nothing for the description to disambiguate. It adds no parameter detail, but none is needed.
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?
States a specific verb and resource ('List available payment methods') plus the backing endpoint (GET /payment-methods). 'payment methods' is unambiguously distinct from the sibling list_payments, so an agent can route without inspecting schemas.
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?
Usage is only implied by the name and the fact that no parameters exist; there is no explicit 'use when' statement or named alternative (e.g. list_payments vs list_payment_methods). Adequate for a trivial param-less list, but no guidance is actually given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_paymentsA
List all payments (Holded API v2). Cursor-paginated: pass the previous response nextCursor as cursor. Response fields are snake_case; amounts are strings with decimal comma. NOTE: this endpoint is filtered to the ACTIVE fiscal year, so payments made in a prior year do NOT appear here even if they are linked to documents. For cross-year payment audits, read a document's payments via get_document_payments (the document paymentsDetail). Use start_date/end_date (YYYY-MM-DD) to filter by date β live-verified against v2.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max items per page (server-paginated; use limit to control page size) | |
| cursor | No | Cursor from a previous response nextCursor | |
| endtmp | No | Legacy: Unix timestamp (seconds) for end date. Converted to ISO YYYY-MM-DD. Ignored when end_date is also provided. | |
| fields | No | Select specific fields to return (e.g., ["id", "name", "days", "discount"]). Reduces response size. If not provided, returns all fields from the API. | |
| summary | No | Return only count and pagination metadata without items (default: false) | |
| end_date | No | Filter payments on or before this ISO date (YYYY-MM-DD). Forwarded directly to the v2 API. | |
| starttmp | No | Legacy: Unix timestamp (seconds) for start date. Converted to ISO YYYY-MM-DD. Ignored when start_date is also provided. | |
| start_date | No | Filter payments on or after this ISO date (YYYY-MM-DD). Forwarded directly to the v2 API. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full burden. It does well on the big behavioral caveat β the active-fiscal-year scoping that silently hides older payments β plus cursor semantics, snake_case field naming, and decimal-comma amount strings. It says nothing about ordering, auth requirements, or how the fiscal-year restriction interacts with explicit start_date/end_date filters, which is a meaningful gap for a no-annotation tool.
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?
Purpose is front-loaded, followed by pagination, then the critical fiscal-year caveat and the alternative route, which is good ordering. It is dense and every sentence carries information, though the parenthetical API version and 'live-verified against v2' do not help an agent decide or invoke.
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 eight optional parameters, no annotations, and no output schema, the description supplies the pitfalls an agent actually needs: the hidden fiscal-year filter, the cursor flow, and the amount/field-naming quirks. It stops short of describing result ordering or whether the date range can override the fiscal-year scope, which matters given no output schema exists.
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 100%, so every parameter is already documented and the baseline is 3. The description reinforces cursor usage and the YYYY-MM-DD date format but adds no meaning beyond the schema for fields, summary, or the legacy starttmp/endtmp parameters. The most valuable parameter insight β whether date filters can escape the fiscal-year filter β is absent.
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?
States a specific verb and resource ('List all payments') with the API version, and immediately distinguishes itself from the closest sibling by naming get_document_payments for the cross-year case. An agent can tell list_payments apart from get_payment, create_payment, and get_document_payments without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when-not: prior-year payments do NOT appear because of the active-fiscal-year filter, and names the alternative (get_document_payments via the document's paymentsDetail) for cross-year audits. It also tells the agent how to paginate and how to filter by date, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_product_imagesB
List all images of a product (Holded API v2)
| Name | Required | Description | Default |
|---|---|---|---|
| productId | Yes | Product ID |
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, yet it says nothing about read-only safety, pagination, ordering, or what an image entry looks like. '(Holded API v2)' is provenance, not behavioral disclosure. For a no-annotation tool this is a notable gap.
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?
One short, front-loaded sentence with no wasted clauses. The only marginal filler is the '(Holded API v2)' tag, which does not aid tool selection.
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 simple one-parameter list tool with no output schema, the description conveys the resource and scope adequately, but it leaves the return shape (URLs, sizes, ordering) and any pagination unspecified, so an agent cannot fully predict the response.
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 single parameter productId has a schema description and 100% coverage, so the schema already documents it fully. The description adds no meaning beyond the schema, which matches the baseline 3 when schema coverage is high.
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?
States a specific verb (List) and resource (all images of a product), which is clear enough to distinguish it from the sibling getters get_product_main_image and get_product_secondary_image by the 'all images' scope. It does not explicitly name those siblings, but the plural scope is implicit differentiation.
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?
Usage is only implied by the word 'all' β an agent can infer this is the collection-level read versus the single-image siblings, but there is no explicit when-to-use/when-not statement or named alternative. No prerequisites or conditions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_productsA
List products (Holded API v2). Cursor-paginated: pass the previous response nextCursor as cursor. Server-paginated; use limit to control page size. Response fields are snake_case; amounts are strings with decimal comma.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max items per page (server-paginated; use limit to control page size) | |
| cursor | No | Cursor from a previous response nextCursor | |
| fields | No | Project only these fields per item (e.g. ["id", "name", "sku"]). Reduces response size. | |
| summary | No | Return only count and pagination metadata without items (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it delivers meaningful behavior: server-side pagination driven by nextCursor and the response conventions (snake_case keys, amounts as decimal-comma strings). It does not state permission/auth needs, rate limits, or default ordering, so it stops short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences, front-loaded with purpose, then pagination mechanics, then response format. No filler and no repetition.
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 4-param read tool with no annotations and no output schema, pagination and return-format disclosure cover the main unknowns. Missing defaults (page size, sort order) and auth expectations keep it from being fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so limit, cursor, fields and summary are all already documented. The description's cursor hint largely restates the schema and it never mentions 'fields' projection or 'summary', so it adds little beyond the structured data.
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?
States a specific verb+resource ('List products') plus the source API, and the plural form cleanly separates it from get_product, create_product, update_product and delete_product in the sibling set. It does not explicitly name those siblings, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the name and the pagination instructions; the description never says when to prefer this over get_product or list_product_images, nor any prerequisite or exclusion. The cursor loop instruction is operational guidance, not selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_project_timesA
List time-tracking entries across all Holded projects (Projects API v2). Returns a cursor-paginated flat list of entries; pass the previous nextCursor as cursor to fetch the next page. Each entry contains timeId, duration (seconds), date (Unix seconds), approved (0/1), projectId, and projectName. The approvedOnly, startDate, and endDate filters are applied client-side on the current page β use pagination to iterate over the full dataset. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max items per cursor page (default: 50) | |
| cursor | No | Cursor token from a previous response nextCursor to fetch the next page | |
| endDate | No | Keep only entries on or before this date (YYYY-MM-DD, inclusive) β applied client-side on the returned page | |
| startDate | No | Keep only entries on or after this date (YYYY-MM-DD, inclusive) β applied client-side on the returned page | |
| approvedOnly | No | Keep only approved entries (approved === 1) β applied client-side on the returned page. Default: false |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and does well: it declares "Read-only", explains cursor-pagination mechanics, enumerates the returned fields with units (duration in seconds, date as Unix seconds), and discloses the important gotcha that approvedOnly/startDate/endDate only filter the current page. It omits auth/permission requirements and rate-limit behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded in the first clause, followed by pagination mechanics, return shape, and the filter caveat in that order of operational importance. No filler sentences; even the field enumeration earns its place because no output schema exists.
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 read-only list tool with no output schema and no annotations, the description covers return shape, pagination, and the surprising client-side filter semantics β everything an agent needs to call it correctly and interpret results. Only missing element is guidance on when to prefer a sibling tool.
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 100%, so all five parameters are already documented in the schema, including the client-side filtering caveat. The description restates the cursor and filter behavior but adds no syntax or format detail beyond what the schema provides, so the baseline of 3 applies.
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?
States a specific verb and resource ("List time-tracking entries across all Holded projects") plus the API family (Projects API v2). The "across all projects" scope distinguishes it from list_project_times_by_project and list_employee_times without needing to open either schema.
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?
Gives clear operational guidance for pagination ("pass the previous nextCursor as cursor to fetch the next page") and warns that filtering is client-side so pagination is needed for the full dataset. It does not explicitly route to sibling alternatives such as list_project_times_by_project when a single project is wanted, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_project_times_by_projectA
List time-tracking entries for a single Holded project (Projects API v2). Returns a cursor-paginated flat list of entries for the given projectId. Pass the previous nextCursor as cursor to fetch the next page. The approvedOnly, startDate, and endDate filters are applied client-side on the current page. Read-only.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max items per cursor page (default: 50) | |
| cursor | No | Cursor token from a previous response nextCursor to fetch the next page | |
| endDate | No | Keep only entries on or before this date (YYYY-MM-DD, inclusive) β applied client-side on the returned page | |
| projectId | Yes | The Holded project ID | |
| startDate | No | Keep only entries on or after this date (YYYY-MM-DD, inclusive) β applied client-side on the returned page | |
| approvedOnly | No | Keep only approved entries (approved === 1) β applied client-side on the returned page. Default: false |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the safety profile and does so explicitly ('Read-only'), plus discloses the important pagination and client-side-filtering quirks that a caller must know to avoid misreading partial results. It omits auth/permission needs and rate limits, so not full marks.
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?
Four short sentences, zero waste, with the resource and scope front-loaded, followed by return shape, pagination mechanics, filtering caveat, and safety. Nothing redundant.
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 six-parameter read tool with no output schema and no annotations, the description covers scope, pagination, filter semantics, and read-only status. It stops short of describing what an entry record contains, which would be the remaining gap in the absence of an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all six parameters, including cursor, limit, and the filter semantics, are already documented in the schema. The description restates the cursor chaining and client-side filter behavior without adding syntax or defaults beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (time-tracking entries) and narrows scope to 'a single Holded project', which implicitly contrasts with the sibling list_project_times. It does not explicitly name that sibling or state the all-projects alternative, keeping it from a 5.
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?
Gives clear context (single project, Projects API v2) and an explicit operational instruction for pagination: pass the previous nextCursor as cursor. It also warns that approvedOnly/startDate/endDate filter client-side on the current page, which tells the agent results may be sparse per page. No explicit when-not or named alternative tool, so not a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_remittancesA
List all remittances (Holded API v2). Cursor-paginated: pass the previous response nextCursor as cursor. Response fields are snake_case; amounts are strings with decimal comma. NOTE: namespace relocated from /remittances to /treasury/remittances in v2.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max items per page (server-paginated; use limit to control page size) | |
| cursor | No | Cursor from a previous response nextCursor | |
| fields | No | Project only these fields per item (e.g. ["id", "name", "date"]). Reduces response size. | |
| summary | No | Return only count and pagination metadata without items (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and adds useful context: cursor-based pagination via previous nextCursor, snake_case response fields, decimal-comma amount strings, and the v2 namespace relocation. It still does not state read-only semantics explicitly, default page size, or error 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 front-loaded with the core operation, then adds pagination, response-format, and namespace details in tight sentences. Every clause carries useful information with no filler.
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 paginated list tool with no output schema and no annotations, the description covers the essential operational context: pagination, response shape hints, and namespace migration. Minor gaps remain around default behavior and the tool's relation to get_remittance, but nothing critical is missing for a correct call.
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 100%, so all four parameters are already documented in the schema. The description reinforces cursor semantics but does not add field-level meaning beyond what the schema provides, so the baseline of 3 is appropriate.
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 a specific verb and resource: list all remittances. It also pins the API version and namespace, which removes ambiguity. However, it does not explicitly distinguish this bulk-listing tool from the sibling get_remittance 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?
The description explains cursor mechanics but never says when to use this tool versus get_remittance or other treasury tools. There are no exclusions, prerequisites, or alternative-routing guidance, leaving usage largely implied by the verb 'list'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_salary_recordsA
List payroll salary records (Holded API v2, requires scope accounting:payrolls.read). Each record has employee info, earnings/deductions lines, totals and payment status (PENDING, PAID, PARTIALLY_PAID). Cursor-paginated.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max items per page | |
| cursor | No | Cursor from a previous response nextCursor |
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 the read scope requirement, that results are cursor-paginated, the fields returned (employee info, earnings/deductions lines, totals), and enumerates payment status values β solid behavioral context beyond the schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences, zero waste. The core action and resource lead, then prerequisites and result shape follow in priority order.
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 no output schema, the description compensates by sketching the returned record structure and status enum. What's missing is field naming or ordering guidance an agent would need to parse results, but the shape is otherwise adequately conveyed.
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 100% with only two parameters, both fully documented in the schema. The description's mention of 'cursor-paginated' reinforces the cursor semantics but adds no new detail about limit defaults or paging size.
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?
States a specific verb and resource ('List payroll salary records') and the record shape. The 'list' verb distinguishes it from get_salary_record/create_salary_record siblings, though it doesn't name them 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?
Provides the required scope (accounting:payrolls.read), which is a genuine prerequisite an agent needs before calling. However it never states when to use this vs. get_salary_record for a single record, nor what filters are available for narrowing the listing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_sales_channelsA
List all sales channels (Holded API v2). Cursor-paginated: pass the previous response nextCursor as cursor. Response fields are snake_case; amounts are strings with decimal comma. Supports field filtering to reduce response size.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max items per page (server-paginated; use limit to control page size) | |
| cursor | No | Cursor from a previous response nextCursor | |
| fields | No | Project only these fields per item (e.g. ["id", "name"]). Reduces response size. | |
| summary | No | Return only count and pagination metadata without items (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the disclosure burden. It usefully explains cursor pagination and response conventions such as snake_case field names and decimal-comma amount strings, which are not captured elsewhere. It does not mention auth, rate limits, or side effects, but for a clearly read-only list operation the key behavioral details are covered.
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 three tight sentences, front-loaded with the core purpose, followed by pagination and response-format details. Every sentence contributes useful information without repetition.
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 no output schema, the description provides important return-value conventions like snake_case and decimal-comma amounts, plus pagination behavior. It is largely complete for a list tool, though it does not describe the full response envelope or explicitly mention the summary parameter.
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 100%, so all four parameters already have documented semantics. The description reinforces cursor usage and field filtering, but adds little syntax or meaning beyond what the schema provides, so the baseline 3 is appropriate.
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 gives a specific verb and resource: 'List all sales channels'. The word 'all' and the sibling set make clear this is the bulk-list operation, distinct from get_sales_channel and the create/update/delete channel tools.
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 explains pagination usage by saying to pass the previous response's nextCursor as cursor, and mentions field filtering to reduce response size. However, it gives no explicit guidance on when to use this tool versus get_sales_channel or other list tools, and states no exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_servicesA
List all services (Holded API v2). Cursor-paginated: pass the previous response nextCursor as cursor. Response fields are snake_case; amounts are strings with decimal comma. Supports field filtering to reduce response size.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max items per page (server-paginated; use limit to control page size) | |
| cursor | No | Cursor from a previous response nextCursor | |
| fields | No | Project only these fields per item (e.g. ["id", "name", "price", "tax"]). Reduces response size. | |
| summary | No | Return only count and pagination metadata without items (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden well: it discloses cursor-pagination semantics (use previous nextCursor), response formatting (snake_case fields, decimal-comma string amounts), and field-filtering to shrink payloads. It doesn't state rate limits or explicit read-only nature, but 'List' plus these details give solid behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action, then packs pagination, response format, and filtering into a few tight sentences. Dense but every clause contributes useful information; no filler.
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 simple read-only list tool with no output schema, the description adequately covers return-shape quirks (snake_case, string amounts) and pagination. Minor gaps like default page size or what a 'service' record contains are acceptable.
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 100%, so all four parameters (limit, cursor, fields, summary) are already documented. The description reinforces pagination and field filtering but adds little beyond the schema, meriting the baseline 3.
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?
States a specific verb and resource ('List all services') clearly, and the API version context is a bonus. It is distinguishable from get_service/create_service by the list verb, though it never explicitly names the CRUD siblings it differs from.
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 explains how to paginate but not when to choose this tool over get_service, or any retrieval-context guidance. Usage is only implied by the 'List' verb, with no exclusions or alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_treasuriesA
List all treasury accounts (Holded API v2). Cursor-paginated: pass the previous response nextCursor as cursor. Response fields are snake_case; amounts are strings with decimal comma. WARNING: the balance field is a STATIC opening figure, not a live balance derived from transactions β do NOT rely on it for reconciliation or to compute the current cash position. Overlaps with list_bank_accounts/get_bank_account/create_bank_account (official treasury tools); consolidation planned for 2.1.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max items per page (server-paginated; use limit to control page size) | |
| cursor | No | Cursor from a previous response nextCursor | |
| fields | No | Project only these fields per item (e.g. ["id", "name", "balance"]). Reduces response size. | |
| summary | No | Return only count and pagination metadata without items (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden and does so well: it discloses cursor pagination, response field casing, amount formatting, and a critical warning that balance is a static opening figure rather than a live balance. These are exactly the behavioral traits an agent needs to avoid misuse.
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 front-loaded with the core purpose, then supplies pagination, response-format, and warning details in a compact sequence. Every sentence carries operational value, including the overlap and planned-consolidation note.
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 annotations and no output schema, the description compensates by explaining pagination mechanics, response field formatting, amount formatting, and the important balance caveat. It is complete enough for an agent to call the tool correctly and interpret the result cautions.
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 100%, so the schema already documents all four optional parameters. The description adds useful cursor-pagination context and response-format details, but it does not add parameter-specific meaning beyond what the schema provides, so the baseline 3 is appropriate.
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 a specific verb and resource: 'List all treasury accounts'. It also distinguishes this listing operation from sibling get/create treasury tools and notes overlap with bank-account tools, so an agent can identify the tool's role without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear context by naming overlapping alternatives (list_bank_accounts, get_bank_account, create_bank_account) and warns against using the balance field for reconciliation or cash-position calculations. It stops short of an explicit rule for when to choose this tool over those alternatives, but the warning and overlap note provide meaningful guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_warehousesA
List all warehouses (Holded API v2). All warehouses are returned in a single call (no cursor pagination). Supports field filtering and summary mode.
| Name | Required | Description | Default |
|---|---|---|---|
| fields | No | Project only these fields per item (e.g. ["id", "name", "address"]). Reduces response size. | |
| summary | No | Return only total count without items (default: false) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It does disclose a genuinely useful behavioral trait β the response is complete with no cursor pagination β but says nothing about permissions, rate limits, or the fact that this is a safe read operation beyond the implied 'List'.
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?
Three short sentences, front-loaded with the resource and the most decision-relevant fact (no pagination), then the optional modifiers. No filler or restated boilerplate.
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 simple zero-required-param read tool with full schema coverage and no output schema, the definition covers scope and response-size behavior adequately. The only real gap is an explicit steer away from the warehouse-stock sibling and a hint about response shape.
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 100%, so both optional params already carry their own descriptions and examples. The description only restates 'field filtering and summary mode' at a high level, adding no syntax, defaults, or interaction details beyond the schema; baseline 3 applies.
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?
States a specific verb and resource ('List all warehouses') plus the API version, which is enough to separate it from get_warehouse/create_warehouse/update_warehouse. It does not explicitly distinguish itself from the nearby 'list_warehouse_stock' sibling, which also lists warehouse-related data, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: the 'summary mode' and 'field filtering' mentions hint at when to reach for those options, but there is no explicit when-to-use, no exclusion, and no named alternative (e.g. 'for stock levels per warehouse use list_warehouse_stock').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_warehouse_stockB
List all products stock in a specific warehouse (Holded API v2). Cursor-paginated: pass the previous response nextCursor as cursor. Server-paginated; use limit to control page size. Supports field filtering to reduce response size.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max items per page (server-paginated; use limit to control page size) | |
| cursor | No | Cursor from a previous response nextCursor | |
| fields | No | Project only these fields per item (e.g. ["product_id", "stock"]). Reduces response size. | |
| summary | No | Return only count and pagination metadata without items (default: false) | |
| warehouseId | Yes | Warehouse ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden; it does disclose meaningful behavior (cursor pagination, server-side paging, field projection to shrink payloads). But it omits the read-only nature, permission/auth requirements, return item shape, and does not mention the 'summary' parameter that changes the response format.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four short sentences with the purpose front-loaded and no filler. There is mild redundancy between the pagination sentences and the schema wording, but nothing egregious.
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 paginated list tool with no output schema and no annotations, the description should say more about what is returned and the summary mode. Pagination mechanics are well covered, but response content and the response-altering summary parameter are left undisclosed.
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 100%, so the baseline is 3, and the description largely restates what the schema already documents (cursor from nextCursor, limit for page size, fields filtering). It adds no syntax or format detail beyond the schema and never explains the summary flag.
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 a specific verb and resource ('List all products stock in a specific warehouse') and scopes it via the required warehouseId. It is clearly distinct from siblings such as list_warehouses or update_product_stock, though it does not name an alternative 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?
It gives procedural guidance for iteration ('pass the previous response nextCursor as cursor') and page sizing, which tells the agent how to call it repeatedly. However, it offers no when-to-use/when-not guidance or comparison against related tools like list_warehouses or update_product_stock.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pause_employeeB
WRITE: starts a pause in the current working session of an employee (Holded API v2).
| Name | Required | Description | Default |
|---|---|---|---|
| employeeId | Yes | Employee ID |
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 of behavioral disclosure. It correctly flags a WRITE operation and states it starts a pause, but omits critical mutation details: required employee state, side effects, idempotency, error handling, and permissions.
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 definition is a single, well-structured sentence that front-loads the operation type (WRITE) and then states the action clearly. There is no wasted text, and every phrase contributes to understanding.
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 simple one-parameter mutation with no annotations or output schema, the description covers the core action but omits state preconditions (e.g., employee must be clocked in) and behavioral effects. It is minimally viable but not complete enough to prevent misuse.
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 100% for the single employeeId parameter, and the description adds no additional syntax or formatting details. Baseline 3 is appropriate because the schema already fully documents the parameter.
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 uses a specific verb (starts a pause) and resource (current working session of an employee), clearly distinguishing it from unpause_employee and clock in/out. It does not explicitly name alternative siblings, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'current working session' implies the employee must already be clocked in before calling, but there is no explicit when-to-use or when-not-to-use guidance. No alternatives are named, leaving the agent to infer correct usage from context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pay_documentA
Register a payment for a document (Holded API v2). Supported docTypes: invoice, salesreceipt, creditnote, receiptnote, purchase β others throw an unsupported error. IMPORTANT: this may AUTO-APPROVE the document as a side effect (status 0β1). paymentmethod is the payment-method catalog id (from list_payment_methods), NOT a bank/treasury id. To link the payment to a bank account, pass bankId: the /payments endpoint can't set it, so the tool performs a second step (PUT /payments/{id}) and reports the outcome in _warnings.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Payment date as Unix timestamp | |
| amount | Yes | Payment amount | |
| bankId | No | Bank account id to link the payment to. Triggers a second step (PUT /payments/{id}) to set the bank link on the payment. | |
| docType | Yes | Type of document | |
| documentId | Yes | Document ID | |
| treasuryId | No | Treasury account ID | |
| paymentmethod | No | Payment-method catalog id (from list_payment_methods), NOT a bank/treasury id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it warns the document may be auto-approved as a side effect (status 0β1), discloses that `bankId` triggers an internal second step (PUT /payments/{id}), and says the outcome surfaces in `_warnings`. Error behavior for unsupported docTypes is also explicit.
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?
Four tightly packed sentences, no filler. The most consequential facts β supported docTypes, the auto-approval side effect, and the bankId two-step β are front-loaded in that order.
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 mutation tool with no annotations and no output schema, it covers the essential risks: side effects, partial-failure behavior via the second PUT, the `_warnings` field, and unsupported-input errors. What remains unstated is permission/auth requirements and how the final payment result is shaped.
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 100%, so the baseline is 3, but the description adds real meaning beyond the schema: it constrains `docType` to the five values that actually work, and re-emphasizes that `paymentmethod` is a catalog id, not a bank/treasury id. It does not clarify `treasuryId` or `date` usage.
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?
States a specific verb and resource ('Register a payment for a document') and scopes it to Holded API v2 with an explicit list of supported docTypes. It distinguishes itself implicitly from the bare payment tools by being document-scoped, though it never names the sibling `create_payment` to sharpen the contrast.
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?
Gives concrete when-not guidance: only invoice, salesreceipt, creditnote, receiptnote and purchase are supported, others throw an error β even though the schema enum lists more values. It also points to `list_payment_methods` for the paymentmethod id. It does not state when to use this versus `create_payment` or `list_payments`.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reconcile_bank_movementA
WRITE: reconciles a bank movement against documents/entries (Holded API v2, official endpoint β replaces the experimental reconcile_bank_transaction from the internal API when v2 is enabled). data is sent verbatim as the request body β see https://www.holded.com/es/desarrolladores/referencia-api (TesorerΓa β Conciliar).
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | Reconciliation payload, sent verbatim as body | |
| accountId | Yes | Bank account ID | |
| movementId | Yes | Bank movement ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the full behavioral burden; the 'WRITE:' prefix usefully signals mutation. However it says nothing about permissions, reversibility, side effects on balances, or error behavior, deferring instead to an external API reference link.
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?
Two compact sentences with the write nature and core purpose front-loaded, and no filler. The parenthetical about the replaced tool earns its place by aiding tool selection.
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 mutation tool with no annotations, no output schema, and a nested verbatim payload, the description is minimally adequate: it identifies the operation and where to find the body format. It omits what a successful reconciliation returns and any guardrails an agent needs before mutating financial records.
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 100%, so the baseline is 3, but the description adds that `data` is sent verbatim as the request body and points to the TesorerΓa β Conciliar reference for its structure. That extra pointer is genuinely useful for a nested-object payload, though the payload fields themselves remain external.
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?
States a specific verb and resource ('reconciles a bank movement against documents/entries') and flags it as a write operation up front. It also distinguishes itself from the deprecated experimental reconcile_bank_transaction, though it doesn't differentiate from live siblings like create_bank_movement or list_bank_movements.
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 only conditional guidance is 'replaces the experimental reconcile_bank_transaction from the internal API when v2 is enabled', which gives a version-selection rule. There is no explicit statement of when to reconcile vs. use related movement/payment tools, nor any prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_documentA
Send a document by email (Holded API v2). Supported docTypes: invoice, salesreceipt, creditnote, receiptnote, estimate, proform, salesorder, waybill, purchaseorder. purchase and purchaserefund are not supported in v2.
| Name | Required | Description | Default |
|---|---|---|---|
| emails | No | Array of email addresses to send to | |
| docType | Yes | Type of document | |
| message | No | Email message body | |
| subject | No | Email subject | |
| documentId | Yes | Document ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It says the tool sends email, but does not disclose external side effects, permission requirements, whether sending is irreversible, rate limits, or what happens when emails are omitted.
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 front-loaded with the core action and then supplies only the necessary docType constraints. The list of supported types is long but directly useful, with no filler.
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?
It covers the key docType constraint well, but for an email-sending mutation with no annotations and no output schema, it leaves important gaps: whether emails are optional or default to something, what confirmation is returned, and what permissions or side effects apply are not explained.
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 100%, so the baseline is 3, but the description adds important semantic value by correcting the enum: it lists supported docTypes and states that purchase and purchaserefund are not supported in v2 despite appearing in the schema enum.
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 a specific verb, resource, and channel: 'Send a document by email (Holded API v2).' It clearly separates this action from sibling document tools such as create_document, get_document_pdf, and attach_file_to_document.
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 provides clear usage constraints by listing supported docTypes and explicitly excluding purchase and purchaserefund in v2. It does not name alternative tools or state when to prefer this over other document actions, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ship_all_itemsA
Ship all items of a document (Holded API v2). salesorder β POST /sales-orders/{id}/ship. purchaseorder β POST /purchase-orders/{id}/receive (receive from supplier). All other docTypes are not supported in v2.
| Name | Required | Description | Default |
|---|---|---|---|
| docType | Yes | Type of document | |
| documentId | Yes | Document ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the full behavioral burden; it does disclose that this is a POST mutation and that purchaseorder maps to a receive-from-supplier action rather than a ship, which is genuinely useful and non-obvious. It does not say what happens when an unsupported docType is passed (error vs no-op), whether the operation is idempotent or reversible, or what permissions/state are required.
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?
Three short sentences, front-loaded with the action, then a compact docType-to-endpoint routing table, then the exclusion rule. Every sentence carries load and nothing is padded.
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?
Covers routing and support boundaries for a mutation tool that has no annotations, which is the most important gap. It leaves open the failure mode for unsupported docTypes and what the call returns (no output schema exists, so return-shape expectations go unaddressed).
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 100%, so the baseline is 3, but the description adds real meaning: the enum lists 11 docTypes while only 2 actually work, and the description narrows that set and explains the divergent semantics for purchaseorder. documentId remains merely 'Document ID' but the schema already covers it.
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?
States a specific verb and resource ("Ship all items of a document") and adds the exact endpoints per docType, so the agent knows precisely what the call does. The scope word "all" implicitly separates it from ship_items_by_line, but the sibling is never named, so differentiation is inferred rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says which docTypes are supported (salesorder, purchaseorder) and that all others are not supported in v2 β a clear when-to-use/when-not rule. It does not, however, point to ship_items_by_line as the alternative for partial/line-level shipping.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ship_items_by_lineA
Ship specific items by line (Holded API v2). salesorder only β POST /sales-orders/{id}/ship-by-lines. purchaseorder line-level receive is UNVERIFIED in v2 and throws unsupported. All other docTypes are not supported.
| Name | Required | Description | Default |
|---|---|---|---|
| lines | Yes | Array of line items to ship | |
| docType | Yes | Type of document | |
| documentId | Yes | Document ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full disclosure burden. It usefully discloses failure behavior (purchaseorder throws unsupported) and the API version constraint, but says nothing about side effects β whether stock is decremented, whether the document status transitions, whether partial/repeat shipments are allowed, or what permissions are required.
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?
Three short sentences, no filler, and the supported-docType constraint is front-loaded ahead of the failure mode. Every sentence earns its place by preventing a distinct class of wrong call.
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?
Without an output schema or annotations, the description should say more about what happens on success and what the lines structure means (units vs. full-line shipment). It is complete on docType validity but incomplete on outcome and partial-shipment semantics.
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 100%, so the baseline is 3, but the description adds real meaning the schema cannot: the docType enum lists eleven values while only salesorder actually works. That rescues the agent from a schema that would otherwise invite an invalid call.
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?
States a specific verb+resource ('Ship specific items by line') and pins the exact endpoint and supported document type. Implicitly distinguishes itself from ship_all_items via 'by line', but never names that sibling, so the differentiation is inferential rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives unambiguous when-not-to-use guidance: purchaseorder line-level receive is unverified and throws unsupported, and all other docTypes are unsupported β an agent can rule out every enum value except salesorder. It does not name ship_all_items as the alternative for whole-order shipping, leaving the routing choice to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
unpause_employeeA
WRITE: ends the current pause of an employee working session (Holded API v2).
| Name | Required | Description | Default |
|---|---|---|---|
| employeeId | Yes | Employee ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It discloses that this is a WRITE operation and what state changes, but omits permissions, idempotency, behavior if the employee is not paused, and return value.
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?
One front-loaded sentence labels the action as WRITE and states the effect without filler. It is appropriately sized for a simple tool.
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 one-parameter write tool, the description gives enough to identify the action and target. However, without annotations or an output schema, it leaves out prerequisites, error behavior, and return information, so it is only minimally complete.
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 single required employeeId parameter is fully documented in the schema, and the description adds only that it relates to an employee working session. With 100% schema coverage, the baseline of 3 is appropriate; no extra format or constraints are provided.
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?
States a specific write action and resource: it ends the current pause of an employee working session. The verb 'unpause' and phrase 'ends current pause' distinguish it from pause_employee and other employee time 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?
The phrase 'ends the current pause' implies the precondition that a pause exists, but it does not explicitly say when to use this instead of pause_employee, clock_in_employee, or clock_out_employee. No exclusions or error conditions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_bank_accountB
WRITE: updates a treasury bank account in Holded (API v2). data is sent verbatim as the request body β see https://www.holded.com/es/desarrolladores/referencia-api (TesorerΓa β Actualizar cuenta).
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | Fields to update, sent verbatim as body | |
| accountId | Yes | Bank account ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description does useful work by labeling the operation WRITE and warning that the body is sent verbatim with no field mapping or validation, which is real behavioral signal. However it omits permissions, reversibility, partial-vs-full update semantics (are omitted fields cleared?), and error behavior β significant gaps for an unannotated mutation.
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?
Two sentences, front-loaded with the operation type and no filler. It is efficient, though the brevity shades into under-specification given the free-form nested body.
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 mutation with a free-form nested `data` object, no annotations, and no output schema, the description leans on an external URL to carry the field contract, which is a fragile dependency for an agent that may not fetch it. Minimum viable, but it should at least characterize the response and key constraints inline.
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 100%, so the baseline is 3. The description adds one meaningful clarification β that `data` passes through verbatim rather than being transformed β but gives no hint about which fields are valid, deferring entirely to the external Holded reference.
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?
States a specific verb and resource ("updates a treasury bank account") and scopes it to Holded API v2, so it is distinguishable from get_bank_account / delete_bank_account / archive_bank_account by name alone. It does not explicitly name those siblings or contrast the operation, keeping it below a 5.
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 "WRITE:" prefix implies a mutation but there is no when-to-use guidance, no exclusion versus archive/delete, and no stated prerequisites (auth scope, account state, required fields). The agent must infer all routing decisions from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_contactC
Update an existing contact (Holded API v2)
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | NIF / CIF / VAT number or tax identification code for the contact. This is the correct Holded API field for tax IDs. Note: the legacy "vatnumber" field does not exist in Holded and is silently ignored. | |
| name | No | Contact name | |
| note | No | Notes about the contact | |
| type | No | Contact type | |
| No | Contact email | ||
| phone | No | Contact phone number | |
| contactId | Yes | Contact ID to update | |
| tradename | No | Trade name | |
| billAddress | No | Billing address | |
| contactPersons | No | List of contact persons associated with this contact |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It only says 'Update an existing contact' and mentions Holded API v2, but does not explain whether updates are partial or full replacement, what happens to omitted fields, permissions required, or side effects.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single short sentence with no wasted words, but it is under-specified rather than appropriately concise. It is front-loaded but lacks the structural detail needed for a complex mutation tool.
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 ten-parameter mutation tool with nested objects and no annotations or output schema, the description is far too thin. It omits update semantics, required-field behavior, and any operational context the agent would need beyond the schema.
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 100%, so all ten parameters are already documented in the schema, including the important code-vs-vatnumber note. The description adds no parameter-level meaning beyond the schema baseline, which warrants a 3.
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 a specific verb and resource: 'Update an existing contact.' This clearly distinguishes it from create/get/list/delete siblings by operation, though it adds no explicit sibling differentiation beyond the verb.
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, prerequisites, or what conditions must hold. The agent must infer that this is the mutation counterpart to create_contact and get_contact.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_contact_groupC
Update an existing contact group (Holded API v2)
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Contact group name | |
| groupId | Yes | Contact group ID to update |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full disclosure burden but provides essentially none. It does not say whether the update is partial or full-replacement, whether omitted fields are preserved, what permissions are required, or whether the change is reversible; only the '(Holded API v2)' tag adds any context.
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?
A single, front-loaded sentence with zero filler or redundancy. It is efficient, though so brief that brevity shades into under-specification rather than tight structure.
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 mutation tool with no annotations, no output schema and no sibling routing, the description should at minimum cover partial-update semantics and the effect of omitting 'name'. None of that is present, so an agent cannot predict the result of a call.
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 100%, with both 'name' and 'groupId' documented in the schema, so the baseline of 3 applies. The description adds no meaning beyond the schema, such as whether 'name' is optional and what happens when it is omitted.
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?
States a specific verb ('Update') and resource ('an existing contact group'), making the operation unambiguous and clearly distinct from create_contact_group, get_contact_group and delete_contact_group by name. It does not explicitly point at those siblings, so it stops just short of full differentiation.
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 sibling CRUD operations, no prerequisites, and no note that the group must already exist beyond the word 'existing'. The agent must infer all usage context from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_documentC
Update an existing document
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Document date as Unix timestamp | |
| items | No | Array of line items | |
| notes | No | Notes for the document | |
| docType | Yes | Type of document | |
| currency | No | Currency code (e.g., EUR, USD) | |
| contactId | No | Contact ID for the document | |
| retention | No | IRPF retention percentage. Accepted on SALES documents only; rejected on purchases because Holded silently ignores it there. | |
| documentId | Yes | Document ID to update | |
| invoiceNum | No | Document reference number (e.g. invoice number from supplier) | |
| expAccountId | No | Expense account ID for expense documents | |
| salesChannelId | No | Sales channel ID to associate with the document |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries full burden. It only says 'Update an existing document' without disclosing whether it performs a partial or full update, what happens if the document doesn't exist, or any mutation side effects. This is inadequate for a mutation tool with 11 parameters.
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 single-sentence description is extremely brief but under-specified for a tool with 11 parameters. It lacks structure (e.g., behavioral notes, examples) and does not earn its place. True conciseness would convey more information efficiently.
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 of 11 parameters, the absence of an output schema, and no behavioral details in the description, the tool is incomplete. The agent lacks information about update semantics, error cases, or document type constraints beyond the schema.
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 100%, so the schema already documents all parameters. The description adds no additional meaning or guidance on parameter interactions (e.g., required vs optional, relationships like tax vs taxes array). Baseline 3 is appropriate.
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 verb 'update' and resource 'existing document', which is accurate. However, it lacks specificity to distinguish from sibling tools like update_document_pipeline or update_document_tracking, which also update documents but with different scopes. The schema provides additional context via docType enum, but the description itself is generic.
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 to use this tool versus create_document, delete_document, or other update tools. There are no hints about prerequisites, when not to use it, or alternatives. The agent must infer from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_document_pipelineA
Update pipeline stage for a document (Holded API v2). Uses PUT β verb changed from POST in v1. Supported for all docTypes except purchaserefund (v2 limitation). Route: PUT ${docBase}/{id}/pipeline.
| Name | Required | Description | Default |
|---|---|---|---|
| docType | Yes | Type of document | |
| stageId | Yes | Stage ID within the pipeline | |
| documentId | Yes | Document ID | |
| pipelineId | Yes | Pipeline ID |
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, and it does disclose the HTTP verb (PUT), the fact that the verb changed from POST in v1, the docType exclusion, and the exact route. It does not cover permission requirements, whether stage transitions are validated, or whether the change is reversible.
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?
Two dense sentences with the core action first and constraints after; nothing is padding. The route template is mildly implementation-leaky but is short and useful for debugging, so it 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?
For a four-required-parameter mutation with no output schema, the description covers the verb, version, route, and the one docType limitation. It could note what a successful response confirms or what happens with an invalid stageId, but nothing critical to correct invocation is missing.
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 100%, so the baseline is 3; the description adds genuine meaning by flagging that one value in the docType enum (purchaserefund) will fail, a constraint the schema itself does not convey. It adds nothing for documentId, pipelineId, or stageId beyond their schema descriptions.
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?
States a specific verb and resource ('Update pipeline stage for a document'), and the API version and route make it unambiguous that this targets the pipeline endpoint rather than the document itself. An agent can distinguish it from sibling update_document without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the one unsupported case ('all docTypes except purchaserefund (v2 limitation)'), which is a real usage guardrail an agent would otherwise miss. It stops short of pointing to an alternative path for purchaserefund or stating prerequisites, so it isn't a full when/when-not/alternatives treatment.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_document_trackingA
Update tracking information for a document (Holded API v2). Supported docTypes: salesorder (PUT /sales-orders/{id}/tracking) and waybill (PUT /waybills/{id}/tracking). All other types have NO EQUIVALENT in v2 and will throw an unsupported error. NOTE: this is a discrepancy with the task brief (which stated "all types unsupported") β the normative annex tables show salesorder and waybill do have tracking in v2.
| Name | Required | Description | Default |
|---|---|---|---|
| carrier | No | Carrier name | |
| docType | Yes | Type of document | |
| documentId | Yes | Document ID | |
| trackingNumber | No | Tracking number |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the full burden. It usefully discloses the endpoints (PUT) and the error behavior for unsupported types, but does not describe mutation side effects (e.g., whether tracking fields are replaced or merged), permission requirements, or what a successful response looks like.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose and support matrix are front-loaded and efficient. However, the final sentence about a discrepancy with a 'task brief' and 'normative annex tables' is internal rationale that does not help an agent invoke the tool and slightly dilutes focus.
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 mutation tool with no annotations and no output schema, the description covers the docType support matrix and error behavior but omits what happens on success, whether optional fields replace existing tracking data, and any auth/prerequisite context. Adequate but with clear gaps.
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 100%, so the baseline is 3. The description adds critical meaning beyond the schema by revealing that, despite the enum listing 11 docTypes, only two actually workβthis is essential for correct parameter selection, though it does not elaborate on carrier/trackingNumber semantics.
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?
Starts with a specific verb+resource ('Update tracking information for a document') and immediately scopes it via API version and supported docTypes, distinguishing it from the generic update_document sibling. An agent can identify exactly what operation this performs.
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?
Explicitly states that only salesorder and waybill are supported and that all other docTypes have no v2 equivalent and will throw an error. This is a clear when-to-use and when-not-to-use rule, leaving no ambiguity about the supported cases.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_employeeB
WRITE: updates a real employee record in Holded (API v2). data is sent verbatim as the request body β see https://www.holded.com/es/desarrolladores/referencia-api (Empleados β Actualizar).
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | Fields to update, sent verbatim as body | |
| employeeId | Yes | Employee ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden itself, and it does disclose the key trait that `data` is forwarded verbatim with no validation or field mapping, plus that it mutates a "real" record. It stops short of stating permission requirements, whether the update is partial or a full overwrite of unspecified fields, or what the response contains.
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?
Two sentences, front-loaded with the operation type and resource, with no filler. The external-doc pointer is long but earns its place by naming the exact section (Empleados β Actualizar).
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 an unannotated mutation tool with a free-form nested body and no output schema, the description covers the operation and body semantics but leaves gaps: no guidance on which fields are updatable, whether omitted fields are preserved, or what errors/lookups (e.g., invalid employeeId) look like.
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 100%, so the baseline is 3, but the description adds real value beyond the schema: it explains that the free-form `data` object is sent verbatim as the request body and points to the Holded developer reference for the field list. That compensates for the nested-object parameter being otherwise opaque.
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 a specific verb and resource ("WRITE: updates a real employee record in Holded (API v2)"), which is clearly distinct from adjacent siblings such as update_employee_contract or update_employee_time. It doesn't explicitly say how it differs from those, but the noun phrase is precise enough for correct selection.
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 when-to-use or when-not-to-use guidance, and no mention of prerequisites or alternatives. The "WRITE:" prefix implies a mutation context, but an agent must infer that this is for existing employees versus create_employee, and nothing warns against using it for contract or time-record updates.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_employee_contractB
WRITE: updates an employee's contract in Holded (API v2) β affects real HR/payroll data. data is sent verbatim as the request body β see https://www.holded.com/es/desarrolladores/referencia-api (Empleados β Actualizar contrato).
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | Contract payload, sent verbatim as body | |
| employeeId | Yes | Employee ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden: it usefully discloses that this is a real write touching HR/payroll data and that the payload is forwarded verbatim with no server-side shaping or validation. It omits permissions/auth requirements, whether the update is full-replacement or partial, error behavior, and the response shape (no output schema exists).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences with the mutation mode front-loaded before the resource, and the external reference link placed last where it will not crowd out the core signal. Nothing is wasted.
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 blind nested-object write against sensitive payroll data with no annotations and no output schema, the description covers risk but offloads the actual payload contract to an external URL the agent may not be able to fetch. The required fields of `data` are undocumented in both schema and description, which is a meaningful gap.
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 100% and both parameters are documented in the schema. The description's only parameter claim β that `data` is sent verbatim as the request body β merely restates the schema's own text and adds no field-level meaning for the nested contract payload.
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 a specific verb and resource ('updates an employee's contract') plus the system (Holded API v2), and the 'WRITE:' prefix immediately signals a mutation. It is distinguishable from the read sibling get_employee_contract, though it never names that sibling or any other alternative 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 statement of when to use this tool versus get_employee_contract or update_employee, and no prerequisites or exclusions. The 'affects real HR/payroll data' note is a caution about consequences rather than guidance for selecting the tool, leaving usage to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_employee_timeC
WRITE: updates a time-tracking record (Holded API v2). data is sent verbatim as the request body β see https://www.holded.com/es/desarrolladores/referencia-api (Control horario β Actualizar).
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | Fields to update, sent verbatim as body | |
| timeId | Yes | Time record ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so the description carries the full burden. The note that `data` is sent verbatim as the request body is genuinely useful behavioral context (no field filtering or validation layer), but nothing is said about partial vs. full replacement semantics, permission/auth requirements, whether omitted fields are nulled, or what the call returns.
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?
Two short sentences with the mutation marker front-loaded and no filler. The external documentation pointer is the only debatable inclusion, and it is arguably load-bearing given the free-form body.
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 mutation with no annotations and no output schema, and its key payload parameter is an untyped nested object with no defined properties β so the actual updatable fields live only behind an external URL. For a write tool where the body is everything, delegating the field list to a web page leaves a real gap.
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 100%, so both parameters are documented in the schema. The description's "sent verbatim as the request body" restates the schema's own wording rather than adding new meaning, so the baseline 3 applies.
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?
States a specific verb and resource ("updates a time-tracking record") and the "WRITE:" prefix makes the mutation nature unmistakable against read siblings like get_employee_time and list_employee_times. It doesn't explicitly name the create/delete siblings it differs from, but the resource naming is precise enough to disambiguate.
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 statement of when to use this versus create_employee_time or update_employee_contract, and no prerequisites. Only the implicit signal is the "WRITE:" label; the agent is left to infer that this requires an existing timeId.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_expenses_accountC
Update an existing expenses account (Holded API v2)
| Name | Required | Description | Default |
|---|---|---|---|
| code | No | PGC account number (e.g. "62900000"). This is the value surfaced as `accountNum` by list_expenses_accounts β Holded accepts it under the `code` key on create/update. | |
| name | No | Expenses account name | |
| accountId | Yes | Expenses account ID to update |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden, and it says almost nothing. It does not state whether omitted fields are preserved or cleared, whether it errors on unknown/invalid codes, whether updates are reversible, or what a success response looks like. The only extra signal is the 'Holded API v2' provenance.
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?
One front-loaded sentence with zero filler; the verb and resource lead. It is efficient but borders on under-specification for a mutation tool with three parameters.
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 write operation with no annotations, no output schema, and no statement of partial-update behavior or failure modes, the description is too thin. The well-documented schema partially compensates on inputs, but the mutation semantics and return behavior remain entirely undocumented.
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 100%, and the `code` parameter even explains the accountNum-to-code mapping, so the schema does the heavy lifting. The description itself adds nothing about required vs optional fields or update semantics, so baseline 3 applies.
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?
States a specific verb and resource: 'Update an existing expenses account'. The word 'existing' implicitly separates it from create_expenses_account, but the description never names the sibling CRUD tools (get/delete/list_expenses_account) to make the routing explicit.
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 on when to use this versus create_expenses_account or get_expenses_account, no prerequisites, and no note on whether it is a full replace or a partial patch. The agent must infer everything from the parameter set.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_invoicing_forecastB
WRITE: updates an invoicing forecast in Holded cashflow (API v2). data is sent verbatim as the request body β see https://www.holded.com/es/desarrolladores/referencia-api (TesorerΓa β Previsiones).
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | Fields to update, sent verbatim as body | |
| forecastId | Yes | Forecast ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden; it does disclose the key trait that `data` is forwarded verbatim with no validation or field mapping, and it flags the API version. It omits whether the update is partial-merge or replace, what happens to unspecified fields, auth requirements, and error/return 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?
Two short sentences, mutation intent front-loaded as "WRITE:", and the doc link placed last. Efficient, though the URL and parenthetical section hint make the second sentence heavier than it needs to be.
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 an unannotated write tool with an unconstrained nested object and no output schema, the description does the minimum plus a docs pointer. It leaves an agent unsure about partial-update semantics, required fields inside `data`, and what the call returns.
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 100%, so both parameters are already documented, and the schema text itself says "sent verbatim as body." The description largely repeats that and adds only a pointer to the external API reference for the shape of the nested `data` object, which is useful but minimal.
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?
States a specific verb plus resource ("updates an invoicing forecast") scoped to Holded cashflow API v2, which is enough to separate it from list/create/delete_invoicing_forecast siblings. It never explicitly names those siblings, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The "WRITE:" prefix implies mutating an existing record rather than creating one, but there is no statement of when to use this versus create_invoicing_forecast or delete_invoicing_forecast, and no prerequisites (permissions, required forecast state) are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_numbering_serieC
Update an existing numbering serie (Holded API v2)
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Serie name | |
| prefix | No | Serie prefix | |
| docType | Yes | Document type | |
| serieId | Yes | Serie ID to update | |
| nextNumber | No | Next number in the serie |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, yet it only says the serie is 'existing'. It does not disclose whether this is a partial or full update, whether omitted fields are preserved, permission requirements, or side effects such as changing numbering sequences.
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 the verb and resource front-loaded and no filler. It is efficient, though its brevity contributes to the missing behavioral detail rather than resolving it.
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 five-parameter mutation tool with no annotations and no output schema, the description is too thin. The schema documents field meanings fully, but nothing covers update semantics, conflict handling for nextNumber, or expected response behavior.
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 100%, with every parameter, including the docType enum and required serieId, documented in the input schema. The description adds no parameter semantics beyond what the schema already states, which is acceptable at this coverage level.
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 a specific verb (Update) and resource (numbering serie), and the '(Holded API v2)' suffix scopes it to the correct API. It distinguishes itself from create/get/delete_numbering_serie by the verb alone, though it never names those siblings explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 create_numbering_serie or get_numbering_series, no prerequisites, and no mention of what happens if a serie ID does not exist. The agent is left to infer context from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_paymentA
Update an existing payment (Holded API v2). IMPORTANT: Holded's PUT /payments/{id} REPLACES the record rather than merging, so any field omitted from the body is blanked. To prevent that, this tool first re-reads the current payment and merges your changes over it, preserving fields you did not pass (contactId, bankId, date, ...).
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Payment date as a Unix timestamp (seconds) | |
| days | No | Days until due | |
| name | No | Payment method name | |
| amount | No | Payment amount | |
| bankId | No | Bank account id to link the payment to | |
| contactId | No | Contact id associated with the payment | |
| paymentId | Yes | Payment ID to update |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses that the underlying PUT replaces the record, that omitted fields would otherwise be blanked, and that the tool mitigates this with a read-then-merge. What is missing is failure behavior β what happens if paymentId does not exist, whether the merge is subject to races, or what the call returns.
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?
Two sentences, both earning their place: the first identifies the operation, the second front-loads the critical replace caveat with a bolded IMPORTANT marker and then explains the mitigation. No filler or restated title.
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 7-parameter mutation tool with no annotations and no output schema, the description covers the single largest risk (silent field blanking) that an agent could not infer from the schema. It is nearly complete; only response shape and error semantics are unaddressed, and those are lower-stakes for a merge-style update.
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 already 100%, so the baseline is 3. The description earns above baseline by clarifying that every non-required parameter is genuinely optional and that omitting one preserves the existing value, naming contactId, bankId, and date as examples β a semantic guarantee the schema itself cannot express.
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 a specific verb+resource ("Update an existing payment") and anchors it to Holded API v2, which makes it clearly distinct from create_payment, get_payment, and delete_payment by name. It stops short of explicitly naming a sibling alternative in cases where creation or payment-via-document is intended, so not a full 5.
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 conveys important usage context: omitting fields is fine because the tool merges, so partial updates are the intended mode. However, it never states when to reach for this over siblings like pay_document or create_payment, nor does it list any exclusions or prerequisites (e.g. the payment must already exist and be owned by the caller).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_productC
Update an existing product (Holded API v2)
| Name | Required | Description | Default |
|---|---|---|---|
| sku | No | Product SKU | |
| tax | No | Tax percentage | |
| name | No | Product name | |
| price | No | Product price | |
| barcode | No | Product barcode | |
| costPrice | No | Cost price | |
| productId | Yes | Product ID to update | |
| description | No | Product description |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and adds no behavioral detail. It does not say whether this is a partial or full replacement update (i.e. whether omitted fields are cleared), what happens on an invalid productId, or whether the operation is idempotent β all critical for a mutation tool with 8 optional fields.
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?
One short, front-loaded sentence with zero waste, but it is under-specified rather than genuinely concise. There is no structural element (e.g. a note on partial updates) that would earn a higher score.
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 an 8-parameter mutation tool with no annotations and no output schema, the description is far too thin. It omits update semantics, permission requirements, and any indication of what is returned, leaving the agent to guess on everything except the verb and resource.
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 100%, so every one of the 8 properties is already documented in the schema. The description adds no semantics beyond the schema β no hint that all fields except productId are optional or how they interact β so the baseline 3 applies.
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?
States a specific verb and resource ("Update an existing product") and identifies the backing API (Holded v2), so the agent knows exactly what operation it is. It does not, however, distinguish this from sibling goods like update_product_stock, update_service, or create_product, so sibling routing still requires inference.
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 on when to use this versus update_product_stock, or versus create_product for a product that does not yet exist. There is no mention of prerequisites (existing product, permissions) or of the alternative of a full create/delete lifecycle.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_product_stockB
Update stock quantity for a product (Holded API v2). BREAKING CHANGE from v1: warehouse_id is now required; stock_variation replaces units; optional variant_id and description added.
| Name | Required | Description | Default |
|---|---|---|---|
| productId | Yes | Product ID | |
| variant_id | No | Variant ID to target a specific product variant (optional) | |
| description | No | Audit note describing the stock adjustment (optional) | |
| warehouse_id | Yes | Warehouse ID (required in v2 β v2 rejects stock updates without it) | |
| stock_variation | Yes | Stock delta (positive to add, negative to subtract). Replaces v1 `units`. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It usefully discloses that warehouse_id is mandatory and that v2 rejects calls without it, plus that the operation is a delta rather than an absolute set β but is silent on permissions, whether negative resulting stock is allowed, and the response shape.
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?
A single dense sentence with the core action front-loaded, followed by the migration caveat. Efficient, though the BREAKING CHANGE framing is more changelog than invocation guidance.
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 5-parameter mutation with zero annotation coverage and no output schema, the definition covers parameter shape adequately but omits the safety and side-effect context an agent needs β permission requirements, whether other warehouse quantities are affected, and what success returns.
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 100%, so the schema already documents all five parameters including the delta semantics of stock_variation and the audit-note purpose of description. The description mostly restates that schema content (variant_id/description optional, warehouse_id required), adding only the v1βv2 naming lineage.
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?
States a specific verb and resource: 'Update stock quantity for a product', which clearly separates it from the generic update_product sibling. It does not explicitly name alternatives such as update_product or the warehouse-stock reads, so it stops short of 5.
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 only guidance given is version-migration detail (v1 vs v2), not when to use this tool versus siblings like update_product or when a stock adjustment is the right operation. No preconditions, no exclusions, no alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_salary_recordA
WRITE: updates a payroll record in Holded (API v2) β affects accounting and HR data. data is sent verbatim as the request body β see https://www.holded.com/es/desarrolladores/referencia-api (Registros de nΓ³mina β Actualizar).
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | Fields to update, sent verbatim as body | |
| salaryRecordId | Yes | Salary record ID |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the burden: it correctly flags this as a write to sensitive accounting/HR data and discloses that the body is sent verbatim (no validation or transformation). It omits whether the update is partial or full, what permissions are required, and what is returned.
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?
Two sentences, front-loaded with the operation type and the consequence warning. The long documentation URL is justified because `data` is otherwise undocumented, though it makes the sentence heavy.
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 two-parameter mutation with a freeform body, no annotations and no output schema, the description covers the biggest unknown (body field semantics via the docs link). It still leaves the agent guessing about partial-update behavior and the response shape, so it is adequate but not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but `data` is a freeform nested object whose allowed fields are not defined anywhere in the schema. The description compensates by pointing to the exact API reference section (Registros de nΓ³mina β Actualizar) that defines those fields, which is real value beyond the schema.
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?
States a specific verb and resource (updates a payroll record in Holded) and tags it WRITE, so it is distinguishable from create_salary_record, get_salary_record and delete_salary_record. It does not explicitly name those siblings, but the verb+resource combination is 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 'WRITE' prefix and the warning that it 'affects accounting and HR data' imply this is for deliberate mutation of an existing record, which is useful context. However, there is no guidance on prerequisites (e.g. fetching current values first via get_salary_record) or when to prefer alternative flows.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_sales_channelC
Update an existing sales channel (Holded API v2)
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Sales channel name | |
| channelId | Yes | Sales channel ID to update |
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 not state whether this is a partial or full update, permission requirements, whether omitted fields are preserved, or any consequences of the mutation.
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 short and front-loaded with the action and resource. The API version note is useful, though the sentence is so terse that it leaves key behavioral information absent.
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 simple two-parameter mutation tool with complete schema coverage, the definition is minimally adequate. However, with no annotations and no output schema, it should do more to explain update semantics and expected behavior.
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 100%, so both parameters are already fully documented. The description adds no meaning beyond the schema, making this the baseline adequate score.
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 gives a clear verb and resource ('Update an existing sales channel') and identifies the API version. It is distinguishable from siblings like create_sales_channel and delete_sales_channel by the verb, though it does not explicitly contrast its scope with them.
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 on when to use this tool versus create/get/delete sales channel siblings, nor any prerequisites such as when a channel ID is valid. Usage is only implied by 'existing'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_serviceC
Update an existing service (Holded API v2)
| Name | Required | Description | Default |
|---|---|---|---|
| sku | No | Service SKU | |
| tax | No | Tax percentage | |
| name | No | Service name | |
| price | No | Service price | |
| serviceId | Yes | Service ID to update | |
| description | No | Service description |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, yet it says nothing beyond "update." Critically, it does not state whether this is a partial patch (only serviceId is required, with all five other fields optional) or a full replacement of the service record, nor what permissions or side effects apply.
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?
A single compact sentence with the operation front-loaded and no wasted prose. The parenthetical "(Holded API v2)" adds minimal value but is not disruptive; the brevity is close to under-specification rather than verbosity.
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 six-parameter mutation tool with no annotations and no output schema, the description omits the essentials: partial-vs-full update semantics, what is returned, and error conditions. Only the schema fields carry any 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?
Schema description coverage is 100%, so every field including serviceId is already documented inline. The description adds no meaning beyond the schema, which is the baseline-3 case for a fully documented schema.
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?
States a specific verb and resource ("Update an existing service") that clearly identifies the operation. Sibling naming (create_service, get_service, delete_service, list_services) makes the distinction obvious, but the description itself does not name or differentiate any alternative.
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 create_service or update_product, no prerequisites, and no exclusions. The agent must infer usage entirely from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_warehouseA
Update an existing warehouse (Holded API v2). BREAKING CHANGE from v1: HTTP verb changed from PUT to PATCH.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | City | |
| name | No | Warehouse name | |
| address | No | Warehouse address | |
| country | No | Country | |
| province | No | Province | |
| postalCode | No | Postal code | |
| warehouseId | Yes | Warehouse ID to update |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It mentions the HTTP verb change from PUT to PATCH, which hints at partial-update semantics, but it does not explain whether omitted fields are preserved, what permissions are required, or what side effects occur.
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 short sentences, front-loads the core action, and avoids repetition. The breaking-change note is compact and placed after the primary purpose.
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 mutation tool with no annotations and no output schema, the description is minimal but adequate given the complete schema. However, it does not explain PATCH partial-update behavior or failure conditions, which are important for correct invocation.
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 100%, so all seven parameters are already documented. The description adds no additional parameter meaning, such as which fields are commonly updated or how warehouseId is obtained, so the baseline 3 is appropriate.
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 a specific verb and resource: update an existing warehouse. It clearly distinguishes the tool from sibling warehouse operations such as create_warehouse, get_warehouse, and delete_warehouse.
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 phrase 'Update an existing warehouse' implies when to use it, but there is no explicit guidance on when not to use it or which sibling to choose for related tasks. The v1 breaking-change note is context, not usage guidance.
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.
64 tool updates
v2.0.3- Added
archive_bank_account - Added
clock_in_employee - Added
clock_out_employee - Added
create_accounting_account - Added
create_bank_account - Added
create_bank_movement - Added
create_employee - Added
create_employee_time - Added
create_invoicing_forecast - Added
create_ledger_entry - Added
create_salary_record - Added
delete_bank_account - Added
delete_employee - Added
delete_employee_time - Added
delete_invoicing_forecast - Added
delete_salary_record - Added
get_bank_account - Changed
get_chart_of_accounts6 fields changed- added
Input schema / properties / archivedAdded value: +{ + "description": "Include archived accounts (default: false)", + "type": "boolean" +} - added
Input schema / properties / cursorAdded value: +{ + "description": "Cursor token from a previous response nextCursor", + "type": "string" +} - added
Input schema / properties / end_dateAdded value: +{ + "description": "Filter end date (ISO 8601, YYYY-MM-DD)", + "type": "string" +} - added
Input schema / properties / include_emptyAdded value: +{ + "description": "Include zero-balance accounts (default: false)", + "type": "boolean" +} - added
Input schema / properties / limitAdded value: +{ + "description": "Max items per page", + "type": "number" +} - added
Input schema / properties / start_dateAdded value: +{ + "description": "Filter start date (ISO 8601, YYYY-MM-DD)", + "type": "string" +}
- Changed
get_contact_attachment3 fields changed- removed
Input schema / properties / attachmentIdRemoved value: -{ - "description": "Attachment ID", - "type": "string" -} - added
Input schema / properties / filenameAdded value: +{ + "description": "Attachment filename as returned by list_contact_attachments", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "contactId", - "attachmentId" -]New value: +[ + "contactId", + "filename" +]
- Changed
get_daily_ledger8 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Cursor token from a previous response nextCursor", + "type": "string" +} - added
Input schema / properties / end_dateAdded value: +{ + "description": "Range end as an ISO 8601 date (YYYY-MM-DD, inclusive). Required unless endtmp is provided.", + "type": "string" +} - changed
Input schema / properties / endtmp / descriptionPrevious value: -"Range end as a Unix timestamp in seconds (inclusive)"New value: +"Range end as a Unix timestamp in seconds (legacy form, converted to ISO). Use end_date when possible." - changed
Input schema / properties / groupByEntry / descriptionPrevious value: -"Group lines by entryNumber into full journal entries (each with totalDebit/totalCredit). Default: false (flat lines)"New value: +"Group lines by entryNumber into full journal entries (each with totalDebit/totalCredit), applied to the current page. Default: false (flat lines)" - added
Input schema / properties / limitAdded value: +{ + "description": "Max items per cursor page (server-paginated; use limit to control page size)", + "type": "number" +} - added
Input schema / properties / start_dateAdded value: +{ + "description": "Range start as an ISO 8601 date (YYYY-MM-DD, inclusive). Required unless starttmp is provided.", + "type": "string" +} - changed
Input schema / properties / starttmp / descriptionPrevious value: -"Range start as a Unix timestamp in seconds (inclusive)"New value: +"Range start as a Unix timestamp in seconds (legacy form, converted to ISO). Use start_date when possible." - changed
Input schema / requiredPrevious value: -[ - "starttmp", - "endtmp" -]New value: +[]
- Changed
get_document_pdf2 fields changed- changed
Input schema / properties / docType / descriptionPrevious value: -"Type of document"New value: +"Type of document (purchase is not supported β PDF endpoint returns 404)" - changed
Input schema / properties / docType / enumPrevious value: -[ - "invoice", - "salesreceipt", - "creditnote", - "receiptnote", - "estimate", - "salesorder", - "waybill", - "proform", - "purchase", - "purchaserefund", - "purchaseorder" -]New value: +[ + "invoice", + "salesreceipt", + "creditnote", + "receiptnote", + "estimate", + "salesorder", + "waybill", + "proform", + "purchaseorder" +]
- Added
get_employee - Added
get_employee_contract - Added
get_employee_time - Added
get_invoicing_forecast - Changed
get_numbering_series6 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Cursor from a previous response nextCursor", + "type": "string" +} - changed
Input schema / properties / fields / descriptionPrevious value: -"Select specific fields to return (e.g., [\"id\", \"name\", \"prefix\", \"nextNumber\"]). Reduces response size by 70-90%. If not provided, returns default fields: id, name, prefix, nextNumber"New value: +"Project only these fields per item (e.g. [\"id\", \"name\", \"prefix\", \"nextNumber\"]). Reduces response size." - added
Input schema / properties / limitAdded value: +{ + "description": "Max items per page (server-paginated; use limit to control page size)", + "type": "number" +} - removed
Input schema / properties / pageRemoved value: -{ - "description": "Page number (starting from 1, default: 1)", - "type": "number" -} - removed
Input schema / properties / pageSizeRemoved value: -{ - "description": "Number of items per page (default: 50, max: 500)", - "type": "number" -} - changed
Input schema / properties / summary / descriptionPrevious value: -"Return only total count and page count without items (default: false)"New value: +"Return only count and pagination metadata without items (default: false)"
- Changed
get_project_time1 field changed- changed
Input schema / properties / timeTrackingId / descriptionPrevious value: -"The time-tracking entry ID (the entry timeId)"New value: +"The time-tracking entry ID (timeId)"
- Added
get_salary_record - Added
get_salary_record_defaults - Changed
get_taxes3 fields changed- removed
Input schema / properties / pageRemoved value: -{ - "description": "Page number (starting from 1, default: 1)", - "type": "number" -} - removed
Input schema / properties / pageSizeRemoved value: -{ - "description": "Number of items per page (default: 50, max: 500)", - "type": "number" -} - changed
Input schema / properties / summary / descriptionPrevious value: -"Return only total count and page count without items (default: false)"New value: +"Return only the item count without the full list (default: false)"
- Added
list_accounting_accounts - Added
list_bank_accounts - Added
list_bank_movements - Added
list_cash_movements - Changed
list_contact_groups6 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Cursor from a previous response nextCursor", + "type": "string" +} - changed
Input schema / properties / fields / descriptionPrevious value: -"Select specific fields to return (e.g., [\"id\", \"name\"]). Reduces response size by 70-90%. If not provided, returns default fields: id, name"New value: +"Project only these fields per item (e.g. [\"id\", \"name\"]). Reduces response size." - added
Input schema / properties / limitAdded value: +{ + "description": "Max items per page (server-paginated; use limit to control page size)", + "type": "number" +} - removed
Input schema / properties / pageRemoved value: -{ - "description": "Page number (starting from 1, default: 1)", - "type": "number" -} - removed
Input schema / properties / pageSizeRemoved value: -{ - "description": "Number of items per page (default: 50, max: 500)", - "type": "number" -} - changed
Input schema / properties / summary / descriptionPrevious value: -"Return only total count and page count without items (default: false)"New value: +"Return only count and pagination metadata without items (default: false)"
- Changed
list_contacts7 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Cursor from a previous response nextCursor", + "type": "string" +} - removed
Input schema / properties / customIdRemoved value: -{ - "description": "Filter by custom ID(s)", - "items": { - "type": "string" - }, - "type": "array" -} - changed
Input schema / properties / fields / descriptionPrevious value: -"Select specific fields to return (e.g., [\"id\", \"name\", \"email\"]). Reduces response size by 70-90%. If not provided, returns default fields: id, customId, name, email"New value: +"Project only these fields per item (e.g. [\"id\", \"name\", \"email\"]). Reduces response size." - changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of items to return (default: 50, max: 500)"New value: +"Max items per page (server-paginated; use limit to control page size)" - removed
Input schema / properties / mobileRemoved value: -{ - "description": "Filter by exact mobile number match", - "type": "string" -} - removed
Input schema / properties / pageRemoved value: -{ - "description": "Page number for pagination (optional)", - "type": "number" -} - removed
Input schema / properties / phoneRemoved value: -{ - "description": "Filter by exact phone number match", - "type": "string" -}
- Changed
list_documents11 fields changed- removed
Input schema / properties / approvedRemoved value: -{ - "description": "Filter by approval state: 0=not approved, 1=approved. Maps to Holded `filter=approved-<n>`. Independent of the Paid/Pending badge and of paymentsPending.", - "enum": [ - "0", - "1" - ], - "type": "string" -} - removed
Input schema / properties / billedRemoved value: -{ - "description": "Filter by billed status: 0=not billed, 1=billed", - "enum": [ - "0", - "1" - ], - "type": "string" -} - removed
Input schema / properties / contactidRemoved value: -{ - "description": "Filter documents by contact ID", - "type": "string" -} - added
Input schema / properties / cursorAdded value: +{ + "description": "Cursor from a previous response nextCursor for the next page", + "type": "string" +} - removed
Input schema / properties / endtmpRemoved value: -{ - "description": "Ending timestamp (Unix timestamp) for filtering documents by date", - "type": "string" -} - changed
Input schema / properties / fields / descriptionPrevious value: -"Select specific fields to return (e.g., [\"id\", \"contactName\", \"total\"]). Reduces response size by 70-90%. If not provided, returns default fields: id, contact, contactName, date, tax, total, status, paymentsPending"New value: +"Project only these fields per item (e.g. [\"id\", \"contact_name\", \"total\"]). Reduces response size." - changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of items to return (default: 50, max: 500)"New value: +"Max items per page (server-paginated; use limit to control page size)" - removed
Input schema / properties / pageRemoved value: -{ - "description": "Page number for pagination (optional)", - "type": "number" -} - removed
Input schema / properties / paidRemoved value: -{ - "description": "Filter by payment status: 0=not paid, 1=paid, 2=partially paid", - "enum": [ - "0", - "1", - "2" - ], - "type": "string" -} - removed
Input schema / properties / sortRemoved value: -{ - "description": "Sort order by creation date", - "enum": [ - "created-asc", - "created-desc" - ], - "type": "string" -} - removed
Input schema / properties / starttmpRemoved value: -{ - "description": "Starting timestamp (Unix timestamp) for filtering documents by date", - "type": "string" -}
- Added
list_employee_times - Added
list_employees - Changed
list_expenses_accounts6 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Cursor from a previous response nextCursor", + "type": "string" +} - changed
Input schema / properties / fields / descriptionPrevious value: -"Select specific fields to return (e.g., [\"id\", \"name\", \"accountNum\"]). Reduces response size. If not provided, returns default fields: id, name, accountNum. NOTE: the PGC number field is `accountNum` (not `code`)."New value: +"Project only these fields per item (e.g. [\"id\", \"name\", \"accountNum\"]). Reduces response size. NOTE: the PGC number field is `accountNum` (not `code`)." - added
Input schema / properties / limitAdded value: +{ + "description": "Max items per page (server-paginated; use limit to control page size)", + "type": "number" +} - removed
Input schema / properties / pageRemoved value: -{ - "description": "Page number (starting from 1, default: 1)", - "type": "number" -} - removed
Input schema / properties / pageSizeRemoved value: -{ - "description": "Number of items per page (default: 50, max: 500)", - "type": "number" -} - changed
Input schema / properties / summary / descriptionPrevious value: -"Return only total count and page count without items (default: false)"New value: +"Return only count and pagination metadata without items (default: false)"
- Added
list_invoicing_forecasts - Added
list_ledger_entries - Changed
list_payments10 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Cursor from a previous response nextCursor", + "type": "string" +} - added
Input schema / properties / end_dateAdded value: +{ + "description": "Filter payments on or before this ISO date (YYYY-MM-DD). Forwarded directly to the v2 API.", + "type": "string" +} - changed
Input schema / properties / endtmp / descriptionPrevious value: -"Ending timestamp (Unix timestamp) for filtering payments by date"New value: +"Legacy: Unix timestamp (seconds) for end date. Converted to ISO YYYY-MM-DD. Ignored when end_date is also provided." - changed
Input schema / properties / endtmp / typePrevious value: -"string"New value: +"number" - changed
Input schema / properties / fields / descriptionPrevious value: -"Select specific fields to return (e.g., [\"id\", \"name\", \"days\", \"discount\"]). Reduces response size by 70-90%. If not provided, returns default fields: id, name, days, discount"New value: +"Select specific fields to return (e.g., [\"id\", \"name\", \"days\", \"discount\"]). Reduces response size. If not provided, returns all fields from the API." - changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of items to return (default: 50, max: 500)"New value: +"Max items per page (server-paginated; use limit to control page size)" - removed
Input schema / properties / pageRemoved value: -{ - "description": "Page number for pagination (optional)", - "type": "number" -} - added
Input schema / properties / start_dateAdded value: +{ + "description": "Filter payments on or after this ISO date (YYYY-MM-DD). Forwarded directly to the v2 API.", + "type": "string" +} - changed
Input schema / properties / starttmp / descriptionPrevious value: -"Starting timestamp (Unix timestamp) for filtering payments by date"New value: +"Legacy: Unix timestamp (seconds) for start date. Converted to ISO YYYY-MM-DD. Ignored when start_date is also provided." - changed
Input schema / properties / starttmp / typePrevious value: -"string"New value: +"number"
- Changed
list_products4 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Cursor from a previous response nextCursor", + "type": "string" +} - changed
Input schema / properties / fields / descriptionPrevious value: -"Select specific fields to return (e.g., [\"id\", \"name\", \"price\"]). Reduces response size by 70-90%. If not provided, returns default fields: id, name, sku, price, stock"New value: +"Project only these fields per item (e.g. [\"id\", \"name\", \"sku\"]). Reduces response size." - changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of items to return (default: 50, max: 500)"New value: +"Max items per page (server-paginated; use limit to control page size)" - removed
Input schema / properties / pageRemoved value: -{ - "description": "Page number for pagination (optional)", - "type": "number" -}
- Changed
list_project_times6 fields changed- changed
Input schema / properties / approvedOnly / descriptionPrevious value: -"Keep only approved entries (approved === 1). Default: false"New value: +"Keep only approved entries (approved === 1) β applied client-side on the returned page. Default: false" - added
Input schema / properties / cursorAdded value: +{ + "description": "Cursor token from a previous response nextCursor to fetch the next page", + "type": "string" +} - changed
Input schema / properties / endDate / descriptionPrevious value: -"Keep only entries on or before this date (YYYY-MM-DD, inclusive)"New value: +"Keep only entries on or before this date (YYYY-MM-DD, inclusive) β applied client-side on the returned page" - removed
Input schema / properties / flattenRemoved value: -{ - "description": "Return a flat array of entries (each with projectId, projectName, and hours = duration/3600) instead of the nested per-project structure. Default: false", - "type": "boolean" -} - added
Input schema / properties / limitAdded value: +{ + "description": "Max items per cursor page (default: 50)", + "type": "number" +} - changed
Input schema / properties / startDate / descriptionPrevious value: -"Keep only entries on or after this date (YYYY-MM-DD, inclusive)"New value: +"Keep only entries on or after this date (YYYY-MM-DD, inclusive) β applied client-side on the returned page"
- Changed
list_project_times_by_project6 fields changed- changed
Input schema / properties / approvedOnly / descriptionPrevious value: -"Keep only approved entries (approved === 1). Default: false"New value: +"Keep only approved entries (approved === 1) β applied client-side on the returned page. Default: false" - added
Input schema / properties / cursorAdded value: +{ + "description": "Cursor token from a previous response nextCursor to fetch the next page", + "type": "string" +} - changed
Input schema / properties / endDate / descriptionPrevious value: -"Keep only entries on or before this date (YYYY-MM-DD, inclusive)"New value: +"Keep only entries on or before this date (YYYY-MM-DD, inclusive) β applied client-side on the returned page" - removed
Input schema / properties / flattenRemoved value: -{ - "description": "Return a flat array of entries (each with projectId, projectName, and hours = duration/3600) instead of the nested structure. Default: false", - "type": "boolean" -} - added
Input schema / properties / limitAdded value: +{ + "description": "Max items per cursor page (default: 50)", + "type": "number" +} - changed
Input schema / properties / startDate / descriptionPrevious value: -"Keep only entries on or after this date (YYYY-MM-DD, inclusive)"New value: +"Keep only entries on or after this date (YYYY-MM-DD, inclusive) β applied client-side on the returned page"
- Changed
list_remittances6 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Cursor from a previous response nextCursor", + "type": "string" +} - changed
Input schema / properties / fields / descriptionPrevious value: -"Select specific fields to return (e.g., [\"id\", \"name\", \"date\"]). Reduces response size by 70-90%. If not provided, returns default fields: id, name, date"New value: +"Project only these fields per item (e.g. [\"id\", \"name\", \"date\"]). Reduces response size." - added
Input schema / properties / limitAdded value: +{ + "description": "Max items per page (server-paginated; use limit to control page size)", + "type": "number" +} - removed
Input schema / properties / pageRemoved value: -{ - "description": "Page number (starting from 1, default: 1)", - "type": "number" -} - removed
Input schema / properties / pageSizeRemoved value: -{ - "description": "Number of items per page (default: 50, max: 500)", - "type": "number" -} - changed
Input schema / properties / summary / descriptionPrevious value: -"Return only total count and page count without items (default: false)"New value: +"Return only count and pagination metadata without items (default: false)"
- Added
list_salary_records - Changed
list_sales_channels6 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Cursor from a previous response nextCursor", + "type": "string" +} - changed
Input schema / properties / fields / descriptionPrevious value: -"Select specific fields to return (e.g., [\"id\", \"name\"]). Reduces response size by 70-90%. If not provided, returns default fields: id, name"New value: +"Project only these fields per item (e.g. [\"id\", \"name\"]). Reduces response size." - added
Input schema / properties / limitAdded value: +{ + "description": "Max items per page (server-paginated; use limit to control page size)", + "type": "number" +} - removed
Input schema / properties / pageRemoved value: -{ - "description": "Page number (starting from 1, default: 1)", - "type": "number" -} - removed
Input schema / properties / pageSizeRemoved value: -{ - "description": "Number of items per page (default: 50, max: 500)", - "type": "number" -} - changed
Input schema / properties / summary / descriptionPrevious value: -"Return only total count and page count without items (default: false)"New value: +"Return only count and pagination metadata without items (default: false)"
- Changed
list_services4 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Cursor from a previous response nextCursor", + "type": "string" +} - changed
Input schema / properties / fields / descriptionPrevious value: -"Select specific fields to return (e.g., [\"id\", \"name\", \"price\", \"tax\"]). Reduces response size by 70-90%. If not provided, returns default fields: id, name, price, tax"New value: +"Project only these fields per item (e.g. [\"id\", \"name\", \"price\", \"tax\"]). Reduces response size." - changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of items to return (default: 50, max: 500)"New value: +"Max items per page (server-paginated; use limit to control page size)" - removed
Input schema / properties / pageRemoved value: -{ - "description": "Page number for pagination (optional)", - "type": "number" -}
- Changed
list_treasuries6 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Cursor from a previous response nextCursor", + "type": "string" +} - changed
Input schema / properties / fields / descriptionPrevious value: -"Select specific fields to return (e.g., [\"id\", \"name\", \"balance\"]). Reduces response size by 70-90%. If not provided, returns default fields: id, name, balance"New value: +"Project only these fields per item (e.g. [\"id\", \"name\", \"balance\"]). Reduces response size." - added
Input schema / properties / limitAdded value: +{ + "description": "Max items per page (server-paginated; use limit to control page size)", + "type": "number" +} - removed
Input schema / properties / pageRemoved value: -{ - "description": "Page number (starting from 1, default: 1)", - "type": "number" -} - removed
Input schema / properties / pageSizeRemoved value: -{ - "description": "Number of items per page (default: 50, max: 500)", - "type": "number" -} - changed
Input schema / properties / summary / descriptionPrevious value: -"Return only total count and page count without items (default: false)"New value: +"Return only count and pagination metadata without items (default: false)"
- Changed
list_warehouse_stock4 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Cursor from a previous response nextCursor", + "type": "string" +} - changed
Input schema / properties / fields / descriptionPrevious value: -"Select specific fields to return (e.g., [\"productId\", \"productName\", \"sku\", \"stock\"]). Reduces response size by 70-90%. If not provided, returns default fields: productId, productName, sku, stock"New value: +"Project only these fields per item (e.g. [\"product_id\", \"stock\"]). Reduces response size." - changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of items to return (default: 50, max: 500)"New value: +"Max items per page (server-paginated; use limit to control page size)" - removed
Input schema / properties / pageRemoved value: -{ - "description": "Page number for pagination (optional)", - "type": "number" -}
- Changed
list_warehouses4 fields changed- changed
Input schema / properties / fields / descriptionPrevious value: -"Select specific fields to return (e.g., [\"id\", \"name\", \"address\"]). Reduces response size by 70-90%. If not provided, returns default fields: id, name, address"New value: +"Project only these fields per item (e.g. [\"id\", \"name\", \"address\"]). Reduces response size." - removed
Input schema / properties / pageRemoved value: -{ - "description": "Page number (starting from 1, default: 1)", - "type": "number" -} - removed
Input schema / properties / pageSizeRemoved value: -{ - "description": "Number of items per page (default: 50, max: 500)", - "type": "number" -} - changed
Input schema / properties / summary / descriptionPrevious value: -"Return only total count and page count without items (default: false)"New value: +"Return only total count without items (default: false)"
- Added
pause_employee - Changed
pay_document1 field changed- changed
Input schema / properties / bankId / descriptionPrevious value: -"Bank account id to link the payment to. Triggers a second step (PUT /payments/{id}) because /pay cannot set the bank link."New value: +"Bank account id to link the payment to. Triggers a second step (PUT /payments/{id}) to set the bank link on the payment."
- Added
reconcile_bank_movement - Added
unpause_employee - Added
update_bank_account - Added
update_employee - Added
update_employee_contract - Added
update_employee_time - Added
update_invoicing_forecast - Changed
update_product_stock7 fields changed- added
Input schema / properties / descriptionAdded value: +{ + "description": "Audit note describing the stock adjustment (optional)", + "type": "string" +} - added
Input schema / properties / stock_variationAdded value: +{ + "description": "Stock delta (positive to add, negative to subtract). Replaces v1 `units`.", + "type": "number" +} - removed
Input schema / properties / unitsRemoved value: -{ - "description": "Number of units to add or subtract", - "type": "number" -} - added
Input schema / properties / variant_idAdded value: +{ + "description": "Variant ID to target a specific product variant (optional)", + "type": "string" +} - removed
Input schema / properties / warehouseIdRemoved value: -{ - "description": "Warehouse ID (optional)", - "type": "string" -} - added
Input schema / properties / warehouse_idAdded value: +{ + "description": "Warehouse ID (required in v2 β v2 rejects stock updates without it)", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "productId", - "units" -]New value: +[ + "productId", + "warehouse_id", + "stock_variation" +]
- Added
update_salary_record
16 tool updates
v1.7.0- Changed
create_document1 field changed- added
Input schema / properties / retentionAdded value: +{ + "description": "IRPF retention percentage. Accepted on SALES documents only; rejected on purchases because Holded silently ignores it there.", + "type": "number" +}
- Changed
create_expenses_account1 field changed- changed
Input schema / properties / code / descriptionPrevious value: -"Account code"New value: +"PGC account number (e.g. \"62900000\"). This is the value surfaced as `accountNum` by list_expenses_accounts β Holded accepts it under the `code` key on create/update."
- Added
get_chart_of_accounts - Added
get_daily_ledger - Added
get_document_payments - Changed
get_expenses_account1 field changed- changed
Input schema / properties / accountId / descriptionPrevious value: -"Expenses account ID"New value: +"Account Holded id (the `id` field, not the PGC accountNum)"
- Added
get_project_time - Changed
get_taxes1 field changed- changed
Input schema / properties / fields / descriptionPrevious value: -"Select specific fields to return (e.g., [\"id\", \"name\", \"percentage\"]). Reduces response size by 70-90%. If not provided, returns default fields: id, name, percentage"New value: +"Select specific fields to return (e.g., [\"key\", \"name\", \"amount\", \"scope\"]). Reduces response size. If not provided, returns default fields: id, key, name, amount, scope, group, type. NOTE: the tax rate field is `amount` (not `percentage`) and the identifier is `key`."
- Changed
list_documents2 fields changed- added
Input schema / properties / approvedAdded value: +{ + "description": "Filter by approval state: 0=not approved, 1=approved. Maps to Holded `filter=approved-<n>`. Independent of the Paid/Pending badge and of paymentsPending.", + "enum": [ + "0", + "1" + ], + "type": "string" +} - changed
Input schema / properties / fields / descriptionPrevious value: -"Select specific fields to return (e.g., [\"id\", \"contactName\", \"total\"]). Reduces response size by 70-90%. If not provided, returns default fields: id, contact, contactName, date, tax, total, status"New value: +"Select specific fields to return (e.g., [\"id\", \"contactName\", \"total\"]). Reduces response size by 70-90%. If not provided, returns default fields: id, contact, contactName, date, tax, total, status, paymentsPending"
- Changed
list_expenses_accounts1 field changed- changed
Input schema / properties / fields / descriptionPrevious value: -"Select specific fields to return (e.g., [\"id\", \"name\", \"code\"]). Reduces response size by 70-90%. If not provided, returns default fields: id, name, code"New value: +"Select specific fields to return (e.g., [\"id\", \"name\", \"accountNum\"]). Reduces response size. If not provided, returns default fields: id, name, accountNum. NOTE: the PGC number field is `accountNum` (not `code`)."
- Added
list_project_times - Added
list_project_times_by_project - Changed
pay_document2 fields changed- added
Input schema / properties / bankIdAdded value: +{ + "description": "Bank account id to link the payment to. Triggers a second step (PUT /payments/{id}) because /pay cannot set the bank link.", + "type": "string" +} - added
Input schema / properties / paymentmethodAdded value: +{ + "description": "Payment-method catalog id (from list_payment_methods), NOT a bank/treasury id.", + "type": "string" +}
- Changed
update_document1 field changed- added
Input schema / properties / retentionAdded value: +{ + "description": "IRPF retention percentage. Accepted on SALES documents only; rejected on purchases because Holded silently ignores it there.", + "type": "number" +}
- Changed
update_expenses_account1 field changed- changed
Input schema / properties / code / descriptionPrevious value: -"Account code"New value: +"PGC account number (e.g. \"62900000\"). This is the value surfaced as `accountNum` by list_expenses_accounts β Holded accepts it under the `code` key on create/update."
- Changed
update_payment4 fields changed- added
Input schema / properties / amountAdded value: +{ + "description": "Payment amount", + "type": "number" +} - added
Input schema / properties / bankIdAdded value: +{ + "description": "Bank account id to link the payment to", + "type": "string" +} - added
Input schema / properties / contactIdAdded value: +{ + "description": "Contact id associated with the payment", + "type": "string" +} - added
Input schema / properties / dateAdded value: +{ + "description": "Payment date as a Unix timestamp (seconds)", + "type": "number" +}
72 tool updates
v1.6.0- First observed
attach_file_to_document - First observed
create_contact - First observed
create_contact_group - First observed
create_document - First observed
create_expenses_account - First observed
create_numbering_serie - First observed
create_payment - First observed
create_product - First observed
create_sales_channel - First observed
create_service - First observed
create_treasury - First observed
create_warehouse - First observed
delete_contact - First observed
delete_contact_group - First observed
delete_document - First observed
delete_expenses_account - First observed
delete_numbering_serie - First observed
delete_payment - First observed
delete_product - First observed
delete_sales_channel - First observed
delete_service - First observed
delete_warehouse - First observed
get_contact - First observed
get_contact_attachment - First observed
get_contact_group - First observed
get_document - First observed
get_document_pdf - First observed
get_expenses_account - First observed
get_numbering_series - First observed
get_payment - First observed
get_product - First observed
get_product_main_image - First observed
get_product_secondary_image - First observed
get_remittance - First observed
get_sales_channel - First observed
get_service - First observed
get_shipped_units - First observed
get_taxes - First observed
get_treasury - First observed
get_warehouse - First observed
list_contact_attachments - First observed
list_contact_groups - First observed
list_contacts - First observed
list_documents - First observed
list_expenses_accounts - First observed
list_payment_methods - First observed
list_payments - First observed
list_product_images - First observed
list_products - First observed
list_remittances - First observed
list_sales_channels - First observed
list_services - First observed
list_treasuries - First observed
list_warehouse_stock - First observed
list_warehouses - First observed
pay_document - First observed
send_document - First observed
ship_all_items - First observed
ship_items_by_line - First observed
update_contact - First observed
update_contact_group - First observed
update_document - First observed
update_document_pipeline - First observed
update_document_tracking - First observed
update_expenses_account - First observed
update_numbering_serie - First observed
update_payment - First observed
update_product - First observed
update_product_stock - First observed
update_sales_channel - First observed
update_service - First observed
update_warehouse
TDQS
Scored across 119 tools
Many tools are cleanly distinct by resource and action, but several overlap explicitly: list_treasuries vs the bank_account tools, list_ledger_entries vs get_daily_ledger (same endpoint), and get_chart_of_accounts vs list_accounting_accounts (same endpoint). The descriptions helpfully flag these duplications and consolidation plans, which mitigates some misselection risk, but the boundaries remain unclear in practice.
Most tools follow a predictable list_/get_/create_/update_/delete_ + resource pattern (list_contacts, get_product, delete_payment, etc.). Some deviations exist (ship_all_items, clock_in_employee, reconcile_bank_movement, get_taxes plural, and the 'serie'/'series' inconsistency), but they are action verbs that stay readable.
119 tools is very high even for a full ERP surface covering contacts, documents, payroll, accounting, and treasury. Redundant pairs (treasury vs bank accounts, ledger vs daily ledger, chart of accounts vs ledger accounts) show bloat rather than strictly additive scope, with consolidation explicitly deferred to a later release.
Coverage is broad and lifecycle-complete across most domains (contacts, products, documents, payments, treasury, warehouses, payroll, accounting, contact groups, numbering series). A few gaps exist β purchaserefund has no full CRUD, purchase PDFs unsupported β but these are largely upstream API limitations that agents can work around.
Maintenance
Related MCP Connectors
Model Context Protocol server for the Apideck Unified API. Connect any MCP-compatible agent framework to 100+ accounting systems, HRIS platforms, file storage providers, and more through one integration. More information https://www.apideck.com/mcp-server
MCP server for Quaderno β tax-rate calculation, invoices, contacts, products, receipts & expenses.
MCP server for Codat β companies, connections, invoices, bills and financial statements.
The Mercado Pago MCP Server implements the Model Context Protocol to provide AI agents and LLMs with access to Mercado Pago's APIs and tools within compatible development environments. It acts as an intermediary that translates Mercado Pago resources into executable functions (tools) that AI applications can invoke to perform actions and automate flows. The server simplifies integration, enables using documentation to implement or improve code, and optimizes operations through natural language interactions without manual implementations.
Related MCP Servers
- 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
- AlicenseBqualityDmaintenanceMCP server for Invoice Ninja v5 API. Enables AI assistants to manage clients, invoices, quotes, payments, and time tracking through natural language.3223 npm2MIT
- AlicenseNot gradedqualityDmaintenanceModel Context Protocol (MCP) server for SuperFaktura invoicing system. Enables AI assistants to interact with SuperFaktura API for managing invoices, clients, and expenses.Apache 2.0
- AlicenseBqualityBmaintenanceMCP server for Holded API v2, enabling listing and querying of contacts, invoices, purchases, products, services, and payments, with low-level access to any endpoint.1547 npm1MIT