- Prérequis
- Installation
- Connecter un client
- Permissions et authentification
- Outils disponibles
- Accès SQL en lecture seule
- Activité, quota et alertes
- Dépannage
- Limites connues
- FAQ
emMCP — Serveur MCP pour Dolibarr
emMCP installe un serveur MCP (Model Context Protocol) directement dans Dolibarr. Un client compatible — Claude.ai, Claude Code ou un client MCP HTTP personnalisé — peut alors interroger et manipuler vos données Dolibarr (tiers, factures, produits, stocks, environnement…) en langage naturel.
Le principe central : pour les outils métier standards, emMCP n'introduit aucun droit nouveau. Chaque appel s'authentifie comme un utilisateur Dolibarr réel (clé API ou OAuth 2.1) et passe par l'API REST de Dolibarr, qui applique les droits existants de cet utilisateur. Seul l'outil de requête SQL fait exception : c'est un droit Dolibarr dédié, distinct, qui n'existe pas dans un Dolibarr standard (voir la section dédiée plus bas).
Confidentialité : emMCP tourne sur votre serveur, mais son rôle est de transmettre les données demandées au client IA connecté (claude.ai, Claude Code, ou un autre). Ces données quittent donc Dolibarr vers le fournisseur IA choisi, selon les conditions de ce fournisseur — héberger le module chez vous ne garantit pas que les données restent exclusivement dans Dolibarr, c'est le principe même du protocole MCP.

Prérequis
| Élément | Version minimum |
|---|---|
| Dolibarr | Version récente |
| PHP | PHP ≥ 8.1 |
| Module API REST Dolibarr | Actif (requis) |
| Connexion | HTTPS obligatoire |
| Base de données | MySQL ou MariaDB pour l'outil SQL (voir plus bas) |
emMCP est un module autonome : il embarque ses propres dépendances (serveur MCP, gestion OAuth, moteur SQL). Aucune installation préalable d'un autre module E-dem n'est nécessaire.
Note : le module API REST natif de Dolibarr doit être activé — emMCP l'utilise pour exécuter les actions avec les permissions de l'utilisateur authentifié.
Installation
Depuis le DoliStore
- Rendez-vous sur le DoliStore et recherchez emMCP
- Achetez le module et téléchargez l'archive ZIP
- Décompressez l'archive dans le dossier
htdocs/custom/de votre installation Dolibarr - Le dossier final doit être
htdocs/custom/emmcp/
Activation
- Connectez-vous à Dolibarr en tant qu'administrateur
- Allez dans Accueil → Configuration → Modules/Applications
- Recherchez « emMCP » et cliquez sur Activer
- Assurez-vous que le module API REST de Dolibarr est également actif
Un nouveau menu de configuration emMCP apparaît, avec quatre onglets : Paramètres, Accès SQL MCP, Activité MCP, À propos.
Mettre à jour le module
Sauvegardez la base de données Dolibarr et le dossier actuel du module avant de remplacer les fichiers ; testez la mise à jour sur une instance hors production si possible.
- Téléchargez la nouvelle version depuis le DoliStore
- Remplacez les fichiers dans
htdocs/custom/emmcp/(ou décompressez par-dessus l'installation existante) - Retournez sur la page de configuration emMCP et vérifiez les onglets SQL et Activité pour appliquer les éventuelles mises à jour de leurs tables
- Vos réglages (SQL, journalisation, quota, alertes) et vos utilisateurs autorisés sont conservés
Reconnecter un client après changement d'URL ou de clé
Si vous changez de domaine, régénérez une clé API, ou recréez un connecteur claude.ai :
- Claude.ai : supprimez l'ancien connecteur personnalisé et recréez-le avec la nouvelle URL — le consentement OAuth est à redonner
- Claude Code : supprimez l'ancienne entrée avec
claude mcp remove dolibarr, puis relancez la commandeclaude mcp addci-dessous avec la nouvelle URL et/ou clé API, dans le même périmètre de configuration qu'auparavant - Client générique : mettez à jour
urlet/ouheaders.Authorizationdans votremcp.json
Connecter un client
L'onglet Paramètres affiche l'URL de votre serveur MCP et génère, pour chaque type de client, la commande ou le fichier prêt à copier.
Claude.ai (connecteur personnalisé — recommandé)
- Dans claude.ai : Paramètres → Connecteurs → « Ajouter un connecteur personnalisé »
- Collez l'URL du connecteur affichée dans la page de configuration emMCP (
https://votre-dolibarr/custom/emmcp/mcp.php) - Claude découvre automatiquement l'authentification OAuth 2.1, vous redirige vers votre Dolibarr pour vous connecter, et vous demande votre consentement — aucune clé à copier
Claude Code
Authentification par clé API Dolibarr, en en-tête Authorization: Bearer (recommandé) ou DOLAPIKEY.
claude mcp add dolibarr --transport http https://votre-dolibarr/custom/emmcp/mcp.php \
--header "Authorization: Bearer VOTRE_CLE_API"
Client MCP générique (mcp.json)
Pour tout client MCP supportant le transport HTTP :
{
"mcpServers": {
"dolibarr": {
"type": "http",
"url": "https://votre-dolibarr/custom/emmcp/mcp.php",
"headers": {
"Authorization": "Bearer VOTRE_CLE_API"
}
}
}
}
Obtenir une clé API
La clé API d'un utilisateur se génère depuis sa fiche : Utilisateurs & Groupes → fiche utilisateur → onglet « Clé pour API ». L'utilisateur doit avoir les permissions Dolibarr adaptées aux actions attendues de l'agent, puisque l'agent agit avec ses droits.
Remplacez
VOTRE_CLE_APIpar la clé réelle générée pour l'utilisateur concerné. Ne partagez jamais cette clé et ne la publiez jamais dans un dépôt de code.
Permissions et authentification
emMCP ne crée aucun compte technique séparé. Il s'appuie entièrement sur l'authentification et les droits Dolibarr existants.
Méthodes d'authentification
| Méthode | Usage |
|---|---|
Clé API Dolibarr (Authorization: Bearer ou DOLAPIKEY) |
Claude Code, clients MCP génériques, scripts |
| OAuth 2.1 avec PKCE obligatoire (S256) | Claude.ai et connecteurs équivalents |
L'implémentation OAuth est conforme aux RFC 9728 (Protected Resource Metadata), 8414 (Authorization Server Metadata) et 7591 (Dynamic Client Registration). Les jetons d'accès sont courts (1 heure), les jetons de rafraîchissement (30 jours) sont automatiquement remplacés à chaque rafraîchissement (rotation), et tous les jetons sont stockés uniquement sous forme de hachage — jamais en clair.
Permissions effectives
Il n'existe aucun rôle « agent IA » dans Dolibarr : chaque outil métier standard s'exécute avec exactement les droits de l'utilisateur Dolibarr authentifié, via l'API REST native. Ces outils apparaissent dans la liste proposée à l'agent quel que soit votre droit réel sur l'objet visé — c'est Dolibarr, via l'API REST, qui refuse l'exécution si le droit manque (l'outil est visible, l'action est refusée). Seul l'outil de requête SQL est structurellement masqué tant que ses quatre conditions ne sont pas réunies (voir plus bas) : c'est la seule vraie différence entre « outil invisible » et « outil visible mais refusé à l'exécution ».
Pour réduire la surface d'action d'un agent, la meilleure pratique reste de lui dédier un utilisateur Dolibarr à droits restreints (principe du moindre privilège), en s'appuyant sur les permissions Dolibarr fines par objet (lecture seule sur certains modules, pas de droit de suppression, etc.) plutôt que de connecter un compte administrateur.
Révoquer un accès
Il n'existe pas de droit générique « accès emMCP » à retirer : les outils métier standards suivent simplement les droits Dolibarr habituels de l'utilisateur. La révocation dépend donc du mode de connexion :
- Client par clé API (Claude Code, client générique) : régénérez la clé API de l'utilisateur Dolibarr concerné (fiche utilisateur → onglet « Clé pour API »). Cela coupe immédiatement l'accès de ce client.
- Connecteur OAuth (claude.ai) : régénérer la clé API ne suffit pas — le jeton d'accès OAuth (1 heure) se renouvelle automatiquement via son jeton de rafraîchissement, indépendamment de la clé API ; l'expiration n'équivaut pas à une révocation. Pour couper l'accès immédiatement, désactivez l'utilisateur Dolibarr associé ou désactivez le module emMCP.
Il n'y a pas de bouton self-service pour révoquer un jeton OAuth précis dans cette version. Pour un besoin de révocation ciblée au-delà de ce que permet la désactivation d'un utilisateur ou du module, contactez le support E-dem.
Droit dédié SQL : le droit « Accès SQL MCP » (
emmcp->sqlquery->read), lui, est un vrai droit Dolibarr qui se retire normalement depuis la fiche utilisateur, en plus de son opt-in — voir la section SQL ci-dessous.
Outils disponibles
emMCP expose un ensemble d'outils MCP qui couvrent la majorité de l'API REST de Dolibarr. Ils apparaissent tous dans la liste proposée à l'agent ; c'est l'API REST de Dolibarr qui refuse l'exécution si le droit de l'utilisateur manque.
| Famille | Outils | Rôle |
|---|---|---|
| Lecture | dolibarr_list, dolibarr_get, dolibarr_get_contacts |
Lister, récupérer un enregistrement, lister les contacts liés |
| Écriture | dolibarr_create, dolibarr_create_from, dolibarr_update, dolibarr_delete |
Créer, créer à partir d'un autre objet (ex. devis → facture), modifier, supprimer |
| Lignes & temps | dolibarr_add_line, dolibarr_add_time_spent |
Ajouter une ligne à un document, saisir du temps passé |
| Workflow | dolibarr_action |
Déclencher une action métier (ex. valider un document) |
| Contacts | dolibarr_link_contact |
Lier un contact à un objet |
| Champs complémentaires | dolibarr_extrafield_update, dolibarr_extrafield_delete |
Gérer les extrafields d'un objet |
| Documents | dolibarr_documents_list, dolibarr_documents_upload, dolibarr_documents_download, dolibarr_documents_delete, dolibarr_documents_builddoc |
Gérer les fichiers attachés et générer un document (ex. PDF) |
| Fichiers | dolibarr_files_create |
Créer un fichier générique |
| Diagnostic | dolibarr_environment, dolibarr_api_explorer |
Informations sur l'instance connectée ; explorer les endpoints REST disponibles |
| SQL | dolibarr_sql_query, dolibarr_sql_schema |
Requête et schéma SQL en lecture seule — masqués tant que les 4 conditions ne sont pas réunies, voir ci-dessous |
Exemple : workflow prudent avant une action qui modifie des données
Les outils d'écriture (dolibarr_create, dolibarr_update, dolibarr_delete, dolibarr_action pour une validation…) agissent réellement sur votre Dolibarr. Bonne pratique recommandée pour ces cas :
- Demandez d'abord à l'agent de lister ou récupérer l'enregistrement concerné (
dolibarr_list/dolibarr_get) et d'afficher ce qu'il compte modifier - Validez vous-même que c'est bien l'enregistrement attendu
- Demandez explicitement l'action d'écriture, plutôt que de lui laisser un mandat large et implicite (« occupe-toi de mes factures »)
Ceci relève de l'usage du client IA (Claude.ai, Claude Code) plutôt que d'un réglage emMCP : le module applique les droits Dolibarr, mais ne peut pas savoir si une demande formulée en langage naturel est ambiguë.
Accès SQL en lecture seule
Au-delà des outils métier standards, emMCP peut exposer un outil de requête SQL en lecture seule. Ce n'est pas un droit métier Dolibarr ordinaire : accorder cet accès donne une lecture large de la base de données, bien au-delà des permissions métier habituelles (marges, salaires, tous les tiers sans restriction commerciale). Dolibarr affiche lui-même cet avertissement dans la page de configuration.

Les quatre conditions
L'outil SQL reste invisible pour l'agent tant que les quatre conditions suivantes ne sont pas toutes réunies :
- Interrupteur global activé dans la configuration du module (désactivé par défaut)
- Droit Dolibarr dédié accordé à l'utilisateur (« Accès SQL MCP », onglet Permissions de sa fiche)
- Opt-in individuel coché nominativement pour l'utilisateur dans la page de configuration — le droit seul ne suffit pas
- Absence de blocage Multicompany : en environnement multi-société, l'accès est refusé par défaut (une requête SQL brute ne peut pas être filtrée de façon fiable par entité), sauf activation explicite du support multi-entité
Ce qui protège la requête elle-même
- Une seule instruction
SELECTouWITHpar appel, sur la connexion Dolibarr existante — aucun compte MySQL séparé n'est requis ni créé. Les requêtes utilisent les identifiants Dolibarr eux-mêmes, sur une session mysqli distincte. - Chaque requête est analysée par un lexeur et un analyseur syntaxique qui refusent toute requête qui n'est pas structurellement un SELECT (un mot comme « UPDATE » présent dans une valeur texte recherchée reste autorisé : ce n'est pas une écriture, seule la structure de la requête compte).
- Plafonds par défaut : 200 lignes (maximum configurable 5000) et 256 Kio de taille de réponse (maximum 4 Mio), appliqués par le module lui-même en lisant les résultats en flux, sans les charger entièrement en mémoire ; 5 secondes de délai maximum (maximum 30) et transaction en lecture seule, eux appliqués par la session MySQL/MariaDB elle-même.
- Colonnes sensibles refusées nommément : mots de passe, clés API, jetons, secrets (
pass,pass_crypted,api_key,token,client_secret,refresh_token,secret,private_key…), ainsi que tout nom de colonne contenant un fragment sensible (password,token,secret,credential…). SELECT *n'est pas interdit en bloc : il est résolu colonne par colonne, et refusé nommément seulement s'il exposerait une colonne sensible.- Fonctions à risque bloquées :
sleep,benchmark,get_lock,release_lock,load_file,sys_exec,sys_eval, etc. - Tables techniques exclues : tables de session, de jetons OAuth, d'audit et de permissions des modules emMCP (et, le cas échéant, d'autres modules E-dem partageant la base) sont explicitement hors périmètre.
- Chaque requête est journalisée avec ses métadonnées (utilisateur, durée, nombre de lignes, statut) ; les résultats ne sont jamais enregistrés. Le texte de la requête peut lui-même être réduit à une empreinte SHA-256 si votre politique de confidentialité l'exige (case « Ne journaliser que l'empreinte des requêtes »).
Exemple de requête acceptée
SELECT rowid, ref, total_ttc, datef
FROM llx_facture
WHERE fk_statut = 1
ORDER BY datef DESC
LIMIT 20
Une requête nommant explicitement ses colonnes comme ci-dessus est plus lisible à auditer dans le journal qu'un SELECT *, même si ce dernier reste autorisé quand aucune colonne sensible n'est exposée.
Limites honnêtes
⚠️ Cet outil est réservé à MySQL/MariaDB — PostgreSQL n'est pas supporté pour l'outil SQL. C'est un garde-fou de volume et de périmètre, pas une garantie absolue contre tout risque : gardez-le désactivé si vous n'en avez pas l'usage, et n'accordez le droit et l'opt-in qu'à des utilisateurs qui ont déjà, sur le plan organisationnel, le droit de consulter l'intégralité de ces données.
Activité, quota et alertes

L'onglet Activité MCP trace les appels reçus par le serveur MCP externe : qui a appelé quel outil, quand, et avec quel résultat.
Réglages disponibles (avec leurs valeurs par défaut)
| Réglage | Défaut | Effet |
|---|---|---|
| Journaliser les appels MCP | Activé | Sans journal, aucune trace de ce qu'un agent a consulté |
| Enregistrer les paramètres des appels | Activé | Les paramètres indiquent quelles données ont été demandées ; peuvent contenir des données personnelles — désactivable séparément pour la confidentialité (les résultats, eux, ne sont jamais enregistrés) |
| Conservation du journal | 90 jours | Au-delà, les lignes sont supprimées lors de la purge |
| Limite d'appels par utilisateur | 0 (désactivée), fenêtre de 60 minutes | Nombre maximum d'appels d'outils autorisés sur la période glissante ; 0 désactive la limite |
| Seuil d'alerte | 0 (désactivé) | Envoie un courriel à l'administrateur quand un utilisateur atteint ce nombre d'appels sur la période |
| Délai entre deux alertes (cooldown) | 720 minutes (12h) | Pour un même utilisateur, évite qu'une session intensive ne déclenche des dizaines de courriels |
Un bouton « Purger selon la conservation » permet de déclencher manuellement la suppression des entrées au-delà de la durée configurée.
À savoir sur le quota
Le quota ne compte que les outils réellement exécutés (tools/call avec succès) : la connexion (initialize) et la liste des outils disponibles (tools/list) ne consomment rien du quota. Un échec de comptage en base est volontairement fail-open (n'échoue pas la requête) : ce mécanisme est un garde-fou de volume, pas une garantie de sécurité anti-exfiltration.
Important : pour garder un quota ou une alerte utiles, laissez la journalisation globale activée — la désactiver arrête aussi les compteurs de quota et d'alerte. Désactivez uniquement l'enregistrement des paramètres si votre politique de confidentialité l'exige.

Le tableau « 100 derniers appels » est filtrable par utilisateur et par outil, et affiche la date, l'utilisateur, la méthode MCP, l'outil appelé, la durée et l'état (succès, refus, erreur).
Dépannage
Erreur 401 juste après le consentement OAuth
C'est le problème le plus fréquent, généralement dû à l'en-tête HTTP Authorization non transmis par défaut sous Apache en mode CGI/FPM (mod_php classique n'est pas concerné), ou à un reverse proxy HTTPS devant votre serveur qui le filtre. Le module inclut des règles .htaccess (RewriteRule et SetEnvIfNoCase pour réexposer HTTP_AUTHORIZATION / REDIRECT_HTTP_AUTHORIZATION), mais le .htaccess ne fonctionne que là où l'hébergeur l'autorise — ce n'est pas garanti sur tous les hébergements. Si l'erreur persiste :
- Vérifiez que le
.htaccessdu module est bien pris en compte (AllowOverridedoit être autorisé sur le dossiercustom/emmcp/— certains hébergements mutualisés le désactivent) - Si vous gérez vous-même le vhost Apache,
CGIPassAuth Onest le correctif le plus robuste, au niveau serveur — à ajouter dans le bloc<VirtualHost>ou<Directory>concerné :
Sur un hébergement mutualisé, demandez à votre hébergeur/administrateur de l'activer si vous ne pouvez pas éditer le vhost vous-même.<Directory "/chemin/vers/dolibarr/htdocs/custom/emmcp"> CGIPassAuth On </Directory> - Sous Nginx + PHP-FPM, ajoutez
fastcgi_param HTTP_AUTHORIZATION $http_authorization;à votre configuration si nécessaire - Derrière un reverse proxy HTTPS ou un load balancer, vérifiez qu'il transmet explicitement l'en-tête
Authorizationde bout en bout — certains proxies le filtrent par défaut - Sous Apache en mode
mod_php, ce problème ne se produit normalement pas
Le connecteur claude.ai ne trouve pas la configuration OAuth
Vérifiez que l'URL du connecteur pointe bien vers mcp.php (pas vers une autre page), et que votre Dolibarr est bien accessible en HTTPS avec un certificat valide — HTTPS est obligatoire, pas optionnel.
Les outils SQL n'apparaissent pas pour un utilisateur
Rappel des quatre conditions : interrupteur global, droit Dolibarr, opt-in individuel, absence de blocage Multicompany. Il suffit qu'une seule condition manque pour que l'outil reste invisible — vérifiez les quatre dans l'ordre.
Un appel est refusé alors que l'utilisateur semble avoir les droits
Consultez le journal d'activité (onglet Activité MCP) : la colonne État indique si l'appel a réussi, a été refusé, ou a échoué. Un refus d'outil SQL peut venir d'une colonne sensible détectée, d'une syntaxe non-SELECT, ou d'un dépassement de plafond (lignes/temps/taille).
Le quota semble se déclencher trop vite (ou jamais)
Vérifiez que la journalisation globale est bien activée : la désactiver arrête aussi le comptage du quota et des alertes, même si la limite est configurée à une valeur non nulle.
Limites connues
- L'outil de requête SQL directe est réservé à MySQL/MariaDB — PostgreSQL n'est pas supporté pour cet outil (les autres outils, basés sur l'API REST Dolibarr, ne sont pas concernés par cette limite du moteur SQL).
- Pas de bouton de révocation OAuth ciblée : régénérez la clé pour un client authentifié par clé API ; pour bloquer immédiatement un connecteur OAuth, désactivez l'utilisateur associé ou le module. La rotation de la clé API ne révoque pas les jetons OAuth.
- Les garde-fous SQL (plafonds, colonnes refusées, gates) réduisent le risque mais ne constituent pas une garantie absolue : n'accordez cet accès qu'à des utilisateurs qui ont déjà, organisationnellement, le droit de voir l'intégralité de ces données.
FAQ
Avec quels clients emMCP fonctionne-t-il ?
Claude.ai (connecteur personnalisé avec OAuth 2.1), Claude Code (authentification par clé API), et tout client MCP compatible avec le transport HTTP (Streamable).
emMCP dépend-il du module Dalfred ?
Non. emMCP est un module autonome, livré avec ses propres dépendances (serveur MCP, gestion OAuth, moteur SQL). Aucune installation préalable d'un autre module E-dem n'est nécessaire.
Quelles permissions l'agent obtient-il sur mes données ?
Pour les outils métier standards, celles de l'utilisateur Dolibarr utilisé pour la connexion, appliquées par l'API REST. L'accès SQL optionnel est une exception : son droit dédié et son opt-in autorisent une lecture plus large, sans les restrictions métier habituelles. Ne l'accordez qu'à des utilisateurs habilités à consulter ces données.
L'accès SQL est-il activé par défaut ?
Non. Il est désactivé par défaut et nécessite un interrupteur global, un droit Dolibarr dédié, un opt-in individuel par utilisateur, et l'absence de blocage Multicompany — les quatre conditions doivent être réunies.
Que couvre le prix affiché sur le DoliStore ?
L'achat du module (15,00 € HT) inclut 1 an de mises à jour et de téléchargements depuis le DoliStore.
Mes données restent-elles dans Dolibarr ?
Non, pas exclusivement. emMCP tourne bien sur votre serveur, mais son rôle est justement de transmettre les données demandées au client IA connecté (claude.ai, Claude Code, ou un autre) pour qu'il puisse répondre. Ces données quittent donc Dolibarr vers le fournisseur IA choisi, selon les conditions de ce fournisseur — ce n'est pas propre à emMCP, c'est le principe même du protocole MCP.
Où trouver de l'aide ?
- Support E-dem : Contactez-nous pour toute question technique
- Documentation MCP : modelcontextprotocol.io pour les spécifications du protocole
- Voir aussi : Dalfred, notre agent IA intégré à Dolibarr avec sa propre interface conversationnelle et son propre accès MCP