kazaplan-mcp
Enables natural-language control of Leroy Merlin's Virtual Home 3D planner (Kazaplan): opening plans, searching the Leroy Merlin catalog, placing and moving furniture, setting floor and wall materials, adding walls, doors, windows and pools, checking room circulation, generating SVG floor plans, and saving changes.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@kazaplan-mcp Mets une baignoire de 170 cm dans la salle de bain"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
kazaplan-mcp
Piloter le concepteur 3D Leroy Merlin (Virtual Home, moteur Kazaplan) en langage naturel, depuis n'importe quel assistant compatible MCP (Claude, Codex, Gemini CLI, Cursor, VS Code…) :
« Mets une baignoire de 170 cm dans la salle de bain » « Meuble le salon en scandinave » « Dessine ma maison d'après cette photo du plan »
Le dépôt contient :
un serveur MCP (
kazaplan-mcp) : ouvrir un plan, chercher dans le catalogue Leroy Merlin, poser des meubles, peindre, construire des murs, contrôler la circulation, dessiner des plans SVG, enregistrer ;deux skills au format ouvert Agent Skills :
kazaplan-decorator(aménager et décorer une pièce à partir de l'identité décorative de la maison) etkazaplan-floorplan(dupliquer un plan, le tracer d'après la photo d'un plan).
Projet non officiel, sans lien avec Leroy Merlin ni Kazaplan. Il utilise l'API du planner telle que le site l'appelle, avec votre propre session ; elle peut changer sans préavis. Il modifie vos plans : faites vos essais sur une copie.
Sommaire
Related MCP server: Loxone MCP Server
1. Démarrage rapide
Deux façons de lancer le serveur, sans rien cloner :
Prérequis | Commande | |
uvx (recommandé) |
| |
Docker | Docker |
|
Installer uv : curl -LsSf https://astral.sh/uv/install.sh | sh (macOS / Linux) ou
powershell -c "irm https://astral.sh/uv/install.ps1 | iex" (Windows).
Au premier lancement, le serveur télécharge le catalogue Leroy Merlin (≈ 350 Mo, quelques minutes), en construit un index local (≈ 25 Mo) et jette le reste. Pendant ce temps, les outils du catalogue répondent « catalogue en cours de téléchargement ». Pour le faire à l'avance, ou récupérer plus tard les nouveautés :
uvx kazaplan-mcp catalogVous n'utilisez pas Claude Code ? Passez à l'étape 2. Avec Claude Code, le plugin installe le serveur et les skills d'un coup :
/plugin marketplace add padupuy/kazaplan-mcp
/plugin install kazaplan@kazaplan-mcp2. Jeton et identifiant du plan
Le jeton
Le serveur agit avec votre session Leroy Merlin. Le jeton est valable environ 7 jours.
Ouvrez https://www.leroymerlin.fr/config-3d/virtual-home, connectez-vous et ouvrez votre projet.
Outils de développement : F12 (Windows / Linux) ou ⌥ ⌘ I (macOS), onglet Réseau, filtre
api.kazaplan.com.Enregistrez une petite modification dans le planner (ou rechargez la page).
Cliquez sur une requête, section En-têtes de la requête, ligne
Authorization: Bearer eyJ….Copiez tout ce qui suit
Bearer.
Ce jeton donne accès à vos plans : ne le partagez pas, ne le commitez jamais. S'il a fuité, déconnectez-vous puis reconnectez-vous à Leroy Merlin.
L'identifiant du plan
Dans le même onglet Réseau, une requête api.kazaplan.com/plans/12345678 : le nombre à la fin est l'identifiant de
votre plan.
Créez un second projet vide sur leroymerlin.fr pour vos essais et dupliquez-y votre maison (« duplique mon plan 11111111 dans le plan 22222222 »).
3. Configuration
Variable | Obligatoire | Rôle | Exemple |
| pour lire / enregistrer en ligne | votre jeton |
|
| pour enregistrer en ligne | liste blanche des plans modifiables, séparés par des virgules |
|
| non | dossier de données : catalogue, sauvegardes, plans SVG | défaut |
| non | dossier des sauvegardes | défaut |
| non | adresse de l'API | défaut |
Sans KZ_ALLOWED_PLANS, le serveur peut lire vos plans mais refuse d'enregistrer : c'est voulu.
4. Brancher le serveur sur votre assistant
Les exemples utilisent uvx. Pour Docker, remplacez la commande par :
"command": "docker",
"args": ["run", "-i", "--rm", "-e", "KZ_TOKEN", "-e", "KZ_ALLOWED_PLANS",
"-v", "kazaplan-data:/data", "ghcr.io/padupuy/kazaplan-mcp"]Avec Docker, les fichiers que vous échangez avec le serveur (.kzp locaux, DECOR.md, planches) doivent se
trouver dans un dossier monté (-v "$PWD":/work, puis chemins /work/…).
Le plus simple est le plugin (voir Démarrage rapide) ; il lit KZ_TOKEN et
KZ_ALLOWED_PLANS dans votre environnement. Sans le plugin :
claude mcp add kazaplan --scope user \
-e KZ_TOKEN="$KZ_TOKEN" -e KZ_ALLOWED_PLANS="22222222" \
-- uvx kazaplan-mcpRéglages → Développeur → Modifier la configuration (claude_desktop_config.json) :
{
"mcpServers": {
"kazaplan": {
"command": "uvx",
"args": ["kazaplan-mcp"],
"env": { "KZ_TOKEN": "collez-votre-jeton-ici", "KZ_ALLOWED_PLANS": "22222222" }
}
}
}Si uvx est introuvable, mettez son chemin absolu (which uvx). Quittez complètement l'application puis relancez-la.
~/.codex/config.toml :
[mcp_servers.kazaplan]
command = "uvx"
args = ["kazaplan-mcp"]
env = { KZ_TOKEN = "collez-votre-jeton-ici", KZ_ALLOWED_PLANS = "22222222" }Le dépôt est aussi une extension Gemini CLI (le serveur hérite de KZ_TOKEN et KZ_ALLOWED_PLANS de votre
environnement) :
gemini extensions install https://github.com/padupuy/kazaplan-mcp~/.cursor/mcp.json :
{
"mcpServers": {
"kazaplan": {
"command": "uvx",
"args": ["kazaplan-mcp"],
"env": { "KZ_TOKEN": "collez-votre-jeton-ici", "KZ_ALLOWED_PLANS": "22222222" }
}
}
}.vscode/mcp.json (le jeton est demandé au démarrage et stocké par VS Code) :
{
"inputs": [{ "id": "kz-token", "type": "promptString", "description": "Jeton Kazaplan", "password": true }],
"servers": {
"kazaplan": {
"type": "stdio",
"command": "uvx",
"args": ["kazaplan-mcp"],
"env": { "KZ_TOKEN": "${input:kz-token}", "KZ_ALLOWED_PLANS": "22222222" }
}
}
}5. Installer les skills
Les skills apprennent à l'assistant à s'en servir comme un décorateur ou un dessinateur : relevé de la pièce,
identité décorative de la maison (DECOR.md : foyer, palette 60 / 30 / 10, matières, programme par pièce), règles
d'ergonomie et de circulation, validation avant de poser, planches d'architecte en fin de projet.
Assistant | Installation |
Claude Code | inclus dans le plugin |
Codex, Cursor, Gemini CLI, Copilot, OpenCode… |
|
Autre | copiez |
6. Utilisation
Parlez normalement à l'assistant :
« Ouvre mon plan 22222222 et fais-moi un résumé des pièces. »
« Trouve une baignoire de moins de 175 cm et pose-la dans la salle de bain. »
« Carrelage blanc 60×60 au sol du WC. »
« Décore la chambre 1 » : sol, murs, lumière, tapis, textiles, miroir, déco ; l'assistant présente le projet et attend votre accord avant de poser quoi que ce soit.
« Enregistre. »
Puis rechargez la page du planner pour voir le résultat. Rien n'est envoyé tant que vous n'avez pas demandé d'enregistrer.
Les murs, ouvertures et pièces neufs se finalisent dans le planner : après l'enregistrement, rechargez-le et enregistrez depuis le planner (il détecte alors les pièces fermées), puis demandez de nommer les nouvelles pièces.
Les outils
Outil | Ce qu'il fait |
| ouvre un plan en ligne ( |
| pièces, surfaces, sols, ouvertures, objets posés |
| murs d'une pièce, portes et fenêtres, segments libres, surface utile |
| recherche dans le catalogue (texte, catégorie, dimensions, style, couleur, sol / mur), fiche d'un article |
| pose, décale, supprime, avec contrôle des collisions, débattements de portes et fenêtres |
| sol, peinture / papier peint / faïence d'une pièce ou d'un mur, plafond, gazon |
| construction : murs, portes et fenêtres, piscine, nom et type des pièces |
| circulation : dégagements autour des meubles, chemins de 60 / 90 cm entre les portes |
| plan SVG vu de dessus d'une pièce ou de la maison |
| livrable |
| enregistre en ligne (ou en |
| contenu brut d'un objet (diagnostic) |
Toutes les cotes sont en centimètres. Sans jeton, on peut travailler sur un .kzp local : « ouvre
~/Downloads/mon-plan.kzp » puis « enregistre dans ~/Downloads/mon-plan-modifie.kzp ».
7. Sécurité et sauvegardes
Liste blanche : le serveur n'enregistre en ligne que les plans de
KZ_ALLOWED_PLANS.Sauvegardes automatiques dans
backups/du dossier de données :<plan>-<date>-orig.kzp(à l'ouverture),<plan>-<date>-sent.kzp(ce qui a été envoyé). Pour revenir en arrière : « ouvre le fichier …-orig.kzp et enregistre-le sur le plan 22222222 ».Le jeton n'est jamais écrit sur disque par le serveur.
Les fichiers écrits à la demande de l'assistant sont limités :
.kzppourkz_save,.svgpourkz_sketch, dossier duDECOR.mdpourkz_board.
8. Dépannage
Symptôme | Cause probable | Solution |
| variable non transmise au serveur | la définir dans la config de l'assistant, relancer |
| jeton expiré (≈ 7 jours) ou mal copié | récupérer un nouveau jeton |
| identifiant absent de | l'ajouter, relancer |
| premier lancement | patienter quelques minutes |
| téléchargement interrompu |
|
| pas la place à cet endroit | autre mur, modèle plus petit, ou |
Le planner affiche des blocs jaunes ou refuse d'enregistrer | plan rejeté par le planner | revenir à la sauvegarde |
Les changements n'apparaissent pas | page du planner non rechargée | recharger l'onglet |
9. Développement
src/kazaplan_mcp/
kzp.py conteneur .kzp (WPRJ)
catalog.py téléchargement du catalogue, index local, recherche
geometry.py géométrie 2D
plan.py modèle du plan : résumé, géométrie des pièces, placement, construction
circulation.py contrôle de circulation
sketch.py plans SVG, livrable PLANCHES.md
section.py coupes des pièces ; mesh.py : modèles 3D .glb rendus au trait
api.py API Kazaplan, sauvegardes ; paths.py : dossier de données
server.py serveur MCP (outils kz_*) et CLI
skills/ skills Agent Skills
tests/ tests (plan synthétique, catalogue simulé)
HANDOFF.md notes techniques : format .kzp, conventions vérifiées, règles du plannerpython3 -m venv .venv && .venv/bin/pip install -e ".[dev]"
.venv/bin/ruff check . && .venv/bin/ruff format --check . && .venv/bin/python -m pytest -qPour essayer le plugin Claude Code depuis le dépôt : claude --plugin-dir ..
Inspecter un plan :
python -m kazaplan_mcp.kzp unpack plan.kzp dossier/ # → metadata.json, project.json
python -m kazaplan_mcp.kzp pack dossier/ nouveau.kzpPublication : un tag v* publie le paquet sur PyPI (release.yml, trusted publishing) et l'image
ghcr.io/padupuy/kazaplan-mcp (docker.yml, aussi edge à chaque push sur main).
Licence
MIT. Leroy Merlin et Kazaplan sont des marques de leurs propriétaires respectifs.
Available Tools
19 toolskz_add_openingKz Add OpeningB
Ajoute une ouverture sur un mur. kind : "door" (90×215 par défaut) ou "casement-window" (100×135, allège 95). offset : distance en cm entre le début du mur et le bord de l'ouverture (sinon centrée).
Inputs: wall_id (required), kind, width, height, +3 more. Returns: object
kz_add_poolKz Add PoolC
Ajoute une piscine enterrée de contour points ([[x, y], …], cm).
Inputs: points (required), height, water_depth, coping_thickness. Returns: object
kz_add_wallsKz Add WallsA
Ajoute une chaîne de murs reliés passant par points ([[x, y], …], cm).
Épaisseurs usuelles : 30 extérieur, 7 cloison. Une extrémité libre posée sur un mur existant
(axe ou face, à ½ épaisseur + 4 cm près) s'y raccorde : en T sur le flanc, en coin sur une
extrémité libre. Les faces (wall.pane) des nouveaux murs sont créées par le planner à l'ouverture.
Aucune pièce n'est créée : le planner la détecte à la prochaine ouverture + enregistrement,
ensuite seulement la nommer avec kz_set_room.
Inputs: points (required), closed, height, thickness. Returns: object
kz_boardKz BoardA
Livrable de la maison pour le plan ouvert : écrit à côté du DECOR.md un PLANCHES.md (vue d'ensemble, nuancier, tableau des pièces, puis par pièce du DECOR.md : plan coté, deux coupes, revêtements, nomenclature) et ses dossiers plans/ et swatches/. À relancer après chaque kz_save.
Inputs: decor_path (required). Returns: object
kz_catalog_itemKz Catalog ItemC
Fiche d'un article du catalogue (model-… ou material-…).
Inputs: item_id (required). Returns: object
kz_check_roomKz Check RoomB
Contrôle la circulation d'une pièce. issues : meubles dont le dégagement est sous la cote (derrière une chaise 75, devant un canapé 60 jusqu'à la table basse, autour d'une table à manger 110 sans compter les chaises (90 pour un îlot ou une table haute), devant une armoire 75, un buffet 60, un meuble de cuisine 90, de chaque côté d'un lit double 60). paths : depuis la porte de la pièce, chaque autre porte, porte-fenêtre ou passage ouvert est-il atteignable par un chemin de 60 cm (width60) et de 90 cm (width90) ?
Inputs: room (required). Returns: object
kz_copy_planKz Copy PlanA
Duplique un plan : copie le .kzp de source_plan_id dans target_plan_id, puis l'ouvre. L'API ne permet pas (encore) de créer un plan : créer d'abord un plan vide sur leroymerlin.fr (Mon projet 3D), noter son id et l'ajouter à KZ_ALLOWED_PLANS. Le contenu de la cible est remplacé ; il est archivé dans backups/ avant l'envoi. Usage type : faire une copie de travail du plan réel avant de le modifier.
Inputs: source_plan_id (required), target_plan_id (required), title. Returns: object
kz_getKz GetC
JSON brut d'un objet du plan (débogage).
Inputs: object_id (required). Returns: object
kz_moveKz MoveA
Décale un objet posé de dx, dy cm (coordonnées du plan), avec les objets posés dessus. Refusé en cas de collision, de débattement de porte ou de fenêtre masquée, sauf force=True (tapis, retouches).
Inputs: object_id (required), dx, dy, force. Returns: object
kz_openKz OpenA
Ouvre un plan : depuis l'API Kazaplan (plan_id, nécessite KZ_TOKEN) ou un fichier .kzp local (path). Pour un fichier local, plan_id (cible d'un futur kz_save) vaut par défaut le début du nom de fichier (« 12345678-20261014-212320-orig.kzp » -> « 12345678 »). Une copie de sauvegarde du .kzp d'origine est écrite dans backups/.
Inputs: path, plan_id. Returns: object
kz_placeKz PlaceA
Pose un modèle du catalogue dans une pièce, avec contrôle de collision (murs, objets, débattement des portes, fenêtres masquées).
Par défaut : dos contre le plus long mur libre qui convient.
against_wall : index d'arête (cf. kz_room_geometry) ; offset : distance en cm entre le début de l'arête et le bord de l'objet (sinon centré dans le plus grand segment libre).
center=True : au centre de la pièce. x, y : centre imposé (coordonnées plan).
under_opening : id d'une fenêtre ; centre l'objet sous elle, dos au mur (radiateurs).
room absent : pose en extérieur, au niveau du terrain ; x, y obligatoires, contrôle des murs traversés.
width / depth / height : redimensionne le modèle (cm), ex. pergola sur mesure.
gap : distance dos du modèle / mur (cm, défaut 1) ; ex. 59 pour poser des portes de dressing devant des caissons de 58 cm. Les modèles NO_COLLISION (portes de dressing…) peuvent chevaucher.
rotation : rotation supplémentaire en degrés (sens trigonométrique) ; avec x, y : angle absolu (la face avant regarde vers rotation + 90°).
force=True : pose même en cas de collision (renvoyée dans warnings).
elevation : hauteur du bas de l'objet au-dessus du sol (cm), au lieu de celle du catalogue (miroir à 120, applique à 170, étagère murale…).
on_top_of : id d'un objet posé ; pose dessus (lampe sur un buffet, vase sur une table), centré sur lui sauf x, y fournis ; avec elevation, pose à cette hauteur (lit : le dessus du matelas, pas la tête de lit).
Inputs: model_id (required), x, y, gap, +12 more. Returns: object
kz_removeKz RemoveB
Supprime un objet (modèle, ouverture, mur avec ses ouvertures, pièce, piscine…).
Inputs: object_id (required). Returns: object
kz_room_geometryKz Room GeometryA
Géométrie d'une pièce (nom, type ou id) : arêtes du contour intérieur avec longueur, normale
vers l'intérieur, mur porteur, ouvertures (abscisses from/to depuis le début de l'arête) et segments
libres free (portes + 5 cm de marge et fenêtres exclues), zones de débattement des portes,
surface totale et utile (hors objets posés au sol).
Inputs: room (required). Returns: object
kz_saveKz SaveA
Enregistre le plan (titre par défaut : celui du plan côté serveur). Avec out_path : écrit seulement un .kzp local (aucun envoi). Sinon : POST sur l'API (plan_id doit figurer dans KZ_ALLOWED_PLANS). Le fichier envoyé est aussi archivé dans backups/.
Inputs: title, out_path. Returns: object
kz_search_catalogKz Search CatalogB
Recherche dans le catalogue Leroy Merlin local (plein texte FR, sans accents requis). kind : "model" (meubles/objets) ou "material" (revêtements). category : libellé ou code de menu (ex. "Baignoires", "SDB_BAIGNOIRES", "Canapés"). usage (matériaux) : "floor" ou "wall". style : Design, Essential, Natural, Industrial, Boheme, Neoclassic, Country. w = largeur (face avant), d = profondeur, h = hauteur, en cm ; price en € TTC.
Inputs: kind, color, limit, max_d, +6 more. Returns: result
kz_set_materialKz Set MaterialA
Applique un revêtement (material-…). target :
"floor:<pièce>" : sol de la pièce (carrelage, parquet…) ;
"ceiling:<pièce>" : plafond de la pièce (peinture), visible seulement en vue 3D ;
"wall:<pièce>" : toutes les faces de mur tournées vers la pièce (peinture, papier peint, faïence) ;
"wall:<pièce>:<arête>" : un seul mur, index d'arête de kz_room_geometry (mur d'accent) ;
"ground" : terrain autour de la maison (gazon).
Inputs: target (required), material_id (required). Returns: object
kz_set_roomKz Set RoomA
Renomme et/ou change le type d'une pièce existante (nom, type ou id). Ne crée jamais de pièce : après kz_add_walls, ouvrir le plan dans le planner et l'enregistrer pour qu'il détecte la pièce (type « room », sans nom), puis kz_open et kz_set_room. Types : bedroom, livingdiningRoom, kitchen, bathRoom, wc, livingRoom, diningRoom, entrance, cupboard, dressing, laundry, storage, bearing, corridor, office, showerRoom, playRoom, otherHabitable, balcony, terraceannex, garage, basement, cellar, attic, loggia, veranda, technicalArea, otherAnnex, garden, terraceext, driveway, carport, parking.
Inputs: room (required), name, type. Returns: object
kz_sketchKz SketchB
Plan SVG vu de dessus d'une pièce (ou du bâtiment principal si room est absent), comme le plan 2D du planner : murs, portes, fenêtres, tapis, meubles (une lettre par modèle, cf. legend), luminaires. decor_path (DECOR.md) : trace en liseré la peinture de chaque mur aux couleurs de la palette. Écrit le fichier dans le dossier de données (sketches/<pièce>.svg) et renvoie son chemin ; wall / on_top / ceiling listent les objets muraux, posés sur un meuble, au plafond ; schedule = nomenclature (code, libellé, dimensions, emplacement), un élément par objet.
Inputs: room, decor_path. Returns: object
kz_summaryKz SummaryB
Résumé du plan : pièces (surface, sol), murs, ouvertures, objets posés (cotes, pièce), piscines.
Inputs: no named parameters. Returns: object
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 19 tools
Most tools target clearly distinct actions/resources: geometry vs. circulation check vs. SVG sketch, place vs. move, add_walls vs. add_opening. Slight overlap remains between kz_get (raw debugging JSON) and kz_summary, and between kz_board and kz_sketch as visual deliverables, but descriptions largely disambiguate them.
All names use a consistent kz_ prefix and mostly follow verb_noun patterns (kz_add_walls, kz_set_room, kz_search_catalog) or clear noun labels (kz_summary, kz_sketch). A few bare nouns/verbs (kz_get, kz_board, kz_catalog_item) break the pattern slightly but remain readable.
19 tools is above the typical 3-15 range, but the domain is complex (walls, openings, rooms, materials, catalog, placement, export). Each tool appears to cover a distinct operation with little obvious redundancy.
Covers open/save/copy, editing (walls, openings, pool, objects), room/material management, analysis/export, and catalog lookup. Notable gaps include no direct plan creation (documented API limitation) and limited post-hoc editing of existing openings/walls, but workarounds are provided.
Maintenance
Related MCP Connectors
Generate, edit, and deploy immersive 3D/WebGL web projects from any MCP assistant.
Skills, agents and memory in the cloud, plus a gateway to your other MCP servers.
Chat with your Zihin.ai agents, list them and load platform skills from any MCP client.
Related MCP Servers
- AlicenseAqualityAmaintenanceIntegrates HomeMatic smart home devices (via CCU3, RaspberryMatic, or debmatic) as MCP tools, enabling natural language query and control of rooms, devices, programs, and system variables.28340 npm9MIT
- AlicenseNot gradedqualityBmaintenanceEnables natural language control of Loxone smart home systems, including lighting, audio, climate, and environmental monitoring, through MCP-compatible clients.36 npm3AGPL 3.0
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to automate 2D architectural drafting and CAD file management, including DXF/DWG parsing, SVG/PNG/PDF rendering, wall extrusion to 3D STL meshes, room and beam analysis, block/script library access, and persistent depot storage via a REST API and MCP tools.18MIT
- AlicenseAqualityCmaintenanceEnables controlling Autodesk Fusion 360 from any MCP-compatible AI client through natural language. Exposes tools for creating sketches, drawing rectangles and circles, extruding, revolving, filleting, shelling, drilling holes and bolt-circle patterns, managing user parameters, and exporting STEP/STL files, plus batch generation of parametric variants.15MIT