Deixe um app pronto para as lojas pelo seu agente de programação
O seu agente lê o app que está à frente dele — SDKs, permissões, bundle id — e rascunha cada página de conformidade a partir do que encontra. Você lê os rascunhos e os publica. O agente não pode.
Antes de começar
Você precisa do Claude Code e de uma conta na AppFoyer. O plano gratuito basta: crie uma. Não há chave para criar — o agente pede a sua aprovação no navegador na primeira vez que se conecta.
Não tem nenhum agente de programação? Seis campos no navegador dão as mesmas cinco páginas sem o plugin.
Não usa o Claude Code? O plugin precisa dele, mas as páginas de privacidade e de termos não: os editores delas no painel têm um prompt, preenchido com os dados do seu app, que você roda em qualquer assistente e cola de volta — impresso na íntegra no guia da política de privacidade e no guia dos termos.
Instalação
claude
/plugin marketplace add appfoyer/claude-plugin
/plugin install appfoyer@appfoyer Não é preciso conta para começar: o agente lê o seu build, mostra o que encontrou e faz as perguntas dele na sua máquina, e só pede que você se conecte quando há algo para salvar. Na primeira vez que ele chama a AppFoyer, o seu navegador abre em uma página de aprovação: entre ou crie uma conta gratuita, confira o nome e para onde o navegador vai voltar, e aprove. O Claude Code guarda a conexão e a renova sozinho; nada é copiado, nada fica guardado no seu shell. Se o navegador não abrir, rode /mcp, escolha appfoyer e selecione Authenticate. No app de desktop do Claude Code, conecte uma vez desse jeito a partir de um terminal e depois abra uma nova sessão ali: uma sessão que já estava rodando não enxerga a nova conexão. Desconecte na página Agent do painel e a próxima chamada falha imediatamente. O Claude Code não atualiza sozinho um marketplace de terceiros: em /plugin → Marketplaces → appfoyer, escolha Enable auto-update para receber as novas versões.
Não tem navegador nessa máquina — um servidor remoto, um contêiner, uma execução automatizada? Use uma API key: crie uma em Agent → API key — for CI and headless use, instale o plugin como acima para ter o fluxo de trabalho e adicione o servidor mais uma vez com a chave no cabeçalho:
export APPFOYER_API_KEY=cpk_…
claude mcp add --transport http appfoyer-key https://app.appfoyer.com/mcp --header "Authorization: Bearer $APPFOYER_API_KEY" O plugin lê a chave apenas dessa variável de ambiente — a skill nunca a vê, e ela só trafega no cabeçalho Authorization que o Claude Code preenche.
Outro cliente MCP — claude.ai, Claude Desktop, Cursor, VS Code — pode se conectar a https://app.appfoyer.com/mcp do mesmo jeito, com a mesma página de aprovação. Ele recebe as ferramentas; o fluxo de trabalho passo a passo que lê os seus arquivos de build vem com o plugin do Claude Code.
O que dizer
Rode estes comandos dentro do repositório do seu app, não em um diretório vazio:
| Diga | O que acontece |
|---|---|
Make this app store-ready | Analisa os arquivos de build, confirma os fatos que não conseguiu deduzir, rascunha cada página e devolve um link de revisão. |
Is this app store-ready? | Auditoria somente leitura com base no checklist de conformidade. Não grava nada. |
Wire the store-ready links into the app | Depois que você publica: propõe os links de privacidade e de suporte dentro do app como um diff para você revisar. |
Add the AppFoyer drift check | Propõe um workflow do GitHub que sinaliza os pull requests que adicionam um SDK ou uma permissão que as páginas talvez não cubram. Como funciona. |
Exemplos
Diga com as suas próprias palavras; estes são os casos que a skill trata.
Um app, primeira execução
> Make this app store-ready - Lista o que encontrou nos arquivos de build — SDKs, permissões, bundle id —, cada item com arquivo e linha.
- Pergunta só o que não conseguiu encontrar: nome da empresa, e-mail de suporte, jurisdição, links das lojas. No máximo duas rodadas.
- Cria o app, envia o ícone a partir do repositório e rascunha as cinco páginas.
- Termina com um link de revisão. Nada fica público até você publicar ali.
Rodar de novo depois de uma mudança
> Make this app store-ready - Encontra o app existente pelo application id e compara os fatos novos com os armazenados.
- Reescreve só as páginas afetadas pela mudança, como a de privacidade depois de um novo SDK de analytics.
- Não mexe no ícone nem no endereço, a menos que você peça.
Vários flavors, nomeados no prompt
> Make com.acme.weather.free and com.acme.weather.pro store-ready - Cria dois apps e não pergunta nada sobre a seleção.
- Lê a pasta, o nome e as dependências de cada flavor. Um SDK de anúncios usado só pelo flavor free não entra na política de privacidade do flavor pro.
- Devolve um link de revisão e uma tabela de URLs do console para cada flavor.
Vários flavors, sem nomes
> Make this app store-ready - Lista os flavors com os application ids, todos pré-selecionados, e você escolhe quais ganham um site.
- Build types como debug e staging aparecem como excluídos, não como opções.
Dimensões marca × ambiente
> Make every brand store-ready - Lista combinações (brandAProd, brandBProd), não flavors isolados.
- Oferece só o ambiente de produção. dev e qa nunca vão para uma loja.
- Lê o nome do app do Gradle (resValue, manifestPlaceholders) ou de source sets movidos, quando o build o coloca ali.
- Se não conseguir saber se uma dimensão é de ambientes ou de marcas, ele pergunta.
Endereço personalizado (Pro e Advanced)
> Make this app store-ready - Monta o endereço a partir do nome do app em inglês, por exemplo weather-now.
- Se esse estiver ocupado ou parecido demais com um nome de marca, tenta o próximo — weather-now-app, acme-weather —, no máximo cinco vezes, e depois pergunta a você.
- No plano gratuito, mantém o endereço app-… e diz que o personalizado vem com o Pro.
- O endereço app-… continua servindo o mesmo site.
Mudar um endereço que você já usa
> Change the address to weather-radar - Pergunta primeiro. O endereço personalizado antigo é liberado na hora, e uma página da loja que ainda o cite para de funcionar.
- Só muda depois que você diz sim.
Atualizar o ícone
> Update the app icon - Encontra o ícone do launcher: o ícone 512 do Play, a maior imagem mipmap ou a imagem de marketing do AppIcon do iOS — primeiro a do próprio flavor.
- Se ele passar de 512 KB, reduz uma cópia em uma pasta temporária. O seu repositório não é alterado.
- Diz qual arquivo enviou. Em um app publicado, o novo ícone entra no ar na hora.
Um app com anúncios
> Make this app store-ready. AdMob publisher id pub-0000000000000000 - Escreve o app-ads.txt a partir das linhas que você fornece. O publisher id não está no seu código, então ele nunca inventa um.
- Lembra você de definir o site como site do desenvolvedor na página da loja.
- A AdMob já verificou arquivos app-ads.txt nos nossos endereços; dê a ela até 24 horas para rastrear.
Manter as páginas em sincronia com o build
> Add the AppFoyer drift check - Toda execução de “make this app store-ready” grava appfoyer.json na raiz do repositório: os SDKs, tipos de dados e permissões a partir dos quais as páginas foram escritas. Ele é gravado pelo mesmo scanner que a verificação roda, nunca à mão.
- Este prompt mostra um workflow do GitHub para o appfoyer/check-action gratuito e grava .github/workflows/appfoyer.yml quando você diz sim. Ele nunca sobrescreve um que você já tenha.
- A partir daí, cada pull request lista o que adicionou ou removeu desde que as páginas foram escritas, com arquivo e linha. Rodar o plugin de novo atualiza os rascunhos e o appfoyer.json.
- Nada é commitado por você. O guia sobre manter a sua política de privacidade em sincronia tem os detalhes e a configuração para outros sistemas de CI.
Verificar sem mudar nada
> Is this app store-ready? - Roda o checklist para cada app correspondente e informa o que falta. Não grava nada.
- Um flavor que ainda não tem app aparece como faltando.
Colocar os links dentro do app
> Wire the store-ready links into the app - Precisa de páginas publicadas.
- Propõe um diff para os links de privacidade e de suporte na sua tela de configurações ou nas suas strings. Só aplica quando você diz sim, e nunca faz commit.
O que sai da sua máquina
Só fatos derivados:
- o nome do app, a plataforma e o bundle id ou application id;
- os nomes dos SDKs e das permissões encontrados nos seus arquivos de build;
- as respostas que você confirma — nome da empresa, e-mail de suporte, jurisdição, URLs das lojas;
- o texto das páginas que o agente rascunha, que fica armazenado na sua conta como rascunho;
- o próprio ícone do app, enviado uma vez por um link de upload de uso único.
Nenhum outro arquivo, nunca código-fonte, nunca segredos ou chaves encontrados no repositório. O que o agente envia é o que uma política de privacidade precisa declarar de qualquer forma.
Um arquivo é gravado no seu repositório e fica lá: appfoyer.json, o registro de a partir de que as páginas foram escritas, criado pelo scanner que vem no plugin. Ele não é enviado a lugar nenhum. O agente nunca faz commit dele, nem de nada mais — quem faz é você.
O que o agente não pode fazer
Seja pela conexão no navegador, seja com uma API key, o plugin tem uma credencial de agente — então publicar simplesmente não está disponível para ele. Isso é imposto no servidor, não pedindo educadamente ao agente:
- Não existe ferramenta de publicação. O agente escreve rascunhos; as suas páginas publicadas não mudam.
- Duas coisas não têm rascunho: o ícone e o endereço personalizado. Em um app publicado, elas mudam o site no ar na hora, e o agente avisa quando as definiu. Ele não pode substituir um endereço personalizado que você já usa sem o seu sim.
- A rota REST que publica uma página recusa de cara as credenciais de agente — só sessão.
- Cada página continua passando, no momento da publicação, pela mesma triagem de conteúdo que uma edição feita à mão.
- Cada chamada do agente é registrada no log de auditoria da conta, com a conexão ou a chave que a fez.
Então o pior caso de uma conexão ou chave comprometida são rascunhos para descartar, um ícone errado ou um endereço novo — não uma página ficando pública em seu nome.
As ferramentas que ele recebe
O plugin se conecta a um endpoint MCP que expõe exatamente estas:
| Ferramenta | O que faz | |
|---|---|---|
list_apps | Leitura | Todos os apps da conta, com slug, URL pública e se há algo publicado. |
get_app | Leitura | Um app: configurações, fatos de coleta de dados armazenados e, de cada página, o texto publicado, o estado de publicação e o rascunho pendente. |
create_app | Escrita | Cria um app com páginas de modelo. Nada fica público. |
create_apps | Escrita | Cria até dez apps em uma chamada, um por product flavor. Cada um começa despublicado. |
update_app | Escrita | Altera configurações, os fatos de coleta de dados armazenados ou a lista de SDKs. Nunca edita o texto das páginas. |
set_page | Escrita | Grava o rascunho de uma página. A página publicada não é alterada. |
set_ad_lines | Escrita | Substitui o app-ads.txt. Usado só quando há um SDK de anúncios e você forneceu os publisher ids. |
get_checklist | Leitura | O checklist de prontidão para as lojas calculado no servidor, mais quais páginas ainda têm rascunhos não publicados. |
get_store_forms | Leitura | Rascunhos de respostas para o formulário Data safety do Google Play e os detalhes de App Privacy da Apple, a partir dos fatos e da lista de SDKs. Você mesmo as insere no console. |
request_publish | Escrita | Informa que o rascunho terminou e devolve a URL de revisão. Não publica nada. |
set_icon | Escrita | Devolve uma URL de upload de uso único para o ícone do app. Entra no ar na hora — um ícone não tem rascunho. |
check_slug | Leitura | Verifica um endereço personalizado (Pro e Advanced) com as mesmas regras do painel. |
set_slug | Escrita | Reivindica um endereço personalizado. Entra no ar na hora. Recusa substituir um que você já tenha, a menos que você tenha concordado. |
Quando algo dá errado
| Sintoma | Causa |
|---|---|
| As ferramentas mostram "needs authentication" | A conexão nunca foi aprovada, ou foi desconectada. Rode /mcp, escolha appfoyer e selecione Authenticate. |
| A página de aprovação diz que a solicitação não pode ser usada | O link expirou ou foi aberto duas vezes. Comece de novo pelo editor; nada foi conectado. |
unauthorized com uma API key | A chave foi revogada no painel, ou pertence a outra conta. Crie uma nova e exporte-a de novo. |
| A publicação devolve um erro de cota | O limite de apps publicados do plano foi atingido. O app e os rascunhos dele são mantidos — despublique outro app ou faça upgrade, e depois publique pela tela de revisão. |
| Um rascunho volta rejeitado ou retido | A triagem de conteúdo encontrou algo. Os motivos listam o que foi encontrado e como corrigir; edite e envie de novo. Nada público mudou. |
Uma coisa que isso não muda
Os rascunhos são modelos completados a partir do seu código, não aconselhamento jurídico. Um agente escrevê-los rapidamente não os torna verdadeiros — leia o que ele escreveu antes de publicar, principalmente a lista do que o seu app coleta. Quem a loja responsabiliza é você.
Dúvidas: support@appfoyer.com.