PrijsProfeet MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| PORT | No | Honoured when PRIJSPROFEET_HTTP_PORT is unset, which is what Render, Heroku and Fly inject | |
| DEBUG | No | Diagnostics on stderr | 0 |
| X_API_KEY | No | Alias for PRIJSPROFEET_API_KEY. Partner key, sent as X-API-Key. | |
| PP_API_KEY | No | Alias for PRIJSPROFEET_API_KEY. Partner key, sent as X-API-Key. | |
| MCP_AUTH_TOKEN | No | Comma-separated bearer tokens for the http transport. Unset means no auth — the server starts and warns, so this is only safe on loopback. | |
| PRIJSPROFEET_PLAN | No | free exposes 20 tools, pro exposes all 26 | free |
| PRIJSPROFEET_API_KEY | No | Partner 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_URL | No | API origin | https://www.prijsprofeet.nl |
| PRIJSPROFEET_SPEC_URL | No | Where to refresh from | https://www.prijsprofeet.nl/openapi.json |
| PRIJSPROFEET_HTTP_HOST | No | Interface for http mode | 0.0.0.0 |
| PRIJSPROFEET_HTTP_PATH | No | Path for http mode | /mcp |
| PRIJSPROFEET_HTTP_PORT | No | Port for http mode | 3000 |
| PRIJSPROFEET_TRANSPORT | No | stdio (client launches the container) or http (serve a URL) | stdio |
| PRIJSPROFEET_TIMEOUT_MS | No | Per-request timeout | 30000 |
| PRIJSPROFEET_USER_AGENT | No | Sent on every request | prijsprofeet-mcp/1.0 |
| PRIJSPROFEET_MAX_RETRIES | No | Retries on 429/5xx and network errors, with backoff honouring Retry-After | 2 |
| PRIJSPROFEET_TOOL_PREFIX | No | Prefix on every tool name | pp |
| PRIJSPROFEET_REFRESH_SPEC | No | Fetch the OpenAPI document at startup instead of using the bundled copy | 0 |
| PRIJSPROFEET_MAX_RESPONSE_BYTES | No | Responses above this are truncated with a note instead of returned whole | 250000 |
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
| Capability | Details |
|---|---|
| tools | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| pp_get_categoriesA | The unified categories with Dutch display names, product counts and group.
Call this before |
| pp_get_brand_dealsA | Every current deal for one brand, e.g. |
| pp_get_deals_by_typeA | Deals for one promotion mechanic, passed as a keyword such as |
| 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.
|
| pp_get_filter_statsA | Facet counts per retailer, promotion status and category. Pass |
| 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_get_productA | Full detail for one product, including EAN, folder, promo group and dietary labels. |
| 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 |
| pp_get_products_by_folderA | Every product in one promotional folder (a single actie). |
| pp_get_promotional_productsA | Everything currently on offer, newest first. Use |
| 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_searchA | Search supermarket offers across the 10 Dutch chains (Albert Heijn, Aldi, DekaMarkt, Dirk, Ekoplaza, Hoogvliet, Jumbo, Lidl, PLUS, Vomar).
Omit How to read a row: Retailer slugs: albert_heijn, jumbo, aldi, lidl, ekoplaza, plus, dekamarkt, hoogvliet, vomar, dirk.
Category slugs are not free text: call |
| 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
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 20 tools
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.
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.
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.
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.