Skip to main content
Glama
arnouthoebreckx

albert-heijn-be-mcp

Albert Heijn: Product Details

ah_get_products
Read-only

Retrieves detailed Albert Heijn product data by ID for up to 20 products, including price, brand, bonus, and optional nutrition, ingredients, and images.

Instructions

Get detailed information about one or more Albert Heijn products by ID (max 20). Returns title, brand, category, price, the price fields (pack_price, deal_min_quantity, deal_total, deal_price_per_pack, unit_price, unit_price_unit), unit size, bonus info, NutriScore, property icons. Set include_nutritional_info=true to also return calories, fat, protein, etc.; include_ingredients=true for the ingredients text and the allergens (what it contains or may contain); include_description=true for the description; include_images=true for image_url. Get product IDs from ah_search_products. When you mention a product or recipe from the result, link its name to its url.

Input Schema

NameRequiredDescriptionDefault
product_idsYesProduct IDs from ah_search_products, e.g. [123456] or [123456, 789012] (max 20)
include_imagesNoInclude image_url (default false)
include_descriptionNoInclude the description (default false)
include_ingredientsNoInclude ingredients (text) and allergens (list), where AH has them (default false)
include_nutritional_infoNoInclude nutritional values (default false)

Output Schema

NameRequiredDescriptionDefault
productsYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed4 schema fields changedv1.2.0
    • addedInput schema / properties / include_description
      Added value: +{
      +  "description": "Include the description (default false)",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / include_images
      Added value: +{
      +  "description": "Include image_url (default false)",
      +  "type": "boolean"
      +}
    • addedInput schema / properties / include_ingredients
      Added value: +{
      +  "description": "Include ingredients (text) and allergens (list), where AH has them (default false)",
      +  "type": "boolean"
      +}
    • changedOutput schema / properties / products / items / anyOf
      Previous value: -[
      -  {
      -    "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"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "allergens": {
      +        "description": "Only with include_ingredients: true, where AH has them: what the product contains or may contain",
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "level": {
      +              "enum": [
      +                "contains",
      +                "may_contain"
      +              ],
      +              "type": "string"
      +            },
      +            "name": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "name",
      +            "level"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "bonus_mechanism": {
      +        "type": "string"
      +      },
      +      "bonus_price": {
      +        "description": "Price of one pack with the bonus, only where AH sends one: a percentage or euro discount, or a price for one pack ('VOOR 1.99'). Absent for deals on several packs ('2e gratis', '2 voor 5.00'): then deal_min_quantity packs cost deal_total, which is deal_price_per_pack a pack.",
      +        "type": "number"
      +      },
      +      "brand": {
      +        "type": "string"
      +      },
      +      "category": {
      +        "type": "string"
      +      },
      +      "deal_min_quantity": {
      +        "description": "Packs needed to get the deal (1 for a plain discount); null without a deal, or when the mechanism is not understood",
      +        "type": [
      +          "number",
      +          "null"
      +        ]
      +      },
      +      "deal_price_per_pack": {
      +        "description": "deal_total / deal_min_quantity, in euros",
      +        "type": [
      +          "number",
      +          "null"
      +        ]
      +      },
      +      "deal_total": {
      +        "description": "What you pay for deal_min_quantity packs with the deal, in euros",
      +        "type": [
      +          "number",
      +          "null"
      +        ]
      +      },
      +      "description": {
      +        "description": "Only with include_description: true",
      +        "type": "string"
      +      },
      +      "id": {
      +        "type": "number"
      +      },
      +      "image_url": {
      +        "description": "Only with include_images: true",
      +        "type": "string"
      +      },
      +      "ingredients": {
      +        "description": "Only with include_ingredients: true, where AH has them",
      +        "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"
      +      },
      +      "pack_price": {
      +        "description": "Normal shelf price of one pack, in euros",
      +        "type": [
      +          "number",
      +          "null"
      +        ]
      +      },
      +      "price": {
      +        "description": "Normal price of one pack in euros, whatever the deal. Same as pack_price.",
      +        "type": "number"
      +      },
      +      "property_icons": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "title": {
      +        "type": "string"
      +      },
      +      "unit_price": {
      +        "description": "Normal price per unit_price_unit, where AH gives one",
      +        "type": [
      +          "number",
      +          "null"
      +        ]
      +      },
      +      "unit_price_description": {
      +        "type": "string"
      +      },
      +      "unit_price_unit": {
      +        "anyOf": [
      +          {
      +            "enum": [
      +              "kg",
      +              "l",
      +              "stuk"
      +            ],
      +            "type": "string"
      +          },
      +          {
      +            "type": "null"
      +          }
      +        ],
      +        "description": "The unit of unit_price"
      +      },
      +      "unit_size": {
      +        "type": "string"
      +      },
      +      "url": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "id",
      +      "title",
      +      "url",
      +      "price",
      +      "is_bonus",
      +      "is_available",
      +      "pack_price",
      +      "deal_min_quantity",
      +      "deal_total",
      +      "deal_price_per_pack",
      +      "unit_price",
      +      "unit_price_unit"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "error": {
      +        "type": "string"
      +      },
      +      "id": {
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "id",
      +      "error"
      +    ],
      +    "type": "object"
      +  }
      +]
  2. First observedv1.1.0

TDQS

A4.4/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 carries real weight here and does: it discloses the max-20 batch limit, the default-off nature of the four include flags, and enumerates the concrete fields returned in the base response. It doesn't discuss error behavior for invalid IDs or performance on large batches, keeping it below a 5.

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

Conciseness4/5

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

Front-loaded with the purpose and batch limit, then the base return fields, then the optional flags in a tidy parallel structure. It is dense but every clause carries information; the final linking instruction is a formatting convention that is arguably useful for the agent's output rather than tool selection.

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, yet the description's overview of return fields and flag effects still gives the agent enough to decide which flags to set without guessing. Combined with the ID-source pointer, nothing needed to invoke this tool 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 the baseline is 3, but the description adds genuine meaning beyond the schema by spelling out what each include flag yields (e.g. include_ingredients returns 'the ingredients text and the allergens (what it contains or may contain)') where the schema only says 'Include ingredients (text) and allergens'. It also lists the concrete price fields available, which the schema does not enumerate.

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?

Opens with a specific verb and resource ('Get detailed information about one or more Albert Heijn products by ID') and immediately bounds scope with 'max 20'. It is clearly distinguishable from the sibling ah_search_products, which supplies the IDs rather than details.

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 product IDs from ah_search_products', establishing the prerequisite step and the ID-based-only access pattern. It does not name an exclusion case (e.g. when to prefer ah_get_product_alternatives instead), so it stops short of full when/when-not guidance.

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