Skip to main content
Glama

albert-heijn-mcp

npm License: Apache-2.0 Node.js 24 MCP

Your Albert Heijn account, in your AI assistant.

albert-heijn-mcp is a Model Context Protocol server for Albert Heijn 🇳🇱. Connect it to any MCP client and just ask: find products and bonus deals, plan meals from Allerhande recipes, keep your shopping list and delivery order up to date, and look back at what you've bought.

NOTE

An unofficial project, not affiliated with or endorsed by Albert Heijn. It uses the same API as the AH mobile app, which may change without notice.


Contents

Related MCP server: Rohlik MCP Server

What you can ask

Ask in Dutch, English or any language your assistant speaks:

"Wat is er deze week in de bonus van wat ik meestal koop?"

Plan meals

"Find a vegetarian Allerhande recipe under 30 minutes for two, and put the ingredients on my shopping list. I already have olive oil and salt."

"Scale the panlasagne recipe to six people and tell me how much salmon I need."

"Plan three weeknight dinners around what's on bonus this week."

Save money

"Which products I usually buy are on bonus this week?"

"Rebuild tonight's stir-fry with ingredients that are on bonus, without changing the recipe too much."

"Is next week's bonus out yet? If not, when does it appear?"

"What's in the 2+1 gratis kaas deal?"

Shop

"Put the products I've had delivered at least three times back on my list."

"Find organic, gluten-free pasta, cheapest first."

"Compare the protein and sugar in these three yoghurts and add the best one to my list."

"When can AH deliver on Saturday?"

"The courgettes are sold out. What else would work in this recipe?"

"Add two more packs of milk to my upcoming delivery."

"Make a favourites list called Pasta night with everything from this recipe."

"Any vandaag-af bread or vegetables at my local AH worth picking up tonight?"

Look back

"How much did my in-store receipts add up to in September, and what were the five priciest items?"

"Show the receipt from my last shop and list anything I bought more than once."

Quick start

Requirements: Node.js 24 (LTS) and an Albert Heijn account.

There's nothing to install: connect a client with npx -y albert-heijn-mcp, which downloads and runs the latest version, then ask it to log you in to Albert Heijn.

To install it permanently instead, run npm install --global albert-heijn-mcp and use the albert-heijn-mcp command. To build from source, clone the repository.

Logging in

AH's login page has a captcha that only works on AH's own site, so logging in takes two steps:

  1. Ask your assistant to log you in. It calls ah_login and gives you a link to AH's login page; locally, it also opens in your browser. Log in as usual.

  2. Paste the code back. After you log in, AH redirects to a link meant for its iPhone app, which the browser can't open, so the page stays put. Open the developer console (Chrome: ⌘ ⌥ J on Mac, Ctrl Shift J on Windows/Linux) and find this line:

    Failed to launch 'appie://login-exit?code=…' because the scheme does not have a registered handler.

    Copy the appie://login-exit?code=… link into the chat. The code works once and expires quickly, so paste it right away.

You only log in once. Tokens are stored on your machine and refreshed automatically:

OS

Location

macOS

~/Library/Application Support/albert-heijn-mcp/tokens.json

Linux

~/.config/albert-heijn-mcp/tokens.json

Windows

%AppData%\albert-heijn-mcp\tokens.json

The file is readable only by your user. Override the location with AH_TOKENS_PATH.

Connecting a client

albert-heijn-mcp works with any MCP client. It runs locally over stdio, or on a server over Streamable HTTP.

Local clients (stdio)

Install it in one click:

Install in Cursor Install in VS Code Other clients that start MCP servers as a local command run npx -y albert-heijn-mcp. Most of them take this JSON in their MCP settings:

{
  "mcpServers": {
    "ah": {
      "command": "npx",
      "args": ["-y", "albert-heijn-mcp"]
    }
  }
}

Where the settings live differs per client; see its documentation. Clients with a CLI usually have an add command instead, e.g. <client> mcp add ah -- npx -y albert-heijn-mcp. It is also listed in the MCP Registry, which some clients install from.

TIP

Desktop apps don't load your shell profile, so they may not findnpx (common with nvm). Then set command to the output of which npx. For a source checkout, use node with the argument /path/to/albert-heijn-mcp/dist/index.js.

Remote clients (Streamable HTTP)

Web apps such as ChatGPT and Claude.ai only connect to servers on the internet. Set one up first (Deploying to a server). The endpoint is https://your-server/mcp. Send the token as an Authorization: Bearer YOUR_TOKEN header if the client lets you set headers; otherwise put it in the URL: https://your-server/mcp?token=YOUR_TOKEN.

ChatGPT: needs Developer mode (Plus, Pro, Business, Enterprise and Education). Open Settings → advanced settings, turn on Developer mode, and create a connector with the URL. Set authentication to No authentication: ChatGPT offers only OAuth or none, so the token goes in the URL.

Claude.ai: Settings → Connectors → Add custom connector, then paste the URL with the token.

IMPORTANT

A token in a URL can end up in proxy logs. Use a long random value (openssl rand -hex 32) and replace it if it leaks.

Configuration

Settings are environment variables. They can also go in a .env file in the working directory (see .env.example); variables already set in the environment take precedence.

Variable

Default

Description

AH_REMOTE

false

Don't open a browser on login. Use on servers (same as --remote).

AH_TOKENS_PATH

per OS

Where to store login tokens.

AH_MCP_HOST

127.0.0.1

Interface the HTTP server listens on. Keep the default behind a reverse proxy.

AH_MCP_PORT

3000

HTTP server port.

AH_MCP_BASE_URL

http://localhost:3000

Public URL of the HTTP server. Set it on a server: for a non-local URL, the localhost-only Host check is turned off so a reverse proxy can forward requests.

AH_MCP_TOKEN

—

Secret required on every HTTP request, as Authorization: Bearer … or ?token=…. Required for the HTTP transport, which doesn't start without it.

AH_LOG_FILE

—

Also append logs to this file. Logs always go to stderr.

Command-line flags:

node dist/index.js [--transport stdio|streamable-http] [--remote] [--version] [--help]

stdio (the default) is for local clients; streamable-http serves MCP at /mcp.

Deploying to a server

albert-heijn-mcp runs as a hardened systemd service behind a reverse proxy, installed from the latest release.

  1. Prepare the server. Install Node.js 24 and create a service user:

    sudo useradd -r -m -d /home/albert-heijn-mcp -s /sbin/nologin albert-heijn-mcp
  2. Configure it in /home/albert-heijn-mcp/.env:

    AH_MCP_BASE_URL=https://albert-heijn-mcp.example.com
    AH_MCP_TOKEN=<output of: openssl rand -hex 32>
  3. Install it with the service unit that comes with the package (it runs in --remote mode):

    sudo npm install --global --prefix /usr/local albert-heijn-mcp
    sudo install -m 644 /usr/local/lib/node_modules/albert-heijn-mcp/deploy/albert-heijn-mcp.service /etc/systemd/system/
    sudo systemctl daemon-reload
    sudo systemctl enable --now albert-heijn-mcp

    To update, run the same commands, then sudo systemctl restart albert-heijn-mcp.

  4. Add TLS with a reverse proxy that forwards to 127.0.0.1:3000. With Caddy:

    albert-heijn-mcp.example.com {
        reverse_proxy 127.0.0.1:3000
    }

The service can write only to /home/albert-heijn-mcp, where it keeps its tokens. If you point AH_LOG_FILE elsewhere, add that path to ReadWritePaths in the unit file.

Tools

Read-only tools are marked as such, so clients can run them without asking. Tools that remove data are marked destructive, so clients ask for confirmation first.

Tools that return data also return it as structured output with a declared schema, for clients that use it. Products and recipes in tool results include a url to their page on ah.nl, and the server asks the assistant to link their names to it.

Tool

Description

ah_login

Log in: returns AH's login link, then completes the login with the code you paste back.

ah_logout

Delete the stored tokens, to switch accounts or reset a session.

ah_get_member_profile

Name, masked email, and bonus card number (last 4 digits).

Tool

Description

ah_search_products

Search one or more keywords at once; Dutch terms work best. Filter by bonus=true or by filters (organic, vegan, gluten_free and other diets, allergens and labels), and sort by price, what you buy most, or Nutri-Score.

ah_get_products

Details for one or more products. include_nutritional_info=true adds the nutrition table.

ah_get_product_alternatives

Similar products and substitutes AH suggests for a product.

ah_get_bonus_offers

This week's bonus offers, or next week's with period=next. previously_bought=true limits them to products you bought before (AH's "Eerder gekocht"). Can filter by keyword.

ah_get_bonus_group_products

The individual products behind a group deal such as "2+1 gratis".

ah_search_stores

Nearby stores, by postal code or your own address.

ah_get_last_chance_items

Vandaag-af markdowns in a store; the one nearest your address by default.

Tool

Description

ah_search_recipes

Search Allerhande recipes; Dutch terms work best.

ah_get_recipe

Ingredients, steps, and nutrition per serving. servings scales the ingredients.

ah_add_recipe_to_shopping_list

Match a recipe's ingredients to products and add them to the list in one step. skip leaves out what you have; dry_run=true previews the matches.

Tool

Description

ah_get_shopping_list

Your shopping list ("Mijn lijst"), the basket you fill while shopping.

ah_add_to_shopping_list

Put products on the list, with a quantity each.

ah_add_free_text_to_shopping_list

Add a free-text item, like "verse bloemen".

ah_remove_from_shopping_list

Remove products or free-text items.

ah_clear_shopping_list

Remove everything. Requires confirm="yes".

ah_get_favorite_lists

Your favourite lists ("Mijn lijstjes").

ah_add_to_favorite_list

Add products to a favourite list.

ah_remove_from_favorite_list

Take products off a favourite list.

ah_create_favorite_list

Start a new, empty favourite list.

ah_delete_favorite_list

Delete a favourite list and its items. Requires confirm="yes".

Choosing a delivery or pick-up slot in the AH app moves your shopping list into an order. ah_get_delivery_slots shows when delivery is possible; the other tools work on that order.

Tool

Description

ah_get_delivery_slots

Delivery windows at your address for the coming days.

ah_get_cart

Products in the active order, with total price and discount.

ah_update_cart_item

Change a product's quantity; 0 takes it out.

ah_remove_from_cart

Remove a product from the order.

ah_clear_cart

Remove everything from the order. Requires confirm="yes".

Tool

Description

ah_get_orders

Upcoming delivery orders, or past ones with past=true.

ah_get_order_details

Products in one order.

ah_get_frequent_items

Your most-ordered products, counted over your delivery orders.

ah_get_receipts

Recent in-store receipts (kassabonnen).

ah_get_receipt_details

Items, discounts and payment for one receipt.

Limitations

  • Delivery orders can't be started through the API. ah_get_delivery_slots lists the windows, but booking one, which starts the order, happens in the AH app or on ah.nl. While the order is active, AH doesn't serve the shopping list; the tools say so and point to the order tools.

  • Ticking off shopping-list items isn't supported: the API returns no usable item IDs.

  • Bonus Box, AH's personal weekly deals, is not available: its API is unknown.

Development

git clone https://github.com/olekpuchka/albert-heijn-mcp
cd albert-heijn-mcp
npm ci
npm run build    # compile to dist/
npm run lint     # type-check

Run it from the checkout with node dist/index.js, or use /path/to/albert-heijn-mcp/dist/index.js as the argument in your client's config with node as the command.

Path

Contents

src/index.ts, src/config.ts

Entry point, flags and settings

src/ahapi/

Client for AH's REST and GraphQL API, on Node's built-in fetch

src/auth/

Login code exchange, token storage and refresh

src/server/

Streamable HTTP transport and token check

src/tools/

The MCP tools, one file per area

deploy/

systemd unit, shipped in the package

listing/

Name, descriptions and icon to use in connector settings and app directories (how)

.github/

CI, release workflow and Dependabot

assets/

Logo for this README and the server icon shown by MCP clients

The only runtime dependencies are the official MCP TypeScript SDK and Zod, which the SDK uses for tool schemas.

To call tools by hand, use the MCP Inspector:

npx @modelcontextprotocol/inspector node dist/index.js

Before deploying a change, run a quick check against a real account: log in, search for melk, add a product to your shopping list and remove it again, then view your cart and orders.

To release, set the new version in package.json and in both places in server.json, merge it to main, and push a tag: git tag v1.2.3 && git push origin v1.2.3. The release workflow checks that the versions match, builds the package, attaches it to the GitHub release as albert-heijn-mcp.tgz, and stages it on npm through trusted publishing, so no npm token is stored. Approve the staged version on npmjs.com (or with npm stage approve) to make it live; the workflow then updates the MCP Registry entry.

Troubleshooting

Codes work once and expire quickly. Ask to log in again and paste the new link straight away.

Open the developer console before you submit the login form, or look for the appie://login-exit?code=… request in the Network tab. Browsers other than Chrome may show the link in an error page or dialog instead.

Log out and back in through the assistant, or delete tokens.json from the token location and log in again.

AH accepts order changes only once an order exists. Choose a delivery slot in the AH app or on ah.nl first.

Choosing a slot moved your list into the order. Use ah_get_cart and ah_update_cart_item until the order is delivered or cancelled.

Set AH_MCP_PORT to another port, in the environment or .env.

License

Apache 2.0

Available Tools

33 tools
ah_add_free_text_to_shopping_listAlbert Heijn: Add Free-Text to Shopping ListA

Add a free-text item to the Albert Heijn shopping list (no product ID needed). Use for reminders like 'verse bloemen', 'any good wine', or items not found in search. Free-text items have no quantity: put amounts in the text, e.g. '2 bossen bloemen'.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesFree-text item description, e.g. 'verse bloemen', 'goede rode wijn'

TDQS

A4.4/5.0
Behavior4/5

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

Annotations declare readOnlyHint=false and destructiveHint=false, so safety is covered. The description adds a genuinely useful behavioral fact beyond that: free-text items carry no quantity field, so amounts must be embedded in the text. It does not state auth requirements or reversibility, but for a simple list add that is minor.

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?

Three short sentences, front-loaded with the core action and the sibling distinction, followed by usage examples and one formatting constraint. No filler.

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 one-parameter, non-destructive add with no output schema, the description covers what it does, when to use it, and how to format input. It omits only an auth prerequisite (a sibling ah_login exists), which is a small residual gap.

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 100%, so baseline would be 3, but the description adds real meaning: the single 'name' parameter must absorb quantity information as prose ('2 bossen bloemen'), which the schema does not convey. This materially changes how the agent should format the argument.

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 a free-text item to the Albert Heijn shopping list') and immediately differentiates itself from the sibling ah_add_to_shopping_list with '(no product ID needed)'. An agent can pick this over the ID-based add without opening either 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?

Gives concrete when-to-use conditions: reminders, vague intents ('any good wine'), and items not found in search. The implicit alternative is the ID-based sibling, though it is never named explicitly, so routing relies on the reader inferring which tool handles product IDs.

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

ah_add_recipe_to_shopping_listAlbert Heijn: Add Recipe to Shopping ListA

Put the ingredients of an Allerhande recipe on the shopping list in one step. Each ingredient is matched to the AH product whose name fits it best (among equally good matches, one on bonus unless prefer_bonus=false); one unit of each product is added. Water is always skipped; pass skip for anything the user already has (e.g. olive oil, salt). Set dry_run=true to show the matches without adding them. Returns the added, skipped and unmatched ingredients, and any whose search failed (worth retrying). When you mention a product or recipe from the result, link its name to its url.

ParametersJSON Schema
NameRequiredDescriptionDefault
skipNoIngredients to leave out, matched by name, e.g. ["olijfolie", "zout"]
dry_runNoOnly show the matches; don't add anything
servingsNoNumber of servings, as in ah_get_recipe
recipe_idYesRecipe id from ah_search_recipes
prefer_bonusNoPrefer a matching product on bonus (default true)

Output Schema

ParametersJSON Schema
NameRequiredDescription
addedYes
failedYes
recipeYes
dry_runYes
skippedYes
not_foundYes

TDQS

A4.7/5.0
Behavior5/5

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

Annotations only declare readOnlyHint=false / destructiveHint=false, so the description carries real weight and delivers: the name-matching rule, the bonus tie-break default, that exactly one unit per product is added, water being silently skipped, dry_run behavior, and the four-way outcome classification (added, skipped, unmatched, search-failed, the last worth retrying). This is unusually rich behavioral disclosure 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.

Conciseness5/5

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

Five short sentences, each carrying distinct information, with the primary action front-loaded and refinements (skip, dry_run, return shape, link formatting) following in priority order. No filler or restatement of the title.

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?

Despite a moderate-complexity mutation with five parameters, the description covers matching logic, skip semantics, dry-run preview, and outcome categories, and even flags failed searches as retryable. An output schema exists so return-shape detail is optional, and the description's brief mention of it is a bonus rather than a necessity.

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 100%, so baseline is 3, but the description goes beyond the schema by explaining the tie-break semantics behind prefer_bonus ('among equally good matches, one on bonus unless prefer_bonus=false'), the intended content of skip, and the purpose of dry_run. It does not touch 'servings' beyond the schema's own cross-reference to ah_get_recipe.

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 ('Put the ingredients of an Allerhande recipe on the shopping list') plus the key scope qualifier 'in one step', which separates it from ah_add_to_shopping_list (single product) and ah_add_free_text_to_shopping_list. An agent can identify the tool's role 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?

Gives clear when-to-use context and explicit exclusions: water is always skipped, and the user should pass 'skip' for anything they already have, with concrete examples (olive oil, salt). It also explains the dry_run preview path. It stops short of naming a sibling alternative for non-recipe additions, so it is a strong 4 rather than a 5.

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

ah_add_to_favorite_listAlbert Heijn: Add to Favourite ListA

Add products to a named Albert Heijn favorite list. Get list_id from ah_get_favorite_lists.

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsYesItems to add, e.g. [{"product_id": 123456, "quantity": 1}]. Quantity 0 is treated as 1.
list_idYesFavorite list ID from ah_get_favorite_lists

TDQS

A3.5/5.0
Behavior2/5

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

Annotations already declare readOnlyHint=false and destructiveHint=false, so the mutation profile is covered. The description adds no behavioral context beyond that — nothing about authentication requirements, duplicate-item behavior, or whether existing list contents are preserved. It essentially restates what the schema already documents.

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 scoped by the prerequisite hint. No filler, no redundancy in phrasing.

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?

No output schema exists, so the description could usefully say what a successful add returns (or whether it is idempotent), but it does not. For a two-parameter write tool whose params are fully documented, the definition is minimally viable rather than complete.

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 100% and the items parameter even carries an inline example and the quantity-0 rule, so the schema does the heavy lifting. The description's 'Get list_id from ah_get_favorite_lists' merely repeats the list_id schema description verbatim, adding no new syntax or constraint information.

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 ('Add') and resource ('products to a named Albert Heijn favorite list'), which is enough to separate it from the shopping-list siblings by the word 'favorite'. It stops short of explicitly contrasting itself with ah_add_to_shopping_list or ah_add_free_text_to_shopping_list, so the differentiation is inferred rather than stated.

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?

Gives a concrete workflow prerequisite: get list_id from ah_get_favorite_lists, naming the sibling that supplies it. There is no explicit statement of when to prefer this over the shopping-list add tools, but the context is clear enough to act on.

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

ah_add_to_shopping_listAlbert Heijn: Add to Shopping ListA

Add one or more products to your Albert Heijn shopping list. Pass an array of items, each with product_id (int) and quantity (int). Returns confirmation listing the names of successfully added products.

ParametersJSON Schema
NameRequiredDescriptionDefault
itemsYesItems to add, e.g. [{"product_id": 123456, "quantity": 2}]

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false and destructiveHint=false, covering the safety profile. The description adds genuine value by disclosing the return behavior ('confirmation listing the names of successfully added products'), which matters since no output schema exists, but says nothing about auth requirements, quantity limits, or failure handling for invalid product IDs.

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?

Three tight sentences: purpose, input shape, and return value, with the core action front-loaded. No filler or 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?

For a single-parameter tool with full schema coverage, the description covers purpose, input shape, and return value, compensating for the absent output schema. It stops short of explaining mutation side effects or edge-case behavior, but nothing essential to a correct call is missing.

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 100%, so both product_id and quantity are already documented, including an inline array example. The description restates the same structure ('array of items, each with product_id (int) and quantity (int)') without adding syntax, constraints, or meaning beyond the schema — the baseline 3 applies.

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 verb (add) and resource (Albert Heijn shopping list) with the batch scope made explicit ('one or more products'). It does not, however, differentiate itself from siblings such as ah_add_free_text_to_shopping_list or ah_add_to_favorite_list, so an agent must infer which add-variant applies.

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 purpose statement — an agent can tell this is for adding products by product_id — but there is no explicit when-to-use guidance, no exclusion, and no pointer to the free-text or favorite-list alternatives among the many siblings.

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

ah_clear_cartAlbert Heijn: Clear OrderA
Destructive

Remove ALL items from the active Albert Heijn delivery order (not the shopping list). Irreversible — requires confirm="yes" to prevent accidental use.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmYesMust be "yes" to confirm

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already flag destructiveHint=true and readOnlyHint=false, so the safety profile is known. The description adds genuinely useful context beyond that: the operation is irreversible and guarded by a confirm="yes" requirement to prevent accidental wholesale clearing. It does not say what the order looks like after clearing, but that gap is minor.

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 tightly packed clauses, front-loaded with the destructive verb and scope, then the safety guard. No filler; every phrase carries routing or safety information.

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 single-parameter destructive mutation with no output schema and annotations covering the safety hints, the description supplies the remaining essentials: exact scope, irreversibility, and the confirmation guard.

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 100% and only one parameter exists, so the schema already documents 'confirm' fully. The description repeats the confirm="yes" requirement and adds intent ('to prevent accidental use'), which adds light value but does not exceed the structured baseline.

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 scope: 'Remove ALL items from the active Albert Heijn delivery order (not the shopping list).' The explicit negative scope cleanly separates it from the sibling ah_clear_shopping_list, so an agent can route correctly without opening 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?

The description clarifies the target (active delivery order, not shopping list), which is the key routing decision among siblings. It stops short of naming ah_clear_shopping_list or ah_remove_from_cart as alternatives for the case where only some items should go, so the exclusion is implicit rather than spelled out.

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

ah_clear_shopping_listAlbert Heijn: Clear Shopping ListA
Destructive

Remove ALL items from the Albert Heijn shopping list. Irreversible — requires confirm="yes".

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmYesMust be "yes" to confirm

TDQS

A4/5.0
Behavior4/5

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

Annotations already flag destructiveHint=true, but the description adds genuinely new information: the operation is irreversible and a confirm="yes" gate is mandatory. It stops short of describing what the response looks like after the clear.

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, zero filler, with the destructive scope front-loaded and the irreversibility/confirmation constraint immediately after it.

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 single-parameter destructive tool with no output schema, the definition covers scope, irreversibility and the confirmation gate. Only the post-clear state (e.g. whether the list is emptied vs deleted) is left unstated.

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?

Only one parameter and schema description coverage is 100% — the schema already states 'Must be "yes" to confirm', and the description merely restates the same constraint without adding format or edge-case detail. Baseline 3 applies.

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 (Remove) and resource (Albert Heijn shopping list) with an explicit scope quantifier (ALL items), which cleanly separates it from the sibling ah_remove_from_shopping_list that handles individual items.

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 (use when the whole list should be emptied) and the confirm="yes" prerequisite gives a concrete condition, but no alternative is named and no when-not guidance is offered.

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

ah_create_favorite_listAlbert Heijn: Create Favourite ListA

Create a new, empty Albert Heijn favorite list with the given name; AH drops some punctuation, such as '-'. Returns its id; add products with ah_add_to_favorite_list.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesName of the list, e.g. 'Weekend' or 'Pasta night'

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
nameYes
item_countYes
updated_atNo

TDQS

A4.5/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=false and destructiveHint=false, so the description carries most of the burden and does so well: it discloses that the created list is empty, warns that AH silently drops punctuation such as '-', and names the follow-up tool. It stops short of describing whether the id is returned in a wrapper object or listing other side effects.

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 compact sentence pair with the creation action front-loaded, then the normalization caveat, then the follow-up tool. No filler, and ordering follows the agent's decision path.

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 single-parameter create tool with an output schema already covering the return value (the id), the description covers what it is, the empty-state behavior, the naming quirk, and the next step. Nothing an agent needs to invoke 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 100% for the single required 'name' parameter, so the baseline would be 3. The description goes beyond the schema by explaining that the name value is normalized server-side (punctuation like '-' is dropped), which is semantics an agent cannot get from the schema alone.

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 ('Create a new, empty Albert Heijn favorite list') and scopes it to the given name. It is immediately distinguishable from siblings like ah_get_favorite_lists, ah_delete_favorite_list, and ah_add_to_favorite_list.

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?

Explicitly routes the agent to the next step: 'add products with ah_add_to_favorite_list,' which names the correct alternative tool for populating the list. It gives clear context for use but does not state prerequisites (e.g. login requirement) or any when-not condition.

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

ah_delete_favorite_listAlbert Heijn: Delete Favourite ListA
Destructive

Delete an Albert Heijn favorite list and everything on it. Irreversible — requires confirm="yes". Get list_id from ah_get_favorite_lists.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmYesMust be "yes" to confirm
list_idYesFavorite list ID from ah_get_favorite_lists

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is covered. The description adds genuine extra context beyond that: the operation is irreversible, it destroys everything on the list, and a confirm="yes" gate is required. No auth or rate-limit detail, so not 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.

Conciseness5/5

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

Two short sentences, zero waste, with the destructive scope and irreversibility front-loaded ahead of the procedural detail.

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 two-parameter destructive tool with no output schema, everything an agent needs is present: what is deleted, that it is irreversible, the confirmation gate, and the source of the ID.

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 100%, so the baseline is 3. The description nonetheless adds meaning: it identifies where list_id originates (ah_get_favorite_lists) and reinforces the exact confirm value, which is more than the schema alone conveys.

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?

Specific verb+resource ('Delete an Albert Heijn favorite list') with explicit scope ('and everything on it'), which clearly distinguishes it from the sibling ah_remove_from_favorite_list that removes individual items. An agent can select this 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?

Gives the prerequisite that list_id comes from ah_get_favorite_lists and states the confirm="yes" requirement, which is clear usage context. It does not explicitly state when-not to use it versus siblings like ah_clear_shopping_list, so it falls 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.

ah_get_bonus_group_productsAlbert Heijn: Bonus Group ProductsA
Read-only

Get all individual products belonging to a specific Albert Heijn bonus promotion group. Use this to drill into a deal like '2+1 gratis kaas' or 'Alle yoghurt 25% korting'. Get segment_id from the bonus_segment_id field in ah_get_bonus_offers results. For an offer from next week's bonus, set period='next'. Returns the same fields as ah_search_products. When you mention a product or recipe from the result, link its name to its url.

ParametersJSON Schema
NameRequiredDescriptionDefault
periodNoBonus week of the offer: 'current' (default) or 'next'
segment_idYesBonus segment ID from the bonus_segment_id field in ah_get_bonus_offers

Output Schema

ParametersJSON Schema
NameRequiredDescription
productsYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds real behavioral context beyond that: it says the payload matches ah_search_products fields and instructs the agent to link a returned product/recipe name to its url when mentioning it. A slight gap remains in that return shape is deferred to another tool rather than described, but with an output schema present this is minor.

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?

Five short sentences, front-loaded with the core purpose, then the workflow linkage, then the output convention. Each sentence carries distinct information, though the trailing url-linking instruction is a formatting convention rather than tool mechanics and could be trimmed.

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 two-parameter read tool with an output schema and readOnlyHint annotation, the description covers purpose, parameter sourcing, the next-week edge case, and return-field expectations. An agent has everything needed to call it correctly on the first attempt.

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 100% and the schema already documents both parameters, including the enum values for period and the origin of segment_id. The description's parameter notes ('set period=next for next week's bonus', 'get segment_id from bonus_segment_id') largely restate the schema, so the baseline of 3 applies.

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 verb (Get) and resource (individual products in a bonus promotion group), and immediately contrasts it with the aggregate view by telling the agent it is for drilling into a deal like '2+1 gratis kaas'. This clearly distinguishes it from ah_get_bonus_offers and ah_search_products without opening either schema.

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?

It gives explicit when-to-use guidance ('drill into a deal'), tells the agent exactly where the required segment_id comes from (the bonus_segment_id field of ah_get_bonus_offers results), and covers the edge case of next week's promotion with period='next'. Nothing about tool selection is left to inference.

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

ah_get_bonus_offersAlbert Heijn: Bonus OffersA
Read-only

Get Albert Heijn bonus/promotional offers. Use this (not ah_search_products) when the user asks what is on bonus/sale/discount. Returns this week's bonus by default; set period='next' for next week's bonus, which AH publishes a few days before the new bonus week starts. Supports optional keyword filter to find e.g. cheese on bonus: set query='kaas'. Set previously_bought=true for offers on products the user bought before (AH's 'Eerder gekocht'). Group deals (e.g. '2+1 gratis', 'Alle yoghurt 25% korting') have no id but a bonus_segment_id — pass that to ah_get_bonus_group_products to see the individual products in the group. Returns id, bonus_segment_id, title, original_price, bonus_price, discount_percentage, bonus_mechanism. When you mention a product or recipe from the result, link its name to its url.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of results to return (default 20)
queryNoOptional keyword filter (Dutch or English) applied client-side, e.g. 'kaas', 'vlees', 'bier'
periodNoWhich bonus week to return: 'current' (default) or 'next'
previously_boughtNoOnly offers on products the user bought before

Output Schema

ParametersJSON Schema
NameRequiredDescription
offersYes

TDQS

A4.8/5.0
Behavior5/5

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

Annotations only declare readOnlyHint, so the description carries the useful behavioral load: default period is the current week, period='next' data is published a few days before the bonus week begins, and group deals lack an id but expose a bonus_segment_id. These are non-obvious traits an agent could not infer from the schema or annotations.

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?

Well front-loaded: purpose first, then disambiguation, then parameter nuances, then return fields and the linking instruction. It is dense and mostly earns its length, though the enumerated return fields and the url-linking instruction add bulk that a tighter description could shed.

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?

Given an output schema exists, return values need not be restated, yet the tool's behavior, filtering options, week semantics, and the hand-off to the group-products sibling are all covered. Nothing needed to invoke 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 100%, so baseline is 3, but the description adds domain meaning: period='next' timing semantics, a concrete Dutch query example ('kaas'), and the AH-specific label 'Eerder gekocht' for previously_bought. It does not add syntax beyond the schema, hence 4 rather than 5.

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 ('Get Albert Heijn bonus/promotional offers') and immediately distinguishes itself from ah_search_products. The scope (weekly bonus offers, group vs single deals) is precise enough that an agent can choose it 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 Guidelines5/5

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

Explicitly names the tool NOT to use ('not ah_search_products') and the trigger condition ('what is on bonus/sale/discount'). It also routes the agent onward to ah_get_bonus_group_products with the exact condition (group deals carrying a bonus_segment_id but no id). Both alternatives and their selecting conditions are stated.

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

ah_get_cartAlbert Heijn: View Order CartA
Read-only

View the items in the active Albert Heijn delivery order (the order cart). An order only exists after the user has chosen a delivery or pick-up slot; the products the user is collecting before that are on the shopping list (use ah_get_shopping_list). Returns the order state, items with names and quantities, total price, and total discount. When you mention a product or recipe from the result, link its name to its url.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
orderNo

TDQS

A4.6/5.0
Behavior4/5

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

readOnlyHint already covers safety, and the description adds real behavioral content: the payload contains order state, item names/quantities, total price and total discount, plus an instruction to hyperlink product/recipe names to their urls. It doesn't cover edge cases such as an empty or expired cart, but against annotation coverage 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.

Conciseness4/5

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

Three sentences, front-loaded with the core action and scoped with the sibling alternative. The return-value enumeration and the url-linking instruction are marginally beyond what this tool needs, but nothing is wasted or buried.

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?

Zero parameters plus an existing output schema means the remaining burden is selection and expectation-setting, and the description covers both: when a cart exists, what it contains, and how to reference items in the reply. Nothing an agent needs 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?

There are zero parameters, so the schema has nothing for the description to annotate; the baseline for a no-arg tool is 4. The description correctly adds no invented parameter semantics.

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?

Specific verb+resource ('View the items in the active Albert Heijn delivery order') with the scope clarified as the order cart after slot selection. It explicitly distinguishes itself from the shopping list, which is the most likely sibling to confuse it with, so an agent can select correctly without opening a schema.

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?

States the precondition for an order existing (a delivery or pick-up slot must be chosen) and names the alternative tool (ah_get_shopping_list) for the pre-slot period. This is explicit when-to-use/when-to-use-else guidance rather than inference.

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

ah_get_delivery_slotsAlbert Heijn: Delivery SlotsA
Read-only

List the delivery time windows Albert Heijn offers at the member's address, per day (Dutch time). Booking a slot is only possible in the AH app or on ah.nl; this shows when delivery is possible. Returns date and windows like '15:00-17:00'.

ParametersJSON Schema
NameRequiredDescriptionDefault
daysNoNumber of days with slots to return (default 7)

Output Schema

ParametersJSON Schema
NameRequiredDescription
daysYes
postal_codeYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds genuine value beyond that: Dutch time zone, the fact that this only shows availability (no booking side effects), and a sample return format ('15:00-17:00').

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?

Three tight sentences, each earning its place: purpose first, the booking constraint second, and return format last. No redundancy or filler.

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 low-complexity, single-optional-parameter read tool with an output schema covering return values and annotations covering safety, the description supplies everything an agent needs (what it lists, what it cannot do, and the shape of results).

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 100%, so the single 'days' parameter (including its default of 7) is already fully documented in the schema. The description adds only implicit time-zone framing ('per day', 'Dutch time') and no syntax beyond what the schema provides, so baseline 3 is correct.

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 (List) and resource (delivery time windows), plus scope (at the member's address, per day, Dutch time). No sibling tool covers delivery slots, and an agent can immediately tell this apart from cart/order/product tools.

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?

The description clarifies that booking is NOT possible through this tool and only happens in the AH app or on ah.nl, which is a useful exclusion guiding correct invocation. It does not name alternative sibling tools, but none exist for this domain, so context is clear.

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

ah_get_favorite_listsAlbert Heijn: View Favourite ListsA
Read-only

List all Albert Heijn favorite/saved shopping lists with their names and item counts. Use the returned list ID with ah_add_to_favorite_list, ah_remove_from_favorite_list or ah_delete_favorite_list.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
listsYes

TDQS

A4.1/5.0
Behavior3/5

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

The readOnlyHint=true annotation already establishes that this is a safe read operation. The description adds that returned IDs can be used with the add/remove/delete favorite-list tools and summarizes the returned fields, but it does not disclose pagination behavior, authentication needs, or rate limits.

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 tool's purpose and followed by the single actionable next step. No filler or redundant wording.

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 zero-parameter read-only tool with an output schema and readOnlyHint, the description covers purpose and follow-up routing completely. Return value details are appropriately left to the output schema.

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?

There are zero parameters and schema description coverage is 100%, so the description correctly does not need to explain parameter semantics. Baseline for a no-parameter tool is 4.

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 ('List all Albert Heijn favorite/saved shopping lists') plus the returned fields (names and item counts), which lets an agent distinguish it from the singular ah_get_shopping_list. It also names the downstream tools that consume the returned list IDs.

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?

Gives clear context for what the tool is for and what to do with the returned list IDs, but never states when to choose it over ah_get_shopping_list or any prerequisite such as an authenticated session. No explicit when-not guidance or exclusions are provided.

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

ah_get_frequent_itemsAlbert Heijn: Frequently Ordered ItemsA
Read-only

Get frequently ordered products by analysing order history. Fetches all fulfillments, expands each order's items, counts per product, and returns products ordered at least min_order_count times. Returns product_name, product_id, order_count, last_ordered_date. When you mention a product or recipe from the result, link its name to its url.

ParametersJSON Schema
NameRequiredDescriptionDefault
min_order_countNoMinimum number of orders a product must appear in (default 3)

Output Schema

ParametersJSON Schema
NameRequiredDescription
productsYes

TDQS

A4/5.0
Behavior4/5

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

With readOnlyHint=true already declaring safety, the description adds substantial value by disclosing the internal algorithm (fetching fulfillments, expanding items, counting) and the exact output fields (product_name, product_id, order_count, last_ordered_date). It also includes a specific post-processing instruction about linking product names to URLs, which is behavioral context not present in annotations.

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?

The description is a single, dense sentence that front-loads the core purpose and then details the mechanism and output. It is efficient with no wasted words, though the post-processing instruction could be separated for better clarity.

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?

Given the presence of an output schema, the description need not explain return values, but it does specify the exact fields returned. It also covers the computation method and provides a linking guideline, making it complete for an agent to understand the tool's behavior and usage.

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 coverage is 100% and the single parameter (min_order_count) is fully documented in the schema with its default value. The description mentions the threshold behavior but does not add syntax or format details beyond what the schema provides, fitting the baseline of 3 when the schema does the heavy lifting.

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 uses a specific verb ('Get frequently ordered products') and explains the underlying mechanism (analysing order history, expanding fulfillments, counting per product). It clearly distinguishes this from siblings like ah_get_orders or ah_get_products by focusing on aggregated frequency.

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?

The description implies usage through the min_order_count threshold explanation, which clarifies the filtering behavior. However, it does not explicitly state when to prefer this tool over alternatives like ah_get_favorite_lists or ah_search_products, leaving the agent to infer the context.

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

ah_get_last_chance_itemsAlbert Heijn: Last-Chance ItemsA
Read-only

Get last-chance / vandaag-af / clearance items from an Albert Heijn store. Requires a store_id (use ah_search_stores to find stores, or provide postal_code to find the nearest store). Uses the dedicated bargainItems GraphQL endpoint which returns today-only markdown deals. When you mention a product or recipe from the result, link its name to its url.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of results to return (default 20)
store_idNoAH store ID. Required to retrieve bargain items.
postal_codeNoDutch postal code (e.g. '1234AB') to find the nearest store when store_id is not known.

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, and the description adds meaningful context beyond that: the dedicated bargainItems GraphQL endpoint and the 'today-only' time-scoped nature of the results. Auth/rate-limit behavior is not mentioned, but the safety profile is well covered.

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?

Purpose is front-loaded, followed by prerequisite and data-source details. The trailing instruction about linking product/recipe names to their urls is a useful output-handling note, though it is somewhat tangential to tool selection.

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-value explanation is unnecessary, and the description covers data source, time scoping, and prerequisites. It is nearly complete for a read-only lookup, missing only auth/rate-limit context.

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 100%, but the description adds value beyond it by clarifying the actual requirement (a store_id is needed) and the relationship between store_id and postal_code as primary vs. fallback inputs, information the schema leaves unstated with 0 required parameters.

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 ('Get last-chance / vandaag-af / clearance items from an Albert Heijn store') with clear domain scoping. It implicitly distinguishes itself from ah_get_bonus_offers by emphasizing 'today-only markdown deals', but does not explicitly name sibling tools to sharpen the boundary.

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?

Gives explicit routing: requires store_id and directs the agent to ah_search_stores, or offers postal_code as an alternative when the store is unknown. This clearly names the helper tool and the fallback condition, though it does not contrast this tool against related offer/inventory tools.

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

ah_get_member_profileAlbert Heijn: Member ProfileA
Read-only

Get your Albert Heijn member profile. Returns name, email (masked), and bonus_card_number (last 4 digits only).

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
nameYes
emailNo
bonus_card_numberNo

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the safe-read profile is covered; the description adds genuine behavioral value by disclosing that email is masked and bonus_card_number is truncated to the last 4 digits. It still doesn't state the authentication requirement, which is relevant for a member-specific tool.

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, with the return payload summarized second. Every clause carries information and nothing is padded.

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 the description is not obliged to enumerate return values, yet it gives a useful précis of the payload. For a zero-parameter, read-only tool this is close to complete; the only omission is the authentication precondition.

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 zero parameters and the description correctly introduces no invented inputs, leaving nothing to misinterpret. The baseline for a no-parameter tool is 4 since there is no parameter semantics to add.

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 ("Get your Albert Heijn member profile") and further scopes it by describing exactly which fields come back. No sibling tool in the list covers member profile retrieval, so the purpose is unambiguous without needing explicit differentiation.

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 only implied: an agent can infer this is the tool for 'who am I / my loyalty details', and there is no competing sibling for that need. However, the description never states when to call it (e.g., after ah_login, only for authenticated users) or any preconditions, so it stays at the minimum-viable level.

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

ah_get_order_detailsAlbert Heijn: Order DetailsA
Read-only

Get the full item list for a specific Albert Heijn delivery order by its ID. Returns all products with names, quantities, and prices. Get order_id from ah_get_orders. When you mention a product or recipe from the result, link its name to its url.

ParametersJSON Schema
NameRequiredDescriptionDefault
order_idYesNumeric order ID from ah_get_orders

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
itemsYes
stateNo
total_priceNo
total_discountNo

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds value beyond that by disclosing the return contents (products with names, quantities, prices) and an output-handling convention: link product/recipe names to their url when mentioned. It stops short of noting empty orders or failure modes.

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?

Three short sentences, each earning its place: what it does, what it returns, how to source the ID, and how to render the result. The core purpose is front-loaded and there is no filler.

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-value structure need not be explained, and readOnlyHint covers safety. The description supplies the remaining context an agent needs: parameter provenance and the linking convention. Minor gaps (empty/nonexistent order handling) keep it from a 5.

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 100% and the single order_id parameter is already documented as 'Numeric order ID from ah_get_orders'. The description's provenance note largely restates the schema, so per the baseline rule a 3 is appropriate even though it is not misleading.

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 ('Get the full item list for a specific Albert Heijn delivery order by its ID') and immediately clarifies the granularity, distinguishing it from the sibling ah_get_orders which lists orders rather than their line items. An agent can tell them apart without opening either 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?

Gives an explicit prerequisite chain: 'Get order_id from ah_get_orders', which tells the agent this tool must be preceded by the list tool and how to obtain the required parameter. It does not state any when-not conditions or error behavior, but the routing context is clear.

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

ah_get_ordersAlbert Heijn: OrdersA
Read-only

List Albert Heijn online delivery orders. By default returns upcoming orders (with a modifiable flag); set past=true for delivered orders. Returns id, date, time_window, total_price, status. Use the returned id with ah_get_order_details to see the items.

ParametersJSON Schema
NameRequiredDescriptionDefault
pastNoReturn delivered orders instead of upcoming ones
limitNoMaximum number of orders to return (default 10)

Output Schema

ParametersJSON Schema
NameRequiredDescription
ordersYes

TDQS

A4.3/5.0
Behavior4/5

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

readOnlyHint=true is already supplied, so safety is covered. The description adds meaningful behavior: the default result set is upcoming orders, past=true flips it, and the response shape (id, date, time_window, total_price, status) is disclosed. The phrase 'with a modifiable flag' is vague, but the semantics of the flag are clarified by the schema.

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?

Three compact sentences, front-loaded with purpose and default behavior, then the flag, then the hand-off to the detail tool. No filler or repetition.

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?

An output schema exists, so enumerating return fields in prose is optional, but everything an agent needs to invoke the tool correctly is present: default scope, the past flag, and the next-step routing. No gaps remain for a two-optional-parameter list tool.

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 100%, so both parameters are documented structurally; baseline is 3. The description reinforces the meaning of past by contrasting upcoming vs delivered orders and notes the default upcoming scope, but adds no format, units, or edge-case detail beyond the schema.

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 ('List Albert Heijn online delivery orders') and immediately scopes it to two modes (upcoming by default, delivered with past=true). An agent can distinguish this from ah_get_order_details, which is explicitly named as the drill-down sibling.

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?

Gives clear context: default is upcoming orders, and past=true switches to delivered orders. It also routes the agent forward ('Use the returned id with ah_get_order_details'), which is exactly the follow-up guidance an agent needs. It stops short of stating when *not* to use this tool or when to prefer another listing alternative.

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

ah_get_product_alternativesAlbert Heijn: Product AlternativesA
Read-only

Get products Albert Heijn suggests instead of a given product: similar products and substitutes, e.g. when it is sold out or to find a cheaper or organic option. Returns the same fields as ah_search_products. When you mention a product or recipe from the result, link its name to its url.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of alternatives (default 10, max 30)
product_idYesProduct ID, e.g. from ah_search_products or ah_get_shopping_list

Output Schema

ParametersJSON Schema
NameRequiredDescription
productsYes

TDQS

A4.2/5.0
Behavior4/5

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

readOnlyHint=true already establishes the safety profile, and the description adds real value by disclosing that the return shape matches ah_search_products, so the agent knows the output contract without opening the schema. It also relays a link-formatting requirement for presenting results, though it says nothing about result counts 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?

Three tight sentences, front-loaded with the core purpose, then usage scenarios, then output/format guidance. No filler and nothing buried.

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 annotations covering the read-only safety profile, a full output schema, and 100% param coverage, the description is nearly self-sufficient. The one nuance it could add is whether an empty alternatives list is possible, but nothing essential is missing.

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 100%: product_id's provenance (from ah_search_products or ah_get_shopping_list) and the limit default/max are fully documented in the schema. The description adds nothing beyond this, so the baseline 3 applies.

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 ('Get products Albert Heijn suggests instead of a given product') and sharpens the scope with 'similar products and substitutes'. An agent immediately understands this returns recommendation alternatives rather than search results.

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?

Gives concrete triggering scenarios ('when it is sold out or to find a cheaper or organic option'), which frames when to reach for this over ah_search_products. It stops short of explicitly naming ah_search_products as the alternative to use for direct lookups.

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

ah_get_productsAlbert Heijn: Product DetailsA
Read-only

Get detailed information about one or more Albert Heijn products by ID (max 20). Returns title, brand, category, description, price, unit size, bonus info, NutriScore, property icons. Set include_nutritional_info=true to also return calories, fat, protein, etc. Get product IDs from ah_search_products. When you mention a product or recipe from the result, link its name to its url.

ParametersJSON Schema
NameRequiredDescriptionDefault
product_idsYesProduct IDs from ah_search_products, e.g. [123456] or [123456, 789012] (max 20)
include_nutritional_infoNoInclude nutritional values (default false)

Output Schema

ParametersJSON Schema
NameRequiredDescription
productsYes

TDQS

A4.1/5.0
Behavior4/5

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

readOnlyHint=true already establishes the safety profile, and the description adds useful context: the batch cap of 20, the fields returned, and the include_nutritional_info switch. It omits auth requirements and failure behavior for unknown IDs, so it is solid but not exhaustive.

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 that lead with the verb, resource, and cap before the optional flag and the linking instruction. The final sentence about linking product names to URLs is behaviorally useful but slightly tangential to invocation.

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, yet the description still summarizes them helpfully. With only two parameters, both covered, and readOnlyHint present, the definition is complete enough to invoke correctly.

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 100%, so the baseline is 3. The description restates the max-20 limit (already in the schema) and paraphrases include_nutritional_info ('also return calories, fat, protein, etc.'), adding only marginal meaning beyond the structured fields.

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 ('Get detailed information about one or more Albert Heijn products by ID') with scope (max 20) and enumerates the returned fields. It is clearly distinguishable from siblings like ah_search_products and ah_get_product_alternatives.

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?

Explicitly routes the agent to ah_search_products as the source of product IDs, which is a genuine usage precondition. It does not, however, say when to prefer this over ah_get_product_alternatives or other product-related siblings, so it falls 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.

ah_get_receipt_detailsAlbert Heijn: Receipt DetailsA
Read-only

Get full details of a single Albert Heijn in-store receipt (kassabon) by its id. Returns all purchased items with name, quantity, unit price and line total, plus any discounts and payment method. Get the id from ah_get_receipts first.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesReceipt transaction ID from ah_get_receipts

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
itemsYes
paymentsNo
discountsNo

TDQS

A4.3/5.0
Behavior4/5

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

Annotations declare readOnlyHint=true, so safety is already covered, but the description adds substantive content: the returned payload (items with name, quantity, unit price, line total, discounts, payment method) and the prerequisite that the id must originate from ah_get_receipts. No mention of auth or error behavior for a missing/invalid id, which keeps 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.

Conciseness5/5

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

Three sentences, zero filler: purpose, payload, and prerequisite in that order. The id-source instruction is front-loaded as the final actionable sentence where an agent will read it last before calling.

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 single-parameter read tool with a full output schema and readOnly annotation, the description supplies everything needed: what it fetches, what comes back, and where the id comes from. Nothing required for correct invocation is missing.

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 100% and the single 'id' parameter is already documented as 'Receipt transaction ID from ah_get_receipts', which the description largely repeats. No added format, example, or validation semantics beyond the schema's own text.

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 ('Get full details of a single ... in-store receipt (kassabon) by its id'), scoped to the in-store receipt domain. This distinguishes it cleanly from ah_get_receipts (the list) and ah_get_order_details (orders, not kassabonnen).

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?

Explicitly routes the agent: 'Get the id from ah_get_receipts first,' which establishes the required call ordering. It does not, however, state when to prefer ah_get_order_details for online orders versus this tool, leaving one sibling boundary to inference.

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

ah_get_receiptsAlbert Heijn: ReceiptsA
Read-only

List recent Albert Heijn in-store receipts (kassabonnen). Returns receipt id, date, and total amount. Use ah_get_receipt_details with the id to see individual items.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of results to return (default 10)

Output Schema

ParametersJSON Schema
NameRequiredDescription
receiptsYes

TDQS

A4/5.0
Behavior3/5

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

readOnlyHint=true already establishes the safe-read profile, so the description's added value is the disclosure of returned fields (id, date, total) and the implicit 'recent' scoping. It says nothing about pagination, ordering, how 'recent' is bounded, or whether authentication via ah_login is required, which is a meaningful gap for a listing tool.

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 tight sentences with zero filler, front-loading what the tool returns before the pointer to the detail sibling.

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 elaborated, and the description is sufficient for a simple one-optional-param list tool. The only omission is any mention of auth prerequisites given the presence of ah_login/ah_logout siblings.

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 100% and the single 'limit' parameter is fully documented in the schema with its default, so the baseline of 3 applies. The description adds no additional semantics about the limit.

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 ('List recent Albert Heijn in-store receipts'), including the Dutch term kassabonnen, and explicitly distinguishes itself from ah_get_receipt_details by noting that this tool returns only summary fields while the sibling returns items.

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?

Explicitly routes the agent to ah_get_receipt_details 'with the id to see individual items', which is a clear next-step condition. It stops short of the full 5 because it never clarifies the boundary against ah_get_orders, a sibling an agent could plausibly confuse with receipts.

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

ah_get_recipeAlbert Heijn: RecipeA
Read-only

Get an Allerhande recipe by id: ingredients, preparation steps, and nutrition per serving. Set servings to scale the ingredient quantities. To shop for it, search the ingredients with ah_search_products and add them with ah_add_to_shopping_list. When you mention a product or recipe from the result, link its name to its url.

ParametersJSON Schema
NameRequiredDescriptionDefault
servingsNoNumber of servings to scale the ingredients to
recipe_idYesRecipe id from ah_search_recipes

Output Schema

ParametersJSON Schema
NameRequiredDescription
idYes
urlYes
stepsYes
titleYes
ratingNo
coursesNo
cuisinesNo
servingsYes
descriptionNo
ingredientsYes
nutri_scoreNo
cook_minutesNo
nutrition_per_servingNo

TDQS

A4.3/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=true; the description adds the servings-scaling behavior, the shape of the returned data, and a post-retrieval linking convention for urls. No auth or rate-limit notes, but for a read-only lookup this is solid added context.

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?

Three short sentences, each load-bearing: what is returned, how to scale it, and what to do next. The core purpose is front-loaded before the workflow advice.

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?

An output schema exists, so return-value documentation is not required, yet the description still names the returned sections. Combined with the scaling note and the shopping workflow, an agent has everything needed to call it correctly.

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 100%, so both parameters are already documented, including that recipe_id comes from ah_search_recipes. The description's note on servings scaling restates the schema's own wording rather than adding new semantics, so the baseline of 3 applies.

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 (Get) and resource (Allerhande recipe by id) and enumerates the payload: ingredients, preparation steps, and nutrition per serving. It is clearly distinguishable from the sibling ah_search_recipes, which only finds ids.

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?

Gives explicit context for two behaviors: set servings to scale quantities, and use ah_search_products plus ah_add_to_shopping_list to shop for the ingredients. It does not mention the more direct sibling ah_add_recipe_to_shopping_list, so the routing advice is helpful but not exhaustive.

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

ah_get_shopping_listAlbert Heijn: View Shopping ListA
Read-only

Get the contents of the Albert Heijn shopping list (boodschappenlijst). In the AH app this is the basket the user fills while shopping; choosing a delivery slot moves its products into an order, after which the list is unavailable until the order is done (use ah_get_cart then). Returns item names, quantities, and product IDs. When you mention a product or recipe from the result, link its name to its url.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
itemsYes

TDQS

A4.7/5.0
Behavior4/5

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

readOnlyHint=true is already declared in annotations, so safety is covered structurally; the description adds lifecycle behavior annotations cannot convey (the list is consumed by slot selection and returns only after the order completes). The one omission is any note on auth/prerequisite state, though ah_login siblings make that largely implicit.

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?

Four short sentences, front-loaded with purpose, then lifecycle, then return shape, then the linking instruction. Every sentence carries actionable information and none restates structured fields.

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?

Although an output schema exists, the description still tells the agent what the items contain and gives a post-call formatting requirement (link product/recipe names to their url), which is guidance the schema cannot express. The lifecycle caveat closes the main behavioral gap.

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 per the rubric the baseline is 4; there are no arguments whose semantics need explaining. The description's mention of returned item names/quantities/product IDs is output information, not parameter semantics, so it neither helps nor hurts here.

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?

Specific verb ('Get') plus the exact resource ('contents of the Albert Heijn shopping list'), with a native-language gloss (boodschappenlijst) that removes ambiguity. It also implicitly distinguishes itself from ah_get_cart by naming that sibling, so an agent can separate the two list-like tools.

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 states the condition under which this tool is NOT usable ('after a delivery slot is chosen... the list is unavailable') and names the alternative to use instead ('use ah_get_cart then'). That is a clear when-to-use/when-not/alternative triple.

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

ah_loginAlbert Heijn: Log InA

Log in to Albert Heijn in two steps. 1) Call without arguments: returns the AH login link and instructions to show the user. 2) After the user logs in, the browser shows a link like appie://login-exit?code=...; call ah_login again with code set to that link (or just the code) to finish. Codes are single-use and expire quickly. If already logged in, returns the account name.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNoThe appie://login-exit?code=... link the user copied after logging in, or just the code. Omit to start a login.

TDQS

A4.5/5.0
Behavior4/5

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

With annotations only declaring readOnlyHint=false and destructiveHint=false, the description carries the real behavioral burden and does so well: codes are single-use, expire quickly, and an already-authenticated session returns the account name. It doesn't mention session lifetime, token storage, or what happens on an expired/invalid code, which keeps 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.

Conciseness5/5

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

Two numbered steps plus two short trailing sentences; the flow is front-loaded and every sentence (expiry, already-logged-in behavior) carries distinct, actionable information.

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?

There is no output schema, so the description must describe returns, and it does: a login link plus instructions on the first call and the account name when already logged in. For a one-optional-parameter auth tool this is complete.

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 100% and the single `code` parameter is fully documented there, so baseline is 3. The description restates that the full link or just the code is accepted and that omitting it starts a login, adding no semantics beyond the schema.

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 ('Log in to Albert Heijn') and immediately distinguishes itself from siblings by describing the two-step flow unique to this tool. An agent can tell it apart from ah_logout and the shopping-list tools without opening a schema.

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 says when to call with no arguments (to start) and when to call with `code` (to finish after the user logs in), including the exact redirect shape to look for. It also covers the already-logged-in case, leaving nothing to inference.

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

ah_logoutAlbert Heijn: Log OutA
Destructive

Log out of Albert Heijn by deleting the stored tokens. Use this to switch accounts or reset a broken session. After logout, call ah_login to authenticate again.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already flag destructiveHint=true, and the description reinforces this by naming what is destroyed (stored tokens) and the post-condition (must re-authenticate). It does not state whether the server-side session is invalidated or whether any local data beyond tokens is affected, leaving a small gap.

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?

Three short sentences, front-loaded with the core action and mechanism, followed by usage and the recovery step. Every sentence carries distinct information with no filler.

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 zero-parameter, no-output-schema tool whose safety profile is already covered by annotations, the description supplies everything needed: mechanism, use cases, and the next call to make.

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 zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. The description correctly implies the action is unconditional and needs no arguments.

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 (log out) plus the resource/mechanism (deleting stored tokens), and implicitly contrasts with the ah_login sibling. An agent can tell exactly what this does without opening any schema.

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 two triggering scenarios (switch accounts, reset a broken session) and the required follow-up (call ah_login to re-authenticate). Nothing about when to use it is left to inference.

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

ah_remove_from_cartAlbert Heijn: Remove from OrderA
Destructive

Remove a single product from the active Albert Heijn delivery order. Use product_id from ah_get_cart. To remove products from the shopping list, use ah_remove_from_shopping_list.

ParametersJSON Schema
NameRequiredDescriptionDefault
product_idYesNumeric product ID to remove

TDQS

A4.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false and destructiveHint=true, so the agent knows this mutates state. The description reinforces the single-item scope (versus ah_clear_cart) but says nothing about idempotency, behavior when the product is not in the cart, or whether the cart total recalculates. Adequate but not rich given the annotations carry the safety profile.

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 tight sentences, zero filler. The primary action is front-loaded, with source and alternative following in descending priority.

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 single-parameter mutation with no output schema and annotations that already declare destructiveness, the description covers purpose, scope, input provenance, and sibling routing. Nothing an agent needs to invoke it correctly is absent.

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 100%, so the baseline is 3, but the description adds real value by stating where product_id comes from (ah_get_cart) rather than just describing its type. That provenance guidance is the only semantic detail an agent could get wrong here.

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?

Specific verb+resource ('Remove a single product from the active Albert Heijn delivery order') with an explicit scope qualifier ('single', 'active ... order'). It cleanly separates this tool from ah_remove_from_shopping_list and ah_clear_cart without the agent needing to open any schema.

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?

Names the upstream data source ('Use product_id from ah_get_cart') and routes the agent to the correct sibling when the target is the shopping list rather than the cart. Both the when-to-use and the alternative are stated explicitly.

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

ah_remove_from_favorite_listAlbert Heijn: Remove from Favourite ListA
Destructive

Remove products from a named Albert Heijn favorite list. Get list_id from ah_get_favorite_lists.

ParametersJSON Schema
NameRequiredDescriptionDefault
list_idYesFavorite list ID from ah_get_favorite_lists
product_idsYesProduct IDs to remove, e.g. [123456, 789012]

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false and destructiveHint=true, so the mutation profile is covered by structured data. The description adds the identifier-provenance requirement but says nothing about permanence, list lifecycle when emptied, or failure behavior for non-member products, which would be valuable context for a destructive operation.

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 tight sentences with zero filler; the operation is front-loaded and the dependency hint follows immediately. Nothing is redundant or padded.

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 simple two-parameter, fully-required, fully-documented mutation whose safety profile is carried by annotations, the description is sufficient to invoke correctly. Minor gaps remain around outcome/error semantics and whether removal is reversible, but nothing essential is missing.

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 100% with both parameters documented in-schema, so the baseline is 3. The description's mention of list_id provenance largely restates the schema's own description, adding no new syntax or constraint detail for product_ids.

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 ("Remove products from a named Albert Heijn favorite list"), which an agent can immediately distinguish from the sibling ah_add_to_favorite_list and from ah_remove_from_shopping_list (different resource: shopping list vs favorite list). The scope (products, named list) is precise.

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?

Explicitly gives the prerequisite lookup path: "Get list_id from ah_get_favorite_lists," which routes the agent to the right sibling for the identifier. It does not state any when-not conditions or error cases (e.g. product not in list), so it falls short of a full 5.

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

ah_remove_from_shopping_listAlbert Heijn: Remove from Shopping ListA
Destructive

Remove one or more items from the Albert Heijn Boodschappenlijst. For product items pass product_ids; for free-text items pass names. Get product_ids from ah_get_shopping_list.

ParametersJSON Schema
NameRequiredDescriptionDefault
namesNoFree-text item names to remove, e.g. ["verse bloemen"]. Use for items without a product ID.
product_idsNoProduct IDs to remove, e.g. [123456, 789012]. Use for product items.

TDQS

A4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false and destructiveHint=true, so the mutation/removal risk is covered structurally. The description adds the two-mode removal model but says nothing about reversibility, behavior when an item is not on the list, or partial-failure handling, so it goes only modestly beyond the annotations.

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?

Three short sentences, front-loaded with the action and resource, then the mode-selection rule, then the discovery pointer. No filler or repetition.

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 no output schema and two fully described optional parameters, the description covers both invocation paths and where to obtain IDs, which is sufficient to call the tool correctly. It is slightly thin on outcome/error behavior for a destructive operation.

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 100% and the schema descriptions already explain 'use for product items' vs 'use for items without a product ID', so the description's guidance largely restates it. It does add the pointer to ah_get_shopping_list as the source of product_ids, which is minor value over the schema.

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 (Remove) plus resource (items in the Albert Heijn Boodschappenlijst) and explicitly scopes it to one-or-more items. This clearly separates it from ah_clear_shopping_list (remove all), ah_add_to_shopping_list, and the similarly named ah_remove_from_cart / ah_remove_from_favorite_list.

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?

Gives concrete routing rules: product items use product_ids, free-text items use names, and product_ids should come from ah_get_shopping_list. It does not, however, name the alternative for bulk removal (ah_clear_shopping_list), so the when-not case is left to inference.

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

ah_search_productsAlbert Heijn: Search ProductsA
Read-only

Search Albert Heijn (Dutch supermarket) products by keyword. Pass one or more queries (max 10) to search for several products in one call. Prefer Dutch search terms for best results: e.g. 'melk' (milk), 'kaas' (cheese), 'brood' (bread), 'kip' (chicken), 'appel' (apple). Set bonus=true to return only products currently on promotion. filters narrows results to products matching all of them, e.g. ['organic', 'gluten_free']: organic, prijsfavoriet (AH's budget label), new, frozen, a diet (vegan, vegetarian, low_sugar, low_fat, low_salt), or free from an allergen (gluten_free, lactose_free, milk_free, egg_free, nut_free, peanut_free, soy_free, fish_free, shellfish_free, sesame_free, celery_free, mustard_free, lupin_free, sulphite_free). sort orders results: relevance (default), price_low_high, price_high_low, most_bought (by this user), nutriscore. Returns, per query: id, title, price, bonus_price, unit, is_bonus, bonus_mechanism, image_url. When you mention a product or recipe from the result, link its name to its url.

ParametersJSON Schema
NameRequiredDescriptionDefault
sortNoResult order (default relevance)
bonusNoReturn only products currently on bonus/promotion
limitNoMaximum results per query (default 10 for one query, 5 for several; max 30)
filtersNoOnly products matching all of these, e.g. ["organic", "vegan"]
queriesYesSearch queries in Dutch or English, e.g. ["melk"] or ["melk", "kaas", "brood"] (max 10)

Output Schema

ParametersJSON Schema
NameRequiredDescription
searchesYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=true, so the description usefully adds the max-10-query constraint, the default limit behavior, the promotion-only toggle, and a per-query result field list plus a presentation instruction (link product names to their url). It adds real context beyond the safe-read annotation, though it doesn't cover pagination or failure behavior.

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?

Front-loaded with purpose and the usage-critical details first. It is somewhat long, and enumerating all 23 filter values duplicates the schema enum rather than only paraphrasing categories, which is mild 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?

With an output schema present, return-value explanation is optional, yet the description still lists per-query fields and adds the name-to-url linking instruction. Enough context exists to call the tool correctly; only sibling routing and pagination nuances are absent.

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 100%, so the baseline is 3; the description earns more by explaining filter semantics the enum doesn't (prijsfavoriet = AH's budget label, grouped diet/allergen categories), clarifying sort option 'most_bought (by this user)', and restating the queries cap with worked examples.

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 ('Search Albert Heijn (Dutch supermarket) products by keyword'), and the keyword-search framing distinguishes it from id-based siblings like ah_get_products and from ah_search_recipes.

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?

Gives clear operating guidance — pass one or more queries (max 10), prefer Dutch terms, use bonus=true for promotions, and how filters combine (AND semantics). It does not explicitly contrast with siblings such as ah_get_products or ah_get_bonus_offers, so no true when-not guidance.

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

ah_search_recipesAlbert Heijn: Search RecipesA
Read-only

Search Allerhande, Albert Heijn's recipe collection. Dutch search terms work best, e.g. 'pasta', 'vegetarisch', 'stamppot', 'kip curry'. Returns id, title, url, cook_minutes, servings, courses, nutri_score, rating. Use the id with ah_get_recipe for ingredients and steps. When you mention a product or recipe from the result, link its name to its url.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of results (default 10, max 30)
queryYesSearch text, e.g. 'pasta zalm'

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalYes
recipesYes

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so the safety profile is covered. The description adds useful behavioral context beyond that: the search language preference, the id-to-detail workflow, and the result-linking convention. It does not cover rate limits or result ordering, which keeps 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.

Conciseness5/5

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

Three sentences, each earning its place, and it is front-loaded with what the tool searches before moving to query tips, return shape, and follow-up workflow. No filler.

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?

An output schema exists, so return values need no explanation, yet the description still summarizes the key fields to aid selection. Combined with the ah_get_recipe routing and the linking instruction, an agent has everything needed to invoke and use this tool correctly.

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 already 100%, so the baseline is 3. The description adds genuine semantic value for the query parameter by specifying that Dutch terms are preferred and giving domain-appropriate example terms, going beyond the schema's example. Limit is left to the schema.

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 (Search) and resource (Allerhande recipe collection), and names the concrete domain (Albert Heijn). This clearly separates it from the sibling ah_search_products, which searches products rather than recipes.

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?

Gives explicit usage guidance: Dutch search terms work best with concrete examples ('pasta', 'vegetarisch', 'stamppot', 'kip curry'), names the follow-up tool ah_get_recipe for ingredients and steps, and states the linking convention for results. The agent knows both how to query and what to do next.

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

ah_search_storesAlbert Heijn: Search StoresA
Read-only

Find Albert Heijn stores near a Dutch postal code. If no postal_code is given, automatically uses the address from the member profile. Returns store id (use this for ah_get_last_chance_items), name, type, and address.

ParametersJSON Schema
NameRequiredDescriptionDefault
postal_codeNoDutch postal code, e.g. '1234AB'. Optional — falls back to member address.

Output Schema

ParametersJSON Schema
NameRequiredDescription
storesYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, so safety is covered. The description adds real behavioral context beyond that: the implicit fallback to the member profile address and the fact that the returned store id is the input to ah_get_last_chance_items, which is not derivable from the 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?

Three tight sentences, front-loaded with purpose and fallback behavior. The enumerated return fields are partly redundant with the existing output schema, which is the only minor waste.

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-parameter read tool with annotations and an output schema, nothing an agent needs is missing: purpose, default behavior, and how the returned id is consumed downstream are all stated.

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 coverage is 100% and the single postal_code parameter already documents the format and the member-address fallback, so the description largely restates what the schema provides. Baseline 3 applies when the schema does the heavy lifting.

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 ('Find Albert Heijn stores') plus the scoping constraint (near a Dutch postal code), which is unmistakable against siblings like ah_search_products or ah_get_last_chance_items.

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?

Explains the conditional default ('if no postal_code is given, automatically uses the address from the member profile') and points to the downstream tool that consumes the returned id (ah_get_last_chance_items). It gives clear context but does not explicitly compare against an alternative store-lookup tool (there is none).

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

ah_update_cart_itemAlbert Heijn: Update Order ItemA
Destructive

Set the quantity of a product in the active Albert Heijn delivery order. Requires an order (started by choosing a delivery slot in the AH app or on ah.nl, which moves the shopping list into it); to collect products before that, use ah_add_to_shopping_list. Use product_id from ah_search_products or ah_get_cart. Set quantity=0 to remove the item (or use ah_remove_from_cart).

ParametersJSON Schema
NameRequiredDescriptionDefault
quantityYesNew quantity (0 removes the item)
product_idYesNumeric product ID

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=false and destructiveHint=true. The description goes beyond them by disclosing the required order state (which is not obvious) and by spelling out that quantity=0 destroys the line item. It stops short of return values or any confirmation of what the mutation yields, so 4 rather than 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?

Front-loaded with the core action, then prerequisites, then alternatives; every sentence carries routing or state information. The delivery-slot parenthetical is slightly heavy but is doing real explanatory work.

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?

No output schema exists, but for a two-parameter mutation with annotations covering the destructive profile, the description supplies everything else needed: prerequisites, id provenance, removal semantics, and alternative tools.

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 100%, so the baseline is 3 and both parameters are already documented in the schema (including 'quantity 0 removes the item'). The description adds genuine value by telling the agent where product_id comes from (ah_search_products or ah_get_cart), which the schema does not.

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+scope: 'Set the quantity of a product in the active Albert Heijn delivery order.' It names the siblings it is not (ah_add_to_shopping_list for pre-order collection, ah_remove_from_cart as an alternative), so an agent can route correctly without opening schemas.

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 prerequisites (an order must exist, created by choosing a delivery slot), explicit alternatives with the condition that selects each (ah_add_to_shopping_list before an order exists; ah_remove_from_cart instead of quantity=0), and a stated special-value convention.

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. 22 tool updatesv1.3.1
    • Addedah_add_recipe_to_shopping_list
    • Addedah_create_favorite_list
    • Addedah_delete_favorite_list
    • Changedah_get_bonus_group_products1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "products": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "bonus_mechanism": {
        +            "type": "string"
        +          },
        +          "bonus_price": {
        +            "type": "number"
        +          },
        +          "id": {
        +            "type": "number"
        +          },
        +          "image_url": {
        +            "type": "string"
        +          },
        +          "is_bonus": {
        +            "type": "boolean"
        +          },
        +          "price": {
        +            "type": "number"
        +          },
        +          "title": {
        +            "type": "string"
        +          },
        +          "unit": {
        +            "type": "string"
        +          },
        +          "url": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "title",
        +          "url",
        +          "price",
        +          "is_bonus"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "products"
        +  ],
        +  "type": "object"
        +}
    • Changedah_get_bonus_offers1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "offers": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "bonus_mechanism": {
        +            "type": "string"
        +          },
        +          "bonus_price": {
        +            "type": "number"
        +          },
        +          "bonus_segment_id": {
        +            "type": "string"
        +          },
        +          "discount_percentage": {
        +            "type": "number"
        +          },
        +          "id": {
        +            "type": "number"
        +          },
        +          "original_price": {
        +            "type": "number"
        +          },
        +          "title": {
        +            "type": "string"
        +          },
        +          "url": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "title"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "offers"
        +  ],
        +  "type": "object"
        +}
    • Changedah_get_cart1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "order": {
        +      "additionalProperties": false,
        +      "properties": {
        +        "id": {
        +          "type": "number"
        +        },
        +        "items": {
        +          "items": {
        +            "additionalProperties": false,
        +            "properties": {
        +              "name": {
        +                "type": "string"
        +              },
        +              "price": {
        +                "type": "number"
        +              },
        +              "product_id": {
        +                "type": "number"
        +              },
        +              "quantity": {
        +                "type": "number"
        +              },
        +              "url": {
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "product_id",
        +              "url",
        +              "quantity"
        +            ],
        +            "type": "object"
        +          },
        +          "type": "array"
        +        },
        +        "state": {
        +          "type": "string"
        +        },
        +        "total_discount": {
        +          "type": "number"
        +        },
        +        "total_price": {
        +          "type": "number"
        +        }
        +      },
        +      "required": [
        +        "id",
        +        "items"
        +      ],
        +      "type": "object"
        +    }
        +  },
        +  "type": "object"
        +}
    • Addedah_get_delivery_slots
    • Changedah_get_favorite_lists1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "lists": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "id": {
        +            "type": "string"
        +          },
        +          "item_count": {
        +            "type": "number"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "updated_at": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "name",
        +          "item_count"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "lists"
        +  ],
        +  "type": "object"
        +}
    • Changedah_get_frequent_items1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "products": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "last_ordered_date": {
        +            "type": "string"
        +          },
        +          "order_count": {
        +            "type": "number"
        +          },
        +          "product_id": {
        +            "type": "number"
        +          },
        +          "product_name": {
        +            "type": "string"
        +          },
        +          "url": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "product_name",
        +          "product_id",
        +          "order_count",
        +          "url"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "products"
        +  ],
        +  "type": "object"
        +}
    • Changedah_get_last_chance_items1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "items": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "brand": {
        +            "type": "string"
        +          },
        +          "category": {
        +            "type": "string"
        +          },
        +          "discount_percentage": {
        +            "type": "number"
        +          },
        +          "expiration_date": {
        +            "type": "string"
        +          },
        +          "id": {
        +            "type": "number"
        +          },
        +          "markdown_type": {
        +            "type": "string"
        +          },
        +          "price_now": {
        +            "type": "string"
        +          },
        +          "price_was": {
        +            "type": "string"
        +          },
        +          "stock": {
        +            "type": "number"
        +          },
        +          "title": {
        +            "type": "string"
        +          },
        +          "url": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "title",
        +          "url"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "items"
        +  ],
        +  "type": "object"
        +}
    • Changedah_get_member_profile1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "bonus_card_number": {
        +      "type": "string"
        +    },
        +    "email": {
        +      "type": "string"
        +    },
        +    "name": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "name"
        +  ],
        +  "type": "object"
        +}
    • Changedah_get_order_details1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "id": {
        +      "type": "number"
        +    },
        +    "items": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "name": {
        +            "type": "string"
        +          },
        +          "price": {
        +            "type": "number"
        +          },
        +          "product_id": {
        +            "type": "number"
        +          },
        +          "quantity": {
        +            "type": "number"
        +          },
        +          "url": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "product_id",
        +          "url",
        +          "quantity"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "state": {
        +      "type": "string"
        +    },
        +    "total_discount": {
        +      "type": "number"
        +    },
        +    "total_price": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "id",
        +    "items"
        +  ],
        +  "type": "object"
        +}
    • Changedah_get_orders1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "orders": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "date": {
        +            "type": "string"
        +          },
        +          "id": {
        +            "type": "number"
        +          },
        +          "modifiable": {
        +            "type": "boolean"
        +          },
        +          "shopping_type": {
        +            "type": "string"
        +          },
        +          "status": {
        +            "type": "string"
        +          },
        +          "time_window": {
        +            "type": "string"
        +          },
        +          "total_price": {
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "id"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "orders"
        +  ],
        +  "type": "object"
        +}
    • Addedah_get_product_alternatives
    • Changedah_get_products1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "products": {
        +      "items": {
        +        "anyOf": [
        +          {
        +            "additionalProperties": false,
        +            "properties": {
        +              "bonus_mechanism": {
        +                "type": "string"
        +              },
        +              "bonus_price": {
        +                "type": "number"
        +              },
        +              "brand": {
        +                "type": "string"
        +              },
        +              "category": {
        +                "type": "string"
        +              },
        +              "description": {
        +                "type": "string"
        +              },
        +              "id": {
        +                "type": "number"
        +              },
        +              "image_url": {
        +                "type": "string"
        +              },
        +              "is_available": {
        +                "type": "boolean"
        +              },
        +              "is_bonus": {
        +                "type": "boolean"
        +              },
        +              "nutri_score": {
        +                "type": "string"
        +              },
        +              "nutritional_info": {
        +                "items": {
        +                  "additionalProperties": false,
        +                  "properties": {
        +                    "name": {
        +                      "type": "string"
        +                    },
        +                    "type": {
        +                      "type": "string"
        +                    },
        +                    "value": {
        +                      "type": "string"
        +                    }
        +                  },
        +                  "required": [
        +                    "type",
        +                    "name",
        +                    "value"
        +                  ],
        +                  "type": "object"
        +                },
        +                "type": "array"
        +              },
        +              "price": {
        +                "type": "number"
        +              },
        +              "property_icons": {
        +                "items": {
        +                  "type": "string"
        +                },
        +                "type": "array"
        +              },
        +              "title": {
        +                "type": "string"
        +              },
        +              "unit_price_description": {
        +                "type": "string"
        +              },
        +              "unit_size": {
        +                "type": "string"
        +              },
        +              "url": {
        +                "type": "string"
        +              }
        +            },
        +            "required": [
        +              "id",
        +              "title",
        +              "url",
        +              "price",
        +              "is_bonus",
        +              "is_available"
        +            ],
        +            "type": "object"
        +          },
        +          {
        +            "additionalProperties": false,
        +            "properties": {
        +              "error": {
        +                "type": "string"
        +              },
        +              "id": {
        +                "type": "number"
        +              }
        +            },
        +            "required": [
        +              "id",
        +              "error"
        +            ],
        +            "type": "object"
        +          }
        +        ]
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "products"
        +  ],
        +  "type": "object"
        +}
    • Changedah_get_receipt_details1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "discounts": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "amount": {
        +            "type": "number"
        +          },
        +          "name": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "name",
        +          "amount"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "id": {
        +      "type": "string"
        +    },
        +    "items": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "name": {
        +            "type": "string"
        +          },
        +          "quantity": {
        +            "type": "number"
        +          },
        +          "total": {
        +            "type": "number"
        +          },
        +          "unit_price": {
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "name",
        +          "total"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "payments": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "amount": {
        +            "type": "number"
        +          },
        +          "method": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "method",
        +          "amount"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "id",
        +    "items"
        +  ],
        +  "type": "object"
        +}
    • Changedah_get_receipts1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "receipts": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "date": {
        +            "type": "string"
        +          },
        +          "id": {
        +            "type": "string"
        +          },
        +          "total_amount": {
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "date",
        +          "total_amount"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "receipts"
        +  ],
        +  "type": "object"
        +}
    • Changedah_get_recipe1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "cook_minutes": {
        +      "type": "number"
        +    },
        +    "courses": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "cuisines": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "description": {
        +      "type": "string"
        +    },
        +    "id": {
        +      "type": "number"
        +    },
        +    "ingredients": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "nutri_score": {
        +      "type": "string"
        +    },
        +    "nutrition_per_serving": {
        +      "additionalProperties": {
        +        "type": "string"
        +      },
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    },
        +    "rating": {
        +      "type": "string"
        +    },
        +    "servings": {
        +      "type": "string"
        +    },
        +    "steps": {
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "title": {
        +      "type": "string"
        +    },
        +    "url": {
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "id",
        +    "title",
        +    "url",
        +    "servings",
        +    "ingredients",
        +    "steps"
        +  ],
        +  "type": "object"
        +}
    • Changedah_get_shopping_list1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "items": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "checked": {
        +            "type": "boolean"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "position": {
        +            "type": "number"
        +          },
        +          "product_id": {
        +            "type": "number"
        +          },
        +          "quantity": {
        +            "type": "number"
        +          },
        +          "url": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "position",
        +          "name",
        +          "quantity"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "items"
        +  ],
        +  "type": "object"
        +}
    • Changedah_search_products3 fields changed
      • addedInput schema / properties / filters
        Added value: +{
        +  "description": "Only products matching all of these, e.g. [\"organic\", \"vegan\"]",
        +  "items": {
        +    "enum": [
        +      "organic",
        +      "prijsfavoriet",
        +      "new",
        +      "frozen",
        +      "vegan",
        +      "vegetarian",
        +      "low_sugar",
        +      "low_fat",
        +      "low_salt",
        +      "gluten_free",
        +      "lactose_free",
        +      "milk_free",
        +      "egg_free",
        +      "nut_free",
        +      "peanut_free",
        +      "soy_free",
        +      "fish_free",
        +      "shellfish_free",
        +      "sesame_free",
        +      "celery_free",
        +      "mustard_free",
        +      "lupin_free",
        +      "sulphite_free"
        +    ],
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / sort
        Added value: +{
        +  "description": "Result order (default relevance)",
        +  "enum": [
        +    "relevance",
        +    "price_low_high",
        +    "price_high_low",
        +    "most_bought",
        +    "nutriscore"
        +  ],
        +  "type": "string"
        +}
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "searches": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "error": {
        +            "type": "string"
        +          },
        +          "query": {
        +            "type": "string"
        +          },
        +          "results": {
        +            "items": {
        +              "additionalProperties": false,
        +              "properties": {
        +                "bonus_mechanism": {
        +                  "type": "string"
        +                },
        +                "bonus_price": {
        +                  "type": "number"
        +                },
        +                "id": {
        +                  "type": "number"
        +                },
        +                "image_url": {
        +                  "type": "string"
        +                },
        +                "is_bonus": {
        +                  "type": "boolean"
        +                },
        +                "price": {
        +                  "type": "number"
        +                },
        +                "title": {
        +                  "type": "string"
        +                },
        +                "unit": {
        +                  "type": "string"
        +                },
        +                "url": {
        +                  "type": "string"
        +                }
        +              },
        +              "required": [
        +                "id",
        +                "title",
        +                "url",
        +                "price",
        +                "is_bonus"
        +              ],
        +              "type": "object"
        +            },
        +            "type": "array"
        +          }
        +        },
        +        "required": [
        +          "query",
        +          "results"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "searches"
        +  ],
        +  "type": "object"
        +}
    • Changedah_search_recipes1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "recipes": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "cook_minutes": {
        +            "type": "number"
        +          },
        +          "courses": {
        +            "items": {
        +              "type": "string"
        +            },
        +            "type": "array"
        +          },
        +          "id": {
        +            "type": "number"
        +          },
        +          "nutri_score": {
        +            "type": "string"
        +          },
        +          "oven_minutes": {
        +            "type": "number"
        +          },
        +          "rating": {
        +            "type": "string"
        +          },
        +          "servings": {
        +            "type": "string"
        +          },
        +          "title": {
        +            "type": "string"
        +          },
        +          "url": {
        +            "type": "string"
        +          },
        +          "wait_minutes": {
        +            "type": "number"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "title",
        +          "url"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    "total": {
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "total",
        +    "recipes"
        +  ],
        +  "type": "object"
        +}
    • Changedah_search_stores1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "$schema": "http://json-schema.org/draft-07/schema#",
        +  "additionalProperties": false,
        +  "properties": {
        +    "stores": {
        +      "items": {
        +        "additionalProperties": false,
        +        "properties": {
        +          "city": {
        +            "type": "string"
        +          },
        +          "id": {
        +            "type": "number"
        +          },
        +          "name": {
        +            "type": "string"
        +          },
        +          "postal_code": {
        +            "type": "string"
        +          },
        +          "street": {
        +            "type": "string"
        +          },
        +          "type": {
        +            "type": "string"
        +          }
        +        },
        +        "required": [
        +          "id",
        +          "name"
        +        ],
        +        "type": "object"
        +      },
        +      "type": "array"
        +    }
        +  },
        +  "required": [
        +    "stores"
        +  ],
        +  "type": "object"
        +}
  2. 28 tool updatesv1.0.0
    • First observedah_add_free_text_to_shopping_list
    • First observedah_add_to_favorite_list
    • First observedah_add_to_shopping_list
    • First observedah_clear_cart
    • First observedah_clear_shopping_list
    • First observedah_get_bonus_group_products
    • First observedah_get_bonus_offers
    • First observedah_get_cart
    • First observedah_get_favorite_lists
    • First observedah_get_frequent_items
    • First observedah_get_last_chance_items
    • First observedah_get_member_profile
    • First observedah_get_order_details
    • First observedah_get_orders
    • First observedah_get_products
    • First observedah_get_receipt_details
    • First observedah_get_receipts
    • First observedah_get_recipe
    • First observedah_get_shopping_list
    • First observedah_login
    • First observedah_logout
    • First observedah_remove_from_cart
    • First observedah_remove_from_favorite_list
    • First observedah_remove_from_shopping_list
    • First observedah_search_products
    • First observedah_search_recipes
    • First observedah_search_stores
    • First observedah_update_cart_item

TDQS

A3.9/5.0

Scored across 33 tools

Disambiguation4/5

Most tools target clearly distinct resources and actions, and the descriptions explicitly distinguish tricky areas like shopping list vs. cart vs. orders. Minor overlap remains: update_cart_item can remove an item via quantity=0 while remove_from_cart exists, and add_to_shopping_list vs. add_recipe_to_shopping_list could blur for some workflows.

Naming Consistency5/5

All tools use a consistent ah_ prefix with snake_case and a predictable verb_noun or verb_object pattern. Long names like ah_add_free_text_to_shopping_list are still readable and fit the same convention.

Tool Count2/5

33 tools is high, and the set exceeds the rubric's 25+ threshold for being too large. Although the Albert Heijn domain is broad, many adjacent lifecycle operations could be consolidated or kept behind fewer tools.

Completeness4/5

Coverage is strong across auth, lists, cart, orders, products, bonuses, recipes, stores, delivery slots, and receipts. Minor gaps exist: there is no explicit add-to-cart for an active order, no checkout/order-placement operation, and delivery slot booking is intentionally unsupported.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables AI assistants to interact with Picnic online supermarket for grocery shopping, meal planning, cart management, delivery tracking, and budget-conscious shopping in Netherlands and Germany.
    134 npm
    108
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to interact with Rohlik Group's online grocery delivery services across multiple European countries, supporting product search, shopping cart management, order history analysis, and personalized meal suggestions based on purchase patterns.
    59 npm
    3
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to interact with Rohlik Group's online grocery delivery services across multiple countries, including product search, cart management, and account info.
    59 npm
    121
    MIT