{"name":"io.github.energio-es/holded-mcp","slug":"energio-es-holded-mcp","title":null,"description":"MCP server for Holded — invoicing, accounting, CRM, projects, and team","url":"https://mcp.market/server/energio-es-holded-mcp","rating":null,"grade":"C","score":65,"certified":false,"status":"active","category":"sales","tags":["sales","finance"],"presence":{"score":0,"stars":null,"forks":null,"downloads_week":null,"last_push_at":null,"license":"MIT"},"uptime":null,"claimed":false,"transport":"npm","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/energio-es/holded-mcp","website":null,"version":"1.5.1","remotes":[],"packages":[{"registryType":"npm","identifier":"@energio/holded-mcp","version":"1.5.1","runtimeHint":"npx","transport":{"type":"stdio"},"environmentVariables":[{"description":"Your Holded API key. Get it from https://app.holded.com/api","isRequired":true,"name":"HOLDED_API_KEY"},{"description":"Comma-separated list of modules to enable (invoicing, crm, projects, accounting, team). All enabled by default.","name":"HOLDED_MODULES"},{"description":"API rate limit in requests per second. Default: 10.","name":"HOLDED_RATE_LIMIT_PER_SECOND"},{"description":"Set to 'true' to enable debug logging for API requests.","name":"HOLDED_DEBUG"}]}],"tools":[{"name":"holded_accounting_create_entry","description":"","write_action":true,"price_micros":0,"input_schema":null},{"name":"holded_accounting_list_account_balances","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"holded_accounting_list_daily_ledger","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"holded_crm_create_lead_note","description":"Add a note to a lead in Holded CRM. Args: - lead_id (string): The lead ID to add the note to (required) - title (string): Note title (required) - desc (string): Note description/body Returns: The created note.","write_action":true,"price_micros":0,"input_schema":null},{"name":"holded_crm_create_lead_task","description":"Create a new task for a lead in Holded CRM. Args: - lead_id (string): The lead ID to add the task to (required) - name (string): Task name (required) Returns: The created task.","write_action":true,"price_micros":0,"input_schema":null},{"name":"holded_crm_delete_lead_task","description":"Delete a task associated with a lead in Holded CRM. Args: - lead_id (string): The lead ID (required) - task_id (string): The task ID to delete (required) Returns: Confirmation of task deletion.","write_action":true,"price_micros":0,"input_schema":null},{"name":"holded_crm_get_available_slots","description":"Get available time slots for a specific booking location from Holded CRM. Args: - location_id (string): The location ID (required) - serviceId (string): Service ID (required) - day (string): Day in yyyy-mm-dd format (required) - response_format ('json' | 'markdown'): Output format (default: 'json') Returns: Array of available time slots for the location with dateTime, from, to, and duration.","write_action":false,"price_micros":0,"input_schema":null},{"name":"holded_crm_list_booking_locations","description":"List all booking locations from Holded CRM. Args: - response_format ('json' | 'markdown'): Output format (default: 'json') Returns: Array of booking locations with id, name, description, active status, and availableServices.","write_action":false,"price_micros":0,"input_schema":null},{"name":"holded_crm_update_lead_dates","description":"Update the creation date of a lead in Holded CRM. Args: - lead_id (string): The lead ID (required) - date (number): Lead creation date as Unix timestamp (required) Returns: Confirmation of date update.","write_action":true,"price_micros":0,"input_schema":null},{"name":"holded_crm_update_lead_note","description":"Update a note associated with a lead in Holded CRM. Args: - lead_id (string): The lead ID (required) - note_id (string): The note ID to update (required) - title (string): Note title (required) - desc (string): Note description/body Returns: The updated note.","write_action":true,"price_micros":0,"input_schema":null},{"name":"holded_crm_update_lead_stage","description":"Move a lead to a different stage in the sales funnel. Args: - lead_id (string): The lead ID to move (required) - stage_id (string): The target stage ID (required) Returns: Confirmation of stage update.","write_action":true,"price_micros":0,"input_schema":null},{"name":"holded_crm_update_lead_task","description":"Update a task associated with a lead in Holded CRM. Args: - lead_id (string): The lead ID (required) - task_id (string): The task ID to update (required) - name (string): Task name Returns: The updated task.","write_action":true,"price_micros":0,"input_schema":null},{"name":"holded_invoicing_attach_document_file","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"holded_invoicing_create_document","description":"","write_action":true,"price_micros":0,"input_schema":null},{"name":"holded_invoicing_create_numbering_serie","description":"Create a new numbering series for a document type in Holded. Args: - doc_type (string): Document type (required) - name (string): Series name (required) - format (string): Format string for document numbers (e.g., 'F17%%%%') - last (integer): Last number used in the series - type (string): Document type (optional, already in path) Returns: The created numbering series.","write_action":true,"price_micros":0,"input_schema":null},{"name":"holded_invoicing_create_payment","description":"Create a standalone payment in Holded. To record a payment for a document, use holded_invoicing_pay_document instead. Args: - contact_id (string): The contact ID to apply the payment to - amount (number): Payment amount (required) - date (number): Payment date as Unix timestamp - account_id (string): Treasury/Bank account ID - desc (string): Payment description Returns: The created payment confirm","write_action":true,"price_micros":0,"input_schema":null},{"name":"holded_invoicing_create_treasury","description":"Create a new treasury/bank account in Holded. Args: - name (string): Treasury account name (required) - id (string): Treasury account ID (optional, auto-generated if not provided) - type (string): Account type (e.g., 'bank', 'cash', 'creditcard') - balance (integer): Initial balance - accountNumber (integer): Accounting account number. If blank, a new account with prefix 572 will be created - iban","write_action":true,"price_micros":0,"input_schema":null},{"name":"holded_invoicing_delete_document","description":"Delete a document from Holded. Args: - doc_type (string): Document type (required) - document_id (string): The document ID to delete (required) Returns: Confirmation of deletion.","write_action":true,"price_micros":0,"input_schema":null},{"name":"holded_invoicing_delete_numbering_serie","description":"Delete a numbering series from Holded. Args: - doc_type (string): Document type (required) - numbering_series_id (string): The numbering series ID to delete (required) Returns: Confirmation of deletion.","write_action":true,"price_micros":0,"input_schema":null},{"name":"holded_invoicing_get_contact_attachment","description":"Get a specific attachment for a contact from Holded. Args: - contact_id (string): The contact ID (required) - filename (string): The attachment filename (required) - response_format ('json' | 'markdown'): Output format (default: 'json') Returns: Attachment file data (binary format, base64 encoded or URL).","write_action":false,"price_micros":0,"input_schema":null},{"name":"holded_invoicing_get_document","description":"Get a specific document by ID from Holded. Args: - doc_type (string): Document type (required) - document_id (string): The document ID to retrieve (required) - response_format ('json' | 'markdown'): Output format (default: 'json') Returns: Document details including line items, totals, and payment status.","write_action":false,"price_micros":0,"input_schema":null},{"name":"holded_invoicing_get_document_pdf","description":"Get the PDF version of a document from Holded. Args: - doc_type (string): Document type (required) - document_id (string): The document ID to get PDF for (required) Returns: PDF file data (base64 encoded or URL).","write_action":false,"price_micros":0,"input_schema":null},{"name":"holded_invoicing_get_numbering_series","description":"Get numbering series for a document type in Holded. Args: - doc_type (string): Document type (required) - response_format ('json' | 'markdown'): Output format (default: 'json') Returns: Array of numbering series with id, name, prefix, suffix, and next number.","write_action":false,"price_micros":0,"input_schema":null},{"name":"holded_invoicing_get_product_image","description":"Get the main image of a specific product from Holded. Args: - product_id (string): The product ID to get the main image for (required) - response_format ('json' | 'markdown'): Output format (default: 'json') Returns: Product main image data (URL or base64 encoded).","write_action":false,"price_micros":0,"input_schema":null},{"name":"holded_invoicing_get_product_secondary_image","description":"Get a specific secondary image of a product from Holded. Args: - product_id (string): The product ID (required) - image_file_name (string): The image file name (required) - response_format ('json' | 'markdown'): Output format (default: 'json') Returns: Product secondary image data (URL or base64 encoded).","write_action":false,"price_micros":0,"input_schema":null},{"name":"holded_invoicing_get_shipped_items","description":"For each item included in a sales or purchase order, get the number of units shipped or received. Args: - doc_type ('salesorder' | 'order'): Document type (required) - document_id (string): The document ID to get shipped items for (required) - response_format ('json' | 'markdown'): Output format (default: 'json') Returns: Array of items with name, sku, total, sent, and pending quantities.","write_action":false,"price_micros":0,"input_schema":null},{"name":"holded_invoicing_get_taxes","description":"Get all taxes information from Holded. Args: - response_format ('json' | 'markdown'): Output format (default: 'json') Returns: Array of taxes with id, name, and rate information.","write_action":false,"price_micros":0,"input_schema":null},{"name":"holded_invoicing_get_treasury","description":"Get a specific treasury/bank account by ID from Holded. Args: - treasury_id (string): The treasury account ID to retrieve (required) - response_format ('json' | 'markdown'): Output format (default: 'json') Returns: Treasury account details including balance and bank information.","write_action":false,"price_micros":0,"input_schema":null},{"name":"holded_invoicing_list_contact_attachments","description":"Get attachments list for a given contact from Holded. Args: - contact_id (string): The contact ID to list attachments for (required) - response_format ('json' | 'markdown'): Output format (default: 'json') Returns: Array of attachment file names.","write_action":false,"price_micros":0,"input_schema":null},{"name":"holded_invoicing_list_documents","description":"","write_action":false,"price_micros":0,"input_schema":null},{"name":"holded_invoicing_list_payment_methods","description":"List all payment methods from Holded. Args: - response_format ('json' | 'markdown'): Output format (default: 'json') Returns: Array of payment methods with id, name, and configuration.","write_action":false,"price_micros":0,"input_schema":null},{"name":"holded_invoicing_list_product_images","description":"List all secondary product images from Holded. Args: - product_id (string): The product ID to list images for (required) - response_format ('json' | 'markdown'): Output format (default: 'json') Returns: Array of product image file names or image data.","write_action":false,"price_micros":0,"input_schema":null},{"name":"holded_invoicing_list_products_stock","description":"List stock levels for products in a specific warehouse in Holded. Args: - warehouse_id (string): The warehouse ID to list stock for (required) - page (number): Page number for pagination (default: 1, max 500 items per page) - response_format ('json' | 'markdown'): Output format (default: 'json') Returns: Array of products with their stock levels for the specified warehouse.","write_action":false,"price_micros":0,"input_schema":null},{"name":"holded_invoicing_list_treasuries","description":"List all treasury/bank accounts from Holded. Args: - response_format ('json' | 'markdown'): Output format (default: 'json') Returns: Array of treasury accounts with id, name, type, currency, and balance.","write_action":false,"price_micros":0,"input_schema":null},{"name":"holded_invoicing_pay_document","description":"Record a payment for a document in Holded. Args: - doc_type (string): Document type (required) - document_id (string): The document ID to pay (required) - amount (number): Payment amount (if different from document total) - account_id (string): Treasury/Bank account ID - date (number): Payment date as Unix timestamp Returns: Confirmation of payment.","write_action":true,"price_micros":0,"input_schema":null},{"name":"holded_invoicing_send_document","description":"Send a document via email in Holded. Args: - doc_type (string): Document type (required) - document_id (string): The document ID to send (required) - emails (string): Recipient email(s), comma-separated (required) - subject (string): Email subject - message (string): Email message body Returns: Confirmation of sending.","write_action":true,"price_micros":0,"input_schema":null},{"name":"holded_invoicing_ship_all_items","description":"Ship all the items of a specific sales order in Holded. Args: - document_id (string): The sales order document ID to ship all items for (required) Returns: Confirmation of shipping with status and info.","write_action":false,"price_micros":0,"input_schema":null},{"name":"holded_invoicing_ship_items_by_line","description":"Ship specific items of a sales order by line position in Holded. Args: - document_id (string): The sales order document ID to ship items for (required) - lines (array): Array of item lines to ship, each with: - itemLinePosition (number): Item line position (starts at 0) - units (number): Number of units to ship Returns: Confirmation of shipping with status and info.","write_action":false,"price_micros":0,"input_schema":null},{"name":"holded_invoicing_update_document","description":"","write_action":true,"price_micros":0,"input_schema":null},{"name":"holded_invoicing_update_document_pipeline","description":"Update the pipeline stage for a document in Holded. Note: This endpoint only works with 'salesorder' and 'waybill' document types. Args: - doc_type ('salesorder' | 'waybill'): Document type (required) - document_id (string): The document ID to update pipeline for (required) - pipeline (string): Pipeline stage identifier (required) Returns: Confirmation of pipeline update.","write_action":true,"price_micros":0,"input_schema":null},{"name":"holded_invoicing_update_document_tracking","description":"","write_action":true,"price_micros":0,"input_schema":null},{"name":"holded_invoicing_update_numbering_serie","description":"Update an existing numbering series in Holded. Args: - doc_type (string): Document type (required) - numbering_series_id (string): The numbering series ID to update (required) - name (string): Series name - format (string): Format string for document numbers - last (string): Last number used in the series (string format) Returns: The updated numbering series.","write_action":true,"price_micros":0,"input_schema":null},{"name":"holded_invoicing_update_payment","description":"Update an existing payment in Holded. Args: - payment_id (string): The payment ID to update (required) - amount (number): Payment amount - date (number): Payment date as Unix timestamp - account_id (string): Treasury/Bank account ID - desc (string): Payment description Returns: The updated payment.","write_action":true,"price_micros":0,"input_schema":null},{"name":"holded_invoicing_update_product_stock","description":"Update stock level for a product in Holded. Args: - product_id (string): The product ID to update stock for (required, path parameter) - stock (object): Nested object structure: stock[warehouseId][productId/variantId] = quantity Example: { \"warehouse1\": { \"product123\": 10, \"variant456\": 5 } } Returns: Confirmation of stock update.","write_action":true,"price_micros":0,"input_schema":null},{"name":"holded_invoicing_upload_product_image","description":"","write_action":true,"price_micros":0,"input_schema":null},{"name":"holded_projects_create_project_time_tracking","description":"Create a new time-tracking entry for a project in Holded. Args: - project_id (string): The project ID (required) - duration (number): Duration in seconds (required) - costHour (number): Cost per hour (required) - desc (string): Description of work (optional) - userId (string): User/Employee ID (required) - taskId (string): Task ID (optional) Returns: The created time-tracking with its assigned ID.","write_action":true,"price_micros":0,"input_schema":null},{"name":"holded_projects_create_task","description":"Create a new task in Holded Projects. According to Holded Projects API v1.2, task creation requires: - name (string): Task name (required) - project_id (string): Project ID to associate the task with (required) - list_id (string): Task list/column ID within the project (required). Get available listIds from the project details. Returns: The created task with its assigned ID.","write_action":true,"price_micros":0,"input_schema":null},{"name":"holded_projects_delete_project_time_tracking","description":"Delete a time-tracking entry from a project in Holded. Args: - project_id (string): The project ID (required) - time_id (string): The time-tracking ID to delete (required) Returns: Confirmation of deletion.","write_action":true,"price_micros":0,"input_schema":null},{"name":"holded_projects_get_project_summary","description":"Get a summary/overview of a project from Holded. Args: - project_id (string): The project ID to get summary for (required) - response_format ('json' | 'markdown'): Output format (default: 'json') Returns: Project summary including projectEvolution, profitability, economicStatus, and task statistics.","write_action":false,"price_micros":0,"input_schema":null},{"name":"holded_projects_get_project_time_tracking","description":"Get a specific time-tracking entry for a project from Holded. Args: - project_id (string): The project ID (required) - time_id (string): The time-tracking ID to retrieve (required) - response_format ('json' | 'markdown'): Output format (default: 'json') Returns: Time-tracking details including duration, description, cost, and other fields.","write_action":false,"price_micros":0,"input_schema":null},{"name":"holded_projects_list_all_times","description":"List time trackings in projects not archived from 18 months on. Args: - start (number): Start date as Unix timestamp (optional) - end (number): End date as Unix timestamp (optional) - archived (boolean): Include archived projects (optional) - response_format ('json' | 'markdown'): Output format (default: 'json') Returns: Array of projects with their time-tracking entries.","write_action":false,"price_micros":0,"input_schema":null},{"name":"holded_projects_list_project_time_trackings","description":"List all time-trackings for a specific project from Holded. Args: - project_id (string): The project ID (required) - page (number): Page number for pagination (default: 1, max 500 items per page) - response_format ('json' | 'markdown'): Output format (default: 'json') Returns: Array of time-trackings for the project.","write_action":false,"price_micros":0,"input_schema":null},{"name":"holded_projects_update_project_time_tracking","description":"Update an existing time-tracking entry for a project in Holded. Args: - project_id (string): The project ID (required) - time_id (string): The time-tracking ID to update (required) - duration (number): Duration in seconds (optional) - costHour (number): Cost per hour (optional) - desc (string): Description of work (optional) - userId (string): User/Employee ID (optional) - taskId (string): Task ID","write_action":true,"price_micros":0,"input_schema":null},{"name":"holded_team_create_employee_time_tracking","description":"Create a new time-tracking entry for an employee in Holded. Args: - employee_id (string): The employee ID (required) - startTmp (string): Start time as Unix timestamp string (required) - endTmp (string): End time as Unix timestamp string (required) Returns: The created time-tracking with its assigned ID.","write_action":true,"price_micros":0,"input_schema":null},{"name":"holded_team_delete_time_tracking","description":"Delete a time-tracking from Holded. Args: - time_id (string): The time-tracking ID to delete (required) Returns: Confirmation of deletion.","write_action":true,"price_micros":0,"input_schema":null},{"name":"holded_team_employee_clock_in","description":"Start counting employee time-tracking in Holded. Args: - employee_id (string): The employee ID to clock in (required) - location (string): Location name (optional) Returns: Confirmation with status, info, and time-tracking ID.","write_action":false,"price_micros":0,"input_schema":null},{"name":"holded_team_employee_clock_out","description":"End counting employee time-tracking in Holded. Args: - employee_id (string): The employee ID to clock out (required) - latitude (string): Latitude (e.g., -7.45556) (optional) - longitude (string): Longitude (e.g., 55.55765) (optional) Returns: Confirmation with status, info, and time-tracking ID.","write_action":false,"price_micros":0,"input_schema":null},{"name":"holded_team_employee_pause","description":"Pause employee time-tracking in Holded. Args: - employee_id (string): The employee ID to pause (required) - latitude (string): Latitude (e.g., -7.45556) (optional) - longitude (string): Longitude (e.g., 55.55765) (optional) Returns: Confirmation with status, info, and time-tracking ID.","write_action":false,"price_micros":0,"input_schema":null},{"name":"holded_team_employee_unpause","description":"Unpause employee time-tracking in Holded. Args: - employee_id (string): The employee ID to unpause (required) - latitude (string): Latitude (e.g., -7.45556) (optional) - longitude (string): Longitude (e.g., 55.55765) (optional) Returns: Confirmation with status, info, and time-tracking ID.","write_action":false,"price_micros":0,"input_schema":null},{"name":"holded_team_get_time_tracking","description":"Get a specific time-tracking by ID from Holded. Args: - time_id (string): The time-tracking ID to retrieve (required) - response_format ('json' | 'markdown'): Output format (default: 'json') Returns: Time-tracking details including employee, time, and status.","write_action":false,"price_micros":0,"input_schema":null},{"name":"holded_team_list_all_time_trackings","description":"List all time-trackings for all employees from Holded. Args: - page (number): Page number for pagination (default: 1, max 500 items per page) - response_format ('json' | 'markdown'): Output format (default: 'json') Returns: Array of time-trackings with id, employee, time, and status.","write_action":false,"price_micros":0,"input_schema":null},{"name":"holded_team_list_employee_time_trackings","description":"List all time-trackings for a specific employee from Holded. Args: - employee_id (string): The employee ID (required) - response_format ('json' | 'markdown'): Output format (default: 'json') Returns: Array of time-trackings for the employee with id, time, and status.","write_action":false,"price_micros":0,"input_schema":null},{"name":"holded_team_update_time_tracking","description":"Update an existing time-tracking in Holded. Args: - time_id (string): The time-tracking ID to update (required) - startTmp (string): Start time as Unix timestamp string (required) - endTmp (string): End time as Unix timestamp string (required) Returns: The updated time-tracking.","write_action":true,"price_micros":0,"input_schema":null}],"scan":{"score":65,"grade":"C","scanned_at":"2026-09-26T11:38:53.307Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-26T11:38:53.358Z","components":{"code":{"score":25,"max":25,"notes":["131 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":12,"max":15,"notes":["local package, no credentials required"]},"maintenance":{"score":3,"max":15,"notes":["repository not readable: repo not found"]},"identity":{"score":2,"max":10,"notes":["no repository or website to verify"]}},"findings":[],"inputs":{"packages":[{"registryType":"npm","identifier":"@energio/holded-mcp","version":"1.5.1","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":4,"publishedAt":"2026-07-01T15:01:33.344Z","repositoryUrl":"git+https://github.com/energio-es/holded-mcp.git"}],"repo":{"found":false,"owner":"energio-es","repo":"holded-mcp","error":"repo not found"},"icon":{"url":null,"source":"none"},"presence":{"stars":null,"forks":null,"downloadsWeek":null,"license":"MIT","lastPushAt":null,"score":0}}}},"grade_history":[],"reviews":[]}