API HelloFresh réelle câblée + filtrage coco validé en local
- Endpoints découverts: menu (menus-service) + détails batch (recipes/recipes) - get_menu en 2 temps: menu (ids) -> batch détails (ingrédients/allergènes) - Fix faux positifs: exclusion sur ingrédients/allergènes/nom, plus sur les tags (HelloFresh pose un tag interne 'coconut' sur ~la moitié des recettes) - Token mis en cache (pas de navigateur si frais) - endpoints.json versionné (sans secret), semaine optionnelle (défaut = courante) - Testé: 4 recettes coco/85 détectées, shortlist classée, tous les outils MCP OK - set_selection (écriture) reste à découvrir sur un compte avec box active
This commit is contained in:
22
server.py
22
server.py
@@ -52,35 +52,37 @@ def hf_list_weeks() -> list[dict]:
|
||||
|
||||
|
||||
@mcp.tool()
|
||||
def hf_get_menu(week: str) -> dict:
|
||||
def hf_get_menu(week: str = "") -> dict:
|
||||
"""Toutes les recettes proposées pour une semaine, chacune annotée.
|
||||
|
||||
Chaque recette porte `contains_excluded` (true si elle contient un ingrédient banni,
|
||||
coco en tête) et `matched_excludes` (quels termes ont matché).
|
||||
`week` vide = semaine courante (format 'YYYY-Www'). Chaque recette porte
|
||||
`contains_excluded` (true si ingrédient banni, coco en tête) et `matched_excludes`.
|
||||
"""
|
||||
w = week or api.current_week()
|
||||
with api.HelloFreshClient() as client:
|
||||
recipes = client.get_menu(week)
|
||||
recipes = client.get_menu(w)
|
||||
hf_filter.annotate(recipes)
|
||||
return {
|
||||
"week": week,
|
||||
"week": w,
|
||||
"count": len(recipes),
|
||||
"recipes": [r.summary() for r in recipes],
|
||||
}
|
||||
|
||||
|
||||
@mcp.tool()
|
||||
def hf_propose(week: str, count: int = 0) -> dict:
|
||||
def hf_propose(week: str = "", count: int = 0) -> dict:
|
||||
"""Shortlist de recettes SANS ingrédient exclu, classée par préférences.
|
||||
|
||||
`count=0` renvoie toutes les recettes sûres. Étape « je propose » : rien n'est écrit
|
||||
sur le compte ici — utiliser hf_confirm_selection() ensuite.
|
||||
`week` vide = semaine courante. `count=0` renvoie toutes les recettes sûres.
|
||||
Étape « je propose » : rien n'est écrit ici — utiliser hf_confirm_selection() ensuite.
|
||||
"""
|
||||
w = week or api.current_week()
|
||||
with api.HelloFreshClient() as client:
|
||||
recipes = client.get_menu(week)
|
||||
recipes = client.get_menu(w)
|
||||
safe = hf_filter.propose(recipes, count=count or None)
|
||||
excluded = [r.summary() for r in recipes if r.contains_excluded]
|
||||
return {
|
||||
"week": week,
|
||||
"week": w,
|
||||
"proposed": [r.summary() for r in safe],
|
||||
"excluded_for_coco_etc": excluded,
|
||||
"note": "Aucune écriture effectuée. Confirme avec hf_confirm_selection(week, recipe_ids).",
|
||||
|
||||
Reference in New Issue
Block a user