augmenter.PRO
Tous les articles
IA/11 min de lecture

Claude Code et Odoo : le workflow technique pour piloter votre ERP sans module Python

Votre Odoo est en SaaS, votre intégrateur dit « impossible », et chaque micro-modification prend trois semaines. Voici, code à l'appui, comment Claude Code lit, modifie et vérifie un Odoo Online depuis le terminal : RPC, Playwright, CLAUDE.md, puis serveur MCP avec garde-fous.

Claude Code et Odoo : le workflow technique pour piloter votre ERP sans module Python

Vous avez payé un abonnement Odoo Online. Vous avez demandé une colonne de plus dans une liste, un champ qui affiche le stock entrant, une vue qui trie autrement. Et vous avez entendu la phrase qui coûte le plus cher dans la vie d'un ERP : « ce n'est pas possible sur votre version ». Cet article montre, code à l'appui, ce qui est réellement possible depuis Claude Code, ce qui ne l'est pas, et à quel moment il faut arrêter de cliquer pour passer à un serveur MCP.

Votre Odoo est en SaaS, et chaque modification passe par quelqu'un d'autre

Le problème n'est pas Odoo, c'est la file d'attente devant Odoo. Sur une instance Online, votre prestataire a raison sur un point : aucun module Python personnalisé ne s'installe. La plateforme le refuse, sans négociation. À partir de là, deux lectures s'affrontent. La première, celle de l'intégrateur pressé : « donc rien n'est possible, il faut migrer sur Odoo.sh ». La seconde, celle que nous avons éprouvée pendant plusieurs mois chez une PME de négoce technique en Île-de-France : quatre portes restent ouvertes, et elles couvrent l'essentiel de ce qu'un dirigeant demande.

Ce qui vous coûte, ce ne sont pas les gros chantiers. Ce sont les dizaines de retouches de quinze minutes qui deviennent chacune un ticket, un devis, une attente. Dans notre expérience, c'est là que se joue la dépendance : pas sur l'installation, sur la vie d'après. Le workflow qui suit a été conçu pour cette vie d'après.

Ce qu'Odoo Online autorise vraiment : quatre portes, pas zéro

Odoo Online interdit le code Python dans des modèles, mais autorise quatre mécanismes qui suffisent à la plupart des personnalisations d'une PME. Voici la grille que nous appliquons avant de dire « impossible » ; le détail de chaque contournement, et le cas où la migration vers Odoo.sh se justifie quand même, est dans Odoo Online : ce que vous ne pourrez jamais y installer. Une condition préalable : Studio et l'API externe, donc tout ce workflow par RPC, ne sont ouverts que sur le plan Custom (44,90 € par utilisateur et par mois en annuel, contre 24,90 € en Standard).

PorteCe qu'elle permetSa limite
StudioChamps, vues, automatisations, par l'interfaceClics uniquement, difficile à tracer et à annuler en lot
Actions serveurDu Python inline, exécuté dans un bac à sablePas de nouveau modèle, pas d'import de bibliothèque
Modules « data-only »JS, XML, SCSS importés en ZIP : patcher un widget, ajouter du styleAucun fichier Python dans models/
RPCLire et écrire tout ce que l'interface sait faire, depuis un scriptAgit avec les droits de l'utilisateur connecté, donc à encadrer

Le workflow en cinq étapes : Claude Code au clavier, Odoo dans le navigateur

Le principe tient en une phrase : Claude Code pilote un navigateur déjà connecté à Odoo, et parle au serveur par le même canal que l'interface. Il n'y a pas de clé d'API à créer, pas de module à installer, et tout ce que vous voyez à l'écran, Claude le voit aussi.

1. Un CLAUDE.md qui dit à Claude où il met les pieds

Avant la première commande, un fichier de contexte à la racine du projet. Il tient en vingt lignes et évite les trois erreurs qui reviennent : se tromper de version, croire qu'un module Python s'installera, et modifier sans prévoir le retour arrière. Si vous n'avez jamais écrit ce fichier, notre guide du CLAUDE.md et des Skills pose la structure complète.

# CLAUDE.md — projet Odoo <client>

## Instance
- Odoo 19.0, édition Online (SaaS) : AUCUN module Python custom
- URL : https://<instance>.odoo.com — session ouverte dans Playwright
- Mode debug : ajouter ?debug=1 à l'URL

## Ce qui est autorisé
- Studio, actions serveur (sandbox), modules data-only (JS/XML/SCSS), RPC call_kw

## Règles
- Toute écriture est précédée d'une lecture (fields_get, search_read)
- Chaque chantier livre un rollback() : ids créés, valeurs d'avant
- Données manquantes : on fait remplir l'équipe, on ne reconstruit pas
- Jamais de modification de prix, de coût ou de stock par script

2. Lire avant d'écrire : l'introspection par RPC

Toutes les opérations passent par le point d'accès /web/dataset/call_kw, appelé en fetch() depuis la page Odoo ouverte. Première commande, toujours : lister les champs du modèle visé, avec leur type et leur caractère stocké ou calculé. Ce détail décide de la suite, on y revient dans les pièges.

// Exécuté par Claude Code via browser_evaluate (Playwright MCP)
() => fetch('/web/dataset/call_kw', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    jsonrpc: '2.0', method: 'call', id: 1,
    params: {
      model: 'sale.order.line',
      method: 'fields_get',
      args: [],
      kwargs: { attributes: ['string', 'type', 'store', 'related'] },
    },
  }),
}).then(r => r.json()).then(d => JSON.stringify(d.result, null, 2))

3. Créer un champ « related » sans Studio

Le cas le plus demandé par un dirigeant : voir une information qui existe déjà ailleurs dans Odoo, mais pas dans l'écran où il travaille. Un champ related fait exactement cela, et sa création par RPC produit le même enregistrement que Studio, en traçable.

params: {
  model: 'ir.model.fields',
  method: 'create',
  args: [{
    model_id: 793,                       // id de sale.order.line (lu via ir.model)
    name: 'x_incoming_qty',
    field_description: 'Stock entrant',
    ttype: 'float',
    related: 'product_id.incoming_qty',
    readonly: true,
    store: false,
  }],
  kwargs: {},
}
// La réponse est l'id du champ créé : on le note pour le rollback.

4. Poser le champ dans la vue

Un champ créé n'est visible nulle part tant qu'une vue ne le porte pas. On lit l'architecture XML de la vue cible avec ir.ui.view / read, Claude insère la colonne au bon endroit, puis on réécrit l'architecture avec ir.ui.view / write. L'ancienne version est conservée dans le projet : c'est elle qu'on remettra en cas de retour arrière.

5. Vérifier, puis livrer le rollback avec le chantier

La vérification ne se fait pas à l'œil : Claude relit le champ et la vue par RPC, ouvre l'écran dans le navigateur et compare. Puis il écrit la fonction de retour arrière avant même de clôturer le ticket. C'est la règle qui a le plus rassuré le dirigeant chez qui nous avons travaillé : rien de natif n'est modifié, et chaque ajout sait se supprimer proprement. La version prête à l'emploi de ces règles est dans notre skill Odoo pour Claude, à déposer dans votre projet.

Les pièges qu'on a payés pour vous

Chacun de ces pièges nous a coûté entre une heure et une demi-journée. Ils ne figurent dans aucune documentation officielle sous cette forme.

  • Un champ calculé non stocké ne se filtre pas. Il se lit dans un search_read, il s'affiche dans une liste, il colore une ligne. Mais il casse tout filtre de recherche ou domaine qui l'utilise. Vérifier store dans fields_get avant de promettre un filtre.
  • Un ZIP créé sous Windows ne s'importe pas. Compress-Archive écrit des antislashs dans les chemins, Odoo attend des barres obliques. Créer l'archive en Python avec des chemins normalisés, ou l'import échoue sans message utile.
  • « Force init » à la mise à jour efface des données. À cocher à la première installation d'un module data-only, jamais à une mise à jour : les enregistrements marqués noupdate seraient réinitialisés.
  • Odoo 19 a changé le Kanban. Le gabarit kanban-box a disparu ; un widget qui l'utilise encore ne rend rien. Il faut <t t-name="card">.
  • Claude ne peut pas téléverser un fichier. Sur Odoo Online, Playwright n'ouvre pas le sélecteur de fichiers et l'injection par script est bloquée par le composant OWL. L'import du ZIP reste un geste humain, et c'est très bien ainsi.

Serveur MCP : quand Claude ne doit plus cliquer, mais appeler des outils

Le workflow précédent sert à configurer Odoo. Il ne sert pas à faire travailler un agent au quotidien avec vos données : un agent qui répond à l'équipe au comptoir n'a pas à piloter un navigateur, il appelle des outils. C'est le rôle d'un serveur MCP, et le sujet vient de changer d'échelle.

Ce qu'Odoo 20 apporte tout seul

Odoo 20, présenté fin septembre 2026, embarque un serveur MCP natif : un module ai_mcp, un point d'accès /mcp sur votre base, une clé d'API à portée « MCP » ou OAuth 2.1, et des outils qui agissent avec les droits de l'utilisateur ayant fourni la clé. Dans la pré-version documentée par des tiers, ces outils sont génériques et en lecture : modèles, champs, recherche, regroupement. Source : notes de version d'Odoo 20. Ce que cela change pour une PME, et ce qui manque encore, est traité à part dans Odoo 20 et son serveur MCP : ce qui change, ce qui manque.

Un détail de budget à garder en tête : avec Odoo 20, les fonctions d'IA intégrées se paient en crédits, 1 € pièce sur le catalogue officiel, sans que la consommation par question soit publiée. Un serveur MCP externe choisit son modèle. Un modèle ouvert sur une machine équipée d'une bonne carte graphique, administrée à distance, répond pour zéro euro à la question : crédits, abonnements ou une machine à vous.

Ce qu'un serveur MCP métier ajoute par-dessus

Un serveur MCP générique donne au modèle le schéma d'Odoo et le laisse se débrouiller. C'est puissant, et c'est précisément ce que nous refusons de donner à un agent qui parle à vos clients. Depuis août 2026 nous construisons, pour un pilote, un serveur MCP écrit en Python avec le SDK officiel, qui parle à Odoo 19 par son API JSON-2 sans une ligne de Python dans Odoo, donc compatible Online. Trois choix le distinguent d'un tuyau générique.

  • Des outils par intention, pas par objet. « La fiche de ce produit » rend en un appel le stock libre, la prochaine réception datée, le prix de ce client et les modèles proches. Une question du comptoir coûte un appel, pas cinq, et l'assemblage des données vit dans du code testé, pas dans le raisonnement du modèle.
  • Des garde-fous dans le code, pas dans le prompt. Aucun outil n'a de paramètre prix, coût ou validation de commande, et un test automatisé compare le schéma de tous les outils pour s'en assurer à chaque build. L'écriture s'arrête au brouillon de devis : c'est un humain qui appuie sur le bouton. Pourquoi une consigne dans le prompt ne suffit pas : l'agent IA qui ne peut pas toucher aux prix.
  • Un vérificateur de chiffres. Le modèle reçoit 37,73 € de l'outil et peut écrire 35 € au client. Un nombre cité dans la réponse qu'aucun outil n'a rendu est repéré par du code, d'abord en observation, puis en blocage.

Un agent qui ne peut pas changer un prix, même si on le lui demande gentiment.

Le tout tient grâce à une discipline chiffrée : 5 794 tests automatisés au vert au 14 octobre 2026, onze décisions d'architecture écrites avec leurs options rejetées, et chaque capacité vérifiée en direct puis recoupée dans Odoo au centime. Ce serveur, une boucle d'agents l'a construit tâche par tâche, avec un juge à chaque tâche et un humain sur ce qui ne se délègue pas : construire un logiciel avec des agents en dix semaines. Le serveur MCP natif d'Odoo 20 pourra devenir, demain, une des façons dont ces outils parlent à Odoo. La valeur n'est pas le tuyau, c'est ce qui passe dedans. Ce que ce serveur ajoute à Odoo 20, point par point : notre page serveur MCP pour Odoo. Choisir entre coder, louer ou héberger, c'est le point de départ de notre intégration MCP pour PME.

Quand ce workflow n'est pas le bon

Trois situations où nous déconseillons ce qui précède, parce que nous l'avons vu échouer ou coûter plus qu'il ne rapporte.

  • Vous êtes sur Odoo.sh ou en Community. Un module Python classique, versionné dans Git, est la bonne voie. Le détour par RPC et les modules data-only est une réponse à la contrainte Online, pas une doctrine.
  • Personne dans l'équipe ne sait lire un JSON. Le workflow suppose quelqu'un, vous ou un collaborateur, capable de relire ce que Claude a fait. Sans ce regard, Studio reste préférable : moins puissant, mais lisible par tous.
  • Vos données ne sont pas tenues. Des emplacements de stock vides, des produits sans coût d'achat, des contacts mal typés : aucun agent ne rattrape cela, il l'amplifie. Le nettoyage vient d'abord ; notre retour sur la reconfiguration d'un Odoo en quatre jours montre par où commencer.

FAQ — Claude Code et Odoo

Comment connecter Claude à Odoo sans développeur ?

Pour configurer : Claude Code pilote votre navigateur connecté à Odoo et passe par le point d'accès RPC que l'interface utilise déjà, sans clé ni module. Pour faire travailler un agent au quotidien : un serveur MCP, natif dans Odoo 20 ou construit sur mesure avec des garde-fous.

Claude Code fonctionne-t-il avec Odoo.sh ?

Oui, et mieux encore : sur Odoo.sh un module Python classique s'installe, donc Claude Code travaille dans un dépôt Git comme sur n'importe quel projet. Le workflow RPC décrit ici reste utile pour l'introspection et les vérifications.

Faut-il attendre le serveur MCP natif d'Odoo 20 ?

Non pour configurer, le workflow RPC suffit aujourd'hui. Oui pour un agent de lecture simple, si votre migration vers Odoo 20 est proche. Dans les deux cas, un outil générique en écriture ne doit jamais être exposé à un agent qui parle à des clients.

Peut-on laisser Claude modifier des prix dans Odoo ?

Techniquement oui, par RPC. Dans notre pratique, jamais par script ni par agent : le prix, le coût et le stock restent des gestes humains, et nos outils MCP n'ont pas de paramètre pour les toucher. Un garde-fou dans le prompt ne suffit pas, il faut qu'il soit dans le code.

Si vous voulez voir ce workflow tourner sur votre propre instance, le premier rendez-vous n'est pas facturé et se fait en visio partout en France : réservez un Audit 180°, ou commencez par la bibliothèque de prompts si vous préférez avancer seul d'abord.

Vousêtesaubonendroit.Onenparle?

60 minutes pour transformer cette lecture en plan concret pour votre PME. Zéro engagement, zéro jargon — juste votre métier et nos outils.