Supplementenscanner
Server Details
Cheapest supplements by normalized price per kg, serving or capsule, across Dutch stores.
- Status
- Healthy
- Uptime
- 99.8% over 43 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 4 tools
The four tools target largely distinct actions: category discovery, free-text search, cheapest-product lookup within a known category, and product detail retrieval. The only overlap is that search_products can also answer natural-language category requests with cheapest-first sorting, but the descriptions explicitly clarify when to prefer find_cheapest.
All tool names use consistent snake_case with a leading verb: find_cheapest, get_product, list_categories, search_products. The pattern is predictable and easy to scan.
Four tools is well-scoped for a read-only supplement price comparison server. Each tool covers a necessary stage of the workflow: category discovery, search, cheapest lookup, and product detail.
The surface covers the core domain workflow: discovering categories, searching products, finding cheapest options, and inspecting product details. Minor gaps remain around explicit multi-product comparison or alternate store/brand listings, but these can mostly be worked around.
Available Tools
4 toolsfind_cheapestFind cheapest productsARead-onlyIdempotentInspect
Find the cheapest supplements by normalized price-per-unit within a category (and all its subcategories). This is the primary tool for "what is the cheapest X?" questions. Use list_categories first to pick a valid category_slug. Narrow it with filters (the category page's attribute filters, such as vegan or a form) and brand; every response lists the filters the category offers in available_filters.
| Name | Required | Description | Default |
|---|---|---|---|
| brand | No | Optional: only this brand, by name or slug as it appears in the results. | |
| limit | No | Maximum number of products to return (1-50). | |
| market | No | Optional country market to query: nl, be, fr, gb, pl, es, dk, at. Defaults to nl, the market this endpoint answers for. Any other value is rejected. | |
| filters | No | Optional: only products carrying every one of these attributes, the filters of the category page, e.g. ["is_vegan", "is_lab_tested", "form:powder"]. A boolean attribute is its key; an option is "key:value", one value per key. Every response lists the ids this category offers in available_filters; an id it does not offer is rejected. | |
| category_slug | Yes | The category to search within, e.g. "whey-protein" or "creatine". Products in every subcategory are included, so a parent slug like "protein-powder" works too. Get valid slugs from list_categories. | |
| in_stock_only | No | When true, only return products currently in stock. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/openWorld, so the safety profile is covered. The description adds real value by disclosing that subcategories are included and that responses list available_filters with invalid ids rejected, but says nothing about result ordering ties or pagination behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences, front-loaded with the core purpose, then prerequisites and narrowing options. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a filtered list tool with full schema coverage and annotations carrying safety, the description covers prerequisite workflow, filtering contract, and response affordance (available_filters) without needing an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all six parameters are already documented in the schema, and much of the description's filter guidance (available_filters, rejected ids) merely restates it. The description adds only modest context, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource — finding cheapest supplements ranked by normalized price-per-unit within a category and its subcategories. The 'price-per-unit' normalization detail makes the ranking criterion unambiguous and separates it from get_product/search_products.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly frames itself as the primary tool for 'what is the cheapest X?' questions and tells the agent to call list_categories first for a valid slug. It also explains how to narrow results with filters and brand, leaving little inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_productGet product detailsARead-onlyIdempotentInspect
Get full detail for one product by its id: price, normalized unit price, size, bulk/staffel tiers, buy link, and recent price history. Use the id returned by find_cheapest or search_products.
| Name | Required | Description | Default |
|---|---|---|---|
| market | No | Optional country market to query: nl, be, fr, gb, pl, es, dk, at. Defaults to nl, the market this endpoint answers for. Any other value is rejected. | |
| product_id | Yes | The numeric product id, as returned in the `id` field by find_cheapest or search_products. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, openWorldHint=true and destructiveHint=false, so the safety profile is covered. The description adds value by disclosing the return content (normalized unit price, bulk tiers, buy link, recent price history) — the closest thing to an output schema here. It omits history window length and result limits, keeping it below 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste — the returned-field enumeration is front-loaded and the id-provenance note follows. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-parameter read tool with full schema coverage, no output schema and clear annotations, nothing an agent needs is missing: the required id, where to get it, what comes back, and the optional market behavior all resolve.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: product_id's numeric origin and the market's accepted values, default, and rejection behavior are all documented in the schema. The description only reinforces that the id comes from find_cheapest or search_products and never mentions market, so it sits at the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (get) and resource (full detail for one product by id) and then enumerates exactly what detail is returned: price, normalized unit price, size, bulk/staffel tiers, buy link, and recent price history. An agent can distinguish this single-product lookup from find_cheapest and search_products 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use the id returned by find_cheapest or search_products" gives a concrete prerequisite and routes the agent through the sibling tools that produce the required id. It does not state any when-not condition or exclusion, 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.
list_categoriesList categoriesARead-onlyIdempotentInspect
List the supplement categories that currently hold priced products, each with a live product count, store count, lowest normalized unit price, and its comparison basis (per_kg / per_serving / per_capsule). Use this to discover a valid category_slug for find_cheapest.
| Name | Required | Description | Default |
|---|---|---|---|
| market | No | Optional country market to query: nl, be, fr, gb, pl, es, dk, at. Defaults to nl, the market this endpoint answers for. Any other value is rejected. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so safety is covered. The description adds real behavioral context beyond them: results are filtered to categories with priced products, counts are live, and prices are normalized with an explicit comparison basis. It stops short of covering pagination, result ordering, or auth/rate-limit behavior, which keeps it from 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler. The scope constraint and returned fields come first, and the routing instruction to find_cheapest comes second — front-loaded exactly where an agent needs it.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing return values and does so field by field, plus explains the filtering rule and downstream use. Minor gaps remain around result ordering and whether the list is bounded, but nothing needed to invoke the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% — the single optional 'market' parameter is fully documented in the schema with its enum values and nl default. The description never mentions market scoping, so it adds no meaning beyond the schema. Baseline 3 is appropriate when the schema does all the parameter work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (supplement categories) plus the exact scope — only categories that currently hold priced products — and enumerates the returned fields (product count, store count, lowest normalized unit price, comparison basis). An agent can distinguish this from find_cheapest, get_product, and search_products 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: "Use this to discover a valid category_slug for find_cheapest." That names the alternative tool and the condition that selects it, which is exactly the decision an agent needs to make between listing categories and searching products.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_productsSearch productsARead-onlyIdempotentInspect
Search the whole supplement catalog the way the website's search box does. A product name or brand is matched typo-tolerantly (e.g. "kreatine", "theanin" still match). In markets where the site reads queries, a request described in words, with qualities (vegan, sugar-free, lab-tested, a form, a brand), is answered as that category with those filters, cheapest per unit first, and interpreted_as says how it was read and what could not be applied. Use find_cheapest instead when you already know the category.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of products to return (1-50). | |
| query | Yes | What the user is looking for, in their own words: a product name or brand ("whey isolaat" or "magnesium bisglycinaat"), or a need with its qualities ("vegan eiwitrepen zonder toegevoegde suiker" or "lab-tested creatine powder"). | |
| market | No | Optional country market to query: nl, be, fr, gb, pl, es, dk, at. Defaults to nl, the market this endpoint answers for. Any other value is rejected. | |
| category_slug | No | Optional: restrict results to this category and all of its subcategories, e.g. "protein-powder". Must be a slug from list_categories; an unknown slug is rejected. | |
| in_stock_only | No | When true, only return products currently in stock. | |
| max_unit_price_cents | No | Optional: only return products whose normalized unit price, rounded to whole cents, is at or below this many cents. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint, and destructiveHint=false, so safety is covered. The description adds genuine context beyond that: typo tolerance in name/brand matching, natural-language interpretation in some markets, cheapest-per-unit ordering, and an interpreted_as field explaining how the query was read. It stops short of describing pagination or result volume behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three dense sentences with the core purpose front-loaded and the sibling routing at the end. Some clauses (the market-reading caveat) are packed tightly, but no sentence is filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a six-parameter, no-output-schema search tool, the description covers the query contract, the interpretation feedback, the ordering guarantee, and the market caveat. The one gap is that return shape beyond interpreted_as (e.g. what fields each product carries) is unstated, despite there being no output schema to lean on.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description still adds value by explaining the query's own-words semantics with typo-tolerant examples and by noting that stated qualities are turned into category filters, plus the interpreted_as feedback, which is not visible in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (search) and resource (the whole supplement catalog), scopes it as mirroring the website search box, and distinguishes itself from find_cheapest by name. An agent can identify what this does and what it returns 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to use find_cheapest when the category is already known, which is a real routing rule. It does not cover get_product for when a specific product identity is known, so alternative guidance is complete for one sibling but not all.
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.
2 tool updates
- Changed
find_cheapest2 fields changed- added
Input schema / properties / brandAdded value: +{ + "description": "Optional: only this brand, by name or slug as it appears in the results.", + "type": "string" +} - added
Input schema / properties / filtersAdded value: +{ + "description": "Optional: only products carrying every one of these attributes, the filters of the category page, e.g. [\"is_vegan\", \"is_lab_tested\", \"form:powder\"]. A boolean attribute is its key; an option is \"key:value\", one value per key. Every response lists the ids this category offers in available_filters; an id it does not offer is rejected.", + "items": { + "type": "string" + }, + "type": "array" +}
- Changed
search_products1 field changed- changed
Input schema / properties / query / descriptionPrevious value: -"The product name or brand to search for, e.g. \"whey isolaat\" or \"magnesium bisglycinaat\"."New value: +"What the user is looking for, in their own words: a product name or brand (\"whey isolaat\" or \"magnesium bisglycinaat\"), or a need with its qualities (\"vegan eiwitrepen zonder toegevoegde suiker\" or \"lab-tested creatine powder\")."
4 tool updates
- Changed
find_cheapest1 field changed- changed
Input schema / properties / market / descriptionPrevious value: -"Optional country market to query: nl, be, fr, gb, pl, es, dk. Defaults to nl, the market this endpoint answers for. Any other value is rejected."New value: +"Optional country market to query: nl, be, fr, gb, pl, es, dk, at. Defaults to nl, the market this endpoint answers for. Any other value is rejected."
- Changed
get_product1 field changed- changed
Input schema / properties / market / descriptionPrevious value: -"Optional country market to query: nl, be, fr, gb, pl, es, dk. Defaults to nl, the market this endpoint answers for. Any other value is rejected."New value: +"Optional country market to query: nl, be, fr, gb, pl, es, dk, at. Defaults to nl, the market this endpoint answers for. Any other value is rejected."
- Changed
list_categories1 field changed- changed
Input schema / properties / market / descriptionPrevious value: -"Optional country market to query: nl, be, fr, gb, pl, es, dk. Defaults to nl, the market this endpoint answers for. Any other value is rejected."New value: +"Optional country market to query: nl, be, fr, gb, pl, es, dk, at. Defaults to nl, the market this endpoint answers for. Any other value is rejected."
- Changed
search_products1 field changed- changed
Input schema / properties / market / descriptionPrevious value: -"Optional country market to query: nl, be, fr, gb, pl, es, dk. Defaults to nl, the market this endpoint answers for. Any other value is rejected."New value: +"Optional country market to query: nl, be, fr, gb, pl, es, dk, at. Defaults to nl, the market this endpoint answers for. Any other value is rejected."
4 tool updates
- Changed
find_cheapest1 field changed- changed
Input schema / properties / market / descriptionPrevious value: -"Optional country market to query: nl, be, fr, gb, pl, es. Defaults to nl, the market this endpoint answers for. Any other value is rejected."New value: +"Optional country market to query: nl, be, fr, gb, pl, es, dk. Defaults to nl, the market this endpoint answers for. Any other value is rejected."
- Changed
get_product1 field changed- changed
Input schema / properties / market / descriptionPrevious value: -"Optional country market to query: nl, be, fr, gb, pl, es. Defaults to nl, the market this endpoint answers for. Any other value is rejected."New value: +"Optional country market to query: nl, be, fr, gb, pl, es, dk. Defaults to nl, the market this endpoint answers for. Any other value is rejected."
- Changed
list_categories1 field changed- changed
Input schema / properties / market / descriptionPrevious value: -"Optional country market to query: nl, be, fr, gb, pl, es. Defaults to nl, the market this endpoint answers for. Any other value is rejected."New value: +"Optional country market to query: nl, be, fr, gb, pl, es, dk. Defaults to nl, the market this endpoint answers for. Any other value is rejected."
- Changed
search_products1 field changed- changed
Input schema / properties / market / descriptionPrevious value: -"Optional country market to query: nl, be, fr, gb, pl, es. Defaults to nl, the market this endpoint answers for. Any other value is rejected."New value: +"Optional country market to query: nl, be, fr, gb, pl, es, dk. Defaults to nl, the market this endpoint answers for. Any other value is rejected."
1 tool update
- Changed
search_products1 field changed- changed
Input schema / properties / max_unit_price_cents / descriptionPrevious value: -"Optional: only return products whose normalized unit price is at or below this many cents."New value: +"Optional: only return products whose normalized unit price, rounded to whole cents, is at or below this many cents."
4 tool updates
- Changed
find_cheapest1 field changed- changed
Input schema / properties / market / descriptionPrevious value: -"Optional country market to query: nl, be. Defaults to nl, the market this endpoint answers for. Any other value is rejected."New value: +"Optional country market to query: nl, be, fr, gb, pl, es. Defaults to nl, the market this endpoint answers for. Any other value is rejected."
- Changed
get_product1 field changed- changed
Input schema / properties / market / descriptionPrevious value: -"Optional country market to query: nl, be. Defaults to nl, the market this endpoint answers for. Any other value is rejected."New value: +"Optional country market to query: nl, be, fr, gb, pl, es. Defaults to nl, the market this endpoint answers for. Any other value is rejected."
- Changed
list_categories1 field changed- changed
Input schema / properties / market / descriptionPrevious value: -"Optional country market to query: nl, be. Defaults to nl, the market this endpoint answers for. Any other value is rejected."New value: +"Optional country market to query: nl, be, fr, gb, pl, es. Defaults to nl, the market this endpoint answers for. Any other value is rejected."
- Changed
search_products1 field changed- changed
Input schema / properties / market / descriptionPrevious value: -"Optional country market to query: nl, be. Defaults to nl, the market this endpoint answers for. Any other value is rejected."New value: +"Optional country market to query: nl, be, fr, gb, pl, es. Defaults to nl, the market this endpoint answers for. Any other value is rejected."
4 tool updates
- Changed
find_cheapest1 field changed- changed
Input schema / properties / market / descriptionPrevious value: -"Optional country market to query: nl, be. Defaults to the market of the requested domain. Any other value is rejected."New value: +"Optional country market to query: nl, be. Defaults to nl, the market this endpoint answers for. Any other value is rejected."
- Changed
get_product1 field changed- changed
Input schema / properties / market / descriptionPrevious value: -"Optional country market to query: nl, be. Defaults to the market of the requested domain. Any other value is rejected."New value: +"Optional country market to query: nl, be. Defaults to nl, the market this endpoint answers for. Any other value is rejected."
- Changed
list_categories1 field changed- changed
Input schema / properties / market / descriptionPrevious value: -"Optional country market to query: nl, be. Defaults to the market of the requested domain. Any other value is rejected."New value: +"Optional country market to query: nl, be. Defaults to nl, the market this endpoint answers for. Any other value is rejected."
- Changed
search_products1 field changed- changed
Input schema / properties / market / descriptionPrevious value: -"Optional country market to query: nl, be. Defaults to the market of the requested domain. Any other value is rejected."New value: +"Optional country market to query: nl, be. Defaults to nl, the market this endpoint answers for. Any other value is rejected."
4 tool updates
- Changed
find_cheapest1 field changed- changed
Input schema / properties / market / descriptionPrevious value: -"Optional country market to query: nl. Defaults to the market of the requested domain. Any other value is rejected."New value: +"Optional country market to query: nl, be. Defaults to the market of the requested domain. Any other value is rejected."
- Changed
get_product1 field changed- changed
Input schema / properties / market / descriptionPrevious value: -"Optional country market to query: nl. Defaults to the market of the requested domain. Any other value is rejected."New value: +"Optional country market to query: nl, be. Defaults to the market of the requested domain. Any other value is rejected."
- Changed
list_categories1 field changed- changed
Input schema / properties / market / descriptionPrevious value: -"Optional country market to query: nl. Defaults to the market of the requested domain. Any other value is rejected."New value: +"Optional country market to query: nl, be. Defaults to the market of the requested domain. Any other value is rejected."
- Changed
search_products1 field changed- changed
Input schema / properties / market / descriptionPrevious value: -"Optional country market to query: nl. Defaults to the market of the requested domain. Any other value is rejected."New value: +"Optional country market to query: nl, be. Defaults to the market of the requested domain. Any other value is rejected."
4 tool updates
- First observed
find_cheapest - First observed
get_product - First observed
list_categories - First observed
search_products
Related MCP Connectors
Live supplement prices per kg, serving or capsule from stores across Europe. Free, no API key.
Dutch supermarket deals and regular prices (Albert Heijn, Jumbo, Lidl...): where it's cheapest.
Supplement prices and price history (NL/BE), SupplementScore ratings, verified discount codes, UCP
Live Dutch supermarket prices and promotions (Albert Heijn, Jumbo, Lidl, Aldi and more) for AI.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceMCP server for Dutch supermarkets and drugstores, enabling product search, price comparison, promotions, shopping lists, meal planning, price alerts, and budget tracking via natural language.MIT
- AlicenseNot gradedqualityDmaintenanceEnables users to compare prices, track budgets, and find promotional deals across major Dutch supermarkets and drugstores. It supports automated shopping list optimization, meal planning, and price history alerts for stores like Albert Heijn, Jumbo, and Kruidvat.20MIT
- AlicenseAqualityBmaintenanceEnables querying live offers and prices from 10 Dutch supermarket chains through a single normalised JSON API. Exposes 26 curated tools, including product search and category lookups, over stdio or authenticated Streamable HTTP.201MIT
- AlicenseAqualityBmaintenanceDanish grocery catalog as MCP tools: live offers across all major chains, stores, EAN lookup, stock.6MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.