Journalmcp-server
Un serveur MCP pour piloter le générateur depuis un assistant
Six outils sur /api/mcp — list_families, describe_family, build_panel, export_dxf, nest_panels, calibrate_deduction — pour qu’un assistant chiffre une façade, lise les diagnostics et récupère le DXF sans ouvrir le studio. Une ligne pour l’attacher à Claude Code.
Un devis de façade, chez nous, commence par un courriel : « 48 cassettes pyramide 800 × 600, relief 60, combien de tôles ? ». Répondre demande d’ouvrir le studio, régler quatre paramètres, lire le métré, lancer le placement, recopier. Depuis cette semaine, un assistant peut le faire à notre place, avec les mêmes calculs, parce que le générateur est aussi un serveur MCP.
Ce qu’est /api/mcp
Le Model Context Protocol est un protocole JSON-RPC que les assistants (Claude et d’autres) utilisent pour appeler des outils. Notre point d’entrée est https://acm.hmlssender.com/api/mcp, transport « Streamable HTTP » sans état : un POST par message, une réponse JSON, pas de session ni de flux. Un GET renvoie une fiche lisible — nom, version du moteur, liste des outils, mode d’authentification. Aucune dépendance : le sous-ensemble utile du protocole (initialize, ping, tools/list, tools/call, notifications) tient en une centaine de lignes et tourne dans les tests sous Node.
Le serveur est en lecture seule : il ne touche jamais aux projets ni aux comptes. Si la variable MCP_API_TOKEN est définie, la route exige Authorization: Bearer <token> ; sinon elle est ouverte. Garde-fous : 120 messages par minute et par adresse, corps limité à 1 Mo, lots de 20 messages au plus, et un interrupteur dans la console d’administration qui répond 503 mcp_disabled. Chaque appel d’outil est journalisé (outil, durée, succès) pour que nous sachions ce qui est utilisé.
Les six outils
list_families— les 21 familles du catalogue : identifiant, nom, catégorie, palier, nombre de paramètres.describe_family— pour une famille : chaque paramètre avec sa plage, son pas, son unité et son défaut, les préréglages, et les contraintes de fabrication en français.build_panel— construit le panneau avec les profils machine et matière par défaut (épaisseur 3, 4 ou 6 mm) et renvoie les métrés (développé, surface, longueur de rainure et de contour, plis, perçages), les diagnostics avec titre et explication en anglais, etexportable.export_dxf— le DXF multi-calques en vue d’usinage (dos), R12 par défaut ou R2000, avec un repère ASCII surREPERE. Refusé si le panneau n’est pas exportable : « corrigez les diagnostics de build_panel ».nest_panels— place N exemplaires sur des tôles (1220 × 2440 par défaut, format libre) : nombre de tôles, taux de chute, coût matière.calibrate_deduction— le retrait réel à partir d’une éprouvette mesurée :r = r0 + (mesuré − (k+1)·L) / k.
Les paramètres absents prennent leur défaut ; ceux hors plage sont ramenés dedans, et la note apparaît dans les diagnostics. Un identifiant de famille inconnu renvoie « Famille inconnue : utilisez list_families », pas une pile d’erreurs.
Un appel, tel quel
httpPOST /api/mcp
{
"jsonrpc": "2.0", "id": 1, "method": "tools/call",
"params": {
"name": "build_panel",
"arguments": { "familyId": "pyramid", "params": { "reliefMm": 60 }, "thicknessMm": 4 }
}
}Et ce que le moteur répond quand la pente demandée n’a pas de fraise dans le profil par défaut :
json{
"exportable": false,
"diagnostics": [
{ "code": "CUTTER_UNAVAILABLE", "severity": "error",
"title": "Cutter not available",
"message": "… angle au sommet requis 118.1°, absent du profil machine.
Fraise la plus proche : 135° (écart +16.9°)." }
]
}Le point important : l’assistant reçoit exactement ce que reçoit l’écran du studio. Même moteur, mêmes profils, même règle « pas d’export avec une erreur ». Il ne peut pas obtenir un DXF que nous n’aurions pas obtenu nous-mêmes.
L’attacher à Claude Code
bashclaude mcp add --transport http acm https://acm.hmlssender.com/api/mcp
# avec un jeton :
claude mcp add --transport http acm https://acm.hmlssender.com/api/mcp \
--header "Authorization: Bearer <token>"Ensuite, dans une session : « liste les familles à relief de palier pro, construis une pyramide 800 × 600 avec 60 mm de relief en 4 mm, dis-moi si elle s’exporte, et place 48 exemplaires sur du 1500 × 3200 ». L’assistant enchaîne list_families, build_panel, puis nest_panels, et lit les diagnostics avant de conclure. Le message instructions renvoyé à l’initialisation lui dit dans quel ordre s’en servir.
Ce que nous en faisons à l’atelier
Pour l’instant, deux usages. Le chiffrage rapide : une famille, des dimensions, une quantité, et le nombre de tôles avec le taux de chute en trente secondes, dans le fil de discussion du devis. Et la vérification en série : un script qui reconstruit chaque famille à ses défauts et à ses préréglages et compare exportable et les métrés d’une version du moteur à l’autre. Le premier a déjà remplacé le tableur ; le second a trouvé une régression de retrait avant qu’elle n’arrive sur une tôle.
À lire ensuite : lire le DXF d’une cassette : calques, R12 vs R2000.