Skip to main content
Glama
Lufa Farms MCP Server

Lufa Farms MCP Server

by FadiSheh

Lufa Farms MCP Server

Let an AI agent do your weekly grocery shopping on Lufa Farms.

"Add two portions of heirloom tomatoes, a sourdough loaf,
 and whatever goat cheese they have this week to my basket."

Disclaimer: This is an independent personal project, not affiliated with, endorsed by, or officially connected to Lufa Farms in any way. It wraps Lufa Farms' internal, undocumented web endpoints (see Discovered API endpoints) rather than any official or public API.


What is this?

An MCP (Model Context Protocol) server that wraps the Lufa Farms web API, exposing it as tools an AI agent (Claude, etc.) can call. You can browse the catalog, search for products, fill your basket, and inspect your upcoming order — all through natural language.

The server was reverse-engineered from the Lufa Farms web app's network traffic. It uses their internal /superMarket/* JSON endpoints, authenticated via a PHP session cookie.


Related MCP server: pc-express-mcp

Requirements

pip install -e .

This installs the lufa-farms-mcp (server) and lufa-farms (login CLI) commands.


Project structure

MCP-LufaFarms/
├── src/lufa_farms/
│   ├── server.py     # MCP server — tool declarations and dispatch
│   ├── client.py     # Async HTTP client for the Lufa Farms API
│   ├── cli.py        # `lufa-farms login` / `lufa-farms logout`
│   └── __main__.py   # `python -m lufa_farms` entry point
├── pyproject.toml    # Project metadata
└── README.md

Setup

This is a standard stdio MCP server, so it works with any MCP-compatible agent or client (Claude Code, Claude Desktop, Cursor, Windsurf, etc.) — not just one. After pip install -e ., add it to your client's MCP server config using the installed lufa-farms-mcp command:

{
  "mcpServers": {
    "lufa-farms": {
      "type": "stdio",
      "command": "lufa-farms-mcp"
    }
  }
}

Where that config lives depends on the client, e.g.:

Client

Config file

Claude Code

~/.claude.json

Claude Desktop

claude_desktop_config.json

Cursor

.cursor/mcp.json

Windsurf

~/.codeium/windsurf/mcp_config.json

GitHub Copilot (VS Code)

.vscode/mcp.json

Then restart the client. The tools will be available in every conversation.


Available tools

Authentication

Logging in is not an MCP tool — credentials must never be typed into the agent conversation. Run this yourself in a terminal instead:

lufa-farms login

It prompts for your email and password (password hidden, via getpass) and saves the resulting session to ~/.lufa_session.json. The agent only ever checks or clears that session:

Tool

Description

lufa_logout

Log out and erase the saved session

lufa_auth_status

Check whether you are currently logged in

Lufa sessions last ~30 days. If yours expires, any tool call will return a clear message telling you to run lufa-farms login again — no need to watch for raw HTTP errors.

Products

Tool

Description

lufa_get_products

Browse the full weekly catalog

lufa_search_products

Search by keyword (e.g. "tomatoes", "bread")

lufa_get_product_details

Get description, price, producer, and availability for one product

lufa_get_nutritional_facts

Get the nutritional panel (calories, macros, ingredients)

Basket

Tool

Description

lufa_view_basket

See current basket contents and totals

lufa_add_to_basket

Add a product (with optional quantity)

lufa_remove_from_basket

Remove a product

lufa_save_basket

Not required — kept for backwards compatibility, see note below

lufa_add_favorite

Save a product to your favorites for next week

lufa_add_to_basket / lufa_remove_from_basket persist to Lufa's server immediately — there is no "confirm order" step anywhere in Lufa's actual site (no such button or endpoint exists in the marketplace frontend), so lufa_save_basket has nothing to do and is kept only for backwards compatibility.

Orders

Tool

Description

lufa_get_order_details

View the upcoming order: date, pickup point, totals

lufa_get_checkout_info

View delivery date, address, time window, and a countdown to delivery


Example prompts

Search for goat cheese and add the cheapest one to my basket.
Show me everything in my basket and tell me the total.
Find all the bread products available this week and describe each one.
Remove the kale from my basket and replace it with spinach.
How much time do I have left before this week's order is delivered?

How authentication works

  1. A GET to /en/login seeds the PHPSESSID cookie.

  2. A POST to /en/login submits the Yii LoginForm (fields: LoginForm[user_email], LoginForm[password]).

  3. The session is validated against /superMarket/GetUserOrderDetails.

  4. All cookies are persisted to ~/.lufa_session.json — subsequent runs reuse them without re-logging in.


Delivery countdown

Lufa's API has no explicit "order cutoff" field. lufa_get_checkout_info fills that gap by computing a countdown from the delivery date and delivery window it does return: delivery_window_starts_at (an ISO timestamp) and time_until_delivery (e.g. "3d 22h"). This is time until your delivery window opens, not a confirmed order-lock deadline — Lufa may stop accepting basket changes some time before that, but exactly when hasn't been reverse-engineered. Treat it as a useful approximation, not a hard cutoff.


Discovered API endpoints

Method

Path

Purpose

GET

/en/login

Seed session cookie

POST

/en/login

Authenticate

POST

/superMarket/getAllProducts

Full catalog (also used to look up a single product)

POST

/superMarket/getProductDescription

Long description

POST

/en/products/GetNutrionalFactsForPopUp

Nutritional facts

GET

/search/marketplaceSearch

Full-text search

POST

/superMarket/GetUserOrderDetails

Basket contents / order summary

POST

/en/superMarket/addToBasket

Add to basket

POST

/en/superMarket/removeFromBasket

Remove from basket

POST

/en/superMarket/save

Legacy per-product add/set (not a basket-wide commit)

POST

/en/superMarket/addFavorite

Add/remove favorite (addFavorite: 1/0)

GET

/superMarket/getManageOrderComponentData

Delivery date, address, time window


Contributing

See CONTRIBUTING.md.

Security

See SECURITY.md for the threat model and how to report an issue.

License

GPL-3.0-or-later.

Available Tools

13 tools
lufa_add_favoriteA

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.

Args: product_id: Product ID to favorite/unfavorite. favorite: True to add to favorites, False to remove (default True).

Inputs: product_id (required), favorite.

lufa_add_to_basketA

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.

Args: product_id: Product ID to add. quantity: Number of units to add on top of the current basket quantity (default 1). This is an increment, not an absolute target quantity.

Inputs: product_id (required), quantity.

lufa_auth_statusA

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.

Inputs: no named parameters.

lufa_get_checkout_infoA

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.

Inputs: no named parameters.

lufa_get_nutritional_factsB

Retrieve the nutritional information panel for a product.

Returns calories, macronutrients, and ingredient list.

Args: product_id: Product ID to look up.

Inputs: product_id (required).

lufa_get_order_detailsA

Show the current or upcoming order summary.

Returns the delivery date, pickup location, basket breakdown, and final totals. Requires an active session.

Inputs: no named parameters.

lufa_get_product_detailsA

Get detailed information for a specific product.

Returns name, price, producer, category, weight, and organic status, looked up from the full marketplace catalog.

Args: product_id: Product ID from lufa_get_products or lufa_search_products.

Inputs: product_id (required).

lufa_get_productsA

Retrieve the full product catalog for the current order week.

Returns product IDs, names, prices, producers, and category tags. Requires an active session.

Inputs: no named parameters.

lufa_logoutA

Log out from Lufa Farms and erase the saved session from disk.

Inputs: no named parameters.

lufa_remove_from_basketA

Remove a quantity of a product from the basket.

Requires an active session.

Args: product_id: Product ID to remove. quantity: Number of units to remove (default 1). Pass a value >= the current basket quantity to remove the line entirely.

Inputs: product_id (required), quantity.

lufa_save_basketA

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.

Inputs: no named parameters.

lufa_search_productsA

Search the Lufa Farms marketplace by keyword.

Use this to quickly locate a specific item without loading the full catalog.

Args: query: Search term, e.g. "heirloom tomatoes", "sourdough bread", "goat cheese".

Inputs: query (required).

lufa_view_basketA

Show the current basket contents.

Returns all items, quantities, unit prices, and the running order total. Requires an active session.

Inputs: no named parameters.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4.2/5.0

    Scored across 13 tools

    Disambiguation5/5

    Each tool targets a distinct resource/action: authentication, product discovery, basket management, favorites, and order info. Even the potentially confusing get_products vs search_products are clearly separated (full catalog vs keyword lookup). The legacy save_basket is clearly marked as a no-op but remains distinct from other tools.

    Naming Consistency4/5

    Most tools follow the lufa_verb_noun pattern (get_products, add_to_basket, get_order_details). Two exceptions: lufa_auth_status (noun phrase rather than verb) and lufa_logout (verb only). Overall the prefix and verb style are consistent enough that the naming feels tidy.

    Tool Count5/5

    13 tools is a reasonable, well-scoped set for a grocery delivery MCP server. The count covers all major workflows without bloat: auth, product browsing, basket editing, favorites, and order status. No redundant or missing categories that would make the count feel excessive or thin.

    Completeness5/5

    The tool surface covers the full customer journey: browse/search products, get details and nutrition, manage basket, save favorites, and view order/checkout info. Auth is represented via status and logout (login is presumably handled out-of-band). The legacy save_basket is explicitly documented as unnecessary, so no functional gap exists.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      B
      maintenance
      Enables AI assistants to search the catalog, manage a cart and usual orders, find delivery slots, and handle favorites, shopping lists, past orders, and item remarks through the store's API, with login and payment left to the user on the website.
      MIT
    • A
      license
      Not graded
      quality
      C
      maintenance
      Enables an LLM to search grocery products, compare nutrition data, manage a PC Express cart, check loyalty points and order history, and generate a checkout handoff link across Loblaws banners such as Real Canadian Superstore, No Frills, and T&T. It never places orders or submits payment.
      MIT
    • F
      license
      Not graded
      quality
      A
      maintenance
      Enables AI assistants to search grocery products, manage shopping carts, view order and delivery details, and get personalized meal or frequent-item suggestions across Rohlik Group platforms such as Rohlik.cz, Knuspr.de, Gurkerl.at, Kifli.hu, and Sezamo.ro.
      -
    • F
      license
      Not graded
      quality
      A
      maintenance
      Enables AI assistants to search grocery products, build and manage shopping carts, and access account, order, delivery, and discount information through the Rohlik Group's online grocery delivery platforms. Supports multiple country-specific storefronts by selecting a regional base URL.
      -