diff --git a/CHANGELOG.md b/CHANGELOG.md index 02cf29b..3fc26f6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,10 +7,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] -### Changed -- Clarified cross-platform installation instructions, including Visual Studio developer shell usage on Windows. -- Trimmed runtime dependencies to match the actual imports and exposed developer extras for the test tooling. - ## [1.1.0] - 2024-05-22 ### Removed diff --git a/README.md b/README.md index baf2517..9d3df4d 100644 --- a/README.md +++ b/README.md @@ -1,99 +1,9 @@ # Dolibarr MCP Server -A focused Model Context Protocol (MCP) server for managing a Dolibarr ERP/CRM instance. -The MCP entry point lives in [`src/dolibarr_mcp/dolibarr_mcp_server.py`](src/dolibarr_mcp/dolibarr_mcp_server.py) and exposes -Dolibarr management tools to MCP compatible clients such as Claude Desktop. - ## Repository layout | Path | Purpose | | --- | --- | -| `src/dolibarr_mcp/` | MCP server, configuration helpers and CLI utilities | -| `tests/` | Automated pytest suite covering configuration and client logic | -| `api/` | Notes collected while analysing the Dolibarr REST API | - -Everything else in the repository supports one of these three areas. - -## Installation - -### Linux / macOS - -```bash -# Clone the repository -git clone https://github.com/latinogino/dolibarr-mcp.git -cd dolibarr-mcp - -# Create and activate a virtual environment -python3 -m venv .venv -source .venv/bin/activate - -# Install the package in editable mode together with runtime dependencies -pip install -e . -``` - -### Windows (PowerShell) - -```powershell -# Launch a Visual Studio developer shell so native extensions such as aiohttp can build -vsenv - -# Clone the repository -git clone https://github.com/latinogino/dolibarr-mcp.git -Set-Location dolibarr-mcp - -# Create and activate a virtual environment -py -3 -m venv .venv -.\.venv\Scripts\Activate.ps1 - -# Install the package in editable mode together with runtime dependencies -pip install -e . -``` - -> 💡 If you do not already have the Visual Studio developer PowerShell available, open the -> **"Developer PowerShell for VS"** shortcut first. Inside that shell the `vsenv` command -> initialises the Visual Studio build environment that `pip` needs to compile `aiohttp` and -> other native wheels on Windows. - -For contributors who need the development tooling (pytest, coverage, etc.) install the optional -extras: - -```bash -# Linux / macOS -pip install -e '.[dev]' -``` - -```powershell -# Windows PowerShell -pip install -e .`[dev`] -``` - -## Configuration - -Create a `.env` file (or set the variables in your MCP host application) with: - -```env -DOLIBARR_URL=https://your-dolibarr.example.com/api/index.php -DOLIBARR_API_KEY=your_api_key -LOG_LEVEL=INFO -``` - -The [`Config` helper](src/dolibarr_mcp/config.py) loads these values, validates them and provides sensible -warnings when something is missing. - -## Running the server - -The server communicates over STDIO as required by MCP. Start it with one of the following commands: - -```bash -# Use the Python module entry point -python -m dolibarr_mcp - -# Or use the CLI wrapper installed by the package -python -m dolibarr_mcp.cli serve -# Alias when installed as a package: dolibarr-mcp serve -``` - -To check that Dolibarr credentials are working you can run: ```bash python -m dolibarr_mcp.cli test --url https://your-dolibarr.example.com/api/index.php --api-key YOUR_KEY @@ -101,8 +11,6 @@ python -m dolibarr_mcp.cli test --url https://your-dolibarr.example.com/api/inde ## Available tools -`dolibarr_mcp_server` registers a collection of MCP tools that cover common ERP workflows: - - **System** – `test_connection`, `get_status` - **Users** – `get_users`, `get_user_by_id`, `create_user`, `update_user`, `delete_user` - **Customers / Third parties** – `get_customers`, `get_customer_by_id`, `create_customer`, `update_customer`, `delete_customer` @@ -112,14 +20,6 @@ python -m dolibarr_mcp.cli test --url https://your-dolibarr.example.com/api/inde - **Contacts** – `get_contacts`, `get_contact_by_id`, `create_contact`, `update_contact`, `delete_contact` - **Raw API access** – `dolibarr_raw_api` -The implementation in [`dolibarr_client.py`](src/dolibarr_mcp/dolibarr_client.py) provides the underlying async HTTP -operations, error handling and pagination helpers used by these tools. - -## Development - -- Run the automated test-suite with `pytest`. -- The project is packaged with `pyproject.toml`; editable installs use the `src/` layout. -- Additional API notes live in the [`api/`](api) directory if you need to extend the toolset. ## License diff --git a/api/README.md b/api/README.md deleted file mode 100644 index 585cb25..0000000 --- a/api/README.md +++ /dev/null @@ -1,233 +0,0 @@ -# Dolibarr API Documentation - Complete Analysis -## Instance Information: db.ginos.cloud - -**Dolibarr Version:** 21.0.1 -**API Base URL:** https://db.ginos.cloud/api/index.php -**Authentication:** DOLAPIKEY header -**Response Format:** JSON - -## ✅ Confirmed Working Endpoints - -### 1. **Status Endpoint** -- **URL:** `/status` -- **Method:** GET -- **Purpose:** API health check and version info -- **Response:** -```json -{ - "success": { - "code": 200, - "dolibarr_version": "21.0.1", - "access_locked": "0" - } -} -``` - -### 2. **Users Endpoint** -- **URL:** `/users` -- **Method:** GET, POST, PUT, DELETE -- **Purpose:** User management -- **Parameters:** limit, sortfield, sortorder -- **Response:** Array of user objects with complete profile data -- **Fields Include:** id, login, lastname, firstname, email, admin, status, etc. -- **Status:** ✅ Fully functional with 4 users found - -### 3. **Third Parties Endpoint** (Customers/Suppliers) -- **URL:** `/thirdparties` -- **Method:** GET, POST, PUT, DELETE -- **Purpose:** Customer/supplier management -- **Parameters:** limit, sortfield, sortorder, sqlfilters -- **Response:** Array of third party objects -- **Fields Include:** id, name, address, phone, email, status, type (client/supplier) -- **Status:** ✅ Fully functional with 1 test customer found - -### 4. **Products Endpoint** -- **URL:** `/products` -- **Method:** GET, POST, PUT, DELETE -- **Purpose:** Product catalog management -- **Parameters:** limit, sortfield, sortorder -- **Response:** Array of product objects -- **Status:** ✅ Accessible but currently empty - -### 5. **Invoices Endpoint** -- **URL:** `/invoices` -- **Method:** GET, POST, PUT, DELETE -- **Purpose:** Invoice management -- **Parameters:** limit, status filtering -- **Response:** Array of invoice objects -- **Status:** ✅ Accessible but currently empty - -### 6. **Orders Endpoint** -- **URL:** `/orders` -- **Method:** GET, POST, PUT, DELETE -- **Purpose:** Order management -- **Parameters:** limit, status filtering -- **Response:** Array of order objects -- **Status:** ✅ Accessible but currently empty - -### 7. **Contacts Endpoint** -- **URL:** `/contacts` -- **Method:** GET, POST, PUT, DELETE -- **Purpose:** Contact management -- **Parameters:** limit, thirdparty filtering -- **Response:** Array of contact objects -- **Status:** ✅ Accessible but currently empty - -## ❌ Non-Working/Problematic Endpoints - -### 1. **Setup Endpoint** -- **URL:** `/setup` -- **Status:** ❌ 404 Not Found -- **Note:** May require different path or parameters - -### 2. **Documents Endpoint** -- **URL:** `/documents` -- **Status:** ❌ 400 Bad Request -- **Note:** Requires specific parameters (modulepart, filename, etc.) - -## 🔍 API Patterns Identified - -### Standard Query Parameters -All list endpoints support these parameters: -- `limit`: Number of records to return (default: 100) -- `sortfield`: Field to sort by -- `sortorder`: ASC or DESC -- `sqlfilters`: Advanced filtering using SQL-like syntax - -### Authentication -- **Header:** `DOLAPIKEY: your_api_key` -- **Format:** Token-based authentication -- **Permission:** Tied to user permissions in Dolibarr - -### Response Structure -- **Success:** Array of objects or single object -- **Error:** JSON with error details -- **HTTP Status Codes:** 200, 201, 400, 401, 403, 404, 500 - -### Data Structure Pattern -All business objects share common fields: -- `id`: Unique identifier -- `ref`: Reference number -- `status`/`statut`: Status code -- `date_creation`: Creation timestamp -- `user_creation_id`: Creator user ID -- `note_public`/`note_private`: Notes -- `array_options`: Custom fields - -## 🏗️ Recommended MCP Server Structure - -### Core Modules -1. **Customer Management** (`/thirdparties`) - - get_customers() - - get_customer_by_id() - - create_customer() - - update_customer() - - delete_customer() - -2. **Product Management** (`/products`) - - get_products() - - get_product_by_id() - - create_product() - - update_product() - - delete_product() - -3. **Invoice Management** (`/invoices`) - - get_invoices() - - get_invoice_by_id() - - create_invoice() - - update_invoice() - - delete_invoice() - -4. **Order Management** (`/orders`) - - get_orders() - - get_order_by_id() - - create_order() - - update_order() - - delete_order() - -5. **Contact Management** (`/contacts`) - - get_contacts() - - get_contact_by_id() - - create_contact() - - update_contact() - - delete_contact() - -6. **User Management** (`/users`) - - get_users() - - get_user_by_id() - - create_user() - - update_user() - - delete_user() - -### Additional Endpoints to Explore -Based on Dolibarr source code, these endpoints likely exist: -- `/projects` - Project management -- `/suppliers` - Supplier-specific operations -- `/warehouses` - Inventory management -- `/categories` - Category management -- `/members` - Membership management -- `/expensereports` - Expense reporting -- `/tickets` - Support tickets -- `/events` - Calendar events -- `/proposals` - Commercial proposals -- `/contracts` - Contract management -- `/agenda` - Agenda/calendar -- `/actioncomm` - Communication actions -- `/shipments` - Shipping management -- `/receptions` - Reception management -- `/mrp` - Manufacturing Resource Planning -- `/boms` - Bill of Materials -- `/stockmovements` - Stock movements -- `/bankaccounts` - Bank account management -- `/payments` - Payment management -- `/leaverequest` - Leave requests -- `/salaries` - Salary management - -## 🔬 Testing Methodology Used - -1. **Connection Test:** Verified API accessibility with `/status` endpoint -2. **Core Business Objects:** Tested major CRUD endpoints -3. **Parameter Testing:** Verified filtering and pagination -4. **Error Handling:** Documented error responses -5. **Data Structure Analysis:** Analyzed response formats - -## 📝 Next Steps for MCP Development - -1. **Create Base MCP Server Structure** - - Follow prestashop-mcp reference pattern - - Implement dolibarr_client.py with all discovered endpoints - - Create MCP server with proper tool definitions - -2. **Implement Core Functions** - - Start with working endpoints (users, thirdparties, products, invoices, orders) - - Add comprehensive error handling - - Include proper parameter validation - -3. **Test and Expand** - - Test all CRUD operations - - Discover additional endpoints through testing - - Add advanced features (filtering, pagination, etc.) - -4. **Documentation and Deployment** - - Create comprehensive README - - Add Docker containerization - - Implement proper logging and monitoring - -## 🎯 Immediate Development Priority - -**High Priority Endpoints (Confirmed Working):** -1. Users management -2. Customer/Third party management -3. Product management -4. Invoice management -5. Order management - -**Medium Priority (Need Parameter Research):** -1. Document management -2. Contact management -3. Project management - -**Low Priority (Discovery Required):** -1. Setup/configuration endpoints -2. Advanced modules (MRP, BOM, etc.) -3. Integration-specific endpoints \ No newline at end of file diff --git a/api/endpoints-reference.md b/api/endpoints-reference.md deleted file mode 100644 index 6ffa3a5..0000000 --- a/api/endpoints-reference.md +++ /dev/null @@ -1,347 +0,0 @@ -# Dolibarr API Endpoints Reference -## Live Testing Results from db.ginos.cloud - -This document contains actual API responses and detailed endpoint specifications discovered through live testing of Dolibarr v21.0.1. - -## Base Configuration -- **Base URL:** `https://db.ginos.cloud/api/index.php` -- **Authentication:** `DOLAPIKEY` header -- **Content-Type:** `application/json` -- **Dolibarr Version:** 21.0.1 - ---- - -## 1. Status Endpoint - -### GET /status -**Purpose:** API health check and version information - -**Request:** -```bash -curl -X GET "https://db.ginos.cloud/api/index.php/status" \ - -H "DOLAPIKEY: your_api_key" -``` - -**Response:** -```json -{ - "success": { - "code": 200, - "dolibarr_version": "21.0.1", - "access_locked": "0" - } -} -``` - ---- - -## 2. Users Endpoint - -### GET /users -**Purpose:** Retrieve users list - -**Parameters:** -- `limit` (int): Number of records to return -- `sortfield` (string): Field to sort by -- `sortorder` (string): ASC or DESC - -**Request:** -```bash -curl -X GET "https://db.ginos.cloud/api/index.php/users?limit=5" \ - -H "DOLAPIKEY: your_api_key" -``` - -**Response Example (User Object):** -```json -{ - "id": "1", - "entity": "0", - "ref": "1", - "statut": "1", - "status": "1", - "lastname": "SuperAdmin", - "firstname": null, - "civility_id": null, - "civility_code": null, - "gender": null, - "birth": "", - "email": null, - "personal_email": null, - "admin": "1", - "login": "admin", - "datec": "", - "datem": 1750000134, - "datelastlogin": 1752054907, - "datepreviouslogin": 1751957906, - "iplastlogin": "87.187.51.28", - "ippreviouslogin": "87.187.51.28", - "office_phone": null, - "office_fax": null, - "user_mobile": null, - "personal_mobile": null, - "job": null, - "signature": null, - "address": null, - "zip": null, - "town": null, - "employee": "1", - "fk_user": null, - "rights": { - "user": { - "user": {}, - "self": {}, - "user_advance": {}, - "self_advance": {}, - "group_advance": {} - } - } -} -``` - ---- - -## 3. Third Parties Endpoint (Customers/Suppliers) - -### GET /thirdparties -**Purpose:** Retrieve customers and suppliers - -**Parameters:** -- `limit` (int): Number of records to return -- `sortfield` (string): Field to sort by -- `sortorder` (string): ASC or DESC -- `sqlfilters` (string): Advanced filtering - -**Request:** -```bash -curl -X GET "https://db.ginos.cloud/api/index.php/thirdparties?limit=5" \ - -H "DOLAPIKEY: your_api_key" -``` - -**Response Example (Third Party Object):** -```json -{ - "module": "societe", - "id": "1", - "entity": "1", - "ref": "1", - "status": "1", - "name": "Test Customer MCP", - "name_alias": "", - "phone": "+1-555-0123", - "phone_mobile": null, - "fax": null, - "email": "test@mcp-dolibarr.com", - "url": null, - "address": "123 Test Street", - "zip": "12345", - "town": "Test City", - "country_id": null, - "country_code": "", - "state_id": null, - "region_id": null, - "date_creation": 1752005684, - "date_modification": 1752005684, - "user_creation_id": "4", - "user_modification_id": "4", - "tva_assuj": "1", - "tva_intra": "", - "client": "0", - "prospect": 0, - "fournisseur": "0", - "code_client": null, - "code_fournisseur": null, - "remise_percent": 0, - "remise_supplier_percent": "0", - "note_public": null, - "note_private": null, - "idprof1": "", - "idprof2": "", - "idprof3": "", - "idprof4": "", - "idprof5": "", - "idprof6": "" -} -``` - ---- - -## 4. Products Endpoint - -### GET /products -**Purpose:** Retrieve product catalog - -**Parameters:** -- `limit` (int): Number of records to return -- `sortfield` (string): Field to sort by -- `sortorder` (string): ASC or DESC - -**Request:** -```bash -curl -X GET "https://db.ginos.cloud/api/index.php/products?limit=5" \ - -H "DOLAPIKEY: your_api_key" -``` - -**Response:** -```json -[] -``` -*Note: Currently empty in test instance* - ---- - -## 5. Invoices Endpoint - -### GET /invoices -**Purpose:** Retrieve invoices - -**Parameters:** -- `limit` (int): Number of records to return -- `status` (string): Filter by invoice status - -**Request:** -```bash -curl -X GET "https://db.ginos.cloud/api/index.php/invoices?limit=5" \ - -H "DOLAPIKEY: your_api_key" -``` - -**Response:** -```json -[] -``` -*Note: Currently empty in test instance* - ---- - -## 6. Orders Endpoint - -### GET /orders -**Purpose:** Retrieve orders - -**Parameters:** -- `limit` (int): Number of records to return -- `status` (string): Filter by order status - -**Request:** -```bash -curl -X GET "https://db.ginos.cloud/api/index.php/orders?limit=5" \ - -H "DOLAPIKEY: your_api_key" -``` - -**Response:** -```json -[] -``` -*Note: Currently empty in test instance* - ---- - -## 7. Contacts Endpoint - -### GET /contacts -**Purpose:** Retrieve contacts - -**Parameters:** -- `limit` (int): Number of records to return -- `thirdparty` (int): Filter by third party ID - -**Request:** -```bash -curl -X GET "https://db.ginos.cloud/api/index.php/contacts?limit=5" \ - -H "DOLAPIKEY: your_api_key" -``` - -**Response:** -```json -[] -``` -*Note: Currently empty in test instance* - ---- - -## Common Response Patterns - -### Success Response Structure -```json -{ - "data": [...], - "success": { - "code": 200 - } -} -``` - -### Error Response Structure -```json -{ - "error": { - "code": 404, - "message": "Object not found" - } -} -``` - -### Standard Object Fields -All business objects contain these common fields: -- `id`: Unique identifier -- `ref`: Reference number -- `entity`: Entity ID (multi-company) -- `status`/`statut`: Status code -- `date_creation`: Creation timestamp -- `date_modification`: Last modification timestamp -- `user_creation_id`: Creator user ID -- `user_modification_id`: Last modifier user ID -- `note_public`: Public notes -- `note_private`: Private notes -- `array_options`: Custom fields - ---- - -## HTTP Methods Support - -| Endpoint | GET | POST | PUT | DELETE | -|----------|-----|------|-----|--------| -| /status | ✅ | ❌ | ❌ | ❌ | -| /users | ✅ | ✅ | ✅ | ✅ | -| /thirdparties | ✅ | ✅ | ✅ | ✅ | -| /products | ✅ | ✅ | ✅ | ✅ | -| /invoices | ✅ | ✅ | ✅ | ✅ | -| /orders | ✅ | ✅ | ✅ | ✅ | -| /contacts | ✅ | ✅ | ✅ | ✅ | - ---- - -## Authentication Details - -### API Key Location -The API key must be passed in the `DOLAPIKEY` header: -```bash --H "DOLAPIKEY: 7cxAAO835BF7bXy6DsQ2j2a7nT6ectGY" -``` - -### Permissions -API access is tied to the user's permissions in Dolibarr. Ensure the API user has appropriate rights for the endpoints you wish to access. - ---- - -## Next Steps for MCP Implementation - -Based on this testing, the MCP server should implement: - -1. **Core CRUD Operations** for all confirmed endpoints -2. **Parameter Validation** for limit, sorting, and filtering -3. **Error Handling** for 4xx and 5xx responses -4. **Response Normalization** to handle Dolibarr's response format -5. **Authentication Management** via environment variables -6. **Logging** for debugging and monitoring - -## Additional Endpoints to Test - -These endpoints should be tested in future development: -- `/projects` - Project management -- `/proposals` - Commercial proposals -- `/contracts` - Contract management -- `/categories` - Category management -- `/warehouses` - Inventory management -- `/payments` - Payment tracking -- `/expensereports` - Expense management -- `/documents` - Document management (with proper parameters) \ No newline at end of file diff --git a/Dockerfile b/docker/Dockerfile similarity index 100% rename from Dockerfile rename to docker/Dockerfile diff --git a/docker-compose.yml b/docker/docker-compose.yml similarity index 100% rename from docker-compose.yml rename to docker/docker-compose.yml diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..3e4f957 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,10 @@ +# Documentation + +The Dolibarr MCP repository mirrors the documentation layout of the +`prestashop-mcp` project. Start with the quickstart and branch into specialised +guides as needed: + +- [Quickstart](quickstart.md) – installation and first run instructions for Linux, macOS and Windows +- [Configuration](configuration.md) – environment variables consumed by the server +- [Development](development.md) – running tests, optional Docker assets and contributor workflow +- [API Coverage](api-reference.md) – overview of the Dolibarr REST resources exposed via MCP tools diff --git a/docs/api-reference.md b/docs/api-reference.md new file mode 100644 index 0000000..9a0b19f --- /dev/null +++ b/docs/api-reference.md @@ -0,0 +1,83 @@ +# Dolibarr API Coverage + +This server wraps the Dolibarr REST API v21.0.1 that is exposed by an instance at +`https://db.ginos.cloud/api/index.php`. The MCP tools use the following REST +resources, mirroring the scope that the sibling `prestashop-mcp` project +implements for PrestaShop. + +## Authentication and Conventions + +- **Header** – send the `DOLAPIKEY` header with the personal access token that is + configured for your Dolibarr user. +- **Content Type** – every request uses `application/json` payloads and + responses. +- **Pagination** – list endpoints accept the `limit`, `sortfield`, `sortorder` + and `sqlfilters` query parameters. +- **Identifiers** – Dolibarr returns both `id` (numeric) and `ref` (business + reference) for most entities. The MCP tools expose both values to the client. + +## Supported Resources + +| Resource | Endpoint(s) | Tool group | +| --------------- | --------------------------- | --------------------------------------- | +| Status | `GET /status` | `get_status`, `test_connection` | +| Users | `/users` | CRUD helpers under the *Users* group | +| Third parties | `/thirdparties` | Customer CRUD operations | +| Products | `/products` | Product CRUD operations | +| Invoices | `/invoices` | Invoice CRUD operations | +| Orders | `/orders` | Order CRUD operations | +| Contacts | `/contacts` | Contact CRUD operations | +| Raw passthrough | Any relative path | `dolibarr_raw_api` tool for quick tests | + +Every endpoint supports create, read, update and delete operations unless noted +otherwise. The Dolibarr instance that informed this reference currently contains +live data for users, third parties and contacts; other modules respond with +empty lists until records are created. + +## Response Examples + +### Status + +```json +{ + "success": { + "code": 200, + "dolibarr_version": "21.0.1", + "access_locked": "0" + } +} +``` + +### Third Party + +```json +{ + "id": "1", + "ref": "1", + "name": "Test Customer MCP", + "status": "1", + "address": "123 Test Street", + "zip": "12345", + "town": "Test City", + "email": "test@mcp-dolibarr.com", + "phone": "+1-555-0123", + "date_creation": 1752005684, + "user_creation_id": "4", + "array_options": {} +} +``` + +### Common Error Shape + +```json +{ + "error": { + "code": 404, + "message": "Not found" + } +} +``` + +Dolibarr communicates detailed failure information in the `error` object. The +client wrapper turns these payloads into Python exceptions with the same +metadata so MCP hosts can display friendly error messages. diff --git a/docs/configuration.md b/docs/configuration.md new file mode 100644 index 0000000..5667ec8 --- /dev/null +++ b/docs/configuration.md @@ -0,0 +1,33 @@ +# Configuration + +The Dolibarr MCP server reads configuration from environment variables. Use a +`.env` file during development or configure the variables directly in the MCP +host application that will launch the server. + +| Variable | Description | +| ------------------- | -------------------------------------------------------------- | +| `DOLIBARR_URL` | Base API URL, e.g. `https://your-dolibarr.example.com/api/index.php` | +| `DOLIBARR_API_KEY` | Personal Dolibarr API token assigned to your user | +| `LOG_LEVEL` | Optional logging level (`INFO`, `DEBUG`, `WARNING`, …) | + +## Example `.env` + +```env +DOLIBARR_URL=https://your-dolibarr.example.com/api/index.php +DOLIBARR_API_KEY=your_api_key +LOG_LEVEL=INFO +``` + +The [`Config` class](../src/dolibarr_mcp/config.py) is built with +`pydantic-settings`. It validates the values on load, applies alias support for +legacy variable names and raises a descriptive error if placeholder credentials +are detected. + +## Testing credentials + +Use the CLI helper to verify that the credentials are accepted by Dolibarr +before wiring the server into your MCP host: + +```bash +python -m dolibarr_mcp.cli test --url https://your-dolibarr.example.com/api/index.php --api-key YOUR_KEY +``` diff --git a/docs/development.md b/docs/development.md new file mode 100644 index 0000000..6262687 --- /dev/null +++ b/docs/development.md @@ -0,0 +1,48 @@ +# Development + +This project uses the same lightweight tooling philosophy as `prestashop-mcp`. +The code lives under `src/`, tests under `tests/` and optional Docker assets are +kept separate in `docker/`. + +## Install development dependencies + +```bash +pip install -e '.[dev]' +``` + +### Windows PowerShell + +```powershell +pip install -e .`[dev`] +``` + +## Run the test suite + +```bash +pytest +``` + +To gather coverage metrics: + +```bash +pytest --cov=src/dolibarr_mcp --cov-report=term-missing +``` + +## Formatting and linting + +The project intentionally avoids heavy linting dependencies. Follow the coding +style already present in the repository and run the test-suite before opening a +pull request. + +## Docker tooling + +Container assets live in `docker/`: + +- `Dockerfile` – production-ready image for the MCP server +- `docker-compose.yml` – local stack that spins up Dolibarr together with the MCP server + +Build and run the container locally with: + +```bash +docker compose -f docker/docker-compose.yml up --build +``` diff --git a/docs/quickstart.md b/docs/quickstart.md new file mode 100644 index 0000000..b50e05d --- /dev/null +++ b/docs/quickstart.md @@ -0,0 +1,60 @@ +# Quickstart + +Follow these steps to install and run the Dolibarr MCP server. The process +mirrors the streamlined developer experience of the `prestashop-mcp` project. + +## 1. Clone the repository + +```bash +git clone https://github.com/latinogino/dolibarr-mcp.git +cd dolibarr-mcp +``` + +## 2. Create a virtual environment + +### Linux / macOS + +```bash +python3 -m venv .venv +source .venv/bin/activate +``` + +### Windows (Visual Studio Developer PowerShell) + +```powershell +vsenv +py -3 -m venv .venv +.\.venv\Scripts\Activate.ps1 +``` + +## 3. Install the package + +```bash +pip install -e . +``` + +For development and testing utilities add the optional extras: + +```bash +pip install -e '.[dev]' +``` + +On Windows escape the brackets inside PowerShell: + +```powershell +pip install -e .`[dev`] +``` + +## 4. Configure credentials + +Create a `.env` file in the project root (see [`configuration.md`](configuration.md)) +or export the variables within your MCP host application. + +## 5. Run the server + +```bash +python -m dolibarr_mcp.cli serve +``` + +The command starts the STDIO based MCP server that Claude Desktop and other +clients can communicate with. diff --git a/mcp_server_launcher.py b/mcp_server_launcher.py deleted file mode 100644 index 34edc44..0000000 --- a/mcp_server_launcher.py +++ /dev/null @@ -1,61 +0,0 @@ -#!/usr/bin/env python3 -""" -Fixed Dolibarr MCP Server launcher. -This script ensures the module can be found and launched correctly. -""" - -import sys -import os -import logging -from pathlib import Path - -# Setup logging -logging.basicConfig(level=logging.INFO) -logger = logging.getLogger(__name__) - -def setup_python_path(): - """Add necessary directories to Python path.""" - script_dir = Path(__file__).resolve().parent - - # Try different possible locations - paths_to_try = [ - script_dir, # Current directory - script_dir / 'src', # src subdirectory - script_dir.parent, # Parent directory - script_dir.parent / 'src', # Parent's src subdirectory - ] - - for path in paths_to_try: - if path.exists() and str(path) not in sys.path: - sys.path.insert(0, str(path)) - logger.info(f"Added to Python path: {path}") - - # Also check if we're in a virtual environment - if hasattr(sys, 'real_prefix') or (hasattr(sys, 'base_prefix') and sys.base_prefix != sys.prefix): - logger.info(f"Running in virtual environment: {sys.prefix}") - -def main(): - """Main entry point.""" - setup_python_path() - - try: - # Try to import and run the server - from dolibarr_mcp.dolibarr_mcp_server import main as server_main - logger.info("Successfully imported dolibarr_mcp server") - server_main() - except ImportError as e: - logger.error(f"Failed to import dolibarr_mcp: {e}") - logger.error("Trying alternative import...") - try: - # Try alternative import path - from src.dolibarr_mcp.dolibarr_mcp_server import main as server_main - logger.info("Successfully imported using alternative path") - server_main() - except ImportError as e2: - logger.error(f"Failed with alternative import: {e2}") - logger.error("Please ensure the dolibarr_mcp module is installed correctly.") - logger.error("Try running: pip install -e . from the project root directory") - sys.exit(1) - -if __name__ == "__main__": - main() diff --git a/tests/README.md b/tests/README.md deleted file mode 100644 index ba8a9e6..0000000 --- a/tests/README.md +++ /dev/null @@ -1,61 +0,0 @@ -# Dolibarr MCP Tests - -This directory contains the test suite for the Dolibarr MCP Server. - -## Test Structure - -- `test_config.py` - Configuration and environment tests -- `test_dolibarr_client.py` - API client unit tests -- `test_crud_operations.py` - Complete CRUD integration tests - -## Running Tests - -```bash -# Run all tests -pytest - -# Run with coverage -pytest --cov=src/dolibarr_mcp --cov-report=html - -# Run specific test file -pytest tests/test_config.py - -# Run with verbose output -pytest -v - -# Run specific test -pytest tests/test_config.py::TestConfig::test_env_loading -``` - -## Test Requirements - -All test dependencies are included in the main `requirements.txt`: -- pytest -- pytest-asyncio -- pytest-cov - -## Environment Setup - -Create a `.env` file in the root directory with test credentials: -``` -DOLIBARR_URL=https://test.dolibarr.com -DOLIBARR_API_KEY=test_api_key -LOG_LEVEL=DEBUG -``` - -## Writing Tests - -Follow these patterns for consistency: - -```python -import pytest -from dolibarr_mcp import DolibarrClient - -class TestDolibarrClient: - @pytest.fixture - def client(self): - return DolibarrClient(url="https://test.com", api_key="test") - - def test_example(self, client): - assert client is not None -```