price-tracker
Reads prices from Amazon product pages by recognizing Amazon-specific price markup (the a-offscreen class) among its price extraction heuristics, then stores each reading so the assistant can report the current price, the change since the last observation, and alert when a target price is hit.
mcp-price-tracker
MCP server for price tracking, a price tracker and price drop watcher for shop pages. Check and watch product prices on ordinary shop pages.
Works with Claude Desktop, Claude Code, Cursor and any Model Context Protocol client. Runs on your own machine, or hosted with no install.
Product page: https://mcp.zovo.one/s/price-tracker — what it does, the tools it exposes, and a live token endpoint.
Install
Hosted, nothing to install. Get a token from https://mcp.zovo.one/mcp/connect (the connect page) or https://mcp.zovo.one/mcp/token (the same token as JSON); a free anonymous one is issued on the spot and a Pro key works the same way. Then point an MCP client at https://mcp.zovo.one/mcp/price-tracker over streamable-http and send the token as Authorization: Bearer <token>.
If your client cannot set headers, put the token in the path instead: https://mcp.zovo.one/mcp/price-tracker/t/<token>. Both forms work. The bare URL with no token answers 401 on tools/call, so the token is not optional.
Claude Desktop, one click. Download price-tracker.mcpb from the latest release and double-click it.
From source. The mirror is self-contained: every @theluckystrike/* dependency is vendored, so a fresh clone builds with no extra setup.
git clone https://github.com/theluckystrike/mcp-price-tracker.git
cd mcp-price-tracker
npm install && npm run buildThen point your client at the built entry point:
{
"mcpServers": {
"price-tracker": {
"command": "node",
"args": ["/absolute/path/to/mcp-price-tracker/dist/index.js"]
}
}
}
@theluckystrike/mcp-price-trackeris not published on npm yet, so annpx -y @theluckystrike/mcp-price-trackercommand will fail. The three paths above are the working ones and each is exercised by CI.
![]()
Read-only mirror of mcp-servers/servers/price-tracker. See MIRROR.md.
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).
Watch any product page for price drops from chat, no scraping service, no account, all local.
Related MCP server: telegram-api-mcp
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):
{
"mcpServers": {
"price-tracker": {
"command": "npx",
"args": ["-y", "@theluckystrike/mcp-price-tracker"]
}
}
}Claude Code:
claude mcp add price-tracker -- npx -y @theluckystrike/mcp-price-tracker(.cursor/mcp.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:
git clone https://github.com/theluckystrike/mcp-servers.git && cd mcp-servers
npm install
npm run build -w packages/mcp-license -w servers/price-trackerThen 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
Tool | What it does |
| Fetch a page now; returns price, currency, title, extraction confidence and the change against the last stored observation for that URL. No watch needed. |
| Start tracking a URL. Stores the first observation. Optional |
| Every watch with current price, min, max, change, target, confidence and source. |
| Stop tracking, by |
| Re-fetch one watch ( |
| Stored observations for one watch, oldest first, optional |
| Record a price you read yourself, for shops that block bots. Creates the watch if needed. |
| Watches whose latest price is at or below target, or which dropped 5% or more since the previous observation. Free. |
| Free or Pro, and where to upgrade. |
| Activate 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 say | Tool |
"What does this cost right now: <url>?" |
|
"Watch that page and alert me if it goes under 40." |
|
"Show me everything I'm watching and whether anything dropped." |
|
"Stop tracking that laptop, I bought it elsewhere." |
|
"Refresh my watches." |
|
"What's the price history on the bookshelf I'm watching?" |
|
"I checked myself, it's 39.99 GBP in-store, log that." |
|
"Has anything I'm watching hit its target or dropped a lot?" |
|
"Am I on the free plan or Pro?" |
|
"Here's my license key, activate it." |
|
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 no
structured 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
Free | Pro ($19 one-time) | |
| Unlimited | Unlimited |
| Yes, unlimited | Yes, unlimited |
Watches | 3 | Unlimited |
History per watch | Last 30 observations | Full history |
| Yes | Yes |
| No | Yes |
| Yes | Yes |
Redirect check and extraction confidence | Yes | Yes |
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_manualis 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_checkandalerts_pendingare 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
npxhangs or fails to find the package: npm publish for this package is pending. Use the.mcpbbundle or the clone-and-build path above until it lands.Using the
.mcpbbundle: 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.jsafternpm run build. Point your client'scommandatnodewith 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_manualif 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
mcp-invoice, bill a client for something you bought after tracking its price.
mcp-spreadsheet, export
price_historyand analyze it as a sheet.mcp-time-tracker, track the hours you spend shopping around, if that is somehow billable.
office-suite, every sibling server behind one install, one config entry.
Guide: Watch a product price with Claude and get told when it drops
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:
Docs MCP URL: https://gitmcp.io/theluckystrike/mcp-price-tracker
Available Tools
10 toolsalerts_pendingPending alertsA
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description claims 'Reads stored data only,' which indicates a read-only operation, but the annotations set readOnlyHint to false. This is a direct contradiction between the description and the structured annotation, so behavioral transparency fails.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no wasted words. It front-loads the core question and thresholds, then adds the prerequisite and data-source clarification.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter tool with no output schema, the description thoroughly covers purpose, thresholds, change percentage, and the watch_refresh prerequisite. An agent has enough information to invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
This tool has zero parameters and 100% schema description coverage, so there are no parameter semantics for the description to add. The zero-parameter baseline applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and resource: 'Answer whether anything you watch got cheaper' and defines the exact alert criteria (at/below target_price or down 5% since previous observation, with change %). This clearly distinguishes it from siblings like watch_list or watch_refresh.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly provides the prerequisite 'run watch_refresh first' and clarifies that it reads stored data, giving clear when-to-call context. It does not explicitly name alternatives to avoid, but the usage context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
license_activateActivate licenseA
Activate a Pro key (MCPL1.xxx.yyy) from checkout: verified offline against a built-in public key, saved to your config file. A wrong, malformed or expired key is refused, unsaved. license_status reads it back.
| Name | Required | Description | Default |
|---|---|---|---|
| key | Yes | License key from the checkout confirmation page |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full behavioral burden. It discloses that verification happens offline against a built-in public key, that the key is persisted to the config file, and that invalid keys are refused and left unsaved. This is substantial transparency for an activation tool, though it could mention overwriting an existing key or the exact return behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. The first sentence front-loads the main action, source, verification method, and persistence. The second sentence efficiently covers error handling and points to the related read-back tool. Every clause adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a single-parameter tool with no output schema and no annotations, the description covers activation behavior, verification mechanism, persistence, error outcomes, and how to read the result later. The only minor gap is an explicit statement of what the function returns upon success or failure, but the phrase 'refused, unsaved' implies a feedback mechanism. Overall, it is sufficiently complete for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents the 'key' parameter at 100% coverage, so the baseline is 3. The description adds meaningful semantics by giving the concrete key format ('MCPL1.xxx.yyy'), confirming the key comes from the checkout page, and explaining that malformed or expired keys will be rejected. This goes beyond the schema's one-line description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Activate a Pro key'), the exact key format ('MCPL1.xxx.yyy'), the source ('from checkout'), and the core mechanism ('verified offline against a built-in public key'). It also differentiates itself from the sibling license_status by noting that license_status reads the activation back, so there is no ambiguity about which tool does what.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: use this when you have a Pro key from checkout that needs to be activated. It also points to license_status as the read-back tool, which implies when to use a related sibling. It does not explicitly spell out 'do not use for checking status' or list other alternatives, but the context is strong enough to avoid misuse.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
license_statusLicense statusA
Report this server's licence state: product, tier free or pro, licence id, expiry, the key source and the upgrade URL. No arguments, no network. Explains a free-tier refusal; license_activate installs a key.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are absent, so the description carries the full burden of behavioral disclosure. It discloses that the call is local ('no network') and argument-free, and it mentions a specific explanatory behavior. The word 'Report' implies read-only, though it does not explicitly state non-destructive or permission requirements; this is adequate for a status command.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The first sentence lists the output fields; the second adds constraints and the sibling pointer. Every clause contributes meaningful information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter status tool with no output schema, the description lists the expected output fields, behavioral constraints, and the relevant alternative tool. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has zero parameters and the description reinforces this with 'No arguments'. It adds value by listing the reported fields, helping an agent understand what the empty input will yield. The baseline for zero-parameter tools is high, and the description meets it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Report'), a clear resource ('this server's licence state'), and enumerates the exact fields returned. It also names the sibling 'license_activate' as the tool that does something different, so an agent can distinguish them immediately.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit usage constraints: no arguments, no network, and explains a free-tier refusal. It also directs the agent to license_activate when the task is to install a key, serving as an explicit pointer to the relevant alternative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
price_add_manualRecord a price by handA
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Product page URL | |
| label | No | Short name for this item | |
| price | Yes | Price as shown, for example 1299.00 or 1.299,00 | |
| currency | No | ISO code such as USD or EUR |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnly=false but the description goes further, disclosing that the tool creates the watch if new, returns the amount and observation count, and refuses unreadable prices. This adds meaningful behavioral context beyond the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. It front-loads the core purpose, follows with the key side effects and limitations, and tucks the quota at the end. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple write tool, it covers the core behavior, side-effect of watch creation, return values, and a refusal condition. The schema handles parameter details, and the description is sufficient to use the tool correctly. A small gap is that error handling beyond 'unreadable price refused' is not described, but that is minor.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and each parameter already has a clear description, including a price format example. The tool description does not add parameter-specific nuance, but the schema fully carries that burden, so a baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific verb-resource pair: manually store a price when a shop blocks automated fetching. It also explains a key side effect (creates the watch if new) and differentiates itself from fetching-oriented siblings like price_check.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells the agent when to use this tool: when a shop blocks fetching, and why (manual reading). It also adds a limitation ('An unreadable price is refused') and a quota note ('Free: 3 watches'). It doesn't name an alternative tool explicitly, but the 'blocks fetching' condition clearly distinguishes it from price_check.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
price_checkCheck a price nowARead-onlyIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Product page URL, including https:// |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark it read-only and idempotent; the description adds useful behavior: it performs a fresh page fetch, returns a change since last check, and deliberately creates no watch. This goes beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each earning its place: when to use, what is returned, and the no-watch side effect. It is front-loaded and contains no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read-only tool, the description covers the call condition, the output fields, and the key side-effect distinction. No output schema exists, but the description supplies enough return information for an agent to know what to expect.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single url parameter is documented with a clear description including the https:// requirement. The description repeats 'any product URL' but does not add new parameter details; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Call this tool for any product URL' to check a price, and it explicitly lists the returned data (price, currency, title, confidence, change since last check). It distinguishes itself from a generic web fetch and from watch tools by saying 'It creates no watch.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear when-to-use context: use it for a product URL because a generic web tool returns raw HTML without the price. It does not name sibling watch/history tools or give explicit when-not-to-use conditions, but the 'creates no watch' statement implies the boundary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
price_historyPrice historyA
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Watch id | |
| url | No | Watch URL | |
| limit | No | Maximum observations to return |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description adds useful behavioral context beyond the annotations: it states the ordering ('oldest to newest'), the included fields, that nothing is fetched, and that free tier shows only the last 30. The annotations are all false, so the description carries the burden and does a good job of disclosing the read-only nature and the free-tier limit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: what it lists, that nothing is fetched, and the free-tier limit. Front-loaded with the core purpose and no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read/list tool with no output schema, the description covers the key details an agent needs: what is returned, ordering, and the free-tier cap. It doesn't mention pagination or how to specify the watch (id vs url), but the schema covers the parameters and the tool is simple enough that this is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all three parameters (id, url, limit). The description adds the 'free shows the last 30' context, which relates to limit, but doesn't add much beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('list'), a resource ('one watch's stored observations'), and a clear scope ('oldest to newest'), and it distinguishes itself from sibling tools like price_check and price_add_manual by clarifying it reads stored observations. It also mentions the output fields (price, currency, source, confidence, min/max), so an agent can tell exactly what this tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context: use it to list stored observations for one watch, and it explicitly says 'Nothing is fetched,' which helps differentiate it from price_check. It doesn't explicitly name alternative tools or state when not to use it, but the context is strong enough for an agent to select it appropriately.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
watch_addWatch a priceA
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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | Product page URL | |
| label | No | Short name for this item | |
| currency | No | ISO code such as USD or EUR, if the page does not say | |
| target_price | No | Report this watch in alerts_pending when the price is at or below this (positive number) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With all annotations being false, the description carries the burden and discloses key side effects: it starts tracking, stores a first observation, supports an optional target, and is subject to a free limit of 3 watches. This gives the agent a good understanding of the state changes and quota implications.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, each earning its place: the first explains why to use it, the second states the core behavior, and the third gives a critical quota detail. It is front-loaded with the primary use case and contains no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 4 parameters, no output schema, and minimal annotations, the description provides enough context to call it correctly: it explains the URL input, the initial observation, optional target, and the watch_refresh relationship. It does not cover failure modes or response format, but these are not strongly required given the absence of an output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already has 100% coverage, so the baseline is 3. The description adds minimal parameter context by mentioning 'optional target' and referencing re-reading via watch_refresh, but it does not deeply explain the semantics of url, label, currency, or target_price beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states that the tool tracks a product URL by storing the first price observation, and contrasts itself with a generic web tool that returns raw HTML without the price. It does not explicitly name siblings like price_add_manual, so it is clear but not fully differentiated from related tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a clear when-to-use directive ('Call this tool for any product URL') and explains why it should be used instead of a generic web fetch because that returns raw HTML without the price. It also mentions that re-reading is done via watch_refresh, providing a workflow, but does not mention conditions where alternatives like price_add_manual should be used.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
watch_listList watchesARead-onlyIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the description's added contribution is the 'never live; nothing is fetched' disclosure, which tells agents this tool performs no network I/O and returns cached data. This is meaningful behavioral context beyond the structured hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two compact sentences with no filler; the field list is front-loaded and the freshness caveat follows. Every clause adds information needed to invoke or interpret the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless, read-only list tool, the description supplies both the return contents and the data-freshness caveat. No output schema is present, but the enumerated fields make the response shape predictable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there is no schema semantics for the description to supplement. Baseline 4 is appropriate because the description adds no parameter claims but none are needed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with 'Show every tracked item with current and previous price...' – a specific verb, resource, and exact field list. It clearly identifies this as a read-only listing tool and differentiates it from mutation siblings like watch_add, watch_remove, and watch_refresh by emphasizing 'nothing is fetched.'
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The caveat that prices are as of the last watch_refresh and never live gives agents clear context for when this cached view is appropriate. It does not name alternatives or state exclusions, but the staleness warning is sufficient guidance for a simple list operation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
watch_refreshRefresh pricesA
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Watch id or URL to re-fetch. Omit and set all=true to refresh everything. Nothing runs in the background, so call this whenever the user asks about prices, drops or alerts - typically once at the start of a session, then read alerts_pending. | |
| all | No | Refresh every watch in one call (Pro; on free, refresh one id at a time) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only state readOnlyHint=false, openWorldHint=false, idempotentHint=false, destructiveHint=false, so the description adds real behavioral value by disclosing that observations are appended (a side effect) and that failures are listed for follow-up. It also explains what the tool returns, which is useful given there is no output schema. It stops short of discussing rate limits or authorization, but those gaps are minor.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tightly written sentences deliver the core purpose, behavior, return values, failure handling, and follow-up action without wasted words. The critical 'only tool that re-reads prices' message is front-loaded, and each clause contributes necessary information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description adequately covers return values and failure behavior. It differentiates the tool from siblings, explains the state-changing 'appends observations' behavior, and routes the agent to alerts_pending. With only two optional parameters fully documented in the schema, nothing essential is missing for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already documents both parameters in detail, including the 'id or URL' format, the 'all=true' behavior, and the free-tier restriction. The main description only repeats 'one watch or all' and adds no additional parameter-level nuance, so a baseline score of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('re-reads prices') and resource ('one watch or all'), and explicitly claims it is 'the only tool' that does this, distinguishing it from siblings like price_check and price_history. It also enumerates the returned fields (current, previous, min, max, change %, target hits), making the tool's purpose unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description positions the tool as the sole mechanism for refreshing prices and instructs the agent to follow up with alerts_pending when a page fails. The schema's id description further reinforces when to call ('whenever the user asks about prices, drops or alerts') and that nothing runs in the background, providing clear contextual usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
watch_removeRemove a watchADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Watch id from watch_list | |
| url | No | URL of the watch, if you do not have the id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explicitly warns that the entire price history is deleted and cannot be recovered, and that re-adding starts empty – which goes well beyond the annotation's destructiveHint=true. It also states that a non-matching key is refused, a failure condition an agent needs to know. This aligns with annotations, and no contradiction exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, each earning its place: action+parameters, irreversibility consequence, and error condition. The purpose is front-loaded in the first sentence. No filler or repetition of structured fields.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter destructive tool with annotations already present, the description covers the essential call semantics, the lasting side effect, and the failure mode. It does not describe the return value, but with no output schema and a straightforward removal, that is not required. The description is complete enough for an agent to invoke correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the description is not required to document parameter syntax. It does add the semantic that id and URL are alternative means of identifying the watch, and that a key must match an existing watch. However, the schema already conveys the 'if you do not have the id' relationship, so the description adds marginal value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Call this tool to stop tracking one item, by watch id or URL,' which clearly states the verb, the resource, and the two acceptable keys. This distinguishes it from siblings like watch_add and watch_list, and the title aligns with the description. No ambiguity remains about what the tool does.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It tells the agent when to call it: when you want to stop tracking an item, and it offers two input methods (id or URL). It does not explicitly name alternatives or exclusions, but the context of 'stop tracking' is sufficiently clear. The error note about non-matching keys is helpful for understanding when a call will fail.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
10 tool updates
v0.22.0- First observed
alerts_pending - First observed
license_activate - First observed
license_status - First observed
price_add_manual - First observed
price_check - First observed
price_history - First observed
watch_add - First observed
watch_list - First observed
watch_refresh - First observed
watch_remove
TDQS
Scored across 10 tools
Most tools have clearly distinct purposes: watch_* handles persistent tracking, price_check is a stateless one-off lookup, and license_* covers licensing. The only real overlap is watch_add vs price_check, which both accept a product URL and fetch a price, but descriptions explicitly separate them ('creates no watch' vs 'starts tracking').
A dominant domain-prefix pattern runs throughout (watch_, price_, alerts_, license_), which makes grouping intuitive. Minor deviations exist: alerts_pending and license_status are noun/adjective forms rather than the verb-style used by the rest.
Ten tools is well within the ideal range and each earns its place: tracking CRUD, refresh, history, alerts, one-off check, and licensing are all genuinely distinct operations. No redundancy or filler.
The lifecycle is well covered: add, list, refresh, history, alerts, remove, manual entry, one-off check, plus license handling. Minor gaps remain, such as no tool to update an existing watch's target_price or bulk-remove watches, but these are workable.
Maintenance
Related MCP Connectors
MCP server for ua_e_commerce_price_tracker_mcp
Unified MCP server for 70+ eCommerce platforms: products, orders, customers, and more.
MCP server for Lemon Squeezy — stores, products, orders, subscriptions, license keys.
MCP server for Product Management
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceThis MCP server enables product management and mathematical calculations through a Telegram bot interface. It allows users to view, search, and add products to a database using natural language commands.-
- AlicenseCqualityCmaintenanceUltimate MCP server for Telegram Bot API — 169 methods, full v9.6 coverage, meta-mode, rate limiting, and circuit breaker, enabling AI to control Telegram bots with natural language.10033MIT
- FlicenseNot gradedqualityDmaintenanceMCP server for VkusVill grocery store, enabling product search, details retrieval, and cart link creation.3-
- AlicenseAqualityDmaintenanceMCP server for tracking Amazon product prices via camelcamelcamel.com, using headless Chromium to bypass Cloudflare protection.3ISC