Skip to main content
Glama
PrijsProfeet MCP

PrijsProfeet MCP

by thijserven
WARNING

This is an independent integration. It is not developed, endorsed, or supported by PrijsProfeet.

PrijsProfeet MCP exposes all 24 operations from the supported PrijsProfeet API contract as validated MCP tools. Use it from a local stdio client or deploy it as an authenticated Streamable HTTP server.

Contents

Related MCP server: mcp-server

Quick start: Docker + GHCR

Prerequisites: Docker Engine with Docker Compose v2. The GitHub Actions workflow publishes ghcr.io/thijserven/prijsprofeet-mcp:latest on pushes to main and also publishes immutable sha-<commit> tags.

git clone https://github.com/thijserven/prijsprofeet-mcp.git
cd prijsprofeet-mcp

# Required: protect the remote MCP endpoint.
export PRIJSPROFEET_MCP_AUTH_TOKEN="$(openssl rand -base64 32)"
export PRIJSPROFEET_MCP_BIND_ADDRESS="127.0.0.1:3000"
export PRIJSPROFEET_MCP_IMAGE="ghcr.io/thijserven/prijsprofeet-mcp:latest"

# Optional: required for PrijsProfeet Pro endpoints.
export PRIJSPROFEET_API_KEY=""

docker compose up --detach
curl --fail http://127.0.0.1:3000/health

The server is now available at http://127.0.0.1:3000/mcp. Authenticate every MCP request with Authorization: Bearer <PRIJSPROFEET_MCP_AUTH_TOKEN>.

For a production deployment, replace :latest with a reviewed immutable digest (or an immutable sha-<commit> tag). Do not expose the endpoint directly to the public internet; bind to loopback or a specific LAN address and put an access-controlled reverse proxy in front of it when remote access is required.

To stop it:

docker compose down

Manual build

Use this path to build the image from the checked-out source rather than pulling GHCR.

git clone https://github.com/thijserven/prijsprofeet-mcp.git
cd prijsprofeet-mcp

export PRIJSPROFEET_MCP_AUTH_TOKEN="$(openssl rand -base64 32)"
export PRIJSPROFEET_MCP_BIND_ADDRESS="127.0.0.1:3000"
export PRIJSPROFEET_API_KEY="" # Optional; needed for Pro endpoints.

docker compose -f docker-compose.local.yaml up --build --detach
curl --fail http://127.0.0.1:3000/health

The local image is named prijsprofeet-mcp:local. Stop it with:

docker compose -f docker-compose.local.yaml down

Development mode

Prerequisites: Node.js 22+ and npm.

npm install
cp .env.example .env
npm run dev

npm run dev starts the stdio transport directly from TypeScript. stdout is reserved for the MCP protocol, so use an MCP client or the Inspector to interact with it. Add PRIJSPROFEET_API_KEY to .env only when you need Pro endpoints.

For the built stdio executable:

npm run build
node dist/index.js

Connect an MCP client

Streamable HTTP (Docker)

Configure an MCP client with:

URL:     http://127.0.0.1:3000/mcp
Header:  Authorization: Bearer <your PRIJSPROFEET_MCP_AUTH_TOKEN>

GET /health is public; /mcp always requires the bearer token.

stdio (local development or manual build)

Use the built entrypoint. The server reads .env from its current working directory, so set the client's working directory to the repository root or pass the environment explicitly.

{
  "mcpServers": {
    "prijsprofeet": {
      "command": "node",
      "args": ["/absolute/path/to/prijsprofeet-mcp/dist/index.js"],
      "cwd": "/absolute/path/to/prijsprofeet-mcp"
    }
  }
}

Capabilities

Every tool validates its input with Zod before an upstream request. Object responses are returned both as readable JSON text and as MCP structuredContent. Upstream HTTP errors and timeouts are returned as MCP tool errors.

Area

Tools

Health

health_check

Products

list_products, get_product, get_price_history, get_forecast, search_products_by_name, get_products_by_folder, get_products_by_retailer, get_promotional_products

Search

search_products, get_categories, get_filter_stats

Matching

match_by_ean, match_product, compare_prices, get_ean_stats

Deals

get_top_deals, get_brand_deals, get_deals_summary, get_popular_deals, get_deals_by_type, get_new_deals

Partner

get_partner_usage

API-key requirements

Public product, search, deal, and category operations can run without an API key. A PrijsProfeet Pro key is required for get_price_history, match_by_ean, match_product, compare_prices, and get_ean_stats. get_partner_usage also requires a key.

The MCP tool metadata includes _meta["nl.prijsprofeet/requiresProPlan"] so compatible clients can identify Pro-only tools before calling them. Request a free key through the PrijsProfeet API page.

Configuration

API client

Set these variables in .env for local stdio use, or in the deployment environment for Docker. Never commit .env.

Variable

Default

Purpose

PRIJSPROFEET_API_KEY

unset

Sent as X-API-Key; needed for Pro endpoints and usage

PRIJSPROFEET_BASE_URL

https://www.prijsprofeet.nl

API origin; non-HTTPS is allowed only for localhost

PRIJSPROFEET_TIMEOUT_MS

15000

Positive upstream request timeout in milliseconds

PRIJSPROFEET_USER_AGENT

project default

Identifies this integration to PrijsProfeet

HTTP server (Docker)

Variable

Required

Purpose

PRIJSPROFEET_MCP_AUTH_TOKEN

Yes

Bearer token required for /mcp

PRIJSPROFEET_MCP_BIND_ADDRESS

Yes

Host address and port, for example 127.0.0.1:3000

PRIJSPROFEET_MCP_IMAGE

GHCR compose file only

Image reference, for example ghcr.io/thijserven/prijsprofeet-mcp:latest

PRIJSPROFEET_MCP_HOST

No

Container bind host; defaults to 0.0.0.0

PRIJSPROFEET_MCP_PORT

No

Container port; defaults to 3000

Architecture

stdio: src/index.ts ──────────────┐
                                   ├─ src/server.ts ─ src/tools/definitions.ts ─ PrijsProfeet API
HTTP:  src/http-entry.ts ─ src/http.ts ┘                    │
                                                             └─ Zod input schemas
  • src/tools/definitions.ts is the deterministic tool catalog: endpoint paths, HTTP methods, argument mapping, metadata, and validation.

  • src/api/client.ts owns URL construction, headers, JSON encoding, timeouts, and upstream-error translation. src/config.ts is the only environment-reading boundary.

  • src/server.ts is transport-independent. src/index.ts hosts stdio; src/http-entry.ts hosts authenticated Streamable HTTP.

dist/ is generated by npm run build; do not edit it directly.

Quality checks

npm run check
npm pack --dry-run

npm run check formats-checks, lints, type-checks, runs unit/in-memory MCP/stdio handshake tests, and builds the project. Tests do not call the live PrijsProfeet API.

For interactive local inspection:

npm run inspect

The Inspector launches the built stdio server. Tool calls made there are live upstream calls and count toward PrijsProfeet rate limits.

Operational notes

  • Respect the PrijsProfeet API terms, upstream rate limits, and anti-bot controls. This server does not bypass those controls and does not automatically retry requests, including 429 responses.

  • Pricing matches are not automatically current offers. Before presenting a cheapest current price, check is_current_deal, promotion_status, valid_from, and valid_until; use current_only: true where a matching tool supports it.

  • EAN matching is exact when an EAN exists. Name/brand/category matching is indicative, not proof of product identity. Dietary labels are indicative and not allergen information.

References

Available Tools

24 tools
compare_pricesCompare pricesA
Read-onlyIdempotent

Compare an EAN across retailers. Pro API key required; inspect promotion status and validity before presenting a current cheapest price.

Inputs: ean (required).

get_brand_dealsGet brand dealsB
Read-onlyIdempotent

Get current deal variants for a brand.

Inputs: brand (required), limit, promotion_type.

get_categoriesGet categoriesA
Read-onlyIdempotent

Get unified product categories and product counts.

Inputs: no named parameters.

get_deals_by_typeGet deals by typeB
Read-onlyIdempotent

Get products matching a promotion keyword such as 1+1.

Inputs: type (required), limit.

get_deals_summaryGet deals summaryB
Read-onlyIdempotent

Get aggregate deal and retailer statistics.

Inputs: no named parameters.

get_ean_statsGet EAN statisticsA
Read-onlyIdempotent

Get EAN coverage statistics across retailers. Pro API key required.

Inputs: no named parameters.

get_filter_statsGet filter statisticsB
Read-onlyIdempotent

Get faceted counts for matching retailers, statuses, categories, and dietary tags.

Inputs: q, dietary, category, retailer, +1 more.

get_forecastGet forecastA
Read-onlyIdempotent

Get the backtested price forecast for a product, if enough history exists.

Inputs: product_id (required).

get_new_dealsGet new dealsA
Read-onlyIdempotent

Get products scraped this week, newest first.

Inputs: limit.

get_partner_usageGet partner usageA
Read-onlyIdempotent

Get API-key account and rate-limit usage. Requires PRIJSPROFEET_API_KEY.

Inputs: no named parameters.

get_price_historyGet price historyA
Read-onlyIdempotent

Get Pro price history for a product. Requires PRIJSPROFEET_API_KEY with Pro access.

Inputs: product_id (required).

get_productGet productA
Read-onlyIdempotent

Get one product by its unique ID.

Inputs: product_id (required).

get_products_by_folderGet products by folderB
Read-onlyIdempotent

Get products from a folder with pagination.

Inputs: folder_id (required), page, page_size.

get_products_by_retailerGet products by retailerA
Read-onlyIdempotent

Get products for one retailer with pagination.

Inputs: retailer (required), page, page_size.

get_promotional_productsGet promotional productsB
Read-onlyIdempotent

Get promotional products, optionally filtered by retailer.

Inputs: page, retailer, page_size.

get_top_dealsGet top dealsA
Read-onlyIdempotent

Get top deals by savings percentage and amount, optionally scoped to repeatable retailer slugs.

Inputs: limit, retailer, min_savings.

health_checkHealth checkA
Read-onlyIdempotent

Verify that PriceProfeet services are operational.

Inputs: no named parameters.

list_productsList productsC
Read-onlyIdempotent

List products with filters, sorting, and pagination.

Inputs: page, sort_by, retailer, folder_id, +5 more.

match_by_eanMatch by EANA
Read-onlyIdempotent

Find products with the same EAN across retailers. Pro API key required. Non-current matches may be upcoming or historical unless current_only is true.

Inputs: ean (required), current_only, exclude_retailer.

match_productMatch productA
Read-onlyIdempotent

Find a product at other retailers. Pro API key required. Non-current matches may be upcoming or historical unless current_only is true.

Inputs: product_id (required), current_only, include_same_retailer.

request_free_api_keyRequest free API keyA

Ask PriceProfeet to email a free API-key link. Rate limited to five requests per hour per IP.

Inputs: email (required), project_name (required), site_url.

search_productsAdvanced product searchA
Read-onlyIdempotent

Fuzzy search and browse promotions with retailer, category, status, type, dietary, price, savings, sorting, and pagination filters.

Inputs: q, page, dietary, sort_by, +8 more.

search_products_by_nameSearch products by nameA
Read-onlyIdempotent

Search the product collection by name with an optional retailer filter.

Inputs: query (required), page, retailer, page_size.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A3.5/5.0

    Scored across 24 tools

    Disambiguation3/5

    Several tools overlap in purpose, notably list_products, search_products, and search_products_by_name, as well as multiple get_products_by_* variants. Descriptions and filters help clarify, but an agent could easily mis-select between similar list/search endpoints.

    Naming Consistency5/5

    Tool names follow a uniform verb_noun pattern with snake_case (e.g., get_product, search_products, compare_prices, request_free_api_key). Prefixes like get/list/search/match/compare are used predictably, making the set highly consistent.

    Tool Count3/5

    At 24 tools, the server sits at the upper boundary of 'heavy' but remains within the acceptable range. The many deal-related tools (top_deals, brand_deals, deals_summary, etc.) could be consolidated, but the count is justifiable for a comprehensive price-comparison API.

    Completeness4/5

    The tool set covers the core read-only domain well: product search, details, price history, forecasting, cross-retailer matching, price comparison, deals, categories, and API key management. Minor gaps exist (e.g., no direct retailer metadata endpoint), but no critical dead ends are evident.

    Maintenance

    ActivitySlowing
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      B
      maintenance
      MCP server that provides tools to retrieve weather information from a weather API, supporting both local stdio and remote Streamable HTTP transports.
      501 npm
      1
      MIT
    • F
      license
      Not graded
      quality
      D
      maintenance
      A production-oriented MCP server exposing tools for weather, currency conversion, text statistics, and server introspection, with auto-discovery, rate limiting, and API key auth.
      -
    • F
      license
      A
      quality
      D
      maintenance
      A minimal MCP server for DataProbe data question answering and read-only SQL queries, supporting stdio and streamable HTTP modes.
      5
      -