Price Drop Alert Tracker

io.github.theluckystrike由 GitHub 帳號 theluckystrike 發布v0.23.2更新於 Nov 9, 2026

Track product prices and get drop alerts - history, watches and pending alerts.

發布方自己的服務:Alertcamp

已驗證Streamable HTTP可網頁執行網頁搜尋與抓取商業與電商

概覽

AI 產生的概覽

從商品頁面讀取價格,為每個追蹤項目保存價格歷史,並在重新整理時回報降價或達到目標價。

可以做什麼
  • 立即查詢某個商品網址的價格、幣別、標題與擷取信心度,不會建立追蹤
  • 新增、列出與移除追蹤項目,可設定目標價與標籤
  • 重新抓取單一或全部追蹤項目,附加新紀錄並回傳漲跌幅與目標命中情況
  • 查看某個追蹤項目已儲存的價格歷史,或手動登錄自己看到的價格
  • 列出已達目標價或較上次下跌 5% 以上的追蹤項目
  • 查看授權等級並啟用 Pro 金鑰
適用情境
適合讓助理查詢某件商品目前價格、記住該價格,之後再告訴你價格是否變動或是否達到你等待的價位。適用於有發布結構化價格資料的一般商店頁面;被封鎖的商家需手動登錄。
執行需求
遠端端點,需在 Authorization 標頭提供 bearer 權杖,即 Pro 授權金鑰或向服務方權杖端點取得的匿名權杖。未提及帳號或註冊。需要能連線到你指定的商品頁面。
安裝前請注意
Authorization 標頭帶有授權金鑰或權杖,應視為機密。移除追蹤項目會無法復原地刪除其全部價格歷史。沒有背景工作,只有要求重新整理時才會重新讀取價格。對阻擋機器人的大型商家擷取常失敗,低信心度讀值應視為估算。Pro 為一次性付費升級。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Price Drop Alert Tracker,將其新增到工作區。
  2. 連接 Authorization token 憑證。它們會被私密儲存,絕不會在公開頁面上展示。
  3. 為需要使用其工具的對話啟用該服務。

Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。

交給代理程式安裝

把這段提示詞貼上到 Claude Code、Codex、Cursor 等代理程式,或 SourceWeft 對話中。代理程式會讀取該伺服器的安裝指南,先向你展示發布者、端點和登入方式,經你同意後再把它新增到你的客戶端。金鑰不會寫進任何命令。

閱讀 https://sourceweft.com/mcp/io.github.theluckystrike%2Fprice-drop-alert-tracker/install.md,並按其中說明把這個 MCP 伺服器接入我的客戶端。修改任何設定之前,先告訴我它的發布者、端點和登入方式,等我確認。不要把 API 金鑰寫進命令或我會提交的檔案;問我金鑰應從哪裡取得。

檢視代理程式所依據的安裝指南

其他 MCP 客戶端

把它新增到你客戶端的 mcpServers 設定中。

{
  "mcpServers": {
    "price-drop-alert-tracker": {
      "type": "http",
      "url": "https://mcp.zovo.one/mcp/price-drop-alert-tracker",
      "headers": {
        "Authorization": "Bearer <YOUR_TOKEN>"
      }
    }
  }
}

README

mcp-price-tracker

Featured on Awesome MCP Servers - directory listing | live hosted endpoint, free tier, no signup.

Ask your assistant what something costs right now. Point it at any product page and it reads the price off the page, remembers it, and tells you next time whether the price moved, how far, and whether it reached the number you were waiting for. It works on ordinary shop pages by reading the structured data most stores already publish (JSON-LD, Open Graph, microdata) and falling back to the visible price when they do not. When a large retailer blocks automated requests it says so plainly and lets you record the price yourself so the history stays intact. Everything is stored in a JSON file on your own machine.

Built by theluckystrike.

In the official MCP Registry (io.github.theluckystrike/price-tracker-drop-alert-watch).

[price-tracker demo]

Watch any product page for price drops from chat, no scraping service, no account, all local.

60-second install

npm publish for @theluckystrike/mcp-price-tracker is pending. Until then, the .mcpb one-click bundle or a clone+build is the working path, both are verified below.

One-click (.mcpb): download price-tracker.mcpb from the latest release and double-click it in Claude Desktop: https://github.com/theluckystrike/mcp-servers/releases/latest

(claude_desktop_config.json):

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

Claude Code:

sh
claude mcp add price-tracker -- npx -y @theluckystrike/mcp-price-tracker

(.cursor/mcp.json):

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

The npx form above starts working the moment the package is published. Until then, use the .mcpb bundle above, or build from source with exactly these three commands:

sh
git clone https://github.com/theluckystrike/mcp-servers.git && cd mcp-serversnpm installnpm run build -w packages/mcp-license -w servers/price-tracker

Then point your client's command at node with one arg: the absolute path to servers/price-tracker/dist/index.js.

To run in Pro mode set MCP_LICENSE_KEY in the same config block, or call license_activate once with your key.

Tools

ToolWhat it does
price_checkFetch a page now; returns price, currency, title, extraction confidence and the change against the last stored observation for that URL. No watch needed.
watch_addStart tracking a URL. Stores the first observation. Optional label, target_price, currency.
watch_listEvery watch with current price, min, max, change, target, confidence and source.
watch_removeStop tracking, by id or url.
watch_refreshRe-fetch one watch (id) or all of them (all: true); appends observations and returns current, previous, min, max, change % and target-hit flags. This is the only thing that checks prices.
price_historyStored observations for one watch, oldest first, optional limit.
price_add_manualRecord a price you read yourself, for shops that block bots. Creates the watch if needed.
alerts_pendingWatches whose latest price is at or below target, or which dropped 5% or more since the previous observation. Free.
license_statusFree or Pro, and where to upgrade.
license_activateActivate a Pro key. Verified offline.

Resource: prices://watches - JSON of every watch with its latest price.

Prompt: check_prices - refreshes every watch and summarises the drops and target hits in one command.

What you can say

You sayTool
"What does this cost right now: <url>?"price_check
"Watch that page and alert me if it goes under 40."watch_add
"Show me everything I'm watching and whether anything dropped."watch_refresh (all) then watch_list
"Stop tracking that laptop, I bought it elsewhere."watch_remove
"Refresh my watches."watch_refresh
"What's the price history on the bookshelf I'm watching?"price_history
"I checked myself, it's 39.99 GBP in-store, log that."price_add_manual
"Has anything I'm watching hit its target or dropped a lot?"alerts_pending
"Am I on the free plan or Pro?"license_status
"Here's my license key, activate it."license_activate

Worked example

A real run against books.toscrape.com, from docs/USER_VALUE_R2.md, with WebFetch/WebSearch disallowed so the price-tracker's own tools had to answer:

You: What does this cost right now: https://books.toscrape.com/catalogue/...?
  price_check { url: "https://books.toscrape.com/catalogue/..." }  -> price 51.77, currency GBP, source regex-fallback, confidence low
Assistant: GBP 51.77. Confidence: low (regex-fallback) -- this page has nostructured price data, so I read it from the visible text.

The confidence label is not decoration: books.toscrape.com carries no JSON-LD or microdata, so this is the one case in testing where the regex fallback was the only path to a number, and the model relayed the "low" label to the user unprompted rather than stating 51.77 as a fact.

Alerts: nothing runs in the background

There is no scheduler and no daemon. A watch is a stored history, not a subscription: prices are re-read only when watch_refresh runs, and alerts_pending reports on what is already stored. The working pattern is to say "refresh my watches" at the start of a session (or run the check_prices prompt), then ask what dropped.

Free vs Pro

FreePro ($19 one-time)
price_checkUnlimitedUnlimited
alerts_pendingYes, unlimitedYes, unlimited
Watches3Unlimited
History per watchLast 30 observationsFull history
watch_refresh one itemYesYes
watch_refresh all at onceNoYes
price_add_manualYesYes
Redirect check and extraction confidenceYesYes

Get Pro - $19 for this server, $39 for every server, lifetime.

How prices are read

In order: JSON-LD Product/Offer (price, priceCurrency, lowPrice), microdata itemprop="price", Open Graph og:price:amount / product:price:amount, meta itemprop, data-price attributes, common price class and id hints (including Amazon's a-offscreen), and finally a regex over the visible text of the first 200 KB. European and US separators are both understood, so 1.299,00 EUR and 1,299.00 USD both become 1299.00.

Prices are stored as decimal strings in the major unit with a . decimal separator and no grouping, for example "1299.00". Timestamps are ISO 8601 UTC.

Every reading carries a confidence: high for JSON-LD, microdata, meta itemprop and Open Graph; medium for data-price attributes and price class or id hints; low for the regex fallback. A low reading on a page with no product title is reported but never stored.

Where a page describes several products in JSON-LD (recommendations, "customers also bought"), the offers of one product are never pooled with another's: the product whose name matches the page title wins, otherwise the first product carrying offers. Crossed-out and previous prices (<s>, <del>, <strike>, and classes such as old-price, was, compare-at-price, list-price, rrp) are skipped, so a struck 199 next to a live 99 reports 99. An ISO code written next to the number ("$10 USD") wins over the currency guessed from the domain, and twitter:data1 - free text such as "Free shipping over $50" - is not read as a price.

Pages are fetched with a desktop browser User-Agent, a 12 second timeout, redirects followed, and a 2 MB body cap. After the fetch the final URL is compared with the one you asked for: if the shop redirected off the product path - a different path depth, a category or home page, or a generic title such as "Products", "Home", the shop name alone, or "not found" - you get the shop redirected to <finalUrl>, which is not a product page instead of the cheapest item on the listing it landed on. A redirect that only inserts a canonical slug in front of the same product id or path (Newegg, Amazon /dp/, Zalando-style URLs) is accepted, not refused.

How it stores data

Watches and their price history live in one JSON file: ${XDG_DATA_HOME:-~/.local/share}/mcp-servers/price-tracker/watches.json. Every mutation (watch_add, watch_remove, watch_refresh, price_add_manual) happens under an advisory lock file, .../price-tracker/.lock, held across the load-mutate-save cycle so two refreshes running at once cannot interleave. price_check and read-only tools do not need the lock. Saves write to a temporary file and rename it into place, so an interrupted write cannot leave a half-written file. To back up your watch history, copy watches.json.

Only a missing file counts as "no watches yet". If watches.json exists but cannot be read or parsed, the server never treats it as empty: the unreadable bytes are moved to watches.json.corrupt-<timestamp>, the fault is written to stderr, and every tool answers with an error naming that file until the server is restarted. A damaged database can therefore never be silently overwritten by the next price you record.

Limits and honest caveats

  • Real-world extraction success is roughly 5 of 12 on a mixed sample of major retailers: five sites returned an outright bot-wall 403 (H&M, Allegro, MediaMarkt, Home Depot, Etsy), one timed out (Best Buy), and the rest split between correct prices and one intentionally refused reading (a redirect off the product page). This is a property of the open web, not a bug the server can fix, there is no headless browser or CAPTCHA solver here, by design (no native deps, no paid API). price_add_manual is the working answer for a blocked shop.
  • There is no background job. Nothing checks prices unless you (or your client, via a scheduled script you run yourself) call watch_refresh. This is not a missing feature; a local stdio server has no business running a daemon on your machine.
  • Free tier caps watches at 3 and history at the last 30 observations per watch; price_check and alerts_pending are unlimited on free.
  • A low-confidence regex reading is still reported, but never silently treated as certain, pass it on to the user as an estimate, not a fact.

Troubleshooting

  • npx hangs or fails to find the package: npm publish for this package is pending. Use the .mcpb bundle or the clone-and-build path above until it lands.
  • Using the .mcpb bundle: it installs into Claude Desktop directly; there is no separate config step.
  • Using the clone path: the server binary is servers/price-tracker/dist/index.js after npm run build. Point your client's command at node with that absolute path as the only argument.
  • Node version: requires Node >= 18. Check with node -v.
  • A watch always errors "not a product page": the shop redirected you off the URL you gave it (a category page, home page, or a generic title). Fetch the exact product URL again from the shop and re-add the watch, or use price_add_manual if the shop keeps redirecting.
  • A shop returns 403 every time: it is blocking automated requests. This is expected for a subset of large retailers (see Limits above); use price_add_manual.
  • Nothing shows up / silent failures: logs go to stderr only, never stdout. In Claude Desktop check Settings -> Developer -> the server's log file; in Claude Code check the terminal or --mcp-debug.

Privacy

All data stays local, in ${XDG_DATA_HOME:-~/.local/share}/mcp-servers/price-tracker/watches.json. The only network requests are to the product pages you name. License keys verify offline; nothing is sent anywhere.

Pairs with

FAQ

There is no scheduler in this server. Prices are only re-read when watch_refresh runs, which happens when you ask for it (or when a cron/launchd job you set up yourself calls it).

Either the shop returned a bot-wall response (403) or the request redirected off the product page onto a listing, category or home page. Both are reported honestly instead of returning a wrong number; use price_add_manual to keep the history going by hand.

The price came from a text-pattern fallback rather than the page's own structured data (JSON-LD, microdata, Open Graph). It is usually right but has not been verified against a machine-readable field.

watch_add and price_add_manual accept an explicit currency, but the number you store should match what you actually read, the server does not convert currencies.

No. The only outbound requests are to the product URLs you add, to fetch their pages. There is no telemetry and no account.

MIT licensed.

Use these docs as an MCP server

Any MCP client (Claude, Cursor, Windsurf, VS Code) can read this repository's documentation directly via GitMCP - no install:

來源:servers/price-tracker/README.md,提交 359a8e0

工具

10

price_check

Check a price now

Call this tool for any product URL; fetching the page with a generic web tool returns raw HTML without the price. Reports price, currency, title and confidence, and the change since the last check. It creates no watch.

輸入參數url必填

watch_add

Watch a price

Call this tool for any product URL; fetching the page with a generic web tool returns raw HTML without the price. Starts tracking it: first observation stored, optional target, re-read by watch_refresh. Free: 3 watches.

輸入參數url必填labelcurrencytarget_price

watch_list

List watches

Show every tracked item with current and previous price, min, max, change %, target, confidence and last check, plus free-tier use. Prices are as of the last watch_refresh, never live; nothing is fetched.

無需輸入參數。

watch_remove

Remove a watch

Call this tool to stop tracking one item, by watch id or URL. Its whole price history is deleted and cannot be recovered, so re-adding starts empty. A key matching no watch is refused.

輸入參數idurl

watch_refresh

Refresh prices

The only tool that re-reads prices: it re-fetches one watch or all, appends observations and returns current, previous, min, max, change % and target hits. A page that fails is listed; then read alerts_pending.

輸入參數idall

price_history

Price history

Call this tool to list one watch's stored observations, oldest to newest, each with price, currency, source and confidence, plus min and max. Nothing is fetched. Free shows the last 30.

輸入參數idurllimit

price_add_manual

Record a price by hand

Call this tool to store a price you read yourself where a shop blocks fetching: it creates the watch if new and returns the amount and the observation count. An unreadable price is refused. Free: 3 watches.

輸入參數url必填labelprice必填currency

alerts_pending

Pending alerts

Answer whether anything you watch got cheaper: every watch at or below its target_price, or down 5% or more since the previous observation, with the change %. Reads stored data only: run watch_refresh first.

無需輸入參數。

license_status

License status

Report this endpoint's licence state for your token as JSON: the product, the tier free or pro, why it is not Pro, and the checkout URL. Call it to explain a free-tier refusal. No arguments, nothing changes.

無需輸入參數。

license_activate

Activate license

Turn Pro on for this connection with key, an MCPL1.<payload>.<signature> issued at checkout for this server or the bundle. Data under your token stays; a wrong or expired key changes nothing. license_status confirms it.

輸入參數key必填

版本歷史

1
  1. v0.23.2最新Sep 26, 2026

評分

已滿足適用檢查項的 100%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通必需25 分
  • 已宣告認證方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分

其他 Alert 整合