You can ask an assistant to fetch a product page and read the price off it, and it will usually get something. The MCP Price Tracker exists because "usually get something" is a bad basis for a price watch: you need a normalised decimal price, the currency, a check that you are still on the product page, and a history to compare against. This guide covers what the server does well and, more usefully, the two places where it will disappoint you.
claude mcp add price-tracker -- npx -y @theluckystrike/mcp-price-tracker
{
"mcpServers": {
"price-tracker": {
"command": "npx",
"args": ["-y", "@theluckystrike/mcp-price-tracker"]
}
}
}
Paste a product URL and ask what it costs. price_check fetches the page and extracts the
price from JSON-LD, microdata, Open Graph tags, common price markup or a currency-aware text fallback,
in that order of preference. It normalises 1.299,00 EUR and 1,299.00 USD to the same number, returns the
product title and the currency, and reports the change against the last price stored for that URL. Every
reading carries a confidence level: high for JSON-LD, microdata and Open Graph, medium for data
attributes and class hints, low for the regex fallback.
Twelve real retail URLs were tested against the compiled fetcher, with the extracted price checked against the HTML by hand. Five returned HTTP 403 from a bot wall: H&M, Allegro, MediaMarkt, Home Depot and Etsy. One timed out after 15 seconds (Best Buy). One followed a redirect off the product page onto a category listing and returned the cheapest item there, which is the worst possible failure for a price watcher. That leaves 5 of 12 correct, or 41.7%.
Of the 7 pages that did return HTML, 6 yielded a price and 5 of those were right, so the extractor is
not the constraint; reach is. Apple, Walmart, Newegg and Gap parsed correctly. The redirect case was
fixed afterwards: the server now refuses a reading when the final URL lands on a home page, enters a
category or search segment the request was not in, or the title is generic such as "Products". You get an
error naming the redirect instead of a number that was never the price. For shops behind a bot wall the
403 message names the cause and points you at price_add_manual, which stores a price you
read yourself and creates the watch.
"Watch this page and tell me if it drops under 900" creates a watch with a target. What it does not do
is poll. There is no scheduler, no daemon and no notification path: nothing runs when your chat is
closed. Checks happen when you ask for them. The pattern that works is to say "refresh my watches" at
the start of a session; watch_refresh re-fetches one watch or all of them, appends the new
observations and reports current, previous, min, max, change percent and target hits.
alerts_pending then lists everything that hit its target or fell 5% or more since the last
check, and it is free rather than gated, because a price watcher that cannot tell you what dropped is not
a price watcher.
If you want an unattended check, wire watch_refresh to your own cron or launchd job that
starts the client. That is outside the server on purpose: a local MCP server has no business running a
background process on your machine.
With a general web fetch tool available, the model may answer "what does this cost" by fetching the page itself and never calling the server. That was measured. The tool descriptions now state what the server adds over a raw fetch, which fixes it most of the time; if you want certainty, name the tool: "use price_check on this URL".
Free gives unlimited price checks with confidence, 3 watches with 30 observations each, and pending alerts. Pro ($19 once) gives unlimited watches, full history and refresh-all. Product page · free versus Pro.
No. There is no background job and no notification channel. Watches are checked when you ask, so the working pattern is to say 'refresh my watches' at the start of a session, or to run the client from your own cron job.
In a 12 URL test, 5 returned HTTP 403 from a bot wall (H&M, Allegro, MediaMarkt, Home Depot, Etsy) and 1 timed out. Apple, Walmart, Newegg and Gap parsed correctly. For blocked shops, price_add_manual stores a price you read yourself.
Every reading carries a confidence level by extraction source, and a redirect that leaves the product page for a home page, a category listing or a generically titled page is refused with an error rather than returning the number found there.
Yes. 1.299,00 EUR and 1,299.00 USD are normalised to the same value, and the currency is detected from the markup rather than assumed.
With a generic web fetch tool available the model sometimes prefers it. Naming the tool in your message ('use price_check on this URL') forces the right path, and the tool descriptions now spell out what the server adds: normalised price, currency, confidence and history.