L’essentiel en 30 secondes
- Un serveur MCP placé entre l'assistant IA et Odoo expose quelques outils précis et les traduit en appels à l'API externe d'Odoo.
- Depuis Odoo 19, utilisez l'API JSON-2 (clé d'API en bearer) ; XML-RPC et JSON-RPC sont dépréciés, suppression annoncée pour Odoo 22 (automne 2028).
- Sur Odoo Online, l'API externe exige une formule Custom ; utilisez un utilisateur bot aux droits minimaux et des clés de trois mois au plus.
- Le SDK Python MCP v2 remplace FastMCP par MCPServer ; le serveur d'exemple tient en une cinquantaine de lignes.
Pour qu'un assistant IA (Claude, ChatGPT, Cursor…) interroge Odoo, on place entre les deux un serveur MCP : il expose quelques outils précis à l'assistant et les traduit en appels à l'API externe d'Odoo, avec la clé d'API d'un utilisateur dédié. Depuis Odoo 19, l'API à utiliser est la nouvelle API JSON-2 (POST /json/2/<modèle>/<méthode>, authentification par clé en bearer) ; XML-RPC et JSON-RPC sont dépréciés et leur suppression est annoncée pour Odoo 22, à l'automne 20281.
Prérequis souvent oublié : sur Odoo Online, l'accès aux données par l'API externe n'est disponible qu'avec les formules Custom, pas avec One App Free ni Standard1.
Le Model Context Protocol (MCP) est le standard ouvert lancé par Anthropic pour connecter des modèles de langage à des outils ; il est géré depuis décembre 2025 par l'Agentic AI Foundation, sous l'égide de la Linux Foundation2. Pour ses principes, voir comment fonctionne un serveur MCP ; pour écrire le premier serveur pas à pas, notre tutoriel de création d'un serveur MCP.
Pourquoi connecter Odoo à un assistant IA ?
Un modèle de langage ne connaît pas vos devis, vos stocks ni vos clients. Via MCP, il appelle des outils qui lisent ces données au moment de la question, puis formule la réponse. Pour l'utilisateur, la demande se fait en langage courant, sans rapport à construire ni menu à parcourir :
- « Quels devis sont encore en attente pour ce client, et pour quel montant hors TVA ? »
- « Reste-t-il plus de dix unités de la référence REF-990 en stock ? »
- « Retrouve l'e-mail et le téléphone du responsable des achats de ce client. »
L'assistant ne voit que ce que les outils du serveur MCP lui donnent. S'il n'existe aucun outil d'écriture sur la comptabilité, l'assistant ne peut pas y écrire, quelle que soit la demande.
Comment dialoguent le client IA, le serveur MCP et Odoo ?
| Étape | Ce qui se passe | Protocole |
|---|---|---|
| 1. Question | L'utilisateur pose sa question dans son client IA, qui choisit un outil du serveur MCP | MCP (JSON-RPC 2.0, stdio ou HTTP) |
| 2. Appel à Odoo | Le serveur MCP construit le domaine de recherche et appelle la méthode du modèle Odoo | API JSON-2 d'Odoo (HTTPS, clé d'API en bearer) |
| 3. Réponse | Odoo renvoie les enregistrements en JSON ; le serveur les transmet ; l'assistant rédige la réponse | MCP |
Chaque appel JSON-2 s'exécute dans sa propre transaction SQL : on ne peut pas enchaîner plusieurs appels dans une même transaction. Pour une opération composée (confirmer une commande, par exemple), appelez la méthode métier qui fait tout d'un coup, comme action_confirm sur sale.order, plutôt qu'une suite d'écritures1.
Comment sécuriser l'accès aux données Odoo ?
- Un utilisateur « bot » dédié avec les droits minimaux nécessaires. L'API JSON-2 applique les droits d'accès, les règles d'enregistrement et les droits sur les champs de l'utilisateur : ce que le bot ne peut pas voir dans Odoo, l'assistant ne le verra pas. Odoo recommande ce type de compte pour toute intégration automatisée, avec un mot de passe vide pour désactiver la connexion par identifiant1.
- Une clé d'API à durée courte. Elle se crée dans Préférences > Sécurité du compte > Nouvelle clé d'API, avec une description et une durée ; aucune clé ne peut dépasser trois mois, ce qui impose une rotation au moins trimestrielle. La clé n'est affichée qu'une fois1.
- Des outils en lecture seule tant que le besoin d'écriture n'est pas démontré, et jamais d'outil générique « exécute n'importe quelle méthode ».
- La clé hors du code, en variable d'environnement ou dans un gestionnaire de secrets.
Comment écrire le serveur MCP en Python ?
Le SDK Python officiel du MCP est passé en version 2, alignée sur la spécification du 28 juillet 2026. pip install mcp installe désormais la 2.x, et la classe FastMCP utilisée dans l'ancienne version de cet article s'appelle maintenant MCPServer, importée depuis mcp.server34. L'exemple ci-dessous expose deux outils de lecture et appelle l'API JSON-2 comme dans la documentation d'Odoo1 :
# pip install "mcp[cli]" requests
import os
import requests
from mcp.server import MCPServer
ODOO_URL = os.environ["ODOO_URL"] # ex. https://mycompany.odoo.com
ODOO_DB = os.environ.get("ODOO_DB") # nécessaire si le serveur héberge plusieurs bases
ODOO_API_KEY = os.environ["ODOO_API_KEY"] # clé de l'utilisateur bot
mcp = MCPServer("odoo-lecture")
def odoo(model: str, method: str, **params):
headers = {"Authorization": f"bearer {ODOO_API_KEY}", "User-Agent": "odoo-mcp-connector"}
if ODOO_DB:
headers["X-Odoo-Database"] = ODOO_DB
r = requests.post(f"{ODOO_URL}/json/2/{model}/{method}", headers=headers, json=params, timeout=30)
r.raise_for_status()
return r.json()
@mcp.tool()
def find_customer(name: str) -> list[dict]:
"""Recherche des contacts Odoo par nom ; renvoie nom, e-mail, téléphone et ville."""
return odoo(
"res.partner", "search_read",
domain=[["name", "ilike", name]],
fields=["name", "email", "phone", "city"],
limit=20,
)
@mcp.tool()
def open_quotations(customer_name: str) -> list[dict]:
"""Devis non confirmés (brouillon ou envoyé) d'un client, avec le montant hors taxes."""
return odoo(
"sale.order", "search_read",
domain=[["partner_id.name", "ilike", customer_name], ["state", "in", ["draft", "sent"]]],
fields=["name", "partner_id", "amount_untaxed", "state", "validity_date"],
limit=50,
)
if __name__ == "__main__":
mcp.run()Le docstring de chaque fonction devient la description de l'outil lue par l'assistant, et les annotations de type deviennent son schéma d'entrée4. Testez le serveur dans l'inspecteur MCP avec uv run mcp dev server.py4. Les modèles, champs et méthodes disponibles varient d'une base à l'autre : consultez la page /doc de votre instance1.
Corrections par rapport à l'ancienne version : le script appelait XML-RPC (/xmlrpc/2/common puis execute_kw), désormais déprécié, et contenait une faute qui le faisait échouer à l'exécution (Odoo_USER au lieu de ODOO_USER). Avec JSON-2, plus besoin d'identifiant utilisateur ni de mot de passe : la clé d'API suffit1.
Comment le brancher sur Claude ?
Avec Claude Code, en passant les variables d'environnement au serveur5 :
claude mcp add --env ODOO_URL=https://mycompany.odoo.com --env ODOO_API_KEY=... \
--transport stdio odoo -- python /chemin/vers/server.pyPour une équipe, le même serveur peut tourner en HTTP (mcp.run(transport="streamable-http")) sur un serveur interne4 ; il faut alors ajouter une authentification devant, puisque quiconque atteint l'URL utilise la clé du bot. Des modules MCP pour Odoo 19 existent aussi sur l'Odoo Apps Store ; ce sont des modules tiers, dont le code et les droits demandés doivent être relus avant installation.
Pour concevoir un connecteur Odoo sur mesure, avec les garde-fous adaptés à vos équipes, voir notre offre d'intégration de l'IA dans vos outils. Sur les usages de ces agents en entreprise, lire aussi MCP en marketing : serveurs et cas d'usage et la sécurité des outils MCP.






Commentaires
Chaque commentaire est relu avant publication, en général sous 24 h ouvrées. Les liens promotionnels ne sont pas publiés.
Aucun commentaire pour l’instant. Une question sur l’article ? Posez-la ci-dessous.