Lufa Farms MCP Server
You can use this server to let an AI agent manage your Lufa Farms grocery shopping: browse/search the catalog, get product details and nutrition, manage your basket, save favorites, and check your upcoming order and delivery info — all through natural language.
Authentication: Check login status (
lufa_auth_status) and log out (lufa_logout). Note: login is performed manually via CLI.Product discovery: Browse the weekly catalog (
lufa_get_products), search by keyword (lufa_search_products), get detailed info (lufa_get_product_details), and fetch nutritional facts (lufa_get_nutritional_facts).Basket management: View basket contents and totals (
lufa_view_basket), add products with optional quantity (lufa_add_to_basket), remove products (lufa_remove_from_basket), and add or remove favorites (lufa_add_favorite).lufa_save_basketis a legacy no-op retained for backwards compatibility.Order information: View upcoming order summary (
lufa_get_order_details) and delivery details with a countdown (lufa_get_checkout_info).Integration: Works as a standard stdio MCP server with any MCP-compatible client (e.g., Claude, Cursor).
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Lufa Farms MCP Server Add two heirloom tomatoes and a sourdough loaf to my basket."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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
Python 3.12+
A Lufa Farms account (https://montreal.lufa.com)
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.mdSetup
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 Desktop |
|
Cursor |
|
Windsurf |
|
GitHub Copilot (VS Code) |
|
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 loginIt 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 |
| Log out and erase the saved session |
| 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 |
| Browse the full weekly catalog |
| Search by keyword (e.g. |
| Get description, price, producer, and availability for one product |
| Get the nutritional panel (calories, macros, ingredients) |
Basket
Tool | Description |
| See current basket contents and totals |
| Add a product (with optional quantity) |
| Remove a product |
| Not required — kept for backwards compatibility, see note below |
| 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 |
| View the upcoming order: date, pickup point, totals |
| 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
A GET to
/en/loginseeds thePHPSESSIDcookie.A POST to
/en/loginsubmits the YiiLoginForm(fields:LoginForm[user_email],LoginForm[password]).The session is validated against
/superMarket/GetUserOrderDetails.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 |
|
| Seed session cookie |
|
| Authenticate |
|
| Full catalog (also used to look up a single product) |
|
| Long description |
|
| Nutritional facts |
|
| Full-text search |
|
| Basket contents / order summary |
|
| Add to basket |
|
| Remove from basket |
|
| Legacy per-product add/set (not a basket-wide commit) |
|
| Add/remove favorite ( |
|
| Delivery date, address, time window |
Contributing
See CONTRIBUTING.md.
Security
See SECURITY.md for the threat model and how to report an issue.
License
Available Tools
13 toolslufa_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
Scored across 13 tools
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.
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.
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.
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
Related MCP Connectors
Search live store shelves, verify delivery windows, and run instant AI agent checkouts.
Live product discovery for AI shopping agents, with shopper-approved retailer handoff.
Food list analyzer and cited food answers for agents. Also recipes, meal plans and grocery lists.
Live product search for AI agents across Shopify merchants and major retailers.
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables 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
- AlicenseNot gradedqualityCmaintenanceEnables 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
- FlicenseNot gradedqualityAmaintenanceEnables 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.-
- FlicenseNot gradedqualityAmaintenanceEnables 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.-