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
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âmetro | Tipo | Descrição |
|---|---|---|
keyword | string | Termo de busca a consultar (ex.: meditation, psikoloji) |
country | string | Có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âmetro | Tipo | Descrição |
|---|---|---|
keyword | string | Termo de busca a consultar |
country | string | Código de país com duas letras |
limit | number | Nú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âmetro | Tipo | Descrição |
|---|---|---|
app_ids | array | IDs numéricos da App Store (ex.: de search_app_store) |
country | string | Có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âmetro | Tipo | Descrição |
|---|---|---|
keywords | array | Palavras-chave ordenadas por prioridade (índice 0–2 = Nível 1, 3–6 = Nível 2, 7–9 = Nível 3) |
locale | string | Localidade de destino (ex.: en-us, en-gb, de-de, tr, ja, ko) |
event_purpose | string | Sobre o que é o evento e por que os usuários deveriam se importar |
audience | string | Público-alvo (ex.: estudantes, profissionais, pais) |
event_context | string | Gancho do mundo real conectando o evento a um momento (ex.: um feriado, uma estação) |
goal | string | Objetivo principal de conversão (ex.: atrair novos usuários, aumentar engajamento) |
tone | string | Tom 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.
| Prompt | Argumentos | O que faz |
|---|---|---|
competitor_snapshot | keyword, country | Coleta análises de concorrentes para uma palavra-chave e depois informa quem domina e quão disputado é |
keyword_shortlist | seed_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_teardown | app_ids, country | Análise detalhada de aplicativos conhecidos — escala, posição, monetização, alcance, momentum, aquisição |
positioning_gap | keyword, country, my_app_id | Coloca seu aplicativo na mesma régua dos líderes e separa atrás de atacável |
metadata_rewrite | app_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_event | event_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.
| URI | Tipo | Conteúdo |
|---|---|---|
asops://guide/tool-selection | markdown | Qual ferramenta usar, quanto cada uma custa, como funciona o login do SensorTower |
asops://reference/country-codes | markdown | Códigos de loja de duas letras por região |
asops://reference/aso-fields | JSON | Limites de caracteres do App Store Connect e quais campos são indexados para busca |
asops://reference/iae-fields | JSON | Limites de In-App Events, tamanhos de arte, regras de texto, níveis de palavras-chave |
asops://reference/iae-locales | JSON | Todas as localidades que prepare_iae aceita — gerado a partir da mesma tabela que a ferramenta valida |
asops://cache/research | JSON | O que já foi pesquisado nesta máquina e se ainda está atualizado |
asops://cache/research/{country}/{keyword} | JSON | Um 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_rivalseget_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 chromiummanualmente.
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 StoreSearch the App Store for "beard style" in FrancePrepare 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ável | Padrão | O que faz |
|---|---|---|
ASO_CACHE_TTL_HOURS | 24 | Por quanto tempo um resultado de research_rivals permanece atualizado no cache local antes de ser coletado novamente |
ASO_DEBUG_RATINGS | não definido | Defina 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
- 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
- Para cada aplicativo, controla um navegador Chromium para coletar análises do SensorTower
- 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. Usesearch_app_store(até 25) e depoisget_app_detailsquando 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/Aaté 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:
| Ferramenta | Conta | O que sai da sua máquina |
|---|---|---|
search_app_store | Nenhum | Palavra-chave e código do país → busca pública da App Store da Apple |
prepare_iae | Nenhum | Nada — computação puramente local, não contata nenhum serviço externo |
research_rivals | SensorTower Grátis | Palavra-chave e código do país → Apple, depois SensorTower via sua própria sessão de navegador |
get_app_details | SensorTower Grátis | IDs 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