holded-mcp
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., "@holded-mcpList all pending invoices from last month"
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.
holded-mcp
MCP server for invoicing and treasury management in Holded: invoices, purchases, estimates, credit notes, sales receipts, recurring invoices, contacts, bank accounts and cashflow forecasting.
Tools (42)
Sales invoices
Tool | What it does |
| List with filters: start_date, end_date, contact_id, status |
| Full detail of an invoice |
| Create an invoice (items, taxes, series, due date) |
| Add notes/tags or edit fields without wiping the rest |
| Finalize a draft → assigns the definitive invoice number |
| Email it to the client |
| Register a payment (partial or full) |
| Download the PDF (local file or base64) |
| Attach a file to an invoice |
Purchases / expenses
Tool | What it does |
| List with filters: start_date, end_date, contact_id, status |
| Full detail of an expense |
| Register an expense (with supplier invoice number) |
| Add notes/tags/supplier invoice number without wiping the rest |
| Register a payment for an expense |
| Attach a PDF to an expense |
Estimates
Tool | What it does |
| List with date/status filters |
| Create a client estimate/quote |
| Add notes/tags or edit fields without wiping the rest |
| Convert an accepted estimate into an invoice |
Credit notes
Tool | What it does |
| List credit notes |
| Create one linked to the original invoice |
| Add notes/tags without wiping the rest |
Simplified receipts
Tool | What it does |
| List sales receipts |
| Issue a simplified receipt |
| Add notes/tags without wiping the rest |
Recurring invoices
Tool | What it does |
| View active templates |
| Create an automatic invoice (daily/weekly/monthly/yearly) |
Contacts
Tool | What it does |
| Search by name, email or tax ID |
| Full contact details |
| Create a client or supplier |
| Update contact fields (safe merge: only changes what you pass) |
Treasury
Tool | What it does |
| Bank accounts with current balance |
| Movements for an account (filter: |
| Add a manual movement (income/expense) |
| Reconcile a movement against an invoice/payment |
Cashflow
Tool | What it does |
| Forecasted incoming/outgoing payments |
| Add a manual forecast |
Remittances
Tool | What it does |
| View active SEPA remittances |
Configuration
Tool | What it does |
| Tax IDs (VAT, withholding, etc.) |
| Service catalog with prices |
| Series by document type: |
| Chart-of-accounts expense accounts |
Related MCP server: MCP Holded
Typical flows
Create and send an invoice to a client
1. list_contacts(search="client name") → contact_id
2. list_taxes() → tax ids
3. list_numbering_series("invoice") → number_line_id
4. create_invoice(contact_id, date, items=[{
name: "Service", units: 1, price: 800,
taxes: [vat_id, withholding_id]
}], number_line_id=...) → invoice_id
5. approve_invoice(invoice_id) → finalizes with definitive number
6. send_invoice(invoice_id, emails=["client@..."])Collect a pending invoice
1. list_invoices(status="pending", start_date="2026-01-01")
2. register_invoice_payment(invoice_id, amount=..., date="2026-06-17")Estimate → Invoice
1. create_estimate(contact_id, date, items) → estimate_id
2. send_invoice(estimate_id, emails=[...]) → send to client
3. convert_estimate_to_invoice(estimate_id) → once accepted
4. approve_invoice(new_invoice_id)Setup
Get your API key: Holded → Settings → Integrations → API.
Install dependencies:
python3 -m venv .venv source .venv/bin/activate pip install -r requirements.txt
MCP client configuration
{
"mcpServers": {
"holded": {
"command": "/path/to/.venv/bin/python3",
"args": ["/path/to/holded-mcp/server.py"],
"env": {
"HOLDED_API_KEY": "pat_xxxxx..."
}
}
}
}Confirmation required for critical operations
These tools require confirmed=True. Called without it, they return a JSON
with requires_confirmation: true that the calling agent MUST show to the
user and wait for a response before repeating the call with confirmed=True.
They're financial operations tied to fiscal numbering, or ones that send
something to a real recipient — often irreversible once executed.
Tool | What it does |
| Finalize a draft invoice — assigns the definitive invoice number, irreversible |
| Email the invoice to the client |
| Register a payment received on an invoice |
| Register a payment made on a purchase/expense |
| Convert an accepted estimate into an invoice |
| Reconcile a bank movement against an invoice/payment |
# 1. First call — no confirmed
approve_invoice(invoice_id="abc123")
# → returns requires_confirmation: true → show it to the user
# 2. Second call — after the user confirms
approve_invoice(invoice_id="abc123", confirmed=True)Response size
list_invoices/list_purchases/list_estimates/list_credit_notes/list_sales_receipts/list_bank_movements no longer include each document's full line-item array (still available via get_invoice/get_purchase/etc.) — measured 76-81% smaller on real data. Without this, a multi-month list_invoices call could exceed a client's response size limit outright. list_contacts is trimmed to identity fields for the same reason.
Response size (part 2)
get_invoice_pdf used to return the entire PDF as base64 when no save_path was given — measured 68,419 characters for a real invoice. It now saves to ~/Downloads/holded-mcp/ by default and returns just the path (measured: 105 characters, -99.8%), matching the pattern already used elsewhere in this repo family for binary content. Pass as_base64=True for the rare case where you actually need the bytes inline.
Security
Every tool carries MCP Tool Annotations (
readOnlyHint,destructiveHint,idempotentHint,openWorldHint) describing its effect up front.API failures are raised as exceptions and always surface as real MCP protocol errors (
isError=true) — no tool catches a Holded API error and quietly turns it into a JSON payload that looks like a successful response.
Notes and known API quirks
Auth: PAT tokens (
pat_...) useAuthorization: Bearer <pat_...>, not akey: valueheader.All POST/PUT bodies use snake_case (
contact_id,due_date,number_line_id...) — the v2 API rejects camelCase with a 400.No server-side date filtering — the server paginates through the full cursor and filters by date client-side.
draftis a boolean flag on the document, not a status value. Valid statuses:pending,completed,partial,cancelled,failed,overdue.Purchase reconciliation only works from the UI — the public API v2 doesn't support reconciling purchase-type movements (
reconcile_bank_movementwithdocument_type: "purchase"always produces a zero-amountforced_reconciled). Use the Holded UI (Expenses → edit payment → select bank account) for that specific case.register_invoice_payment/register_purchase_paymentusetreasury_idinternally (the tool acceptsaccount_idand maps it for you); free text goes indescription, notnotes.No delete endpoint exists in the API for invoices, purchases, estimates or credit notes — only the Holded UI can remove a document.
create_cashflow_forecastrequires an approved (non-draft) document — approve first withapprove_invoice.Attachments use
multipart/form-datawith no explicitContent-Typeheader (letrequestsset it).
License
MIT — see LICENSE.
This server cannot be deployed
Maintenance
Related MCP Connectors
MCP server for Codat — companies, connections, invoices, bills and financial statements.
Hosted MCP server for Mini Accountant: invoices, expenses, customers, analytics, tax estimates.
MCP server for Quaderno — tax-rate calculation, invoices, contacts, products, receipts & expenses.
MCP server for Modern Treasury — payment orders, transactions, counterparties and ledgers.
Related MCP Servers
- AlicenseNot gradedqualityAmaintenanceMCP server for Holded — invoicing, accounting, CRM, projects, and team77 npm1MIT
- AlicenseBqualityAmaintenanceA Model Context Protocol (MCP) server for the Holded Invoice API. This server allows AI assistants like Claude to interact with Holded's invoicing, contacts, products, and more.7820 npm19MIT
- AlicenseAqualityDmaintenanceMCP server that connects Claude Code to the Holded API for natural language financial, accounting, and invoicing queries, with built-in Spanish PGC context.132Apache 2.0
- FlicenseNot gradedqualityDmaintenanceAn open-source MCP server for the Holded API that enables natural language management of invoicing, CRM, projects, team, and accounting.-