# Holded — how to use (mcp.ai)

Connect your Holded account and use 10 tools for sales and CRM straight from your AI agent. Connect with your own API key. Holded is business management software for managing sales documents, invoices, services, contacts, contact groups, and tags.

## Option A — via MCP (recommended)
Remote MCP endpoint (HTTP, streamable): `https://api.mcp.ai/p_holded?ms=1787293500000`
Add it as a custom/remote MCP connector in your client (Claude, Cursor, VS Code…), then authenticate when prompted. Once connected, ask the agent to use the server's tools (e.g. `holded_create_contact`).

## Option B — via direct REST API
Base URL: `https://api.mcp.ai/api/holded`
Auth: `Authorization: Bearer sk_live_…` — create a workspace API key at https://mcp.ai/settings/api-keys
Discover endpoints: `GET https://api.mcp.ai/api/holded/_endpoints`

### Endpoints
- `POST https://api.mcp.ai/api/holded/create/contact` — Create a customer, supplier, lead, debtor, creditor, or unclassified contact and return its new Holded ID.
  - body: { name: string, email?: string, phone?: string, mobile?: string, tax_id?: string, website?: string, is_person?: boolean, trade_name?: string, vat_number?: string, contact_type?: string, billing_address?: object }
- `POST https://api.mcp.ai/api/holded/create/invoice` — Create a sales invoice for an existing contact and return its ID; this does not send, approve, or record payment for the invoice.
  - body: { body?: string, tags?: string[], items: object[], notes?: string, currency?: string, discount?: number, due_date?: string, language?: string, contact_id: string, issue_date?: string, description?: string, currency_change?: number, sales_channel_id?: string, numbering_series_id?: string }
- `POST https://api.mcp.ai/api/holded/delete/contact` — Permanently delete one contact by ID; linked documents keep display text but lose the live contact association.
  - body: { contact_id: string }
- `POST https://api.mcp.ai/api/holded/delete/invoice` — Permanently delete one invoice and its recorded payments; its document number is not reused.
  - body: { invoice_id: string }
- `POST https://api.mcp.ai/api/holded/find/contacts` — Find Holded contacts by name prefix or an exact email, phone, mobile, tax ID, or external ID. With no filter, return one page of contacts.
  - body: { name?: string, email?: string, limit?: integer, phone?: string, cursor?: string, mobile?: string, tax_id?: string, external_id?: string }
- `POST https://api.mcp.ai/api/holded/find/invoices` — Find Holded invoices by fuzzy document-number prefix or list them by contact, payment status, issue date, or due date. With no filter, return one page of invoices.
  - body: { sort?: string, limit?: integer, cursor?: string, status?: string, contact_id?: string, due_date_end?: string, due_date_start?: string, issue_date_end?: string, document_number?: string, issue_date_start?: string }
- `POST https://api.mcp.ai/api/holded/get/contact` — Return the complete profile of one contact by its Holded contact ID.
  - body: { contact_id: string }
- `POST https://api.mcp.ai/api/holded/get/invoice` — Return full details, lines, totals, and payment summary for one invoice by its Holded ID.
  - body: { invoice_id: string }
- `POST https://api.mcp.ai/api/holded/update/contact` — Safely change selected fields on a contact without clearing unspecified profile data. Reads the contact before updating and returns the verified result.
  - body: { changes: object, contact_id: string }
- `POST https://api.mcp.ai/api/holded/update/invoice` — Safely change selected mutable fields on an invoice without clearing unspecified invoice data or altering recorded payments. Reads the invoice before updating and returns the verified result.
  - body: { changes: object, invoice_id: string }

## Example prompts
- "What can I do in Holded?"
- "Show me a summary of my Holded account"

## More
- Page: https://mcp.ai/holded
- Agent spec (llms.txt): https://mcp.ai/holded/llms.txt
- Postman collection: https://mcp.ai/holded/postman.json
