Price Tracker MCP

Acompanhe preços ao longo do tempo: registre pontos de preço por produto ou serviço, veja tendências e variações percentuais.

Documentação

mcp-price-tracker

Servidor MCP para rastreamento de preços, um rastreador de preços e observador de quedas de preços para páginas de lojas. Verifique e acompanhe preços de produtos em páginas de lojas comuns.

Funciona com Claude Desktop, Claude Code, Cursor e qualquer cliente do Model Context Protocol. Roda na sua própria máquina ou hospedado, sem instalação.

Página do produto: https://mcp.zovo.one/s/price-tracker — o que faz, as ferramentas que expõe e um endpoint de token ao vivo.

Instalação

Hospedado, nada para instalar. Obtenha um token em https://mcp.zovo.one/mcp/connect (página de conexão) ou https://mcp.zovo.one/mcp/token (o mesmo token em JSON); um token anônimo gratuito é emitido na hora e uma chave Pro funciona da mesma forma. Em seguida, aponte um cliente MCP para https://mcp.zovo.one/mcp/price-tracker via streamable-http e envie o token como Authorization: Bearer <token>.

Se o seu cliente não puder definir cabeçalhos, coloque o token no caminho: https://mcp.zovo.one/mcp/price-tracker/t/<token>. Ambas as formas funcionam. A URL simples sem token responde 401 em tools/call, então o token não é opcional.

Claude Desktop, um clique. Baixe price-tracker.mcpb do último lançamento e clique duas vezes nele.

A partir do código-fonte. O espelho é autocontido: cada dependência @theluckystrike/* é incluída, então um clone novo compila sem configuração extra.

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

Em seguida, aponte seu cliente para o ponto de entrada compilado:

{
  "mcpServers": {
    "price-tracker": {
      "command": "node",
      "args": ["/absolute/path/to/mcp-price-tracker/dist/index.js"]
    }
  }
}

@theluckystrike/mcp-price-tracker ainda não está publicado no npm, então um comando npx -y @theluckystrike/mcp-price-tracker falhará. Os três caminhos acima são os que funcionam e cada um é testado pela CI.

price-tracker demo

Espelho somente leitura de mcp-servers/servers/price-tracker. Veja MIRROR.md.

Destaque no Awesome MCP Servers — listagem no diretório | endpoint hospedado ao vivo, plano gratuito, sem cadastro.

Pergunte ao seu assistente quanto custa algo agora. Aponte-o para qualquer página de produto e ele lê o preço da página, lembra dele e informa na próxima vez se o preço mudou, quanto mudou e se atingiu o número que você esperava. Funciona em páginas de lojas comuns lendo os dados estruturados que a maioria das lojas já publica (JSON-LD, Open Graph, microdados) e recorrendo ao preço visível quando eles não existem. Quando um grande varejista bloqueia solicitações automatizadas, ele diz isso claramente e permite que você registre o preço manualmente para que o histórico permaneça intacto. Tudo é armazenado em um arquivo JSON na sua própria máquina.

Criado por theluckystrike.

No registro oficial de MCP (io.github.theluckystrike/price-tracker-drop-alert-watch).

Acompanhe qualquer página de produto para quedas de preço pelo chat, sem serviço de scraping, sem conta, tudo local.

Instalação em 60 segundos

A publicação no npm para @theluckystrike/mcp-price-tracker está pendente. Até lá, o pacote de um clique .mcpb ou um clone + compilação é o caminho que funciona, ambos verificados abaixo.

Um clique (.mcpb): baixe price-tracker.mcpb do último lançamento e clique duas vezes nele no 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"]
    }
  }
}

O formato npx acima começa a funcionar assim que o pacote for publicado. Até lá, use o pacote .mcpb acima ou compile a partir do código-fonte com exatamente estes três 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

Em seguida, aponte o command do seu cliente para node com um argumento: o caminho absoluto para servers/price-tracker/dist/index.js.

Para executar no modo Pro, defina MCP_LICENSE_KEY no mesmo bloco de configuração ou chame license_activate uma vez com sua chave.

Ferramentas

FerramentaO que faz
price_checkBusca uma página agora; retorna preço, moeda, título, confiança da extração e a mudança em relação à última observação armazenada para aquela URL. Não é necessário acompanhamento.
watch_addComeça a rastrear uma URL. Armazena a primeira observação. Opcionais: label, target_price, currency.
watch_listCada acompanhamento com preço atual, mínimo, máximo, mudança, meta, confiança e fonte.
watch_removePara de rastrear, por id ou url.
watch_refreshBusca novamente um acompanhamento (id) ou todos (all: true); adiciona observações e retorna atual, anterior, mínimo, máximo, % de mudança e sinalizadores de meta atingida. Esta é a única coisa que verifica preços.
price_historyObservações armazenadas para um acompanhamento, da mais antiga para a mais recente, com limit opcional.
price_add_manualRegistra um preço que você mesmo leu, para lojas que bloqueiam bots. Cria o acompanhamento se necessário.
alerts_pendingAcompanhamentos cujo preço mais recente está igual ou abaixo da meta, ou que caíram 5% ou mais desde a observação anterior. Grátis.
license_statusGrátis ou Pro, e onde atualizar.
license_activateAtiva uma chave Pro. Verificado offline.

Recurso: prices://watches — JSON de cada acompanhamento com seu preço mais recente.

Prompt: check_prices — atualiza todos os acompanhamentos e resume as quedas e metas atingidas em um único comando.

O que você pode dizer

Você dizFerramenta
"Quanto custa isso agora: <url>?"price_check
"Acompanhe essa página e me avise se ficar abaixo de 40."watch_add
"Mostre tudo que estou acompanhando e se algo caiu."watch_refresh (todos) e depois watch_list
"Pare de rastrear aquele notebook, comprei em outro lugar."watch_remove
"Atualize meus acompanhamentos."watch_refresh
"Qual é o histórico de preços da estante que estou acompanhando?"price_history
"Eu mesmo verifiquei, está 39,99 GBP na loja, registre isso."price_add_manual
"Algo que estou acompanhando atingiu a meta ou caiu muito?"alerts_pending
"Estou no plano gratuito ou Pro?"license_status
"Aqui está minha chave de licença, ative-a."license_activate

Exemplo prático

Uma execução real contra books.toscrape.com, de docs/USER_VALUE_R2.md, com WebFetch/WebSearch desabilitados para que as próprias ferramentas do rastreador de preços tivessem 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.

O rótulo de confiança não é decoração: books.toscrape.com não contém JSON-LD nem microdados, então este é o único caso nos testes em que o fallback por regex foi o único caminho para um número, e o modelo transmitiu o rótulo "baixo" ao usuário sem ser solicitado, em vez de afirmar 51,77 como um fato.

Alertas: nada roda em segundo plano

Não há agendador nem daemon. Um acompanhamento é um histórico armazenado, não uma assinatura: os preços são relidos apenas quando watch_refresh é executado, e alerts_pending relata o que já está armazenado. O padrão de trabalho é dizer "atualize meus acompanhamentos" no início de uma sessão (ou executar o prompt check_prices) e depois perguntar o que caiu.

Grátis vs Pro

GrátisPro ($19 pagamento único)
price_checkIlimitadoIlimitado
alerts_pendingSim, ilimitadoSim, ilimitado
Acompanhamentos3Ilimitado
Histórico por acompanhamentoÚltimas 30 observaçõesHistórico completo
watch_refresh um itemSimSim
watch_refresh todos de uma vezNãoSim
price_add_manualSimSim
Verificação de redirecionamento e confiança da extraçãoSimSim

Obtenha o Pro — $19 para este servidor, $39 para todos os servidores, vitalício.

Como os preços são lidos

Em ordem: JSON-LD Product/Offer (price, priceCurrency, lowPrice), microdados itemprop="price", Open Graph og:price:amount / product:price:amount, meta itemprop, atributos data-price, dicas comuns de classe e id de preço (incluindo o a-offscreen da Amazon) e, finalmente, um regex sobre o texto visível dos primeiros 200 KB. Separadores europeus e americanos são ambos compreendidos, então 1.299,00 EUR e 1,299.00 USD ambos se tornam 1299.00.

Os preços são armazenados como strings decimais na unidade principal com separador decimal . e sem agrupamento, por exemplo "1299.00". Os carimbos de data/hora estão em ISO 8601 UTC.

Cada leitura carrega uma confiança: high para JSON-LD, microdados, meta itemprop e Open Graph; medium para atributos data-price e dicas de classe ou id de preço; low para o fallback por regex. Uma leitura low em uma página sem título de produto é relatada, mas nunca armazenada.

Quando uma página descreve vários produtos em JSON-LD (recomendações, "clientes também compraram"), as ofertas de um produto nunca são combinadas com as de outro: o produto cujo nome corresponde ao título da página vence; caso contrário, o primeiro produto com ofertas. Preços riscados e anteriores (<s>, <del>, <strike> e classes como old-price, was, compare-at-price, list-price, rrp) são ignorados, então um 199 riscado ao lado de um 99 ativo relata 99. Um código ISO escrito ao lado do número ("$10 USD") vence a moeda adivinhada pelo domínio, e twitter:data1 — texto livre como "Frete grátis acima de $50" — não é lido como preço.

As páginas são buscadas com um User-Agent de navegador desktop, timeout de 12 segundos, redirecionamentos seguidos e limite de corpo de 2 MB. Após a busca, a URL final é comparada com a solicitada: se a loja redirecionou para fora do caminho do produto — profundidade de caminho diferente, página de categoria ou inicial, ou título genérico como "Produtos", "Início", apenas o nome da loja ou "não encontrado" — você recebe the shop redirected to <finalUrl>, which is not a product page em vez do item mais barato na listagem em que caiu. Um redirecionamento que apenas insere um slug canônico na frente do mesmo id ou caminho de produto (URLs estilo Newegg, Amazon /dp/, Zalando) é aceito, não recusado.

Como os dados são armazenados

Acompanhamentos e seu histórico de preços ficam em um único arquivo JSON: ${XDG_DATA_HOME:-~/.local/share}/mcp-servers/price-tracker/watches.json. Cada mutação (watch_add, watch_remove, watch_refresh, price_add_manual) acontece sob um arquivo de bloqueio consultivo, .../price-tracker/.lock, mantido durante o ciclo carregar-mutar-salvar para que duas atualizações simultâneas não possam se intercalar. price_check e ferramentas somente leitura não precisam do bloqueio. As gravações escrevem em um arquivo temporário e o renomeiam para o lugar, então uma gravação interrompida não pode deixar um arquivo pela metade. Para fazer backup do seu histórico de acompanhamentos, copie watches.json.

Apenas um arquivo ausente conta como "sem acompanhamentos ainda". Se watches.json existir, mas não puder ser lido ou analisado, o servidor nunca o trata como vazio: os bytes ilegíveis são movidos para watches.json.corrupt-<timestamp>, a falha é escrita em stderr, e todas as ferramentas respondem com um erro nomeando esse arquivo até que o servidor seja reiniciado. Um banco de dados danificado nunca pode, portanto, ser silenciosamente sobrescrito pelo próximo preço que você registrar.

Limites e ressalvas honestas

  • A taxa real de extração é de aproximadamente 5 em 12 em uma amostra mista de grandes varejistas: cinco sites retornaram um bloqueio direto de bot com 403 (H&M, Allegro, MediaMarkt, Home Depot, Etsy), um expirou (Best Buy), e o restante se dividiu entre preços corretos e uma leitura intencionalmente recusada (um redirecionamento para fora da página do produto). Isso é uma propriedade da web aberta, não um bug que o servidor possa corrigir; não há navegador headless nem solucionador de CAPTCHA aqui, por design (sem dependências nativas, sem API paga). price_add_manual é a resposta que funciona para uma loja bloqueada.
  • Não há trabalho em segundo plano. Nada verifica preços a menos que você (ou seu cliente, por meio de um script agendado que você mesmo executa) chame watch_refresh. Isso não é um recurso ausente; um servidor stdio local não tem motivo para executar um daemon na sua máquina.
  • O plano gratuito limita os acompanhamentos a 3 e o histórico às últimas 30 observações por acompanhamento; price_check e alerts_pending são ilimitados no plano gratuito.
  • Uma leitura por regex com confiança low ainda é relatada, mas nunca tratada silenciosamente como certa; repasse-a ao usuário como uma estimativa, não como um fato.

Solução de problemas

  • npx trava ou não encontra o pacote: a publicação no npm deste pacote está pendente. Use o pacote .mcpb ou o caminho de clonagem e compilação acima até que ele seja publicado.
  • Usando o pacote .mcpb: ele instala diretamente no Claude Desktop; não há etapa de configuração separada.
  • Usando o caminho de clonagem: o binário do servidor é servers/price-tracker/dist/index.js após npm run build. Aponte o command do seu cliente para node com esse caminho absoluto como único argumento.
  • Versão do Node: requer Node >= 18. Verifique com node -v.
  • Um monitor sempre apresenta erro "não é uma página de produto": a loja redirecionou você para fora da URL fornecida (uma página de categoria, página inicial ou um título genérico). Obtenha novamente a URL exata do produto na loja e adicione o monitor novamente, ou use price_add_manual se a loja continuar redirecionando.
  • Uma loja retorna 403 toda vez: ela está bloqueando solicitações automatizadas. Isso é esperado para um subconjunto de grandes varejistas (veja Limitações acima); use price_add_manual.
  • Nada aparece / falhas silenciosas: os logs vão apenas para stderr, nunca para stdout. No Claude Desktop, verifique Configurações -> Desenvolvedor -> o arquivo de log do servidor; no Claude Code, verifique o terminal ou --mcp-debug.

Privacidade

Todos os dados permanecem locais, em ${XDG_DATA_HOME:-~/.local/share}/mcp-servers/price-tracker/watches.json. As únicas solicitações de rede são para as páginas de produto que você nomeia. As chaves de licença são verificadas offline; nada é enviado a lugar algum.

Combina com

FAQ

Não há agendador neste servidor. Os preços só são relidos quando watch_refresh é executado, o que acontece quando você solicita (ou quando um job cron/launchd que você mesmo configurou o chama).

Ou a loja retornou uma resposta de bloqueio de bot (403) ou a solicitação redirecionou para fora da página do produto para uma página de listagem, categoria ou inicial. Ambos são relatados honestamente em vez de retornar um número errado; use price_add_manual para manter o histórico manualmente.

O preço veio de um fallback de padrão de texto em vez dos dados estruturados da própria página (JSON-LD, microdata, Open Graph). Geralmente está correto, mas não foi verificado contra um campo legível por máquina.

watch_add e price_add_manual aceitam um currency explícito, mas o número que você armazena deve corresponder ao que você realmente leu; o servidor não converte moedas.

Não. As únicas solicitações de saída são para as URLs de produto que você adiciona, para buscar suas páginas. Não há telemetria nem conta.

Licenciado sob MIT.

Use estes documentos como um servidor MCP

Qualquer cliente MCP (Claude, Cursor, Windsurf, VS Code) pode ler a documentação deste repositório diretamente via GitMCP — sem instalação: