Skip to main content

260913-recettes de Joplin ves MEALIE par Claude

Mise en place le 2026-09-13. Mealie est utilisé tous les jours par toute la famille, mais renseigner une recette à la main est fastidieux : sections d'ingrédients, étapes, catégories, tags, photo. La procédure confie ce travail à Claude à partir d'une simple note Joplin.

1. La procédure, côté Julien

  1. Capturer la recette dans une note Joplin — texte libre, copié-collé d'un site, réponse d'un assistant, dictée, photos du téléphone. Aucune mise en forme n'est exigée.
  2. Publier la note : dans Joplin, clic droit sur la note → Publier la note → copier le lien (https://joplin.juxjux.ovh/shares/xxxxxxxx).
  3. Coller le lien à Claude en lui demandant d'en faire une recette Mealie. C'est tout.

Claude lit la note, la structure, crée la recette avec sa photo, et rend le lien Mealie. En retour il signale ce qu'il a dû décider seul (catégorie ou tag créé, quantités absentes, photo de remplacement), pour que Julien puisse corriger d'un mot.

Où est le travail de Claude

Une note de recette est rarement au carré : un copié-collé de site mêle recette et bavardage ; une réponse d'assistant argumente (« je choisirais l'espadon… ») au lieu de lister ; une photo de carnet manuscrit ne dit rien à un parseur. Un script ne peut pas trier ça. Claude, lui, lit la note comme un lecteur et en tire :

Champ Mealie Ce que Claude en fait
Nom reformulé en titre de recette (le titre Joplin est souvent une note de travail)
Description l'esprit du plat, les choix qui comptent — pas les étapes
Personnes, temps repris s'ils sont dans la note, estimés sinon (et signalés comme estimés)
Ingrédients listés en sections (Marinade, Sauce, Riz coco…) — Mealie les affiche titrées
Étapes rédigées à l'impératif, titrées, sans le bavardage
Notes ce qui ne rentre ni dans les ingrédients ni dans les étapes : variantes, choix du poisson, conseils
Catégories cuisine / pays / type de plat — c'est la convention de la base (Turquie, Italia, Poisson, Dessert…)
Tags ingrédients principaux — c'est l'autre convention de la base (Courgettes, Feta, Lait de coco…)
Source l'URL de la note Joplin, dans le champ URL d'origine de Mealie
Image la première vraie photo de la note ; les autres en photos secondaires

Claude réutilise les catégories et tags existants avant d'en créer, et signale toute création. Les temps sont en minutes nues (« 30 »), comme le reste de la base.

2. L'outillage

Tout est dans Jux-scripts/Mealie-Recettes/ et Jux-scripts/MCP/, stdlib Python seule — rien à installer, réplicable sur toutes les machines par Syncthing.

joplin_mealie.py — la mécanique

py -3.12 joplin_mealie.py lire <url_note_publiee>          # texte + images, avec verdict "photo ou pas"
py -3.12 joplin_mealie.py creer fiche.json [--simulation]  # creation, image, photos secondaires
py -3.12 joplin_mealie.py image <slug> <url_ou_fichier>    # poser / remplacer l'image principale
py -3.12 joplin_mealie.py organiseurs                      # categories et tags existants
py -3.12 joplin_mealie.py supprimer <slug>
  • lire transforme le bloc <div id="rendered-md"> de la page publiée en texte proche du markdown (titres, listes, gras, tableaux), remplace chaque image par un marqueur [image N] et les liste à part avec leurs dimensions. Une image de moins de 200 px de côté est déclarée PAS une photo : c'est un favicon ou une vignette, jamais un plat.
  • creer prend une fiche JSON (celle que Claude rédige) et fait le reste : POST /api/recipes (nom) → PUT /api/recipes/{slug} (corps complet) → PUT /api/recipes/{slug}/image (multipart) → POST /api/recipes/{slug}/assets pour les photos secondaires. Catégories et tags sont résolus par nom, insensible à la casse et aux accents, créés s'ils manquent. Refuse un doublon de nom sauf --doublon-ok. --simulation montre le corps sans rien écrire.

Fiche JSON minimale :

{
  "nom": "Brochettes d'espadon satay, riz coco",
  "description": "…", "personnes": 4,
  "temps_preparation": "25", "temps_cuisson": "20", "temps_total": "60",
  "categories": ["Asiatique", "Poisson"],
  "tags": ["Espadon", "Lait de coco", "Cacahouetes"],
  "ingredients": [{"titre": "Marinade", "items": ["2 c. à soupe de sauce soja", "…"]}, "600 g d'espadon"],
  "etapes": [{"titre": "Marinade", "texte": "…"}, "Servir avec le riz."],
  "notes": [{"titre": "Quel poisson ?", "texte": "…"}],
  "source": "https://joplin.juxjux.ovh/shares/…",
  "image": "https://joplin.juxjux.ovh/shares/…?resource_id=…",
  "images_secondaires": ["https://…"]
}

mcp_mealie.py — les mêmes gestes en outils MCP

Enregistré le 2026-09-13 dans ~/.claude.json du poste julie (projet Claude-pcelio+jux), comme les autres MCP Python : command = chemin absolu de python.exe, args = chemin du script. 13 outils :

  • Joplin → Mealie : lire_note_joplin, creer_recette, poser_image, poser_photo_secondaire
  • consultation : lister_recettes, lire_recette, lister_organiseurs, supprimer_recette
  • au quotidien : plan_repas, ajouter_au_plan, listes_courses, ajouter_courses, recette_vers_courses

Le MCP importe joplin_mealie.py depuis le dossier voisin : une seule implémentation, deux façons de l'appeler (le CLI reste utile quand le MCP n'est pas chargé, ou depuis Ubuntu / la VM).

3. Première recette réelle — l'exemple du 2026-09-13

Note : https://joplin.juxjux.ovh/shares/EqODt1SvmX6OKzdr867bpZ — Brochette de poisson Satay sauce. Une réponse d'assistant collée telle quelle : classement de cinq poissons avec des étoiles, « je choisirais l'espadon », marinade en liste, sauce satay sans quantités, riz coco et accompagnement en prose.

Résultat : Brochettes d'espadon satay, riz coco — 5 sections d'ingrédients, 5 étapes titrées, 2 notes, catégories Asiatique + Poisson, 8 tags dont un créé (Espadon), photo. Le classement des poissons est allé dans une note, pas dans les étapes.

Ce qu'a révélé ce premier passage :

  • La seule image de la note faisait 16 × 16 px : le favicon d'un site cité par l'assistant, pas une photo. Sans le contrôle des dimensions, Mealie aurait reçu un carré illisible. D'où la règle des 200 px.
  • Sans photo dans la note, Claude en cherche une libre de droits sur Wikimedia Commons (API commons.wikimedia.org, licence lue dans les métadonnées). Ici : Brochette d'espadon à Georgioúpoli (Crète), CC0. Elle est signalée comme provisoire dans une note de la recette, à remplacer par une photo du plat.
  • Wikimedia refuse le User-Agent vide de urllib (HTTP 403) et n'accepte que des tailles de vignette fixes (1280px-, pas 800px- → HTTP 400 « Use thumbnail sizes listed »). Le script envoie un User-Agent nommé.
  • La note de Julien n'avait ni temps ni nombre de personnes explicites hors « pour 4 personnes / 600–700 g » : les temps ont été estimés (25 + 20, total 60 marinade comprise) et le sont dits.

4. Pièges relevés

  1. Une note publiée est publique — l'URL suffit, sans identifiant. Ne pas y mettre autre chose que la recette. Le champ URL d'origine de Mealie la garde : dépublier la note casse ce lien, sans effet sur la recette.
  2. Les images de la note se téléchargent par ?resource_id= sur l'URL du partage, anonymement. Les photos de téléphone arrivent en pleine taille (1 920 × 1 440, 500 Ko à 800 Ko) — Mealie les redimensionne lui-même.
  3. Mealie n'analyse pas les ingrédients : ils sont stockés en texte libre (note / display), comme les 141 recettes existantes. Le champ title du premier ingrédient d'une section porte le titre de section — c'est ainsi que Mealie fait ses en-têtes.
  4. POST /api/recipes ne prend que le nom et renvoie le slug ; tout le reste passe par un PUT du corps complet relu (GET puis mise à jour), sinon l'API efface ce qu'on n'a pas renvoyé.
  5. Les temps sont des chaînes libres dans Mealie. La base utilise des minutes nues (« 60 », « 30 ») — 31 recettes sur 141 n'en ont aucun. S'y tenir.
  6. 59 recettes sur 141 n'ont pas de catégorie au 2026-09-13 : les plus récentes ont été saisies vite. Rien n'empêche de les reprendre une par une avec lire_recette + mise à jour — chantier possible.
  7. Le CLI claude n'est pas dans le PATH du poste (application de bureau) : le MCP a été inscrit à la main dans .claude.json, sauvegarde .claude.json.bak-260913-mealie. Il faut relancer la session pour qu'il soit chargé.
  8. Piège d'atelier, sans rapport avec Mealie : l'outil Bash de Claude Code abîme les \x.. dans un heredoc Python — deux fichiers réparés en cours de route. Écrire les scripts avec l'outil d'édition, les exécuter avec Bash.

5. Identifiants

Mealie : jubertrand@gmail.com / mot de passe dans CLAUDE.md (OAuth2 password, POST /api/auth/token, formulaire username/password, jeton valable 48 h). Surchargeables par MEALIE_URL, MEALIE_USER, MEALIE_PASS.