Initial commit: Mealie MCP server

Ports a working Hermes agent skill to an MCP server. The skill's value was not
its Mealie endpoints but ~25 operational rules found by running imports against
the live instance; those are now code with tests rather than prompt text.

The server owns deterministic mechanics — auth, the non-default User-Agent
Cloudflare requires, the `extension` field on cover uploads, PATCH instead of
the 500-ing bulk-action endpoints, decimal-comma normalization, and restoring
Swedish display text after parsing. Language and taste judgement stay with the
model, fed by the four reference notes shipped as MCP resources.

verify_recipe runs the finished-import definition as code so an agent cannot
report success on a recipe with an English ingredient line, a missing cover, or
ingredients still in the "Click Parse" state.

Home Assistant is optional and isolated; the Obsidian meal plan is out of scope.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-07-31 07:31:10 +02:00
committed by fredamn76
commit f2d233b430
17 changed files with 1643 additions and 0 deletions
+44
View File
@@ -0,0 +1,44 @@
# Allrecipes post-import pitfalls
Den här referensen dokumenterar konkreta fel som observerats i live-körning mot Fredriks Mealie-instans och ska användas när recept importeras från Allrecipes eller andra engelskspråkiga receptsidor.
## Verifierade problem
### 1. `image` i API betyder inte nödvändigtvis att omslagsbilden syns i UI
- Ett recept kan ha ett icke-tomt `image`-fält och ändå sakna synlig omslagsbild i gränssnittet.
- Därför måste importflödet alltid köra ett explicit bildsteg efter import.
- För lokal upload på Fredriks Mealie-instans måste `PUT /api/recipes/<slug>/image` skicka med multipart-fältet `extension` (t.ex. `jpg` eller `webp`). Utan det kan uppladdningen fastna i validering och bilden blir inte korrekt sparad.
### 2. Bulk-actions för taggar/kategorier är opålitliga i denna instans
Följande endpoints gav 500-fel under verkliga körningar:
- `/api/recipes/bulk-actions/tag`
- `/api/recipes/bulk-actions/categorize`
Använd i stället direkt PATCH på receptets `tags` och `recipeCategory`.
### 3. Mealie-parsern kan förstöra svenska display-rader
Exempel på observerade fel:
- `4,7 dl basmatiris` blev något i stil med `4710 liter ...`
- parsern gav konstiga bråktecken, dubblerade enheter och skräptecken i `display`
- vissa parser-resultat gav märkliga `food.name`-värden för svenska rader
### 4. Svensk decimal-komma är känsligt
Parsern hanterar ofta struktur bättre om decimal-komma först normaliseras till punkt för parseranropet, men den normaliserade raden ska inte användas som slutlig `display` i Mealie.
## Rekommenderad motstrategi
1. Bevara alltid en canonical svensk ingrediensrad separat.
2. Använd parsern endast för `quantity`, `unit`, `food`.
3. Återställ den mänskliga svenska raden till `display` och `note` efter parse.
4. Om parsern ger `food.name` utan `id` och du behöver strukturen kvar efter PATCH, skapa/återanvänd riktig Mealie food först.
5. För Allrecipes: om scrape-bild inte blir stabil i UI, ladda ner hero-bilden och använd `PUT /api/recipes/<slug>/image`.
6. Om Köket.se- och YouTube-importer fortsätter att visa fungerande omslagsbilder medan Allrecipes-importer inte gör det, behandla det som ett källspecifikt Allrecipes-problem. Gå då direkt till explicit hero-bild-download + `PUT /api/recipes/<slug>/image` i stället för bredare generell felsökning.
7. Om parsern fortfarande gör visningen ful efter cleanup, välj läsbarhet före struktur för just de trasiga raderna: nollställ `quantity` / `unit` / `food` och spara rena svenska `display` / `note` i stället för att behålla dålig automatisk rendering.
## Definition av klar import
Ett importerat recept räknas inte som klart förrän:
- svensk titel/beskrivning/instruktioner är satta
- `recipeIngredient[].display` ser normala ut för människa
- parsern inte lämnar receptet i `Click Parse`-läge
- bild har satts eller verifierats explicit
- taggar/kategorier är applicerade eller medvetet hoppade över