MCP server that lets an AI agent do the groceries on labellevie.com — up to a ready-to-pay cart. Payment is never automated.
La Belle Vie MCP server demonstrates solid tool design with comprehensive schemas, clear descriptions, and thoughtful error handling. All 20 tools have explicit Zod schemas with type definitions and parameter descriptions. Tool names follow verb_noun convention (search_products, add_to_cart, etc.). Descriptions are detailed and contextual (avg ~150 chars), explaining WHAT, WHEN, and prerequisites. Error handling is production-grade with recovery guidance (notConnected() nudge, LbvApiError categorization). Key strengths: idempotent read operations, clear auth gating, structured output with euro() formatting. Gaps: no tool annotations (readOnlyHint/destructiveHint), some parameter descriptions could be more prescriptive about formats/constraints, output schemas documented in code but not formally exposed in tool registration.
Add a product to the basket by product id. Quantity defaults to 1.
Add a product to a favorites list by product id. The list can be identified by id or created by name. Requires a connected account.
Explore the store's category taxonomy. No arguments → the top-level aisles (Primeur, Fromagerie, Épicerie…); parentId → that category's subcategories; query → find categories by name (accent-insensitive) with breadcrumb paths. Use a returned id as categoryId in search_products to filter results.
Check whether La Belle Vie delivers to a postal code.
Get a one-time secure link to connect your La Belle Vie account. Your password is never sent through this chat — it is only sent to La Belle Vie via the secure link.
Show which La Belle Vie account is connected (if any).
Missing tool annotations (readOnlyHint, destructiveHint, idempotentHint). Tools are marked with Risk: READ_ONLY|WRITE|DESTRUCTIVE in metadata but not exposed via MCP tool annotations, limiting agent planning optimization.
Output schemas not formally documented in tool registration. Descriptions mention returned fields (id, name, price, unit, stock, categories) but structured output schema is not exposed via CallToolResult.structuredContent consistently across all tools.
Parameter format constraints not fully specified. 'postalCode' accepts strings but no regex pattern or format hint (e.g., '5 digits' for French codes). 'slotKey' from get_delivery_slots lacks format documentation. LLMs cannot validate without explicit constraints.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 69 | 2025-06-18+ | v2 |
Disconnect and permanently delete the stored La Belle Vie credentials.
Remove all items from the basket.
List available delivery slots for a postal code. Each slot has a key (for prepare_checkout), a date, and a time window.
List the products in a past order by order id. Requires a connected account.
List the user's favorites lists and their products. Requires a connected account.
List the user's recent orders with dates, totals, and order ids. Requires a connected account.
List the user's usual (frequently ordered) products. Requires a connected account.
Prepare a ready-to-pay checkout summary for a postal code and delivery slot. Does NOT place or pay for an order. Requires a connected account.
Remove a product (or reduce its quantity) from the basket by product id.
Remove a product from a favorites list. Requires a connected account.
Add all products from a past order into the current basket. Requires a connected account.
Search the La Belle Vie catalog by keyword. Returns matching products with id, name, price, unit, stock, sale info and category names. Use the returned product id with add_to_cart. Keyword search can conflate meanings (e.g. "banane" returns fresh bananas AND banana-flavored candy) — pass a categoryId from browse_categories to keep only products in that category (and its subcategories).
Verify a promo code and show its discount. Requires a connected account.
Show the current basket: line items, quantities and totals.
Auth-gated tools (verify_promo, list_recent_orders, etc.) return notConnected() nudge but do not suggest next steps beyond 'call connect_account'. Error recovery could guide: 'Call connect_account, then retry this tool.'
No pagination guidance in browse_categories or list_favorites. If these return large result sets, LLMs lack offset/limit parameters to control response size and avoid context window exhaustion.