MCP server for Lufa Farms grocery shopping. Exposes Lufa Farms grocery shopping as MCP tools so an AI agent can browse products, manage a basket, and inspect orders on behalf of the user.
Server has 13 tools with consistent naming (verb_noun pattern: lufa_*) and detailed descriptions (avg 180 chars). All tools have input schemas with type definitions and parameter descriptions. However, output schemas are not documented, responses are inferred from code but not formally declared. Error handling returns structured {success, message} but lacks recovery guidance. No tool annotations (readOnlyHint/destructiveHint). Parameter validation is present but minimal. Missing pagination for list-like tools (lufa_get_products). Overall solid foundation but lacks production-grade polish.
Add or remove a product from the user's favorites list. Favorites appear prominently in the marketplace next week, making it easy to reorder frequently purchased items. Requires an active session.
Add a product to the basket. Changes take effect immediately (there is no separate draft state) — verified live: basket total updated right after the call, with no save_basket needed to see it reflected. Products that come in multiple sizes/formats (e.g. "family format") are listed as separate product IDs, not a weight variant of the same product — check the `sub_products` field from `lufa_get_product_details` to find them, then add the desired variant's ID directly. Requires an active session.
Check whether there is an active Lufa Farms session. This makes a live request rather than just checking for a saved cookie. If a `note` field is present, the session cookie exists but its validity couldn't be fully confirmed (see the note text for why) — tool calls may still work, or may come back asking for a re-login.
Retrieve delivery metadata for the current order, including a countdown. Returns the delivery date, address, and delivery time window, plus two computed fields: `delivery_window_starts_at` (ISO timestamp) and `time_until_delivery` (e.g. "3d 22h") — how long until the delivery window opens. Lufa's API doesn't expose an explicit order-cutoff field, so treat this as a useful approximation of how much time is left, not a confirmed deadline — Lufa may stop accepting basket changes some time before the delivery window actually opens. Requires an active session.
Output schemas not documented. Tool descriptions explain what is returned (e.g., 'Returns product IDs, names, prices, producers, and category tags') but formal JSON Schema output definitions are absent. LLMs cannot plan downstream tool calls or extract fields reliably without documented response structures.
No tool annotations (readOnlyHint, destructiveHint, idempotentHint). Tools like lufa_logout and lufa_add_to_basket modify state but lack explicit destructiveHint. Clients cannot determine which tools are safe to retry or require confirmation.
lufa_get_products lacks pagination. Description states 'Retrieve the full product catalog' but no limit, offset, or cursor parameters. Large catalogs will blow context windows. Should accept limit (default 20-50) and offset/cursor.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 63 | 2026-07-28+ | v2 |
Retrieve the nutritional information panel for a product. Returns calories, macronutrients, and ingredient list.
Show the current or upcoming order summary. Returns the delivery date, pickup location, basket breakdown, and final totals. Requires an active session.
Get detailed information for a specific product. Returns name, price, producer, category, weight, and organic status, looked up from the full marketplace catalog.
Retrieve the full product catalog for the current order week. Returns product IDs, names, prices, producers, and category tags. Requires an active session.
Log out from Lufa Farms and erase the saved session from disk.
Remove a quantity of a product from the basket. Requires an active session.
Not required for normal use — kept only for backwards compatibility. lufa_add_to_basket / lufa_remove_from_basket already persist to the server immediately; there is no "confirm order" step anywhere in Lufa's actual site (no such button or endpoint exists in the marketplace frontend). This calls a legacy per-product endpoint with no product specified, which is effectively a no-op that returns success trivially. Requires an active session.
Search the Lufa Farms marketplace by keyword. Use this to quickly locate a specific item without loading the full catalog.
Show the current basket contents. Returns all items, quantities, unit prices, and the running order total. Requires an active session.
Error responses lack recovery guidance. Tools return {success: False, message: '...'} but do not suggest next steps. E.g., 'product_id must not be empty' should suggest 'Call lufa_search_products() to find a product ID.'
lufa_save_basket is a legacy no-op. Description acknowledges it 'is effectively a no-op that returns success trivially.' This tool should be removed entirely, it adds confusion and wastes agent reasoning cycles. If backwards compatibility is required, deprecate it explicitly in the server instructions.