efood-mcp
An unofficial Model Context Protocol server for the efood.gr consumer app API that lets you discover restaurants, browse menus, build a cart, and place real orders on efood.gr.
README
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 (developer-qc.e-food.gr, efood.partner.deliveryhero.io) |
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 (api.e-food.gr) |
The efood mobile app / website — browse and order as a customer | ✅ This. Unofficial/undocumented. |
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 build
Copy the env template and fill it in:
cp .env.example .env
- Discovery 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.js
Or 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.js
Then 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.
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。