efood-mcp
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., "@efood-mcp find sushi restaurants near me and show their menus"
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.
efood-mcp
An unofficial Model Context Protocol server for the efood.gr consumer app API. It lets an MCP client (Claude Code, Claude Desktop, etc.) discover restaurants, browse menus, build a cart, and place orders on your behalf.
⚠️ Read the Disclaimer before using this. This talks to efood's private, undocumented app API. The account/order features are not sanctioned by efood and using them may violate efood's Terms of Service.
place_orderspends real money.
What this is (and isn't)
efood has two very different APIs:
API | Who it's for | This project? |
Partner API ( | Shops/vendors selling on efood — manage catalog, incoming orders, promotions | ❌ Not this. It has no way to browse restaurants or order as a customer. |
Consumer app API ( | The efood mobile app / website — browse and order as a customer | ✅ This. Unofficial/undocumented. |
Related MCP server: Uber Eats MCP Server
Tools
Discovery — no login required
search_restaurants— restaurants delivering to alat/lng(or geocodedaddress), with filters (open_now,query,cuisine,min_rating,has_offers,max_delivery_fee,max_minimum_order,vertical,favorites_only) andsort. When credentials are configured, results include anis_favoriteflag;favorites_only:truereturns only your favorited places that deliver to that location (favorites are location-scoped — efood has no global favorites list, so this uses the listing's server-sidefilters={"is_favorite":true}).get_restaurant_menu— full menu (categories + priced items), hours, offers, discounts. Each item carries anavailableflag (false = out of stock / "Μη διαθέσιμο"; such items fail order validation). Passavailable_only: trueto drop out-of-stock items and empty categories.get_menu_item_options— customization/variation options for an item.
All three discovery tools (and add_item) accept an optional lang (e.g. "en", "el").
efood localizes menu/option names via Accept-Language; EFOOD_LANG sets the default (en), and
lang overrides per call — set it to match the conversation so option names line up with search
terms. Codes and prices are identical across languages.
Account — requires authentication
get_addresses— your saved delivery addresses (for theaddress_idused at checkout).get_payment_methods— your saved payment methods as opaque tokens (no card numbers).get_order_history— your previous orders (most recent first) with restaurant, date, total, payment, status, and items; optionalrestaurant_idfilter for re-ordering the usual.get_order_status— status of an existing order.
Cart — efood's server-side basket (there is no local cart)
Every cart tool takes a restaurant_id and operates on that shop's persistent basket — the one shown
in the efood app. add_item/remove_item read the basket, change it, and re-persist it; no address
is needed until checkout.
add_item— add a customizable item by naming its options:item_code+options(names or codes), e.g.["traditional pita","tomato","tzatziki"]. Resolves names→codes, auto-fills required choices (bread / all-vs-choose), computes the price, rejects out-of-stock.dry_runpreviews; unknown names return the option catalog.lang= the language of the option names you pass.get_cart— read the basket: indexed line items with options, quantities, prices, and total.remove_item— remove a line by itsindex(fromget_cart); removing the last line clears it.clear_cart— delete the shop's basket entirely (removes it from the app).
Checkout — real purchase
place_order— submits the shop's basket as a real, paid order.confirm:false(default) validates against the deliveryaddress_idand returns a summary (items, total, fees, min-order);confirm:truesubmits. Cash on delivery or a saved payment token only (no card entry).
Setup
Requires Node.js 20+.
npm install
npm run buildCopy the env template and fill it in:
cp .env.example .envDiscovery tools need no configuration.
Account/cart/checkout tools need credentials in
.env:EFOOD_EMAIL+EFOOD_PASSWORD— the server logs in programmatically and caches the session.or
EFOOD_SESSION_ID— a session id you captured yourself (takes priority; see below).
How credentials are handled
Your password is read only from your local .env/environment and is sent only to efood's own
/api/v1/user/login endpoint to obtain a session id. It is never logged, printed, or sent anywhere
else. The resulting session id is cached in memory and sent as the x-core-session-id header.
If programmatic login is blocked (e.g. device verification), log in yourself in the efood app or
website, copy the x-core-session-id value from a request in your browser's dev tools (Network
tab), and set it as EFOOD_SESSION_ID.
Use with Claude Code
Use the absolute path to the built dist/index.js in this project:
claude mcp add efood -- node /absolute/path/to/efood-mcp/dist/index.jsOr add to a project .mcp.json:
{
"mcpServers": {
"efood": {
"command": "node",
"args": ["/absolute/path/to/efood-mcp/dist/index.js"]
}
}
}Quick check (no credentials needed)
Inspect the tools interactively:
npx @modelcontextprotocol/inspector node dist/index.jsThen call search_restaurants with lat=37.9838, lng=23.7275 (central Athens) — you should get a
list of restaurants. get_restaurant_menu with one of the returned ids returns its menu.
Typical flow
search_restaurants → get_restaurant_menu → add_item … → get_cart → get_addresses
→ place_order (preview, confirm:false) → place_order (confirm:true).
Disclaimer
Unofficial & undocumented.
api.e-food.gris efood's private app API. It may change or break at any time, rate-limit you, or flag/suspend your account. Use at your own risk.Most of the API has been verified live: discovery (search, menus, options), authentication, addresses, payment methods, order history, favorites, availability, and the full server-side cart flow (
add_item/get_cart/remove_item/clear_cart) including order validation. The paths not yet exercised are the final real-order submission (place_orderwithconfirm:true) and order-status lookup — their request shapes derive from an older community SDK (kpapadatos/efoodgr) and will be tested and verified in a future pass.place_orderspends real money. It cannot enter card details — pay with cash on delivery or a saved payment token. Always confirm the exact items and total first.Not affiliated with, endorsed by, or supported by efood / Delivery Hero.
Available Tools
12 toolsadd_itemAdd an item to the cart (auto-resolve options)A
Add a menu item to the shop's server-side basket by naming its options in plain language — no raw codes or price math. Give item_code and an options list (names as they appear in the menu, or codes), e.g. ["traditional pita","tomato","tzatziki"]. It resolves each name to a code, auto-fills required choices (bread; all-vs-choose), computes the price, rejects out-of-stock items, and appends the line to the basket (visible in the efood app). Pass lang matching the language of your option names (default EFOOD_LANG). Unknown names return the option catalog so you can retry. dry_run previews the resolved line without saving.
Inputs: item_code (required), restaurant_id (required), lang, comment, +3 more.
clear_cartClear the cartA
Delete the shop's server-side basket entirely (removes it from the efood app). Only affects the saved basket — it does not cancel any placed order. Requires authentication.
Inputs: restaurant_id (required).
get_addressesGet saved addressesA
List the delivery addresses saved on your efood account. The id of an address is required to validate or place an order. Requires authentication.
Inputs: no named parameters.
get_cartGet the cartA
Read the shop's current server-side basket (the one shown in the efood app): line items with names, options, quantities, prices, and total. Each line has an index for remove_item.
Inputs: restaurant_id (required), lang.
get_order_historyGet order historyA
List your previous efood orders, most recent first — each with restaurant, date, total, payment method, status, and the items ordered. Optionally filter to a single restaurant (useful for re-ordering the usual). Requires authentication.
Inputs: limit, restaurant_id.
get_order_statusGet order statusA
Retrieve the current status of an existing order by its id. Requires authentication.
Inputs: order_id (required).
get_payment_methodsGet saved payment methodsA
List the payment methods saved on your efood account (e.g. stored cards, as opaque tokens). Use a returned payment token with place_order. This is read-only and does not expose full card numbers. Requires authentication.
Inputs: no named parameters.
place_orderPlace order (real purchase)ADestructive
Submit the shop's server-side basket as a REAL efood order. This charges your chosen payment method and cannot be undone from here. Safety: call with confirm:false (default) first — it validates against the delivery address and returns a summary (items, total, fees, min-order); only call confirm:true after the user has explicitly approved. Card details cannot be entered here — pay with cash on delivery or a saved payment token (see get_payment_methods).
Inputs: address_id (required), restaurant_id (required), confirm, delivery_type, +2 more.
remove_itemRemove a cart lineA
Remove a single line from the basket by its index (see get_cart). Removing the last line clears the basket. Requires authentication.
Inputs: index (required), restaurant_id (required).
search_restaurantsSearch restaurantsA
Find restaurants/shops that deliver to a location on efood.gr. Provide either lat+lng (preferred) or a free-text address (geocoded via OpenStreetMap). Optional filters narrow and sort the results. No login required for public search; when credentials are configured, results include an is_favorite flag, and favorites_only:true returns only your favorited places that deliver to this location (favorites are inherently location-scoped — there is no global favorites list).
Inputs: lat, lng, lang, sort, +11 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 12 tools
Each tool targets a distinct resource (restaurant, menu, cart, order, account) and action, with clear boundaries. Even cart-related tools are unambiguous: add_item, remove_item, get_cart, and clear_cart perform different operations on different scales.
Every tool follows the verb_noun pattern with underscores, using consistent verbs like get, add, remove, clear, search, and place. Minor singular/plural variations (e.g., get_addresses vs get_cart) are natural and do not break the pattern.
With 12 tools, the server is well-scoped for a food delivery domain. It covers restaurant discovery, menu browsing, cart management, order placement, and order tracking without unnecessary bloat or missing core actions.
The core ordering lifecycle is fully covered: search restaurants, fetch menus, customize items, manage cart, place order, and check status. Minor gaps such as editing cart line quantities or canceling an order exist, but agents can work around them (e.g., remove and re-add items).
Maintenance
Related MCP Connectors
An MCP server that exposes functionalities to use Zomato's services.
Per-restaurant MCP servers: menu, hours, delivery terms; live example below
Unlock the power of food transparency with our Open Food Facts MCP server. Easily look up any food
Unofficial read-only MCP server for VeryChic hotel offers
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceA proof-of-concept server implementing the Model Context Protocol that enables LLM applications to interact with Uber Eats functionality.1-
- FlicenseNot gradedqualityDmaintenanceA proof-of-concept Model Context Protocol server that enables LLM applications to interact with Uber Eats, allowing AI agents to browse and order food through natural language.240-
- AlicenseAqualityDmaintenanceMCP server for Getir partner API (Turkey). Manage orders, products, pricing, and store status for your Getir restaurant via Bearer token authentication.86 npmMIT
- AlicenseAqualityCmaintenanceMCP server for browsing Glovo stores, menus, products, and managing a basket via API calls without checkout or payment.274MIT