Mcp Holded

io.github.nubiia-devPublished by GitHub account nubiia-devv2.0.3Updated Oct 29, 2026

Complete Holded Invoice API integration with 72 MCP tools for invoices, contacts, products, and more

Overview

AI-generated overview

MCP server for the Holded ERP API v2, letting an assistant manage invoices, contacts, products, treasury, ledger and HR data in a Holded account.

What you can do
  • Create, list, read, update, delete, pay, email and export PDFs of invoices, estimates, credit notes, orders and other documents, plus shipping and tracking
  • Manage contacts and their attachments, contact groups, and sales channels
  • Manage products, images and stock levels, warehouses, services and numbering series
  • Work with treasury and bank accounts, bank and cash movements, payments and payment methods
  • Read and write accounting ledger entries, chart of accounts, daily ledger, taxes and remittances
  • Handle team and HR data: employees, payroll records, time entries and clock in/out
When to use it
Useful when an assistant should answer questions or carry out routine work inside a Holded account — pulling invoice lists, drafting and sending documents, checking stock, or looking up ledger and payroll data — without switching to the Holded UI.
Requirements
Runs locally via npx with Node.js 22.14 or higher. Needs a Holded account with API access and a v2 API key (starting with pat_ or sk_live_) supplied in the HOLDED_API_KEY environment variable; multi-tenant setups use TENANT_N_NAME and TENANT_N_API_KEY. Network access to the Holded API is required.
Before you install
Create, update and delete tools change real accounting data in Holded, and sending a document emails it to the client. Registering a payment may auto-approve the document. The API key grants broad access to company financial and HR data; keep it out of version control. Treasury balance fields are static opening figures, not live balances, so they should not be used for reconciliation.

Installation

In SourceWeft

  1. Open Mcp Holded in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

MCP Holded

[CI] [npm version] [License: MIT] [codecov] [by Nubiia]

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.

Installation

Prerequisites

  • Node.js 22.14 or higher
  • A Holded account with API access
  • A Holded API v2 key (pat_… or sk_live_…) — generate it in Holded → Settings → API

Install from npm

bash
npm install -g @nubiia/mcp-holded

Install from source

bash
git clone https://github.com/nubiia-dev/mcp-holded.gitcd mcp-holdednpm installnpm run build

Configuration

Environment Variables

All tools call the Holded API v2 (Bearer auth, cursor pagination). You need a single v2 key:

bash
# Recommended — primary key nameexport HOLDED_API_KEY=pat_your_v2_key_here
# Alternative — accepted as an alias; wins over HOLDED_API_KEY if both are setexport HOLDED_API_KEY_V2=sk_live_your_v2_key_here

Generate 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:

bash
export TENANT_1_NAME=company-aexport TENANT_1_API_KEY=pat_key_for_company_aexport TENANT_2_NAME=company-bexport TENANT_2_API_KEY=sk_live_key_for_company_b

TENANT_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

json
{  "mcpServers": {    "holded": {      "command": "npx",      "args": ["-y", "@nubiia/mcp-holded"],      "env": {        "HOLDED_API_KEY": "pat_your_v2_key_here"      }    }  }}

Or if installed from source:

json
{  "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 argument2.x argumentNotes
page(removed)Server no longer accepts offset pages
pageSizelimitServer-paginated; use limit to control page size
(none)cursorPass the nextCursor from the previous response

Responses now follow this envelope:

json
{  "items": [...],  "nextCursor": "opaque-string-or-null",  "hasMore": true}

Iterate by passing nextCursor as cursor until hasMore is false.

Response format

  • Field names are snake_case throughout (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

Operation1.x behaviour2.x behaviour
purchaserefund list/get/update/delete/paySupportedRemoved — create only via /purchases/refund
update_document trackingAll document typesOnly salesorder and waybill
Ship operationsAll document typesOnly salesorder and purchaseorder
Experimental banking (reconcile_bank_transaction)Opt-in via env flagRemoved — use reconcile_bank_movement (treasury v2)
get_daily_ledger datesUnix timestamps (starttmp/endtmp)ISO 8601 strings (start_date/end_date); legacy Unix args still accepted as a convenience
get_taxesPaginatedReturns all taxes in one call (no pagination args)
update_product_stockOptional warehousewarehouse_id is now required
List tools field projectionsReduced default set of fieldsFull v2 payload returned; use fields argument to filter

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:

TypeDescription
invoiceSales invoices
salesreceiptSales receipts
creditnoteCredit notes (refunds)
receiptnoteReceipt notes
estimateEstimates/Quotes
salesorderSales orders
waybillPacking lists
proformProforma invoices
purchasePurchases
purchaserefundPurchase refunds (create only in v2)
purchaseorderPurchase 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_here

Pagination

List endpoints use cursor-based pagination via limit and cursor arguments (see Migrating from 1.x).

Development

bash
# Install dependenciesnpm install
# Buildnpm run build
# Watch modenpm run dev

Write 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:

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 · ✉️ [email protected]

License

MIT - See LICENSE file for details.

Author

Built by Nubiia — nubiia.es · [email protected]

Maintainer: Samuel Fraga — GitHub · LinkedIn

Links

Source: README.md at commit e6cbae6

Tools

119

list_documents

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).

ParameterslimitcursorfieldsdocTyperequiredsummary

create_document

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).

ParametersdaterequireditemsrequirednotesdocTyperequiredcurrencycontactIdrequiredretentionapproveDocinvoiceNumexpAccountIdsalesChannelId

get_document

Get a specific document by ID

ParametersdocTyperequireddocumentIdrequired

get_document_payments

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.

ParametersdocTyperequireddocumentIdrequired

update_document

Update an existing document

ParametersdateitemsnotesdocTyperequiredcurrencycontactIdretentiondocumentIdrequiredinvoiceNumexpAccountIdsalesChannelId

delete_document

Delete a document

ParametersdocTyperequireddocumentIdrequired

pay_document

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`.

ParametersdateamountrequiredbankIddocTyperequireddocumentIdrequiredtreasuryIdpaymentmethod

send_document

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.

ParametersemailsdocTyperequiredmessagesubjectdocumentIdrequired

get_document_pdf

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.

ParametersdocTyperequireddocumentIdrequired

ship_all_items

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.

ParametersdocTyperequireddocumentIdrequired

ship_items_by_line

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.

ParameterslinesrequireddocTyperequireddocumentIdrequired

get_shipped_units

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.

ParametersdocTyperequireddocumentIdrequired

attach_file_to_document

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).

ParametersdocTyperequiredfilenamerequireddocumentIdrequiredfileBase64required

update_document_tracking

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.

ParameterscarrierdocTyperequireddocumentIdrequiredtrackingNumber

update_document_pipeline

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.

ParametersdocTyperequiredstageIdrequireddocumentIdrequiredpipelineIdrequired

list_payment_methods

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.

Takes no parameters.

list_contacts

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.

Parameterslimitcursorfieldssummary

create_contact

Create a new contact (Holded API v2)

ParameterscodenamerequirednotetypeemailphonetradenamebillAddresscontactPersons

get_contact

Get a specific contact by ID (Holded API v2)

ParameterscontactIdrequired

update_contact

Update an existing contact (Holded API v2)

ParameterscodenamenotetypeemailphonecontactIdrequiredtradenamebillAddresscontactPersons

delete_contact

Delete a contact (Holded API v2)

ParameterscontactIdrequired

list_contact_attachments

Get list of attachments for a contact (Holded API v2). Use the filenames from the response with get_contact_attachment.

ParameterscontactIdrequired

get_contact_attachment

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.

ParametersfilenamerequiredcontactIdrequired

list_products

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.

Parameterslimitcursorfieldssummary

create_product

Create a new product (Holded API v2)

ParametersskutaxkindnamerequiredpricestockbarcodecostPricedescription

get_product

Get a specific product by ID (Holded API v2)

ParametersproductIdrequired

update_product

Update an existing product (Holded API v2)

ParametersskutaxnamepricebarcodecostPriceproductIdrequireddescription

delete_product

Delete a product (Holded API v2)

ParametersproductIdrequired

get_product_main_image

Get the main image of a product (Holded API v2)

ParametersproductIdrequired

list_product_images

List all images of a product (Holded API v2)

ParametersproductIdrequired

get_product_secondary_image

Get a secondary image of a product (Holded API v2)

ParametersimageIdrequiredproductIdrequired

update_product_stock

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.

ParametersproductIdrequiredvariant_iddescriptionwarehouse_idrequiredstock_variationrequired

list_treasuries

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.

Parameterslimitcursorfieldssummary

create_treasury

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.

Parametersbicibannamerequiredbalance

get_treasury

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.

ParameterstreasuryIdrequired

list_expenses_accounts

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.

Parameterslimitcursorfieldssummary

create_expenses_account

Create a new expenses account (Holded API v2)

Parameterscodenamerequired

get_expenses_account

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.

ParametersaccountIdrequired

update_expenses_account

Update an existing expenses account (Holded API v2)

ParameterscodenameaccountIdrequired

delete_expenses_account

Delete an expenses account (Holded API v2)

ParametersaccountIdrequired

get_numbering_series

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.

ParameterslimitcursorfieldsdocTyperequiredsummary

create_numbering_serie

Create a new numbering serie (Holded API v2)

ParametersnamerequiredprefixdocTyperequirednextNumber

update_numbering_serie

Update an existing numbering serie (Holded API v2)

ParametersnameprefixdocTyperequiredserieIdrequirednextNumber

delete_numbering_serie

Delete a numbering serie (Holded API v2)

ParametersdocTyperequiredserieIdrequired

list_sales_channels

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.

Parameterslimitcursorfieldssummary

create_sales_channel

Create a new sales channel (Holded API v2)

Parametersnamerequired

get_sales_channel

Get a specific sales channel by ID (Holded API v2)

ParameterschannelIdrequired

update_sales_channel

Update an existing sales channel (Holded API v2)

ParametersnamechannelIdrequired

delete_sales_channel

Delete a sales channel (Holded API v2)

ParameterschannelIdrequired

list_payments

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.

Parameterslimitcursorendtmpfieldssummaryend_datestarttmpstart_date

create_payment

Create a new payment (Holded API v2)

Parametersdaysnamerequired

get_payment

Get a specific payment by ID (Holded API v2)

ParameterspaymentIdrequired

update_payment

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, ...).

ParametersdatedaysnameamountbankIdcontactIdpaymentIdrequired

delete_payment

Delete a payment (Holded API v2)

ParameterspaymentIdrequired

get_taxes

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`.

Parametersfieldssummary

list_contact_groups

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.

Parameterslimitcursorfieldssummary

create_contact_group

Create a new contact group (Holded API v2)

Parametersnamerequired

get_contact_group

Get a specific contact group by ID (Holded API v2)

ParametersgroupIdrequired

update_contact_group

Update an existing contact group (Holded API v2)

ParametersnamegroupIdrequired

delete_contact_group

Delete a contact group (Holded API v2)

ParametersgroupIdrequired

list_remittances

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.

Parameterslimitcursorfieldssummary

get_remittance

Get a specific remittance by ID (Holded API v2). NOTE: route relocated to /treasury/remittances/{id} in v2.

ParametersremittanceIdrequired

list_services

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.

Parameterslimitcursorfieldssummary

create_service

Create a new service (Holded API v2)

Parametersskutaxnamerequiredpricedescription

get_service

Get a specific service by ID (Holded API v2)

ParametersserviceIdrequired

update_service

Update an existing service (Holded API v2)

ParametersskutaxnamepriceserviceIdrequireddescription

delete_service

Delete a service (Holded API v2)

ParametersserviceIdrequired

list_warehouses

List all warehouses (Holded API v2). All warehouses are returned in a single call (no cursor pagination). Supports field filtering and summary mode.

Parametersfieldssummary

create_warehouse

Create a new warehouse (Holded API v2)

ParameterscitynamerequiredaddresscountryprovincepostalCode

list_warehouse_stock

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.

ParameterslimitcursorfieldssummarywarehouseIdrequired

get_warehouse

Get a specific warehouse by ID (Holded API v2)

ParameterswarehouseIdrequired

update_warehouse

Update an existing warehouse (Holded API v2). BREAKING CHANGE from v1: HTTP verb changed from PUT to PATCH.

ParameterscitynameaddresscountryprovincepostalCodewarehouseIdrequired

delete_warehouse

Delete a warehouse (Holded API v2)

ParameterswarehouseIdrequired

list_project_times

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.

ParameterslimitcursorendDatestartDateapprovedOnly

list_project_times_by_project

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.

ParameterslimitcursorendDateprojectIdrequiredstartDateapprovedOnly

get_project_time

Get a single time-tracking entry by project ID and time-tracking ID (Projects API v2). Read-only.

ParametersprojectIdrequiredtimeTrackingIdrequired

get_chart_of_accounts

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.

Parameterslimitcursorarchivedend_datestart_dateinclude_empty

get_daily_ledger

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.

Parameterslimitcursorendtmpend_datestarttmpstart_dategroupByEntry

list_employees

List employees (Holded API v2, section Equipo y RRHH). Cursor-paginated: pass the previous response `nextCursor` as `cursor` to fetch the next page.

Parameterslimitcursor

get_employee

Get a single employee by ID (Holded API v2).

ParametersemployeeIdrequired

create_employee

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.).

Parametersdatarequired

update_employee

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).

ParametersdatarequiredemployeeIdrequired

delete_employee

DESTRUCTIVE: permanently deletes an employee record in Holded (API v2). This cannot be undone.

ParametersemployeeIdrequired

get_employee_contract

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.

ParametersemployeeIdrequired

update_employee_contract

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).

ParametersdatarequiredemployeeIdrequired

clock_in_employee

WRITE: registers a clock-in for an employee in Holded time tracking (API v2). Affects real working-time records.

ParametersemployeeIdrequired

clock_out_employee

WRITE: registers a clock-out for an employee in Holded time tracking (API v2).

ParametersemployeeIdrequired

pause_employee

WRITE: starts a pause in the current working session of an employee (Holded API v2).

ParametersemployeeIdrequired

unpause_employee

WRITE: ends the current pause of an employee working session (Holded API v2).

ParametersemployeeIdrequired

list_employee_times

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.

ParameterslimitcursoremployeeId

get_employee_time

Get a single time-tracking record by ID (Holded API v2).

ParameterstimeIdrequired

create_employee_time

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).

ParametersdatarequiredemployeeIdrequired

update_employee_time

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).

ParametersdatarequiredtimeIdrequired

delete_employee_time

DESTRUCTIVE: permanently deletes a time-tracking record in Holded (API v2). This cannot be undone.

ParameterstimeIdrequired

list_salary_records

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.

Parameterslimitcursor

get_salary_record

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.

ParameterssalaryRecordIdrequired

create_salary_record

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).

Parametersdatarequired

update_salary_record

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).

ParametersdatarequiredsalaryRecordIdrequired

delete_salary_record

DESTRUCTIVE: permanently deletes a payroll record in Holded (API v2). This cannot be undone and affects accounting data.

ParameterssalaryRecordIdrequired

get_salary_record_defaults

Get the default data for creating a payroll record (Holded API v2). Useful as a base payload for create_salary_record.

Takes no parameters.

list_ledger_entries

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.

Parameterslimitcursorend_datestart_date

create_ledger_entry

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).

Parametersdatarequired

list_accounting_accounts

List accounting accounts (Holded API v2). Cursor-paginated. For the v1 read-only chart of accounts see get_chart_of_accounts.

Parameterslimitcursor

create_accounting_account

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).

Parametersdatarequired

list_bank_accounts

List treasury bank accounts (Holded API v2, official endpoint). Cursor-paginated.

Parameterslimitcursor

get_bank_account

Get a treasury bank account by ID (Holded API v2).

ParametersaccountIdrequired

create_bank_account

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).

Parametersdatarequired

update_bank_account

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).

ParametersdatarequiredaccountIdrequired

delete_bank_account

DESTRUCTIVE: permanently deletes a treasury bank account in Holded (API v2). Prefer archive_bank_account to keep history. This cannot be undone.

ParametersaccountIdrequired

archive_bank_account

WRITE: archives a treasury bank account in Holded (API v2). Reversible alternative to delete_bank_account.

ParametersaccountIdrequired

list_bank_movements

List bank movements of a treasury account (Holded API v2, official endpoint — replaces the experimental internal banking tools). Cursor-paginated.

ParameterslimitcursoraccountIdrequired

create_bank_movement

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).

ParametersdatarequiredaccountIdrequired

reconcile_bank_movement

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).

ParametersdatarequiredaccountIdrequiredmovementIdrequired

list_cash_movements

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.

ParameterslimitcursoraccountIdrequired

list_invoicing_forecasts

List cashflow invoicing forecasts (Holded API v2). Cursor-paginated.

Parameterslimitcursor

get_invoicing_forecast

Get a cashflow invoicing forecast by ID (Holded API v2).

ParametersforecastIdrequired

create_invoicing_forecast

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).

Parametersdatarequired

update_invoicing_forecast

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).

ParametersdatarequiredforecastIdrequired

delete_invoicing_forecast

DESTRUCTIVE: permanently deletes an invoicing forecast in Holded cashflow (API v2).

ParametersforecastIdrequired

Version history

1
  1. v2.0.3LatestOct 22, 2026

Score

90% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts
  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts