Skip to main content
Glama
sachitha7

mcp-server-dolibarr

by sachitha7
README.md
# mcp-server-dolibarr

An [MCP](https://modelcontextprotocol.io) server for [Dolibarr](https://www.dolibarr.org/) ERP/CRM. Lets Claude (or any MCP-compatible client) read and manage your Dolibarr **thirdparties** (clients/suppliers), **commercial proposals**, **contracts**, and **invoices** directly — no manual API scripting needed.

Built by [Nexora 360 Digital](https://nexora360.lk), released for anyone running Dolibarr to use for free.

## Requirements

- A running Dolibarr instance (v15+) with the **REST API module** enabled (*Setup → Modules → API*)
- A Dolibarr **API key** for the user the assistant should act as (*your user profile → API/REST tab → Generate Key*)
- Node.js 18 or newer

## Installation

No install needed — run it directly with `npx` (see configuration below), or clone this repo and run `npm install`.

## Configuration

The server reads two environment variables:

| Variable            | Description                                                              | Example                                              |
|---------------------|----------------------------------------------------------------------|-------------------------------------------------------|
| `DOLIBARR_URL`       | Your Dolibarr REST API base URL                                          | `https://your-domain.com/dolibarr/api/index.php`     |
| `DOLIBARR_API_KEY`   | The API key generated for your Dolibarr user                             | `abc123...`                                          |

### Claude Code

```bash
claude mcp add dolibarr \
  --env DOLIBARR_URL=https://your-domain.com/dolibarr/api/index.php \
  --env DOLIBARR_API_KEY=your_api_key_here \
  -- npx -y mcp-server-dolibarr
```

### Claude Desktop / other MCP clients

Add to your MCP config file (e.g. `claude_desktop_config.json`):

```json
{
  "mcpServers": {
    "dolibarr": {
      "command": "npx",
      "args": ["-y", "mcp-server-dolibarr"],
      "env": {
        "DOLIBARR_URL": "https://your-domain.com/dolibarr/api/index.php",
        "DOLIBARR_API_KEY": "your_api_key_here"
      }
    }
  }
}
```

## Available tools

**Connectivity**
- `dolibarr_ping` — verify the URL/API key are working

**Thirdparties (clients/suppliers)**
- `dolibarr_list_thirdparties`
- `dolibarr_get_thirdparty`
- `dolibarr_find_thirdparty_by_email`
- `dolibarr_create_thirdparty`
- `dolibarr_update_thirdparty`

**Commercial Proposals (Quotes)**
- `dolibarr_list_proposals`
- `dolibarr_get_proposal`
- `dolibarr_create_proposal`
- `dolibarr_add_proposal_line`
- `dolibarr_validate_proposal`

**Contracts**
- `dolibarr_list_contracts`
- `dolibarr_get_contract`
- `dolibarr_create_contract`
- `dolibarr_add_contract_line`

**Invoices**
- `dolibarr_list_invoices`
- `dolibarr_get_invoice`
- `dolibarr_create_invoice`
- `dolibarr_add_invoice_line`
- `dolibarr_validate_invoice`
- `dolibarr_get_invoice_pdf_url`

**Anything else**
- `dolibarr_request` — raw passthrough to any Dolibarr REST endpoint (`/products`, `/users`, `/projects`, etc.) for the parts of Dolibarr's huge API surface this server doesn't wrap explicitly yet.

## Notes & known Dolibarr quirks

- Proposals, contracts and invoices are created in two steps in Dolibarr's API: create the header first, then add line items separately (`*_lines` endpoints). The tools above mirror that.
- **Dolibarr 23.x line-creation silent-failure bug:** on Dolibarr 23 instances, `POST /{proposals|invoices|contracts}/{id}/lines` actually expects the body wrapped as `{"request_data": {...fields...}}`, not a flat object of fields (despite this not matching the field names documented for older Dolibarr versions). Sending a flat object doesn't error — it silently creates a blank line with `special_code: "3"` (no description, qty 0, price 0) instead of your real data. `dolibarr_add_proposal_line`, `dolibarr_add_invoice_line` and `dolibarr_add_contract_line` already wrap the body correctly to work around this. If you see blank/`special_code: 3` lines appearing on Dolibarr versions other than 23.x, check your instance's live schema at `/api/index.php/explorer/swagger.json` and adjust `index.js` accordingly — Dolibarr's REST API shape has changed across major versions.
- On some Dolibarr versions, certain endpoints (e.g. contracts) only work reliably for admin/SuperAdmin API keys — if a non-admin key fails, try generating the key as an admin user.
- `country_id` for thirdparties follows Dolibarr's internal country table (e.g. `144` = Sri Lanka in standard Dolibarr installs) — check your instance if unsure.

## Contributing

Issues and PRs welcome — this was built to scratch a real itch (managing client proposals/invoices via Claude) and intentionally keeps a `dolibarr_request` escape hatch so it stays useful even where dedicated tools haven't been written yet.

## License

MIT — see [LICENSE](./LICENSE).

TDQS

A3.5/5.0

Scored across 22 tools

Disambiguation5/5

Each tool targets a distinct resource (contract, invoice, proposal, thirdparty) and action (create, add_line, get, list, validate, find, update). The catch-all 'dolibarr_request' tool is clearly distinguished as a generic fallback. There is no ambiguity or overlap.

Naming Consistency5/5

All tools follow a consistent 'dolibarr_verb_noun' pattern (e.g., create_invoice, list_proposals). The only exception is 'dolibarr_request', which is a generic tool and intentionally deviates. Overall, naming is highly predictable and uniform.

Tool Count5/5

22 tools cover multiple ERP entities (thirdparties, contracts, invoices, proposals) with appropriate CRUD-like operations. The number is well-scoped for a comprehensive integration without being excessive.

Completeness4/5

The tool set covers core workflows for thirdparties, contracts, invoices, and proposals, including creation, line addition, retrieval, listing, and validation. Missing are update and delete operations for most entities, but the raw request tool can compensate. Minor gaps in update/delete completeness.

Maintenance

ActivitySlowing
ResponsivenessSyncing