geizhals-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@geizhals-mcpsearch for the cheapest RTX 4070"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
geizhals-mcp
An MCP server that lets an LLM search Geizhals, a leading German/DACH price-comparison site, for the cheapest offers on new products. Built for self-hosting: one container, no API keys, no per-query credits.
Companion to jnslmk/kleinanzeigen-mcp — that one covers second-hand classifieds, this one covers new retail goods.
Geizhals sits behind a Cloudflare JS challenge, so this drives a real (patched, headed) browser to reach the page. Search parsing is anchored on the live
galleryview__*markup; product detail is read from the page's JSON-LD (ProductGroup→ variantAggregateOffer), which carries the per-merchant offers directly. Both paths were verified end-to-end against live pages (July 2026).Note on sorting: the default
relevancesort returns the products you searched for.sort=priceasks Geizhals for cheapest-first across its broad free-text match, which for loose queries surfaces cheap loosely-related items — prefer it only with a specific query.
Tools
Tool | What it does |
| Search by keyword, sort by price/relevance, filter by price band. Returns product summaries. |
| Full detail — name, price range, per-merchant offers — for one product id. |
| Full details for several ids at once — the normal follow-up to a search. |
| Search from a pasted Geizhals URL, preserving filters |
The intended flow is search_products → pick interesting ids →
get_products_batch. Search results omit the per-merchant offer tables so a
broad search does not blow up the model's context window.
Related MCP server: ssc
How it works
Geizhals has no public API and is fronted by Cloudflare's "Sichere Verbindung wird überprüft" JS challenge, which returns 403 to any plain HTTP client. So:
Browser: patchright (a patched, undetected Playwright fork) drives Chromium headed under Xvfb — a headed browser behind a virtual display clears Cloudflare far more reliably than headless from a datacenter IP.
Parsing:
scraper.pyprefers the page'sapplication/ld+jsonProduct block and the stableaNNNNNNN.htmlproduct hrefs, falling back to CSS selectors (collected in_SEL) for the human-readable fields.
Running it
docker run --rm -p 8000:8000 --shm-size=1g ghcr.io/jnslmk/geizhals-mcp:latestStreamable HTTP at http://localhost:8000/mcp, plain GET /healthz for
container healthchecks. Give the container at least 1.5 GB of memory and
--shm-size=1g — Chromium maps its renderer heap into /dev/shm.
Configuration
Variable | Default | Purpose |
|
|
|
|
| Bind address |
|
| Bind port |
|
| MCP endpoint path |
|
| Concurrent browser contexts / scrapes |
|
| Hard cap on products returned by a search |
|
| Cap on ids per |
|
| How long to wait for Cloudflare to clear |
|
|
|
| (none) | Egress proxy URL, e.g. |
| (none) | Optional proxy auth |
|
| Python log level |
LibreChat
mcpServers:
geizhals:
type: streamable-http
url: "http://geizhals-mcp:8000/mcp"
timeout: 180000
chatMenu: true
mcpSettings:
allowedAddresses:
- "geizhals-mcp:8000"allowedAddresses is required — LibreChat's SSRF guard blocks MCP URLs that
resolve to private addresses, which a sibling container always does. The timeout
is generous because a cold call starts a browser and waits out a Cloudflare
challenge.
Claude Code
claude mcp add --transport http geizhals http://localhost:8000/mcpDevelopment
uv venv && uv pip install -e .
patchright install chromium
# Headless is fine for a quick check; headed (default) needs a display:
GH_HEADLESS=1 python -m geizhals_mcpVerifying the scraper
The extraction was written without live-HTML access. Before trusting a release:
Run the server and call
search_productswith a common term (e.g.RTX 4070).If results come back empty but the logs show no Cloudflare block, the row selectors in
_SELare stale — capture a real search page (page.content()), inspect it, and correct_SEL["row"],_SEL["row_price"]and_SEL["row_offercount"].Do the same for
get_productagainst_SEL["offer_*"].If calls fail with a Cloudflare-timeout error, the datacenter IP is flagged — route egress through a residential/mobile proxy (see below).
Cloudflare and proxies
Cloudflare challenges are much harsher on datacenter IPs — in practice it will
not clear from a typical VPS. Route the browser through a residential IP by
setting GH_PROXY to an HTTP proxy that egresses from one (for a self-hosted
setup, a small proxy on a home box reachable over a VPN/tailnet works well):
docker run --rm -p 8000:8000 --shm-size=1g \
-e GH_PROXY=http://192.168.1.10:8888 \
ghcr.io/jnslmk/geizhals-mcp:latestbrowser.py passes it straight to chromium.launch(proxy=…). From a residential
IP no proxy is needed.
Images
ghcr.io/jnslmk/geizhals-mcp — multi-arch (linux/amd64, linux/arm64), built
by GitHub Actions on native runners for each architecture.
Tag | Meaning |
| Newest build of |
| A specific commit |
| Release tags |
Caveats
Geizhals has no public API, so this scrapes the site with a headless browser. It can break whenever Geizhals change their markup or tighten Cloudflare, and heavy or parallel use will trip bot detection — particularly from a datacenter IP. Scraping is also at odds with Geizhals' terms of service. Keep it to personal-scale use; the conservative concurrency defaults exist for exactly this reason.
License
MIT — see LICENSE.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseCqualityCmaintenanceA Model Context Protocol server enabling product searches across e-commerce platforms, price history tracking, and product specification-based searches using natural language prompts.219MIT

sscofficial
Alicense-qualityDmaintenanceMCP server for scraping product prices, offers, reviews, and details from Amazon, Google Shopping, Bol.com, and Coolblue via natural language commands, with spend-cap protections.191MIT- AlicenseBqualityBmaintenanceMCP server for finding, comparing, and ranking the cheapest real offers across eBay, Amazon, Craigslist, OfferUp, and Google Shopping, with tax estimation and exact-model filtering.6MIT
- Alicense-qualityCmaintenanceAn MCP server that lets an LLM search and inspect eBay listings through the official Browse API.MIT
Related MCP Connectors
MCP server for AI dialogue using various LLM models via AceDataCloud
Hosted MCP server connecting claude.ai, ChatGPT and other AI apps to your own computer
MCP server for generating rough-draft project plans from natural-language prompts.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/jnslmk/geizhals-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server