MCP Price Tracker

Verifique e acompanhe os preços de produtos em páginas de lojas comuns.

Documentação

mcp-price-tracker

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

Pergunte ao seu assistente quanto algo custa agora. Aponte-o para qualquer página de produto e ele lê o preço da página, lembra dele e te avisa na próxima vez se o preço mudou, quanto mudou e se atingiu o número que você estava esperando. Funciona em páginas de lojas comuns lendo os dados estruturados que a maioria das lojas já publica (JSON-LD, Open Graph, microdata) e, quando não há, recorre ao preço visível. Quando um grande varejista bloqueia requisiçõ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.

Construído por theluckystrike.

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

price-tracker demo

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 + build é o caminho que funciona, ambos verificados abaixo.

Um clique (.mcpb): baixe price-tracker.mcpb do lançamento mais recente e clique duas vezes 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 formulário npx acima começa a funcionar no momento em 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 variação em relação à última observação armazenada para aquela URL. Não é necessário acompanhamento.
watch_addComeça a acompanhar uma URL. Armazena a primeira observação. Opcional: label, target_price, currency.
watch_listCada acompanhamento com preço atual, mínimo, máximo, variação, meta, confiança e fonte.
watch_removePara de acompanhar, por id ou url.
watch_refreshBusca novamente um acompanhamento (id) ou todos eles (all: true); adiciona observações e retorna atual, anterior, mínimo, máximo, variação % e indicadores 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, opcional limit.
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 acompanhar 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 carrega JSON-LD nem microdata, 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 repassou o rótulo "baixo" ao usuário sem ser solicitado, em vez de afirmar 51,77 como 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), microdata itemprop="price", Open Graph og:price:amount / product:price:amount, meta itemprop, data-price atributos, dicas comuns de classe e id de preço (incluindo o a-offscreen da Amazon) e, por fim, 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, microdata, meta itemprop e Open Graph; medium para data-price atributos 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 reporta 99. Um código ISO escrito ao lado do número ("$10 USD") vence sobre 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 de desktop, timeout de 12 segundos, redirecionamentos seguidos e limite de 2 MB de corpo. Após a busca, a URL final é comparada com a que você pediu: se a loja redirecionou para fora do caminho do produto - uma profundidade de caminho diferente, uma página de categoria ou inicial, ou um 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 da 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

Os 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. Toda 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 no stderr, e toda ferramenta responde 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 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 resolvedor 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 para este pacote está pendente. Use o pacote .mcpb ou o caminho de clone e build acima até que seja publicado.
  • Usando o pacote .mcpb: ele instala diretamente no Claude Desktop; não há etapa separada de configuração.
  • Usando o caminho de clone: 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 acompanhamento sempre erra com "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). Busque a URL exata do produto novamente na loja e re-adicione o acompanhamento, ou use price_add_manual se a loja continuar redirecionando.
  • Uma loja retorna 403 toda vez: ela está bloqueando requisições automatizadas. Isso é esperado para um subconjunto de grandes varejistas (veja Limites acima); use price_add_manual.
  • Nada aparece / falhas silenciosas: os logs vão apenas para o stderr, nunca para o 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 requisições de rede são para as páginas de produto que você nomeia. As chaves de licença verificam 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 de cron/launchd que você mesmo configurou o chama).

Ou a loja retornou uma resposta de bloqueio a bots (403) ou a solicitação foi redirecionada da página do produto para uma listagem, categoria ou página inicial. Ambos são reportados honestamente em vez de retornar um número errado; use price_add_manual para manter o histórico atualizado 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 produtos que você adiciona, para buscar suas páginas. Não há telemetria e não há 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: