Track product prices and get drop alerts - history, watches and pending alerts.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Bearer <Pro license key or anonymous token from GET https://mcp.zovo.one/mcp/token>
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
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.
This tool takes no arguments.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
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.
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}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.
| Argument | Type | Description |
|---|---|---|
| key* | string | License key from checkout, MCPL1.<payload>.<signature> |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"key"
],
"properties": {
"key": {
"type": "string",
"description": "License key from checkout, MCPL1.<payload>.<signature>"
}
},
"additionalProperties": false
}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.
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}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.
| Argument | Type | Description |
|---|---|---|
| url* | string | Product page URL |
| label | string | Short name for this item |
| price* | string | number | Price as shown, for example 1299.00 or 1.299,00 |
| currency | string | ISO code such as USD or EUR |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"url",
"price"
],
"properties": {
"url": {
"type": "string",
"description": "Product page URL"
},
"label": {
"type": "string",
"description": "Short name for this item"
},
"price": {
"type": [
"string",
"number"
],
"description": "Price as shown, for example 1299.00 or 1.299,00"
},
"currency": {
"type": "string",
"description": "ISO code such as USD or EUR"
}
},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| url* | string | Product page URL, including https:// |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"description": "Product page URL, including https://"
}
},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| id | string | Watch id |
| url | string | Watch URL |
| limit | integer | Maximum observations to return |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"id": {
"type": "string",
"description": "Watch id"
},
"url": {
"type": "string",
"description": "Watch URL"
},
"limit": {
"type": "integer",
"description": "Maximum observations to return",
"exclusiveMinimum": 0
}
},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| url* | string | Product page URL |
| label | string | Short name for this item |
| currency | string | ISO code such as USD or EUR, if the page does not say |
| target_price | string | number | Report this watch in alerts_pending when the price is at or below this (positive number) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"description": "Product page URL"
},
"label": {
"type": "string",
"description": "Short name for this item"
},
"currency": {
"type": "string",
"description": "ISO code such as USD or EUR, if the page does not say"
},
"target_price": {
"type": [
"string",
"number"
],
"description": "Report this watch in alerts_pending when the price is at or below this (positive number)"
}
},
"additionalProperties": false
}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.
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}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.
| Argument | Type | Description |
|---|---|---|
| id | string | 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 | boolean | Refresh every watch in one call (Pro; on free, refresh one id at a time) |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"id": {
"type": "string",
"description": "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": {
"type": "boolean",
"description": "Refresh every watch in one call (Pro; on free, refresh one id at a time)"
}
},
"additionalProperties": false
}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.
| Argument | Type | Description |
|---|---|---|
| id | string | Watch id from watch_list |
| url | string | URL of the watch, if you do not have the id |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"id": {
"type": "string",
"description": "Watch id from watch_list"
},
"url": {
"type": "string",
"description": "URL of the watch, if you do not have the id"
}
},
"additionalProperties": false
}