Skip to main content
Glama
sina-attarzadeh

PrijsProfeet MCP

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
PORTNoHonoured when PRIJSPROFEET_HTTP_PORT is unset, which is what Render, Heroku and Fly inject
DEBUGNoDiagnostics on stderr0
X_API_KEYNoAlias for PRIJSPROFEET_API_KEY. Partner key, sent as X-API-Key.
PP_API_KEYNoAlias for PRIJSPROFEET_API_KEY. Partner key, sent as X-API-Key.
MCP_AUTH_TOKENNoComma-separated bearer tokens for the http transport. Unset means no auth — the server starts and warns, so this is only safe on loopback.
PRIJSPROFEET_PLANNofree exposes 20 tools, pro exposes all 26free
PRIJSPROFEET_API_KEYNoPartner key, sent as X-API-Key. Unset means the anonymous Gratis tier. PP_API_KEY and X_API_KEY are accepted as aliases.
PRIJSPROFEET_BASE_URLNoAPI originhttps://www.prijsprofeet.nl
PRIJSPROFEET_SPEC_URLNoWhere to refresh fromhttps://www.prijsprofeet.nl/openapi.json
PRIJSPROFEET_HTTP_HOSTNoInterface for http mode0.0.0.0
PRIJSPROFEET_HTTP_PATHNoPath for http mode/mcp
PRIJSPROFEET_HTTP_PORTNoPort for http mode3000
PRIJSPROFEET_TRANSPORTNostdio (client launches the container) or http (serve a URL)stdio
PRIJSPROFEET_TIMEOUT_MSNoPer-request timeout30000
PRIJSPROFEET_USER_AGENTNoSent on every requestprijsprofeet-mcp/1.0
PRIJSPROFEET_MAX_RETRIESNoRetries on 429/5xx and network errors, with backoff honouring Retry-After2
PRIJSPROFEET_TOOL_PREFIXNoPrefix on every tool namepp
PRIJSPROFEET_REFRESH_SPECNoFetch the OpenAPI document at startup instead of using the bundled copy0
PRIJSPROFEET_MAX_RESPONSE_BYTESNoResponses above this are truncated with a note instead of returned whole250000

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{}

Tools

Functions exposed to the LLM to take actions

NameDescription
pp_get_categoriesA

The unified categories with Dutch display names, product counts and group. Call this before pp_search to turn a user's word ("zuivel", "brood") into a valid category slug. Cheap, and worth it before a search that would otherwise return nothing.

pp_get_brand_dealsA

Every current deal for one brand, e.g. Coca-Cola or Ahold. Brand matching follows the capitalisation in the source data, so keep the brand as the user wrote it and do not normalise it.

pp_get_deals_by_typeA

Deals for one promotion mechanic, passed as a keyword such as 1+1, 2+2 or korting. The type values used by promotion_type elsewhere are the internal names (percentage, multi_buy, one_plus_one, volume, limited, starting).

pp_get_new_dealsC

The most recently started offers, capped at 30 rows.

pp_get_popular_dealsB

The deals users click most often, capped at 30 rows.

pp_get_deals_summaryA

Aggregate stats: total products, retailer count, biggest discount, last update. One cheap call to check that the data is fresh before reporting anything about "this week".

pp_get_top_dealsA

Top deals grouped per brand, optionally narrowed to one or more retailers. min_savings defaults to 10%; raise it to cut the noise. Pass retailer as an array to scope the lists to specific chains.

pp_get_filter_statsA

Facet counts per retailer, promotion status and category. Pass q (and optionally category) to get the counts for one specific search — useful to show what a filter would still return, or to check whether a category exists before searching it.

pp_health_checkA

Check that the PrijsProfeet API is reachable. Call this when another tool returns 5xx to tell an outage apart from a bad request.

pp_get_partner_usageA

Current rate-limit usage and account info for the configured API key. Requires a valid partner key, so it fails with 401 when the server is running without one.

pp_list_productsA

List products with filters, newest extraction first. Use pp_search when the user named a product; use this when you need to enumerate by retailer, folder, promo group or validity window. promo_group_id returns every product in one shared action — read that field off a product to get the rest of its group. min_valid_from / max_valid_from (YYYY-MM-DD) bound the date the promotion starts.

pp_get_productA

Full detail for one product, including EAN, folder, promo group and dietary labels. product_id is the product_id field from any search or list result.

pp_get_price_forecastA

Server-side backtested price forecast for one product ("Profeet voorspelt"). A product with no forecast is not an error: the call returns HTTP 200 with a null forecast, and the reason arrives in the X-Forecast-Reason header. Report it as "no forecast available" rather than retrying.

pp_get_products_by_folderA

Every product in one promotional folder (a single actie). folder_id is the folder_id field on a product. page_size may go up to 1000 here, but a big page is expensive in context and in rate limit — ask for what the question needs.

pp_get_promotional_productsA

Everything currently on offer, newest first. Use pp_list_products with is_promotional=true instead when you also need a filter.

pp_get_products_by_retailerA

Every product from one retailer, paginated. Takes a retailer slug (albert_heijn, jumbo, aldi, lidl, ekoplaza, plus, dekamarkt, hoogvliet, vomar, dirk), not a display name.

pp_search_products_by_nameA

Search products with the term inside the URL path. This is the older sibling of pp_search: same data, fewer filters, no sorting. Prefer pp_search for new work.

pp_searchA

Search supermarket offers across the 10 Dutch chains (Albert Heijn, Aldi, DekaMarkt, Dirk, Ekoplaza, Hoogvliet, Jumbo, Lidl, PLUS, Vomar). Omit q or pass * to browse the whole catalogue.

How to read a row: promotion_status decides what the price means. active = on offer right now, upcoming = starts next week, shelf = the regular price, historical = the last price seen, up to 60 days old. Taking the lowest price across rows can therefore return a price nobody is charging today — filter on promotion_status (or leave current_only-style filtering to the caller) before quoting a best price.

Retailer slugs: albert_heijn, jumbo, aldi, lidl, ekoplaza, plus, dekamarkt, hoogvliet, vomar, dirk. Category slugs are not free text: call pp_get_categories first to map the user's word to a slug. Keep page_size modest; page through rather than asking for 100 rows when a question needs 3.

pp_get_sla_summaryA

Availability per calendar month, newest first. Answers "was the API down last Tuesday?" with a number instead of a guess.

pp_request_free_keyA

Request a free API key for an email address. A one-click link is mailed out; the key itself is never in the response. The response is deliberately identical whether or not that address already has a key, so a success here never confirms someone is a customer. Capped at 5 requests per hour per IP. This has a real-world side effect — it emails a stranger. Only call it when the user has explicitly asked for it in this conversation.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

A3.7/5.0

Scored across 20 tools

Disambiguation4/5

Each tool targets a fairly distinct slice (newest, popular, top-by-brand, by-type, by-retailer), and descriptions explicitly differentiate them. However, there are documented redundancies that create real overlap: pp_get_promotional_products vs pp_list_products with is_promotional, and pp_search vs the 'older sibling' pp_search_products_by_name.

Naming Consistency4/5

Consistent pp_ prefix and snake_case verb_noun pattern (pp_get_*, pp_list_*, pp_search*). Minor deviation with pp_search / pp_search_products_by_name and the unprefixed-looking pp_health_check, but overall predictable.

Tool Count3/5

At 20 tools this sits in the heavy range for a read-mostly price API, with several near-duplicate listing/search tools that could be consolidated. Each tool has some justification, but the surface is larger than strictly needed.

Completeness4/5

Covers the domain well: search, list, product detail, categories, folders, retailers, price forecast, deal aggregations, health, SLA and account tools. Gaps are minor (no explicit comparison or basket tools), but core supermarket-data workflows are complete.

Maintenance

ActivityMaintained
ResponsivenessNo issues