App Store Operator

Pesquisa competitiva da App Store para desenvolvedores iOS independentes — busca de palavras-chave ranqueadas, estimativas de downloads e receita dos concorrentes e textos de eventos in-app do iOS. Grátis, sem chave de API.

Documentação

App Store Operator

npm downloads license node MCP MCP Badge

Inteligência competitiva da App Store, dentro do Claude.

App Store Operator é um servidor MCP que traz a pesquisa da App Store diretamente para o seu assistente de IA. Em vez de alternar para um painel, você pede ao Claude resultados de palavras-chave ranqueadas, estimativas de downloads e receita de concorrentes, ou textos prontos para In-App Events compatíveis com App Store Connect — e obtém a resposta na mesma conversa em que está tomando a decisão.

Feito para desenvolvedores iOS independentes que querem pesquisa dentro do fluxo de trabalho, em vez de outra aba no navegador. Gratuito e de código aberto (MIT). Uma alternativa leve ao SensorTower, AppTweak e AppFollow para pesquisa competitiva exclusiva de iOS.

claude mcp add --transport stdio app-store-operator -- npx -y app-store-operator@latest

app-store-operator.com · Guia de configuração

O que ele faz

Pesquisa na App Store aplicativos concorrentes para uma determinada palavra-chave e coleta análises detalhadas do SensorTower — downloads, receita, avaliações, principais mercados, informações do editor e muito mais.

search_app_store e prepare_iae funcionam sem nenhuma conta. research_rivals e get_app_details abrem um navegador uma vez para um login gratuito no SensorTower e depois reutilizam essa sessão salva — sem plano pago, sem chave de API.

Tudo o que o servidor expõe — quatro ferramentas, seis prompts, sete recursos — é somente leitura. Nada grava na sua conta do App Store Connect, no SensorTower ou em qualquer lugar além de um arquivo de cache local.

Ferramentas

research_rivals

Encontra os 3 principais aplicativos para uma palavra-chave e retorna um relatório completo de métricas para cada um.

ParâmetroTipoDescrição
keywordstringTermo de busca a consultar (ex.: meditation, psikoloji)
countrystringCódigo de país com duas letras (ex.: us, tr, gb)

Retorna para cada concorrente:

  • URLs da App Store e do SensorTower
  • Downloads e receita mundial e do último mês
  • Nota e quantidade de avaliações
  • Editor, categorias, principais mercados
  • Data de lançamento, última atualização, idiomas suportados
  • Compras dentro do aplicativo e presença de redes de anúncios

Cache de 24 horas, então perguntar novamente sobre a mesma palavra-chave e país não custa nada e não abre navegador.


search_app_store

Pesquisa na App Store uma palavra-chave e retorna resultados ranqueados como tabela markdown — instantaneamente, sem exigir SensorTower.

ParâmetroTipoDescrição
keywordstringTermo de busca a consultar
countrystringCódigo de país com duas letras
limitnumberNúmero de resultados a retornar (1–25, padrão 3)

Use para descobrir quais aplicativos aparecem antes de decidir quais analisar. Continue com get_app_details para análises de aplicativos específicos.


get_app_details

Busca análises do SensorTower para um ou mais IDs de aplicativos que você já possui.

ParâmetroTipoDescrição
app_idsarrayIDs numéricos da App Store (ex.: de search_app_store)
countrystringCódigo de país com duas letras

Retorna para cada aplicativo:

  • Downloads e receita (mundial + último mês)
  • Nota e quantidade de avaliações
  • Editor, categorias, principais mercados
  • Data de lançamento, última atualização, idiomas suportados
  • Compras dentro do aplicativo e presença de redes de anúncios

Nunca é armazenado em cache — cada chamada coleta dados novos, em cerca de 10–20 segundos por ID de aplicativo.


prepare_iae

Gera textos para In-App Events (IAE) da App Store iOS — 3 variações no idioma de destino e, em seguida, um relatório final.

ParâmetroTipoDescrição
keywordsarrayPalavras-chave ordenadas por prioridade (índice 0–2 = Nível 1, 3–6 = Nível 2, 7–9 = Nível 3)
localestringLocalidade de destino (ex.: en-us, en-gb, de-de, tr, ja, ko)
event_purposestringSobre o que é o evento e por que os usuários deveriam se importar
audiencestringPúblico-alvo (ex.: estudantes, profissionais, pais)
event_contextstringGancho do mundo real conectando o evento a um momento (ex.: um feriado, uma estação)
goalstringObjetivo principal de conversão (ex.: atrair novos usuários, aumentar engajamento)
tonestringTom do texto: Engaging, Playful, Motivational, Authoritative, Calm ou Urgent

Retorna: um briefing estruturado usado para gerar 3 variações de texto, cada uma com nome do evento (≤30 caracteres), descrição curta (≤50 caracteres) e descrição longa (≤120 caracteres).


Qualquer campo que o SensorTower não exponha, ou mantenha atrás do paywall, retorna como N/A. O servidor informa a lacuna em vez de preenchê-la, e os prompts abaixo instruem o assistente a fazer o mesmo.

Prompts

Seis fluxos de trabalho prontos que já encadeiam as ferramentas acima, para você não precisar descrever a sequência. No Claude Code, eles aparecem como comandos de barra; outros clientes os exibem em um seletor de prompts.

PromptArgumentosO que faz
competitor_snapshotkeyword, countryColeta análises de concorrentes para uma palavra-chave e depois informa quem domina e quão disputado é
keyword_shortlistseed_keyword, country, count?Expande uma palavra-chave inicial em candidatas, testa cada uma contra resultados de busca ao vivo e as classifica como atacar / observar / pular
app_teardownapp_ids, countryAnálise detalhada de aplicativos conhecidos — escala, posição, monetização, alcance, momentum, aquisição
positioning_gapkeyword, country, my_app_idColoca seu aplicativo na mesma régua dos líderes e separa atrás de atacável
metadata_rewriteapp_name, keyword, country, must_keep?Três variações de nome / subtítulo / campo de palavras-chave, com contagem de caracteres contra os limites da Apple
in_app_eventevent_context, locale, keywords?, audience?, tone?Executa o fluxo completo de In-App Event, pedindo o que prepare_iae ainda precisar

Argumentos marcados com ? são opcionais. Cada prompt instrui o assistente a não inventar números e, quando o SensorTower estiver envolvido, a não recorrer silenciosamente a uma ferramenta mais fraca quando o login for necessário.

Recursos

Dados de referência e estado local que um cliente pode anexar como contexto sem gastar uma chamada de ferramenta.

URITipoConteúdo
asops://guide/tool-selectionmarkdownQual ferramenta usar, quanto cada uma custa, como funciona o login do SensorTower
asops://reference/country-codesmarkdownCódigos de loja de duas letras por região
asops://reference/aso-fieldsJSONLimites de caracteres do App Store Connect e quais campos são indexados para busca
asops://reference/iae-fieldsJSONLimites de In-App Events, tamanhos de arte, regras de texto, níveis de palavras-chave
asops://reference/iae-localesJSONTodas as localidades que prepare_iae aceita — gerado a partir da mesma tabela que a ferramenta valida
asops://cache/researchJSONO que já foi pesquisado nesta máquina e se ainda está atualizado
asops://cache/research/{country}/{keyword}JSONUm resultado de research_rivals em cache, sem nova coleta

Nada disso sai da sua máquina: os recursos de referência são estáticos e os dois recursos de cache leem ~/.app-store-operator/cache.json.

Requisitos

  • Node.js v18+
  • Uma sessão de desktop para research_rivals e get_app_details. Elas controlam uma janela real e visível do Chromium para você fazer login no SensorTower, então precisam de um display — não funcionam via SSH simples ou dentro de um contêiner. As outras duas ferramentas não têm esse requisito.
  • Espaço em disco para o Chromium. Instalar o pacote baixa uma compilação do Playwright Chromium (algumas centenas de MB) via etapa de pós-instalação. Se essa etapa falhar, o servidor a instala no primeiro uso; você também pode executar npx playwright install chromium manualmente.

Uso

Como servidor MCP (Claude Code / Claude Desktop / OpenAI Codex)

Claude Code — execute este comando uma vez:

claude mcp add --transport stdio app-store-operator -- npx -y app-store-operator@latest

Claude Desktop — adicione à sua configuração MCP:

{
  "mcpServers": {
    "app-store-operator": {
      "command": "npx",
      "args": ["app-store-operator@latest"]
    }
  }
}

OpenAI Codex — execute este comando uma vez:

codex mcp add app-store-operator -- npx -y app-store-operator@latest

O Codex armazena servidores MCP em ~/.codex/config.toml. Se preferir editar diretamente:

[mcp_servers.app-store-operator]
command = "npx"
args = ["-y", "app-store-operator@latest"]

# Optional but useful for SensorTower scraping flows
startup_timeout_sec = 20
tool_timeout_sec = 180

Depois reinicie o Codex ou inicie um novo thread e faça perguntas como:

  • Research rivals for "hairstyle" in the GB App Store
  • Search the App Store for "beard style" in France
  • Prepare an in-app event for a summer hairstyle campaign in en-gb

Nenhuma etapa de instalação é necessária — npx baixa e executa o pacote automaticamente.

O servidor se comunica via stdio e foi projetado para ser invocado por um cliente MCP. Ele anuncia instructions em todo o servidor durante initialize para que os clientes roteiem corretamente entre as ferramentas e retorna um erro de ferramenta MCP quando o login no SensorTower é necessário.

Configuração

Ambas as configurações são variáveis de ambiente opcionais no processo do servidor.

VariávelPadrãoO que faz
ASO_CACHE_TTL_HOURS24Por quanto tempo um resultado de research_rivals permanece atualizado no cache local antes de ser coletado novamente
ASO_DEBUG_RATINGSnão definidoDefina como 1 para imprimir o painel de avaliações do SensorTower em stderr quando uma nota ou contagem de avaliações retornar N/A — útil ao relatar um bug de coleta

Em um contêiner

O repositório inclui um Dockerfile baseado na imagem oficial do Playwright:

docker build -t app-store-operator .
docker run -i --rm app-store-operator

O servidor fala JSON-RPC via stdio, então nenhuma porta é exposta — aponte seu cliente MCP para o stdin/stdout do contêiner. Observe que um contêiner não tem display: search_app_store e prepare_iae funcionam lá, mas as duas ferramentas do SensorTower não conseguem abrir uma janela de login e falharão em vez de solicitar que você faça login.

Como funciona

  1. Pesquisa na App Store a palavra-chave e o país e consulta quaisquer IDs de aplicativos passados diretamente na API pública iTunes Lookup da Apple
  2. Para cada aplicativo, controla um navegador Chromium para coletar análises do SensorTower
  3. Extrai as métricas e retorna um relatório compilado

Os dados do SensorTower são coletados via Playwright porque são renderizados no lado do cliente.

Uma janela do navegador será aberta. Isso é intencional, não é um bug: o SensorTower exige login, então a primeira execução abre uma janela visível para você entrar. A sessão é salva em ~/.app-store-operator/profile e reutilizada em todas as chamadas posteriores, então você só faz login uma vez. Se uma ferramenta relatar not_logged_in, termine o login nessa janela e execute a ferramenta novamente.

Resultados de research_rivals ficam em cache por 24 horas em ~/.app-store-operator/cache.json — substitua o TTL com a variável de ambiente ASO_CACHE_TTL_HOURS.

Limitações

  • Somente iOS. Nada aqui cobre Google Play ou Android.
  • Somente leitura. Nenhuma ferramenta altera nada no App Store Connect ou no SensorTower.
  • research_rivals é fixado nos 3 principais resultados. Use search_app_store (até 25) e depois get_app_details quando precisar de um conjunto mais amplo.
  • A coleta é frágil por natureza. O SensorTower renderiza o painel no lado do cliente e muda o markup sem aviso; quando isso acontece, os campos afetados retornam N/A até que os seletores sejam atualizados. Um único aplicativo falhando nunca falha a chamada inteira.
  • O nível gratuito do SensorTower decide o que você vê. Valores atrás do paywall retornam como N/A.

Política de Privacidade

Política completa: https://app-store-operator.com/privacy

O App Store Operator é executado inteiramente na sua máquina. Não há backend, nem telemetria, nem análises — o autor coleta, recebe e armazena nada sobre você ou seu uso.

O que cada ferramenta envia e para onde:

FerramentaContaO que sai da sua máquina
search_app_storeNenhumPalavra-chave e código do país → busca pública da App Store da Apple
prepare_iaeNenhumNada — computação puramente local, não contata nenhum serviço externo
research_rivalsSensorTower GrátisPalavra-chave e código do país → Apple, depois SensorTower via sua própria sessão de navegador
get_app_detailsSensorTower GrátisIDs de aplicativos da App Store → API pública de consulta da Apple e SensorTower

O que é armazenado localmente:

  • ~/.app-store-operator/cache.json — resultados em cache, expirando após 24 horas por padrão (ASO_CACHE_TTL_HOURS)
  • ~/.app-store-operator/profile — o perfil do Chromium que mantém sua sessão do SensorTower

Você digita suas credenciais do SensorTower na própria página do SensorTower em uma janela do navegador na sua máquina. O servidor nunca lê nem armazena sua senha, e o autor nunca a recebe.

Excluindo tudo — nenhuma solicitação ao autor, nada para esperar:

rm -rf ~/.app-store-operator

Apple e SensorTower são terceiros independentes com suas próprias políticas. Este projeto não é afiliado a nenhum deles.

Estrutura do projeto

src/
├── index.js                    # MCP server setup and request handlers
├── shared.js                   # App Store lookup + SensorTower scraping
├── cache.js                    # 24h local cache (research_rivals only)
├── prompts.js                  # the six prompt workflows
├── resources.js                # reference data + cache resources
└── tools/
    ├── research-rivals.js      # research_rivals tool
    ├── search-app-store.js     # search_app_store tool
    ├── get-app-details.js      # get_app_details tool
    └── prepare-iae.js          # prepare_iae tool
scripts/postinstall.js          # installs Playwright Chromium on install
scripts/sync-version.js         # syncs server.json, manifest.json and CHANGELOG.md on release
test/smoke-test-mcp.js          # stdio smoke test
server.json                     # MCP registry manifest
manifest.json                   # Claude Desktop / MCPB bundle manifest
Dockerfile                      # container build (no display: search + IAE tools only)

Desenvolvimento

Sem etapa de build e sem linter — clone-o, npm install, e execute npm start para iniciar o servidor via stdio.

O teste de fumaça verifica se o servidor inicia e expõe tudo o que deveria. Ele verifica initialize (incluindo as instruções do servidor e a versão anunciada), tools/list, prompts/list, prompts/get, resources/list, resources/templates/list, e lê todos os recursos, falhando se um declarado como JSON não for analisado. Ele não faz chamadas de rede e não abre navegador:

npm run smoke

Os lançamentos são orientados por tags: escreva as notas sob ## Unreleased em CHANGELOG.md, execute npm version <patch|minor|major> — que sincroniza a versão em server.json e manifest.json e renomeia esse título para a nova versão para você — depois envie com --follow-tags. O GitHub Actions executa o teste de fumaça, publica no npm e no registro MCP, e cria o lançamento a partir dessa seção do changelog. O bump se recusa a executar enquanto ## Unreleased estiver vazio.

Contribuições são bem-vindas — abra uma issue ou um pull request em github.com/meyusufdemirci/app-store-operator.

Licença

MIT © Yusuf Demirci