MCP Price Tracker

Consulta y monitorea los precios de productos en páginas de tiendas comunes.

Documentación

mcp-price-tracker

Destacado en Awesome MCP Servers - listado del directorio | endpoint alojado en vivo, nivel gratuito, sin registro.

Pídele a tu asistente cuánto cuesta algo ahora mismo. Señálale cualquier página de producto y leerá el precio de la página, lo recordará y te dirá la próxima vez si el precio ha cambiado, cuánto, y si ha alcanzado el número que estabas esperando. Funciona en páginas de tiendas ordinarias leyendo los datos estructurados que la mayoría de las tiendas ya publican (JSON-LD, Open Graph, microdata) y recurriendo al precio visible cuando no los tienen. Cuando un gran minorista bloquea las solicitudes automatizadas, lo dice claramente y te permite registrar el precio tú mismo para que el historial permanezca intacto. Todo se almacena en un archivo JSON en tu propia máquina.

Creado por theluckystrike.

En el Registro oficial de MCP (io.github.theluckystrike/price-tracker-drop-alert-watch).

price-tracker demo

Observa cualquier página de producto para detectar caídas de precio desde el chat, sin servicio de scraping, sin cuenta, todo local.

Instalación en 60 segundos

La publicación en npm para @theluckystrike/mcp-price-tracker está pendiente. Hasta entonces, el paquete de un clic .mcpb o una clonación + compilación es la vía funcional, ambas verificadas a continuación.

Un clic (.mcpb): descarga price-tracker.mcpb de la última versión y haz doble clic en 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"]
    }
  }
}

El formulario npx anterior comienza a funcionar en cuanto se publique el paquete. Hasta entonces, usa el paquete .mcpb anterior, o compila desde el código fuente con exactamente estos tres comandos:

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

Luego apunta el command de tu cliente a node con un argumento: la ruta absoluta a servers/price-tracker/dist/index.js.

Para ejecutar en modo Pro, establece MCP_LICENSE_KEY en el mismo bloque de configuración, o llama a license_activate una vez con tu clave.

Herramientas

HerramientaQué hace
price_checkObtiene una página ahora; devuelve precio, moneda, título, confianza de extracción y el cambio respecto a la última observación almacenada para esa URL. No se necesita seguimiento.
watch_addComienza a rastrear una URL. Almacena la primera observación. Opcional label, target_price, currency.
watch_listCada seguimiento con precio actual, mínimo, máximo, cambio, objetivo, confianza y fuente.
watch_removeDetiene el seguimiento, por id o url.
watch_refreshVuelve a obtener un seguimiento (id) o todos ellos (all: true); añade observaciones y devuelve actual, anterior, mínimo, máximo, cambio % y banderas de objetivo alcanzado. Esto es lo único que comprueba precios.
price_historyObservaciones almacenadas para un seguimiento, de más antiguas a más recientes, opcional limit.
price_add_manualRegistra un precio que leíste tú mismo, para tiendas que bloquean bots. Crea el seguimiento si es necesario.
alerts_pendingSeguimientos cuyo último precio está en o por debajo del objetivo, o que cayeron un 5% o más desde la observación anterior. Gratis.
license_statusGratis o Pro, y dónde actualizar.
license_activateActiva una clave Pro. Verificada sin conexión.

Recurso: prices://watches - JSON de cada seguimiento con su último precio.

Prompt: check_prices - actualiza cada seguimiento y resume las caídas y objetivos alcanzados en un solo comando.

Lo que puedes decir

Tú dicesHerramienta
"¿Cuánto cuesta esto ahora mismo: <url>?"price_check
"Vigila esa página y avísame si baja de 40."watch_add
"Muéstrame todo lo que estoy vigilando y si algo ha bajado."watch_refresh (todo) luego watch_list
"Deja de rastrear ese portátil, lo compré en otro sitio."watch_remove
"Actualiza mis seguimientos."watch_refresh
"¿Cuál es el historial de precios de la estantería que estoy vigilando?"price_history
"Lo comprobé yo mismo, está a 39.99 GBP en tienda, regístralo."price_add_manual
"¿Algo de lo que estoy vigilando ha alcanzado su objetivo o ha bajado mucho?"alerts_pending
"¿Estoy en el plan gratuito o en Pro?"license_status
"Aquí está mi clave de licencia, actívala."license_activate

Ejemplo práctico

Una ejecución real contra books.toscrape.com, desde docs/USER_VALUE_R2.md, con WebFetch/WebSearch deshabilitados para que las propias herramientas del rastreador de precios tuvieran que responder:

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.

La etiqueta de confianza no es decoración: books.toscrape.com no lleva JSON-LD ni microdata, así que este es el único caso en las pruebas donde el respaldo por regex era el único camino a un número, y el modelo transmitió la etiqueta "baja" al usuario sin que se lo pidieran en lugar de afirmar 51.77 como un hecho.

Alertas: nada se ejecuta en segundo plano

No hay programador ni demonio. Un seguimiento es un historial almacenado, no una suscripción: los precios se vuelven a leer solo cuando watch_refresh se ejecuta, y alerts_pending informa sobre lo que ya está almacenado. El patrón de trabajo es decir "actualiza mis seguimientos" al inicio de una sesión (o ejecutar el prompt check_prices), y luego preguntar qué ha bajado.

Gratis vs Pro

GratisPro ($19 pago único)
price_checkIlimitadoIlimitado
alerts_pendingSí, ilimitadoSí, ilimitado
Seguimientos3Ilimitados
Historial por seguimientoÚltimas 30 observacionesHistorial completo
watch_refresh un elementoSíSí
watch_refresh todo a la vezNoSí
price_add_manualSíSí
Verificación de redirecciones y confianza de extracciónSíSí

Obtén Pro - $19 por este servidor, $39 por todos los servidores, de por vida.

Cómo se leen los precios

En orden: JSON-LD Product/Offer (price, priceCurrency, lowPrice), microdata itemprop="price", Open Graph og:price:amount / product:price:amount, meta itemprop, data-price atributos, pistas comunes de clase e id de precio (incluyendo el a-offscreen de Amazon), y finalmente un regex sobre el texto visible de los primeros 200 KB. Se entienden tanto los separadores europeos como los estadounidenses, así que 1.299,00 EUR y 1,299.00 USD ambos se convierten en 1299.00.

Los precios se almacenan como cadenas decimales en la unidad principal con un separador decimal . y sin agrupación, por ejemplo "1299.00". Las marcas de tiempo son ISO 8601 UTC.

Cada lectura lleva una confianza: high para JSON-LD, microdata, meta itemprop y Open Graph; medium para atributos data-price y pistas de clase o id de precio; low para el respaldo por regex. Una lectura low en una página sin título de producto se informa pero nunca se almacena.

Cuando una página describe varios productos en JSON-LD (recomendaciones, "los clientes también compraron"), las ofertas de un producto nunca se combinan con las de otro: gana el producto cuyo nombre coincide con el título de la página; de lo contrario, el primer producto que tenga ofertas. Los precios tachados y anteriores (<s>, <del>, <strike>, y clases como old-price, was, compare-at-price, list-price, rrp) se omiten, así que un 199 tachado junto a un 99 activo informa 99. Un código ISO escrito junto al número ("$10 USD") gana sobre la moneda adivinada por el dominio, y twitter:data1 - texto libre como "Envío gratis por más de $50" - no se lee como un precio.

Las páginas se obtienen con un User-Agent de navegador de escritorio, un tiempo de espera de 12 segundos, se siguen las redirecciones y un límite de cuerpo de 2 MB. Después de la obtención, la URL final se compara con la que pediste: si la tienda redirige fuera de la ruta del producto - una profundidad de ruta diferente, una página de categoría o de inicio, o un título genérico como "Productos", "Inicio", el nombre de la tienda solo, o "no encontrado" - obtienes the shop redirected to <finalUrl>, which is not a product page en lugar del artículo más barato del listado en el que aterrizó. Una redirección que solo inserta un slug canónico delante del mismo id de producto o ruta (URLs estilo Newegg, Amazon /dp/, Zalando) se acepta, no se rechaza.

Cómo almacena datos

Los seguimientos y su historial de precios viven en un archivo JSON: ${XDG_DATA_HOME:-~/.local/share}/mcp-servers/price-tracker/watches.json. Cada mutación (watch_add, watch_remove, watch_refresh, price_add_manual) ocurre bajo un archivo de bloqueo de asesoría, .../price-tracker/.lock, mantenido durante el ciclo de carga-mutación-guardado para que dos actualizaciones simultáneas no puedan intercalarse. price_check y las herramientas de solo lectura no necesitan el bloqueo. Los guardados escriben en un archivo temporal y lo renombran en su lugar, así que una escritura interrumpida no puede dejar un archivo a medias. Para respaldar tu historial de seguimientos, copia watches.json.

Solo un archivo faltante cuenta como "aún no hay seguimientos". Si watches.json existe pero no se puede leer o analizar, el servidor nunca lo trata como vacío: los bytes ilegibles se mueven a watches.json.corrupt-<timestamp>, la falla se escribe en stderr, y cada herramienta responde con un error que nombra ese archivo hasta que el servidor se reinicia. Una base de datos dañada nunca puede ser sobrescrita silenciosamente por el siguiente precio que registres.

Límites y advertencias honestas

  • La tasa de extracción real es aproximadamente 5 de 12 en una muestra mixta de grandes minoristas: cinco sitios devolvieron un muro anti-bots 403 directo (H&M, Allegro, MediaMarkt, Home Depot, Etsy), uno agotó el tiempo (Best Buy), y el resto se dividió entre precios correctos y una lectura rechazada intencionalmente (una redirección fuera de la página del producto). Esto es una propiedad de la web abierta, no un error que el servidor pueda arreglar; no hay navegador sin cabeza ni solucionador de CAPTCHA aquí, por diseño (sin dependencias nativas, sin API de pago). price_add_manual es la respuesta funcional para una tienda bloqueada.
  • No hay trabajo en segundo plano. Nada comprueba precios a menos que tú (o tu cliente, mediante un script programado que ejecutes tú mismo) llames a watch_refresh. Esto no es una función faltante; un servidor stdio local no tiene por qué ejecutar un demonio en tu máquina.
  • El nivel gratuito limita los seguimientos a 3 y el historial a las últimas 30 observaciones por seguimiento; price_check y alerts_pending son ilimitados en el nivel gratuito.
  • Una lectura por regex con confianza low aún se informa, pero nunca se trata silenciosamente como cierta; transmítela al usuario como una estimación, no como un hecho.

Solución de problemas

  • npx se cuelga o no encuentra el paquete: la publicación en npm para este paquete está pendiente. Usa el paquete .mcpb o la ruta de clonación y compilación anterior hasta que llegue.
  • Usando el paquete .mcpb: se instala directamente en Claude Desktop; no hay un paso de configuración separado.
  • Usando la ruta de clonación: el binario del servidor es servers/price-tracker/dist/index.js después de npm run build. Apunta el command de tu cliente a node con esa ruta absoluta como único argumento.
  • Versión de Node: requiere Node >= 18. Compruébalo con node -v.
  • Un seguimiento siempre da error "no es una página de producto": la tienda te redirigió fuera de la URL que le diste (una página de categoría, de inicio o un título genérico). Obtén la URL exacta del producto nuevamente desde la tienda y vuelve a añadir el seguimiento, o usa price_add_manual si la tienda sigue redirigiendo.
  • Una tienda devuelve 403 cada vez: está bloqueando solicitudes automatizadas. Esto es esperado para un subconjunto de grandes minoristas (ver Límites arriba); usa price_add_manual.
  • No aparece nada / fallos silenciosos: los registros van solo a stderr, nunca a stdout. En Claude Desktop revisa Configuración -> Desarrollador -> el archivo de registro del servidor; en Claude Code revisa la terminal o --mcp-debug.

Privacidad

Todos los datos permanecen locales, en ${XDG_DATA_HOME:-~/.local/share}/mcp-servers/price-tracker/watches.json. Las únicas solicitudes de red son a las páginas de producto que nombras. Las claves de licencia se verifican sin conexión; no se envía nada a ningún sitio.

Se complementa con

Preguntas frecuentes

No hay un programador de tareas en este servidor. Los precios solo se vuelven a leer cuando se ejecuta watch_refresh, lo cual ocurre cuando lo solicitas (o cuando un trabajo de cron/launchd que tú mismo configures lo llama).

O la tienda devolvió una respuesta de muro anti-bots (403) o la solicitud se redirigió fuera de la página del producto hacia una lista, categoría o página de inicio. Ambos casos se informan honestamente en lugar de devolver un número incorrecto; usa price_add_manual para mantener el historial de forma manual.

El precio provino de un respaldo de patrón de texto en lugar de los datos estructurados propios de la página (JSON-LD, microdatos, Open Graph). Por lo general es correcto, pero no se ha verificado contra un campo legible por máquina.

watch_add y price_add_manual aceptan un currency explícito, pero el número que almacenes debe coincidir con lo que realmente leíste; el servidor no convierte monedas.

No. Las únicas solicitudes salientes son a las URL de productos que agregas, para obtener sus páginas. No hay telemetría ni cuenta.

Licencia MIT.

Usa estos documentos como un servidor MCP

Cualquier cliente MCP (Claude, Cursor, Windsurf, VS Code) puede leer la documentación de este repositorio directamente a través de GitMCP, sin instalación: