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-mcpfind 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.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Menu language for resolving names, e.g. "en" or "el". | |
| comment | No | Special instructions for this item. | |
| dry_run | No | Resolve and price only; do not modify the basket. | |
| options | No | Option selections by name (menu language) or code. Required tiers auto-fill if omitted. | |
| quantity | No | Quantity (default 1). | |
| item_code | Yes | The item `code` from the menu (e.g. "IT_000000000083"). | |
| restaurant_id | Yes | Restaurant/shop id the item belongs to. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description fully discloses key behaviors: resolves names to codes, auto-fills required choices, computes price, rejects out-of-stock items, appends to basket, returns catalog on unknown names, and dry_run does not save. This is comprehensive for a mutation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a dense paragraph but every sentence provides useful information. It is front-loaded with the main action and then details behaviors and parameters. It could be slightly more structured with bullets, but it remains concise and to the point.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the main workflow, failure case, language handling, and dry_run mode. However, since there is no output schema, it does not explicitly state what a successful add returns (e.g., updated cart or confirmation), which is a minor gap. Overall, it is sufficiently complete for a complex mutation tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, but the description adds significant value beyond the schema. It explains the `options` parameter with an example, clarifies that names or codes are accepted, and describes `lang` default behavior and `dry_run` semantics, which are not obvious from the schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states 'Add a menu item to the shop's server-side basket' with a specific verb and resource. It also distinguishes from siblings by emphasizing the plain-language option resolution and no price math, making it specific to this tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use it (adding an item to the basket) and provides operational guidance like using plain-language names and dry_run for preview. It does not explicitly contrast with sibling tools, but the context is clear enough for an agent to select it correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| restaurant_id | Yes | Shop/restaurant id whose basket to clear. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations given, the description carries the full burden. It covers destructive action (delete), server-side scope, non-effect on placed orders, and authentication. Missing details like irreversibility or empty-basket behavior, but still substantive.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each adding essential information: the operation, the exclusion of order cancellation, and the auth requirement. No redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter destructive tool, the description covers the main contextual aspects: scope, side effects, and prerequisites. It omits response behavior or edge cases, but these are less critical given no output schema and the tool's simplicity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema fully describes restaurant_id with 100% coverage, and the description adds no further parameter-specific meaning. This matches the baseline of 3 for high schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action (delete) and resource (server-side basket entirely), distinguishing it from siblings like remove_item that target individual items. The phrase 'removes it from the efood app' reinforces the full-scope deletion.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides a clear exclusion ('does not cancel any placed order') and notes the authentication prerequisite, which informs when to use the tool. However, it does not explicitly name alternatives for order cancellation, leaving room for improvement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses that authentication is required and implies a read-only operation via 'List'. The note about the address id being necessary for orders gives insight into return semantics. While it doesn't cover every edge case (e.g., empty results), it is sufficient for a simple read tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with the core purpose, and every sentence adds value. The first sentence states the action, the second provides critical usage context and auth requirement. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only tool with no output schema, the description covers the essential context: what it lists, why it matters (address id for orders), and authentication. It does not explicitly describe the return structure, but the address id hint provides adequate completeness for this simple tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has zero parameters, so the description does not need to explain parameter semantics. Per the rubric, 0 parameters yields a baseline of 4. The description appropriately focuses on the output rather than inputs, making it fully adequate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'List the delivery addresses saved on your efood account.' This clearly states what the tool does and distinguishes it from sibling tools like place_order or get_payment_methods, as no other tool handles saved addresses.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context on when to use the tool: 'The id of an address is required to validate or place an order.' This implies the tool is used to retrieve address IDs for subsequent order operations. However, it does not explicitly mention alternatives or when not to use it, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Display language, e.g. "en" or "el" (default EFOOD_LANG). | |
| restaurant_id | Yes | Shop/restaurant id whose basket to read. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that this is a read operation ('Read'), which implies non-destructive behavior, and details the returned data (line items with names, options, quantities, prices, total). It adds the index information but does not address error cases or authentication requirements, which are undisclosed but acceptable given no annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences, front-loaded with the main purpose and then supporting details. No unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read tool with no output schema, the description adequately describes the return shape (line items with attributes and total) and notes the index field for remove_item. It does not mention error scenarios, but given the simplicity, it is fairly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both lang and restaurant_id are described in the schema. The description does not add parameter specifics, just references 'shop' which corresponds to restaurant_id, but the baseline of 3 applies since schema covers parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reads the current server-side basket, specifying the resource (basket) and the action (read). It distinguishes from siblings like clear_cart and remove_item by focusing on read-only access.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when you need to view the basket contents, mentioning that line items have an index used for remove_item, which hints at the read-then-modify workflow. However, it does not explicitly name alternative tools or state when not to use it, so it is clear but lacks explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max orders to return (default 20). | |
| restaurant_id | No | Only return orders from this restaurant id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states that the tool lists orders, returns them 'most recent first', includes specific fields, optionally filters, and requires authentication. This covers the key behavioral traits (ordering, read-only nature implied by 'list', authentication) and adds value beyond a minimal description. It doesn't disclose rate limits or error behaviors, but for a simple read operation this is sufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loaded with the main action and output details. Every sentence contributes: the first lists the tool's core function and return fields, the second adds an optional filter use case, and the third notes the authentication requirement. No wasted words, perfectly sized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite having no output schema, the description enumerates the exact fields returned (restaurant, date, total, payment method, status, items). It also conveys ordering, filtering, and authentication. For a list tool with only two optional parameters and no output schema, this fully covers what an agent needs to know to invoke it correctly and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: both 'limit' and 'restaurant_id' have schema descriptions. The tool description adds a contextual note about restaurant_id being useful for 're-ordering the usual', but does not add meaning beyond the schema. The baseline of 3 is appropriate since the schema already documents the parameters fully and the description's extra note is marginal.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('List your previous efood orders') and the specific resource (previous orders) with details on what each entry includes (restaurant, date, total, payment method, status, items). This differentiates it from siblings like get_order_status, which focuses on a single order, and search_restaurants, which is about finding restaurants. The verb+resource is explicit and unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides a clear use case: 'useful for re-ordering the usual' when filtering by restaurant. This implies when the tool is appropriate, and the optional restaurant filter adds context for a specific scenario. However, it does not explicitly name alternatives or state when not to use this tool (e.g., for live order tracking), so it lacks an explicit exclusion, keeping it from a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_order_statusGet order statusA
Retrieve the current status of an existing order by its id. Requires authentication.
| Name | Required | Description | Default |
|---|---|---|---|
| order_id | Yes | The order id returned by place_order. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It mentions that authentication is required and uses the verb 'retrieve' to indicate a read-only operation. However, it does not disclose behavior for missing orders, error responses, or side effects, and the return format is not described.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence that front-loads the core purpose and includes the important authentication constraint. There is no wasted wording or redundant detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple with one parameter, but the lack of an output schema means the description should specify what the return value contains. While 'current status' implies the output, it does not explain whether it is a simple string, an object, or how errors are reported. This leaves some ambiguity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%: the order_id parameter has a clear description stating it is returned by place_order. The tool description adds no additional parameter semantics, so it meets the baseline but does not exceed it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves the current status of an existing order by its id, using a specific verb and resource. This distinguishes it from sibling tools like get_order_history, which likely serve a different purpose. The input requirement (order id) is also explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage when an order id is available and current status is needed, but it does not explicitly state when to use this tool vs alternatives like get_order_history. No exclusions or alternative tool recommendations are provided, though the authentication requirement gives some usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description effectively discloses key behavioral traits: read-only operation, no exposure of full card numbers, and authentication requirement. This goes beyond a simple 'list' and addresses security and side-effect concerns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, each serving a distinct purpose: listing, usage, and safety/authentication. There is no redundancy or filler, making it highly concise and well-structured.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema or annotations, the description covers the essential context: purpose, usage with a sibling, read-only nature, security, and authentication. It doesn't mention pagination or empty-list behavior, but for a simple list tool, this is adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero parameters, so the empty schema provides no information. The description adds meaning by explaining that payment methods are 'opaque tokens' and that a returned token is used with place_order, which helps the agent understand the data's purpose beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's action ('List the payment methods saved on your efood account') with a specific verb and resource, and distinguishes it from siblings like get_addresses by focusing on payment methods and tokens.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit integration guidance ('Use a returned payment token with place_order'), which implies the tool's role in the checkout flow. It lacks explicit exclusions of alternatives, but the context is clear enough for an agent to know when to invoke it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| confirm | No | Must be true to actually submit. Omit/false to preview only. | |
| address_id | Yes | Delivery address id (from get_addresses). | |
| delivery_type | No | Fulfilment type (default "delivery"). | |
| payment_token | No | Saved payment token, if paying by card. | |
| restaurant_id | Yes | Shop/restaurant id whose basket to order. | |
| payment_method | No | Payment method, e.g. "cash" or "card" (default "cash"). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses critical behavioral traits beyond the destructiveHint annotation: it charges the chosen payment method, cannot be undone, performs validation against the delivery address, returns a summary, and requires explicit user approval before confirming. This adds substantial context about side effects and safety flow.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but extremely well-structured: it front-loads the main purpose and consequence, then provides a clear 'Safety:' callout with the two-step flow, and ends with a practical payment note. No filler words; every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (destructive, no output schema, 6 parameters), the description fully covers the decision-relevant aspects: what it does, consequences, safety confirmation flow, payment options, and validation behavior. It also references related tools for prerequisites, making it complete for an agent to use correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds extra meaning by explaining the two-phase confirm behavior (preview vs actual submit) and the payment limitation (no card entry, must use cash or saved token). It also references get_payment_methods, which is helpful for understanding the payment_token parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states this tool submits the shop's server-side basket as a real order, with the explicit consequence of charging the user's payment method and being irreversible. It uses a specific verb ('Submit') and identifies the resource (server-side basket → efood order), clearly distinguishing it from siblings like clear_cart or get_cart.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs to call with confirm:false first to preview/validate, and only call confirm:true after user approval. Also provides an exclusion: card details cannot be entered here, pointing to get_payment_methods for payment tokens. This gives clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| index | Yes | Zero-based index of the line to remove (from get_cart). | |
| restaurant_id | Yes | Shop/restaurant id. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so description carries burden. It discloses that authentication is required and that removing the last line clears the basket—a meaningful side effect. Could add more about response or reversibility, but the key behavioral traits are covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences: first states action and key parameter, second notes a critical side effect, third states auth requirement. No fluff, front-loaded, every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple 2-parameter mutation tool with no output schema, the description covers purpose, parameter source, side effect, and authentication. It is sufficiently complete for an agent to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema already fully describes both parameters (index from get_cart, restaurant_id). The description adds little beyond the schema, mainly reinforcing that index comes from get_cart. Baseline 3 is appropriate given 100% schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it removes a single line from the basket by index, explicitly distinguishing from clear_cart (which would remove all lines). References get_cart for index lookup, making the action unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context: use to remove one specific line via index, and references get_cart. However, it does not explicitly mention alternatives like clear_cart for removing the whole cart, so it lacks explicit when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| lat | No | Latitude of the delivery location. | |
| lng | No | Longitude of the delivery location. | |
| lang | No | Result language, e.g. "en" or "el" (default EFOOD_LANG). Match the conversation. | |
| sort | No | Sort order for the results. | |
| limit | No | Max results (default 25). | |
| query | No | Case-insensitive filter on restaurant name. | |
| address | No | Free-text address, used only if lat/lng are not given. | |
| cuisine | No | Case-insensitive filter on cuisine. | |
| open_now | No | Only return currently open restaurants. | |
| vertical | No | Filter by vertical (e.g. "food", "groceries"). | |
| has_offers | No | Only restaurants that currently have offers. | |
| min_rating | No | Minimum average rating. | |
| favorites_only | No | Only your favorited restaurants (requires authentication). | |
| max_delivery_fee | No | Maximum delivery fee. | |
| max_minimum_order | No | Maximum minimum-order amount. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses key behaviors: lat/lng preferred, address geocoding via OSM, no login needed for public search, and the location-scoped nature of favorites when credentials are configured. This adds meaningful context beyond the schema, though it omits potential details like rate limits or error handling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, with the primary purpose front-loaded. Each sentence delivers distinct value: what it finds, how to locate, and authentication/favorites behavior. There is no redundancy or fluff; it is appropriately detailed for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 15 parameters and no output schema, the description covers the essential usage modes and auth variations. It mentions the is_favorite flag and favorites_only behavior, which hints at the result structure. It does not describe the full return format or pagination, but for a search tool this is a minor gap; the core functionality is well explained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value by noting lat/lng are 'preferred,' explaining that address is geocoded via OpenStreetMap, and clarifying that favorites_only requires authentication and that favorites are inherently location-scoped. These details go beyond the property descriptions in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'Find restaurants/shops that deliver to a location on efood.gr.' This clearly distinguishes it from sibling tools like cart, order, and menu operations. It also narrows the scope to location-based delivery, making the purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit usage context: provide lat/lng (preferred) or a free-text address geocoded via OpenStreetMap, and optional filters. It also differentiates public search from authenticated search with favorites. While it doesn't explicitly say 'use this when searching restaurants,' the siblings make it the only search tool, so the guidance is clear and sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
12 tool updates
v0.1.0- First observed
add_item - First observed
clear_cart - First observed
get_addresses - First observed
get_cart - First observed
get_menu_item_options - First observed
get_order_history - First observed
get_order_status - First observed
get_payment_methods - First observed
get_restaurant_menu - First observed
place_order - First observed
remove_item - First observed
search_restaurants
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
- mcpOAuthcom.zomato
An MCP server that exposes functionalities to use Zomato's services.
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
Guest API for meni.ge restaurants: browse menus, place orders, reserve tables. No auth needed.
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.238-
- AlicenseAqualityDmaintenanceMCP server for Getir partner API (Turkey). Manage orders, products, pricing, and store status for your Getir restaurant via Bearer token authentication.86 npmMIT
- AlicenseAqualityAmaintenanceMCP server for browsing Glovo stores, menus, products, and managing a basket via API calls without checkout or payment.273MIT