Skip to main content
Glama
jspuij

ijburgeats-mcp

by jspuij

ijburgeats-mcp

An MCP server for ordering food delivery from IJburg Eats in Amsterdam. It lets an AI assistant (Claude Code, Claude Desktop, OpenClaw, or any MCP client) browse the restaurants, build a cart, reorder from your order history and place the order. You pay through a link you open yourself.

You:     Order the same as last Friday, as soon as possible, with iDEAL.
Claude:  I put that order back in the cart: Spicy Tuna Roll, Edamame Beans and
         a Poké bowl with quinoa. Delivery ASAP to your address, total €38.15
         incl. €0.35 iDEAL fee. Shall I place it?
You:     Yes.
Claude:  Order placed. Pay here to send it to the kitchen: https://pay.multisafepay.com/…

Unofficial. IJburg Eats has no public API. This server uses the same internal endpoints as the website's own JavaScript, which runs on the Cashdesk webshop platform. The endpoints are undocumented and can change at any time. This project is not affiliated with IJburg Eats or Cashdesk. Use it for your own orders, at a human pace.

Features

  • Browse: every IJburg Eats restaurant, its menu, and full-text search across all menus

  • Product options: required choices (side dish, base) and optional extras, with surcharges

  • Cart: add, change quantities, remove, clear

  • Order history and reorder (with an account): your past orders, and one call to put a past order back in the cart. Items are matched by name against today's menu, so dishes that disappeared are reported instead of guessed.

  • Delivery time: as soon as possible or a specific slot

  • Checkout with guard rails:

    • review_order shows exactly what will be ordered

    • place_order only succeeds at the total that was reviewed

    • payment methods can be restricted in the config

Related MCP server: doordash-mcp

How payment works

Ordering itself can be automated, but paying can't: iDEAL and card payments go through a MultiSafepay page. place_order returns that payment link. You open it in your browser and pay with your bank app, which is your final confirmation. The order is sent to the restaurant once paid.

Cash on delivery (WINKEL_Cash) needs no payment step at all, so it would let the assistant place an order nobody confirmed. If the server is reachable by more people or reads untrusted content (web search, messages), restrict it:

[policy]
allowed_payments = ["MSP_Ideal", "MSP_MASTERCARD", "MSP_VISA"]

A disallowed method is refused by the server before checkout is contacted, and it is hidden from the payment options the model sees.

Installation

Requires Python 3.11+ and uv.

git clone https://github.com/jspuij/ijburgeats-mcp.git
cd ijburgeats-mcp
uv sync

Configuration

mkdir -p ~/.config/ijburgeats
cp config.example.toml ~/.config/ijburgeats/config.toml
chmod 600 ~/.config/ijburgeats/config.toml

Fill in your details. Set IJBURGEATS_CONFIG to use a different path.

Section

Required

Used for

[customer]

yes

Name, contact details and delivery address for the checkout form; the postcode decides which restaurants deliver

[account]

no

Your ijburgeats.nl login: orders land in your account, and get_order_history and reorder work

[policy]

no

allowed_payments, see above

Claude Code

claude mcp add ijburgeats -s user -- uv --directory /path/to/ijburgeats-mcp run ijburgeats-mcp

Claude Desktop and other MCP clients

{
  "mcpServers": {
    "ijburgeats": {
      "command": "uv",
      "args": ["--directory", "/path/to/ijburgeats-mcp", "run", "ijburgeats-mcp"]
    }
  }
}

OpenClaw

openclaw mcp set ijburgeats '{"command":"/path/to/venv/bin/ijburgeats-mcp","env":{"IJBURGEATS_CONFIG":"/path/to/config.toml"}}'

OpenClaw prefixes the tool names (ijburgeats__place_order).

Tools

Tool

What it does

list_restaurants

Restaurants with their description and menu categories. The site only shows restaurant names as logos, so these identify them.

get_menu

One restaurant's products (id, price, description, has_choices), optionally one category

search_menu

Search products across all restaurants

get_product_options

addons (pick exactly one per group) and toppings (optional extras) for a product

add_to_cart

Add a product with its chosen options

view_cart

Items, delivery cost, total, minimum-order status

update_cart_item

Change a line's quantity; 0 removes it

clear_cart

Empty the cart

get_order_history

Past orders of the logged-in account

reorder

Put a past order back in the cart; reports skipped (no longer on the menu) and needs_choice (a required option didn't match)

get_delivery_times

Delivery slots for a day; ASAP is always accepted

review_order

Sets the delivery time and returns items, address, payment method and total_to_pay. Orders nothing.

place_order

Places the order. Needs expected_total equal to the reviewed total and returns the payment link. Marked destructive, so clients that ask for approval will ask.

Limitations

  • The cart lives in the server's web session, not in your account. A cart built here is not visible on the website, and it is lost when the server restarts.

  • One server process means one cart: every user of the same server shares it.

  • Not supported: pickup, coupons, loyalty points, and Tokoh (a separate webshop at tokoh.ijburgeats.nl).

  • The website's own "Bestel opnieuw" button is not used. In testing it dropped items and re-added the old payment fee as a product, so reorder rebuilds orders itself.

How it works

All state (delivery postcode, cart, delivery time) is kept server-side in a session cookie, so the client is a cookie-holding httpx session against these endpoints:

Purpose

Request

Delivery postcode

GET /FindStoreByZipCode/{postcode}

Menu, all restaurants

GET /menu (HTML)

Product options

GET /menu/product/{id}/choices (HTML fragment)

Add to cart

POST /AddToCart {ProductID, Amount, Addons:[{AddonID}], Toppings:[{ToppingID}]}

Cart

GET /CartJSON, POST /UpdateCart/{row}/{n}, POST /DeleteFromCart/{row} (empty body, or HTTP 411)

Delivery time

GET /GetTimeOptions/{yyyy-mm-dd}, POST /UpdateOrderDateTime {DateTime}

Payment methods

GET /checkout-json

Place order

POST /processCheckout (JSON) → {Status: "Redirect", RedirectURL}

Login

POST /user/login form email, password → 303 and an auth cookie

Order history

GET /user/orders (HTML: item names and choices, no product ids)

HTML parsing is isolated in parsing.py, so a site change usually means fixing one function.

Development

uv run pytest

The tests run offline. Parsers are tested against pages captured from the public site in tests/fixtures (the order history fixture is synthetic), and the client and tools are tested against a fake shop on httpx.MockTransport. No test places an order.

License

MIT

Available Tools

13 tools
add_to_cartB

Add a product to the cart and return the updated cart. Nothing is ordered yet.

ParametersJSON Schema
NameRequiredDescriptionDefault
quantityNo
addon_idsNo
product_idYes
topping_idsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=false and openWorldHint=true; the description's 'Nothing is ordered yet' usefully reinforces that the mutation is non-committal and it discloses the return payload. It does not cover availability/stock failures, quantity merge behavior, or addon/topping validation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the action and then the key constraint. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no prose. However, with 0% schema coverage the description should compensate for the undocumented quantity/addon/topping parameters, and it does not.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and four parameters exist, yet the description mentions only 'a product' (product_id). Quantity, addon_ids, and topping_ids receive no semantic explanation anywhere, leaving the agent to guess their meaning and accepted values.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('add a product to the cart') plus the side effect on return ('return the updated cart'). 'Nothing is ordered yet' separates it from place_order, though no sibling is named explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied: 'Nothing is ordered yet' nudges the agent to use this before place_order, but there is no explicit when/when-not guidance or reference to update_cart_item for adjusting quantities.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

clear_cartB

Remove everything from the cart.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover readOnly=false, destructive=false and openWorld=true, so the description's only addition is the scope of removal. Notably, 'remove everything' sits in tension with destructiveHint=false, which could mislead an agent about reversibility; the description neither confirms nor resolves this.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with zero filler. It is appropriately sized, though the brevity comes at the cost of the usage and consequence information a destructive-scope tool would benefit from.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema and annotations exist, so return values and safety hints are covered. What remains missing is any statement of when to prefer this over sibling cart-mutation tools or whether the clear is reversible.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes no parameters, so there is nothing for the description to disambiguate. Baseline 4 applies for a zero-parameter tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Remove') and resource ('everything from the cart'), so the operation is unambiguous. It does not differentiate itself from siblings such as update_cart_item or add_to_cart, leaving the agent to infer the distinction.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use guidance, no alternatives named, and no warning about the consequence of emptying the cart. With update_cart_item in the sibling list, an agent gets no help choosing between clearing wholesale and removing items individually.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_delivery_timesA
Read-only

Available delivery slots for a day (YYYY-MM-DD, default today). Pass a slot's value as delivery_time to review_order / place_order; "ASAP" means as soon as possible.

ParametersJSON Schema
NameRequiredDescriptionDefault
dayNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as read-only and open-world, so the safety profile is covered. The description adds useful behavioral context beyond annotations: the day parameter defaults to today, the output values are meant to be used as delivery_time, and 'ASAP' has a specific meaning.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the core purpose, then the workflow detail. Every clause earns its place with no redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple, has an output schema, and the description covers the key parameter semantics and integration with ordering tools. It omits minor details such as timezone or what happens when no slots are available, but overall it is sufficient for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It does by specifying the date format (YYYY-MM-DD) and the default behavior (today), which is exactly the missing semantic information for the single 'day' parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific resource and scope: available delivery slots for a given day. It clearly distinguishes this tool from siblings by naming the ordering tools (review_order / place_order) that consume its output, so an agent can place it in the workflow without checking other schemas.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explains the primary use case: get slots for a day, then pass a slot's value as delivery_time to review_order or place_order. It also clarifies that 'ASAP' is a valid value. It does not explicitly state when not to use this tool, but no sibling provides the same data, so the guidance is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_menuA
Read-only

Menu of one restaurant (store_id from list_restaurants), optionally one category only.

Products with has_choices=true need get_product_options before add_to_cart.

ParametersJSON Schema
NameRequiredDescriptionDefault
categoryNo
store_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The added has_choices caveat is genuinely useful but is workflow guidance rather than behavioral disclosure about the call itself (e.g., no mention of pagination despite an output schema).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences plus a caveat, front-loaded with the core resource and scope. No filler, though the final note reads as an abrupt fragment.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be described, and the description covers the key inputs and the downstream workflow dependency. It is complete enough for an agent to call and chain correctly, missing only explicit sibling routing to search_menu.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry the load. It does explain the origin of store_id (from list_restaurants) and clarifies that category is optional and limited to a single value, which adds meaning the bare schema lacks.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific resource and scope: the menu of one restaurant, optionally narrowed to a single category. It implicitly distinguishes itself from list_restaurants (source of store_id) and search_menu, though it doesn't name search_menu explicitly as the alternative for querying dishes.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives concrete context: store_id comes from list_restaurants, and products flagged has_choices=true require get_product_options before add_to_cart. That is real cross-tool routing, though no explicit 'when not to use this' vs search_menu is offered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_order_historyA
Read-only

Past orders of the logged-in account (newest first): order_id, time, total, status and items with the choices made. "Transactie kosten" is the old online-payment fee, not food.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations cover the safety profile (readOnlyHint, openWorldHint), so the description's added value is the ordering guarantee ('newest first') and the domain caveat about 'Transactie kosten' being an old payment fee rather than a food item. That caveat is real context an agent could not infer from structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the scope and ordering before the field list. The enumerated return fields partially duplicate the output schema, but the sentence is short enough that little is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter read tool with an output schema and read-only annotations, the description supplies everything needed to select and invoke it, plus a useful domain caveat. Nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes no parameters, so the baseline is 4. The description correctly characterizes the call as implicit-scope (logged-in account) rather than parameterized, which prevents an agent from hunting for a user or date argument.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific resource and scope ('past orders of the logged-in account', 'newest first') plus the fields returned, which lets an agent separate it from review_order, place_order and reorder. It doesn't explicitly name a sibling, but the resource is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the scope ('logged-in account'), but there is no explicit when-to-use or when-not-to-use guidance and no alternative named, e.g. review_order for a single order or reorder for repeating one.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_product_optionsA
Read-only

Choices for a product. Each addon group needs exactly one option id; toppings are optional extras (respect max_in_group when set). Prices are surcharges per item.

ParametersJSON Schema
NameRequiredDescriptionDefault
product_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the safety profile (readOnlyHint=true, openWorldHint=true), so the bar is lower. The description still adds real domain semantics beyond the schema: addon groups require exactly one option id, toppings are optional, max_in_group caps selection, and prices are per-item surcharges rather than totals.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, no filler, and the core purpose is front-loaded before the selection rules. The opening fragment is telegraphic ('Choices for a product') but the rest compensates efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the return structure needn't be spelled out, yet the description adds valuable interpretation rules (one option id per addon group, max_in_group, surcharge pricing). For a single-parameter read tool this covers what an agent needs before calling.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% for the single product_id parameter, but the description is written around 'a product' and so implicitly ties the argument to the product whose options are returned. The parameter name is self-evident, but no explicit syntax, format, or sourcing guidance is added, so it does the minimum.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names the resource ('Choices for a product') and the follow-on sentences make clear it returns selectable addon/topping options, so an agent can tell what it gets back. However, it lacks an explicit verb and never differentiates itself from siblings like get_menu or search_menu, which also surface product-related data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to call this tool versus get_menu, search_menu, or add_to_cart. The rules given ('each addon group needs exactly one option id', 'respect max_in_group') govern how to interpret the result, not when to reach for this tool. Usage is only weakly implied.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_restaurantsA
Read-only

List the restaurants on IJburg Eats with a short description and their menu categories.

Restaurant names are not available as text; identify them by description and categories.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so safety is covered. The description adds a genuinely non-obvious behavioral quirk — restaurant names are not exposed as text and must be identified by description and categories — which is exactly the kind of context structured fields cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no filler, with the core action front-loaded and the identification caveat kept as a separate short line that earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described, and the description still previews them helpfully. For a zero-parameter read-only listing tool it is essentially complete; only the lack of scoping/usage context keeps it from a 5.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Zero parameters, so the baseline of 4 applies. There is nothing further the description could add on parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('List the restaurants on IJburg Eats') and even previews the returned fields (short description, menu categories). It implicitly separates itself from get_menu/search_menu by being the enumeration tool, but never names a sibling explicitly, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use or when-not-to-use statement. The agent must infer that this is the browsing/entry-point call, with no guidance on whether to prefer search_menu or get_menu once a restaurant is known.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

place_orderA
Destructive

PLACE A REAL ORDER that costs money. Only call after the user explicitly confirmed the review_order result. expected_total must equal review_order's total_to_pay; the order is refused if the total changed. For iDEAL/card, give the user the returned payment_url to pay in their browser; the order is only final once paid. note is an optional message for the restaurant/driver.

ParametersJSON Schema
NameRequiredDescriptionDefault
noteNo
paymentYes
delivery_timeNoASAP
expected_totalYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructive/openWorld/non-idempotent, and the description adds critical context beyond them: the tool spends real money, the total is validated against review_order and can be refused, and the order is only final once payment is completed. That is exactly the behavioral disclosure an agent needs for an irreversible purchase.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the money-spending warning, then prerequisites, then parameter constraints and post-payment flow in four tight sentences with no filler. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers the sequencing prerequisite, the total-validation refusal, and the payment_url handoff. Output schema exists so return-value details needn't be repeated, and the description still surfaces the one output (payment_url) the agent must act on.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description carries the burden and does well: expected_total's equality constraint with review_order's total_to_pay and note's optional restaurant/driver message are both meaningfully explained. delivery_time is left unexplained, a minor gap since it defaults to ASAP.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('PLACE A REAL ORDER') and immediately distinguishes it from the sibling review_order, which the agent must call first. The uppercase emphasis on 'REAL' and 'costs money' makes the consequential nature unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit precondition: only call after the user confirms the review_order result, with expected_total matching review_order's total_to_pay. It also states the failure condition (refused if total changed) and the post-call flow for iDEAL/card, leaving no ambiguity about when and how to sequence.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reorderA

Add the items of a past order (order_id from get_order_history) to the cart, matched by name against the current menu. Reports items no longer on the menu (skipped) and items whose required choice could not be matched (needs_choice: ask the user, then use add_to_cart with the matched ids plus their pick). Nothing is ordered; continue with review_order.

ParametersJSON Schema
NameRequiredDescriptionDefault
order_idYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses non-obvious behavior beyond annotations: partial failures are reported as skipped/needs_choice rather than erroring, and 'nothing is ordered' clarifies the write scope against the readOnlyHint=false annotation. Output schema exists, so the reported result categories are reinforced rather than uniquely required here.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense but front-loaded: primary action first, then edge-case handling, then the terminal caveat ('Nothing is ordered'). Every clause carries routing or failure-mode information; only the nested parenthetical is slightly heavy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-param cart mutation with an output schema, the description covers the full agent workflow (source of input, partial-match handling, next tool to call) and states the operation is not order placement. Nothing needed to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the single param is undocumented in the schema, but the description compensates by naming its source (order_id from get_order_history). This is the key semantic an agent needs and it is supplied.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (add past order's items to cart) plus the matching mechanism (matched by name against the current menu). Clearly distinct from add_to_cart and get_order_history, and it names the latter as its input source.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes: get order_id from get_order_history, handle needs_choice by asking the user and calling add_to_cart with matched ids plus pick, then continue with review_order. Both the trigger and the follow-up alternatives are given.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

review_orderA

Prepare checkout without ordering: sets the delivery time and returns items, address, payment method and total_to_pay. Show this to the user and get explicit confirmation before calling place_order. payment is a value from payment_options (e.g. MSP_Ideal, WINKEL_Cash).

ParametersJSON Schema
NameRequiredDescriptionDefault
paymentNoMSP_Ideal
delivery_timeNoASAP

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false, openWorldHint=true, destructiveHint=false, and the description is consistent with that, adding the important workflow fact that it mutates delivery time but must not commit the order. It does not discuss side effects on the cart or error behavior, keeping it short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three front-loaded sentences with no fluff; the purpose leads, workflow follows, parameter hint last. The return-value enumeration is slightly redundant given an output schema exists.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers purpose, the confirmation workflow, and payment semantics. Since an output schema exists, the return list need not be restated, and the main remaining gap is delivery_time value format.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must carry the parameter burden. It does well for payment (names payment_options and examples MSP_Ideal/WINKEL_Cash) but leaves delivery_time format unspecified (e.g., from get_delivery_times vs a timestamp), so compensation is partial.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a precise verb+resource ('Prepare checkout without ordering') and enumerates the effects (sets delivery time, returns items/address/payment/total_to_pay). The phrase 'without ordering' cleanly distinguishes it from the sibling place_order.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names the alternative tool (place_order) and the gate that selects it ('Show this to the user and get explicit confirmation before calling place_order'). This is exactly the when-to-use/when-not guidance an agent needs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_menuA
Read-only

Search all restaurants' products by name, description or category (case-insensitive).

ParametersJSON Schema
NameRequiredDescriptionDefault
queryYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint and openWorldHint, so safety and scope are covered. The description adds one genuine behavioral detail beyond them: matching is case-insensitive and spans all restaurants. It says nothing about result limits, ranking, or empty-result behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One tightly written sentence with the resource and match fields front-loaded; no filler to trim.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, and the tool is a simple one-parameter lookup. The description covers the essentials; only cross-sibling routing guidance is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0% and the single parameter 'query' is undocumented in the schema. The description compensates by defining what the query is matched against (name, description, category) and that matching is case-insensitive, which is real semantic value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (search) and resource (restaurants' products) plus the fields matched (name, description, category). An agent can distinguish it from get_menu or list_restaurants, though the description never names those siblings to sharpen the contrast.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to prefer this over get_menu, list_restaurants, or get_product_options. The keyword-search framing implies a lookup use case, but the agent is left to infer the boundary with the full-listing siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_cart_itemA

Change the quantity of a cart line (row_id from view_cart); 0 removes it.

ParametersJSON Schema
NameRequiredDescriptionDefault
row_idYes
quantityYes

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false and destructiveHint=false; the description adds the non-obvious behavioral rule that quantity=0 deletes the line, which the schema cannot express. It does not describe error behavior (e.g. invalid row_id) or whether the result is reversible, but with annotations covering the safety profile this is solid.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler; the operation comes first and the two operational details are parenthetically appended. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-param cart mutation with annotations and an output schema (so return values need no explanation), the description covers the essential gotchas. Minor omissions (failure modes when row_id is stale) keep it from being fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description carries the burden, and it does so for both params: row_id is defined as coming from view_cart output and quantity gets a special sentinel meaning (0 = removal). This is meaningful semantics beyond the bare 'string'/'integer' schema types.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Change the quantity of a cart line') and distinguishes itself from siblings like add_to_cart and clear_cart by naming the exact mutation it performs. An agent can identify the operation without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Points the agent to view_cart as the source of row_id and reports that quantity=0 removes the line, which is the key routing condition (no separate remove tool needed). It does not explicitly contrast itself with add_to_cart/clear_cart, so it stops short of full when/when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

view_cartA
Read-only

Current cart: items (with row_id), delivery cost, total and minimum-order status.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds useful content scope (what the cart view includes) but does not disclose behavioral traits such as empty-cart handling, authentication needs, or error conditions. This is adequate given the annotations but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One short, front-loaded fragment that lists the relevant cart fields without any filler. Every word earns its place and the resource is stated first.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

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 annotations and an output schema, the description covers the essential purpose and returned data. It could mention empty-cart behavior, but that is a minor omission given the low complexity and existing structured metadata.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters and the schema description coverage is 100%, so there are no parameter semantics to document. The baseline of 4 applies for a parameterless tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names the specific resource ('Current cart') and enumerates the key fields it exposes (items with row_id, delivery cost, total, minimum-order status). This clearly identifies it as the read counterpart to add_to_cart, update_cart_item, and clear_cart, though it relies on the tool name for the explicit verb 'view'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit guidance on when to use this tool versus siblings like review_order or get_order_history. The purpose is implied by the name and content list, but the description itself provides no when-to-use or when-not-to-use context.

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.

  1. 13 tool updatesv0.1.0
    • First observedadd_to_cart
    • First observedclear_cart
    • First observedget_delivery_times
    • First observedget_menu
    • First observedget_order_history
    • First observedget_product_options
    • First observedlist_restaurants
    • First observedplace_order
    • First observedreorder
    • First observedreview_order
    • First observedsearch_menu
    • First observedupdate_cart_item
    • First observedview_cart

TDQS

A3.9/5.0

Scored across 13 tools

Disambiguation5/5

Each tool targets a clearly distinct step in the food-ordering flow: browsing (list_restaurants/get_menu/search_menu), cart management (view/add/update/clear), checkout (review_order/place_order), and history/reorder. The boundary between reorder and add_to_cart is also clearly described.

Naming Consistency4/5

Tool names are uniformly snake_case and almost all follow a verb_noun pattern (view_cart, add_to_cart, place_order, etc.). The only deviation is reorder, which is a bare verb rather than a verb_noun phrase, but it remains understandable.

Tool Count5/5

With 13 tools, the set is well-scoped for an online food-ordering assistant. It covers discovery, cart operations, checkout, and past-order workflows without excessive granularity.

Completeness4/5

The core order lifecycle is covered: browse restaurants/menus, manage cart, choose delivery time, review, and place an order. Minor gaps exist around listing payment options explicitly, cancelling or tracking an active order, and managing user/address details, but agents can mostly work around them.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI agents to discover and order food from multiple delivery services (DoorDash, UberEats, Grubhub) using A2A protocol and process payments via Stripe with AP2 protocol mandates for cryptographically signed user authorization.
    1
    MIT
  • A
    license
    B
    quality
    D
    maintenance
    Enables AI agents to search restaurants, browse menus, manage carts, and place orders on DoorDash programmatically. It utilizes a headless browser to interact with DoorDash's GraphQL API and bypass anti-bot protections for the full delivery lifecycle.
    22
    6 npm
    4
    MIT
  • F
    license
    A
    quality
    D
    maintenance
    Allows AI assistants to browse menus, manage carts, and place orders on Uber Eats through natural language commands.
    34
    2
    -