Home · Guides

Watch a product price with Claude and get told when it drops

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.

Install

claude mcp add price-tracker -- npx -y @theluckystrike/mcp-price-tracker
{
  "mcpServers": {
    "price-tracker": {
      "command": "npx",
      "args": ["-y", "@theluckystrike/mcp-price-tracker"]
    }
  }
}

price_check: what does this cost right now

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.

Read this before you rely on it: five of twelve retailers block bots

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, refresh, and the absence of a background job

"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.

One more thing that will happen

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 tier

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.

Questions

Will it notify me when a price drops while I am away?

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.

Which shops fail?

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.

How does it avoid reporting the wrong price?

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.

Does it handle European number formats?

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.

Why did Claude fetch the page itself instead of using the server?

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.

Related

All MCP servers and prices · All guides