App Store Connect

Servidor MCP para a API do App Store Connect — gerencie preços de apps iOS, assinaturas, compras dentro do app, TestFlight, metadados da App Store, capturas de tela, eventos no app e envios para revisão a partir do Claude.

Documentação

appstoreconnect-mcp

npm CI License: MIT

Um servidor Model Context Protocol para a API App Store Connect da Apple. Gerencia apps, assinaturas, preços e muito mais a partir de qualquer cliente compatível com MCP (Claude Code, Claude Desktop, Cursor, Windsurf).

A primeira superfície publicada é precificação de assinaturas — incluindo um fluxo de rebalanceamento por Paridade de Poder de Compra que já foi usado para agendar 120 alterações de preço em produção em 65 territórios em um app iOS real. Novos domínios do ASC (TestFlight, vendas, capturas de tela, compras dentro do app) são projetados para serem plugados um arquivo por vez; veja o Roadmap.

Instalação (zero configuração)

npx @akoskomuves/appstoreconnect-mcp init

O assistente:

  1. Abre App Store Connect → Chaves para você baixar um .p8 (ignorado se você já tiver um).
  2. Copia a chave para ~/.appstore/ com chmod 600.
  3. Pergunta seu Issuer ID e o Key ID (detectado automaticamente).
  4. Verifica a autenticação com uma chamada real à API antes de gravar qualquer coisa.
  5. Detecta quais clientes MCP você tem instalados — Claude Code, Claude Desktop, Cursor, Windsurf — e se registra nos que você escolher.

Quando algo parecer errado mais tarde, execute um diagnóstico somente leitura:

npx @akoskomuves/appstoreconnect-mcp doctor

Instalação manual

Se preferir configurar manualmente, adicione em ~/.claude.json (Claude Code), claude_desktop_config.json (Claude Desktop) ou no equivalente do seu cliente:

{
  "mcpServers": {
    "appstoreconnect": {
      "command": "npx",
      "args": ["-y", "@akoskomuves/appstoreconnect-mcp"],
      "env": {
        "ASC_ISSUER_ID": "...",
        "ASC_KEY_ID": "...",
        "ASC_PRIVATE_KEY_PATH": "~/.appstore/AuthKey_XXXXXXXXXX.p8"
      }
    }
  }
}

Ou via CLI do Claude Code:

claude mcp add appstoreconnect \
  -e ASC_ISSUER_ID=... \
  -e ASC_KEY_ID=... \
  -e ASC_PRIVATE_KEY_PATH=~/.appstore/AuthKey_XXXXXXXXXX.p8 \
  -- npx -y @akoskomuves/appstoreconnect-mcp

Configuração

Gere uma chave de API do App Store Connect em App Store Connect → Usuários e Acesso → Integrações → Chaves. Gravações de preço precisam do papel Admin; operações somente leitura funcionam com App Manager.

VariávelO que é
ASC_ISSUER_IDUUID do emissor da página de Chaves
ASC_KEY_IDKey ID de 10 caracteres
ASC_PRIVATE_KEY_PATHCaminho para o arquivo AuthKey_XXXXXXXXXX.p8 baixado (~ é expandido)

O arquivo .p8 é uma chave privada — nunca o envie para o repositório. Recomendado: ~/.appstore/AuthKey_XXXXXXXXXX.p8 fora de qualquer repositório.

Opcional: chave de assinatura de compras dentro do app

Necessária apenas para as ferramentas asc_sign_* (assinatura de resgate de ofertas de assinatura). Emita uma segunda chave em App Store Connect → Usuários e Acesso → Integrações → In-App Purchase — esta é uma chave separada da chave de API do ASC acima, gerada em uma aba diferente da mesma página.

VariávelO que é
ASC_IAP_ISSUER_IDUUID do emissor da aba de chaves In-App Purchase (diferente de ASC_ISSUER_ID)
ASC_IAP_KEY_IDKey ID de 10 caracteres para a chave IAP
ASC_IAP_PRIVATE_KEY_PATHCaminho para o .p8 de assinatura IAP (~ é expandido)

O servidor inicia normalmente sem elas — apenas as ferramentas asc_sign_* recusam com uma mensagem de configuração se estiverem ausentes. Defina uma ou duas, mas não todas as três, e o servidor rejeita com um erro claro. Execute appstoreconnect-mcp doctor para verificar se a chave carrega como um ES256 PKCS#8 válido.

Opcional: número do fornecedor (relatórios de vendas e finanças)

Usado apenas por asc_get_sales_report / asc_get_finance_report. Seu número de fornecedor é no nível da conta, exibido em App Store Connect → Pagamentos e Relatórios Financeiros ao lado do nome da sua equipe (uma string numérica como 85123456).

VariávelO que é
ASC_VENDOR_NUMBERNúmero de fornecedor padrão para downloads de relatórios de vendas/finanças

Sem ele, as duas ferramentas de relatório ainda funcionam — elas apenas precisam de vendorNumber passado por chamada (e a mensagem de erro delas informa onde encontrá-lo). Observação: baixar relatórios de vendas/finanças exige uma chave de API com o papel Admin, Finance ou Sales.

Ferramentas

Apps

  • asc_list_apps — lista apps (filtra por bundleId)
  • asc_get_app — busca um app por ID

Assinaturas

  • asc_list_subscription_groups — grupos para um app
  • asc_get_subscription_group — busca um grupo por ID
  • asc_list_subscriptions — assinaturas renováveis automaticamente em um grupo
  • asc_get_subscription — busca uma assinatura por ID
  • asc_list_subscription_prices — cronograma de preços atual por assinatura. Uma linha por território (~175 sem filtro) — passe territoryId para restringir a um mercado
  • asc_list_subscription_price_points — pontos de preço válidos para uma assinatura em um território. Passe nearAmount para restringir a resposta aos níveis mais próximos de um preço-alvo.

Produtos de assinatura (gravações)

Criar a hierarquia em si — o passo que costumava levar você à interface web do App Store Connect. Quatro nomes, dos quais apenas dois os clientes veem:

RecursoAtributoQuem vê
SubscriptionGroupreferenceNameapenas interno
SubscriptionGroupLocalizationnamecliente — título acima das opções de plano
Subscriptionnameapenas interno
SubscriptionLocalizationnamecliente — o plano individual
  • asc_post_subscription_group — cria o contêiner no qual toda assinatura deve viver. Um cliente pode ter apenas uma assinatura ativa por grupo, então planos mutuamente exclusivos (Mensal vs Anual) pertencem ao mesmo grupo
  • asc_patch_subscription_group — renomeia (referenceName é o único atributo mutável; grupos não podem ser movidos entre apps)
  • asc_delete_subscription_group — lista as assinaturas do grupo primeiro e recusa nomear no lado do cliente os produtos específicos que bloqueiam a exclusão, em vez de deixar a Apple retornar um 409 puro
  • asc_post_subscription — cria uma assinatura renovável automaticamente. productId é permanente: não pode ser alterado, e a Apple nunca permite que seja reutilizado na conta — nem mesmo após a assinatura ser excluída. subscriptionPeriod é opcional na criação, mas obrigatório antes do envio; o novo produto começa em MISSING_METADATA e a mensagem de sucesso lista as etapas restantes
  • asc_patch_subscription — name, subscriptionPeriod, familySharable, reviewNote, groupLevel. productId não tem caminho de código aqui por construção. Arrays aninhados de oferta/preço são deliberadamente não suportados — a semântica deles no wire é substituir, então um chamador que passa uma oferta excluiria silenciosamente as demais; use as ferramentas dedicadas de oferta e preço
  • asc_delete_subscription — pré-verifica o estado e recusa para produtos em revisão ou já aprovados, apontando para asc_post_subscription_availability como a forma de parar de vender um produto ativo

Localizações de grupo de assinatura

O título do grupo voltado ao cliente — o que a App Store renderiza acima das opções de plano e o que aparece em Ajustes → Assinaturas. Um grupo sem localizações não pode ser enviado.

  • asc_list_subscription_group_localizations / asc_get_subscription_group_localization
  • asc_post_subscription_group_localization — name + locale, além de customAppName opcional (substitui como o nome do app aparece dentro da folha de assinatura; geralmente omita). Pegadinha de wire tratada: a chave de relacionamento pai é subscriptionGroup, enquanto chamadas Subscription referem-se ao mesmo pai como group
  • asc_patch_subscription_group_localization — name / customAppName; o locale é a chave de busca imutável
  • asc_delete_subscription_group_localization

Precificação de assinatura (gravações)

  • asc_post_subscription_price — define o preço para um território, seja o preço inicial ou uma alteração agendada. A ordem importa, e ambas as etapas são confirmadas ao vivo: disponibilidade de território → linha de base sem data → alterações com data.
    • Omita startDate para o primeiro preço de uma assinatura em um território. A linha inicial é a linha de base sem data; um primeiro preço com data é uma alteração de preço sem nada para alterar. A Apple diz isso explicitamente — "Invalid startDate. Create a starting price before creating future prices." — e a distância não ajuda (1, 8 e 29 dias à frente todos retornam 409).
    • A disponibilidade deve existir primeiro. Sem ela, até um POST sem data corretamente formatado falha, com um 409 que culpa o ponto de preço (ENTITY_ERROR.RELATIONSHIP.INVALID → /data/relationships/subscriptionPricePoint/id). O ponto de preço está correto; a Apple simplesmente não consegue precificar um território onde o produto não é vendido. A ferramenta traduz ambos em vez de repassar o 409 bruto.
    • preserveCurrentPrice assume o padrão verdadeiro em uma alteração com data e é omitido em uma linha de base, onde não há coorte existente para avô. A linha criada lê preserved: false até que um preço mais novo a substitua; isso é esperado, não uma falha de avô
  • asc_delete_subscription_price — cancela uma alteração agendada pendente

Precificação de app (apps pagos não assinatura)

  • asc_list_app_prices — cronograma de preços atual de um app, separando sobreposições manuais de preços derivados automaticamente e expondo o território base
  • asc_list_app_price_points — níveis de preço válidos da Apple para um app em um território específico (~600+ níveis por território). Passe nearAmount (preço-alvo) e nearCount opcional (padrão 10) para restringir a resposta aos níveis mais próximos — a Apple não suporta filtro por valor aproximado no servidor, então a lista completa ainda é paginada, mas apenas os níveis mais próximos são exibidos.
  • asc_post_app_price_schedule — substitui todo o cronograma de preços (substituição de cronograma inteiro, NÃO uma mesclagem — corresponde à API da Apple). A pré-verificação recusa a menos que pelo menos uma entrada tenha como alvo o território base sem startDate, e exige acknowledgeReplacesAll: true explícito. Uma confirmação separada de acknowledgeDeletesScheduledIfBaseChanges é necessária ao alterar o território base (a Apple apaga alterações agendadas pendentes na mudança de base). Apps não têm mecanismo de avô — novos cronogramas ativam atomicamente no startDate de cada entrada.

Compras dentro do app (consumíveis, não consumíveis, assinaturas não renováveis)

  • asc_list_iaps — lista IAPs de um app (apenas superfície v2 — assinaturas renováveis automaticamente são cobertas pelas ferramentas de Assinaturas acima). Filtrável por inAppPurchaseType e state. Se isso retornar zero linhas para um app que você sabe que tem IAPs, os IAPs podem ser apenas legados e precisam ser migrados na interface web do App Store Connect antes de aparecerem aqui.
  • asc_get_iap — busca um único IAP por ID.
  • asc_list_iap_prices — cronograma de preços atual de um IAP (mesma forma dos preços de app: sobreposições manuais + derivados automaticamente + território base).
  • asc_list_iap_price_points — níveis de preço válidos da Apple para um IAP em um território específico. Mesma restrição de nearAmount / nearCount das ferramentas de pontos de preço de app e assinatura.
  • asc_post_iap_price_schedule — substitui todo o cronograma de preços do IAP (mesma semântica de substituição de cronograma inteiro de asc_post_app_price_schedule: acknowledgeReplacesAll: true, entrada de território base sem startDate, confirmação de mudança de base necessária). Sem mecanismo de avô — igual aos apps.

Ofertas introdutórias de assinatura

Ofertas introdutórias têm como alvo assinantes novos — a "primeira janela" com desconto antes do preço regular entrar em vigor.

  • asc_list_subscription_introductory_offers — lista ofertas introdutórias (teste grátis / pague conforme usar / pague antecipado) configuradas para uma assinatura, em todos os territórios. O curinga "todos os territórios" da Apple (uma única oferta sem territory) aparece como TERR=(all) na tabela. Passe territoryId para restringir a um mercado — ofertas curinga são sempre mantidas, pois estão ativas em todos os lugares.
  • asc_get_subscription_introductory_offer — busca uma oferta por ID.
  • asc_post_subscription_introductory_offer — cria uma oferta. Três offerModes: FREE_TRIAL (sem preço; omita pricePointId), PAY_AS_YOU_GO (cobra o preço da oferta a cada período por numberOfPeriods períodos), PAY_UP_FRONT (cobrança única para toda a duração; a Apple ainda exige numberOfPeriods — assume 1 quando omitido). Passe territoryId para atingir um mercado, ou omita para o curinga "todos os territórios" da Apple (usa o ponto de preço literal em todos os mercados — sem FX automático). A validação no servidor recusa PAY_* sem pricePointId, PAY_AS_YOU_GO sem numberOfPeriods e endDate ≤ startDate — o erro da Apple é exibido inline caso contrário.
  • asc_patch_subscription_introductory_offer — caminho de atualização restrito: apenas startDate, endDate e pricePointId podem mudar após a criação. Para alterar modo / duração / períodos, exclua e recrie.
  • asc_delete_subscription_introductory_offer — exclui uma oferta pendente ou ativa. A Apple recusa excluir uma oferta atualmente resgatável; use PATCH endDate para hoje para interrompê-la.

Ofertas promocionais de assinatura

Ofertas promocionais têm como alvo assinantes existentes ou vencidos — elegibilidade oposta às ofertas introdutórias, definida pelo próprio tipo de recurso (sem sinalizador por oferta). A Apple limita as ofertas promocionais ativas a 10 por assinatura. Após a criação, apenas os preços por território podem ser editados — name, offerCode, offerMode, duration e numberOfPeriods são imutáveis.

  • asc_list_subscription_promotional_offers — lista as ofertas promocionais configuradas para uma assinatura.
  • asc_get_subscription_promotional_offer — busca uma única oferta, incluindo seus preços por território.
  • asc_list_subscription_promotional_offer_prices — lista as linhas de preço por território vinculadas a uma oferta (território + moeda + valor + ID do price point).
  • asc_post_subscription_promotional_offer — cria uma oferta (name + offerCode + modo + duração + todos os preços por território) em um único POST atômico. Verifica antecipadamente o limite de 10 ofertas da Apple e colisões de offerCode, recusando com uma mensagem de correção clara em vez de deixar a Apple retornar 409.
  • asc_patch_subscription_promotional_offer_prices — atualiza os preços por território da oferta. A semântica de rede da Apple é de substituição (o novo array de preços vira o estado pós-operação, descartando qualquer território não listado); o parâmetro mode: 'replace' | 'add' | 'remove' da ferramenta esconde essa armadilha — 'add' lê os preços atuais e mescla, 'remove' lê e filtra.
  • asc_delete_subscription_promotional_offer — DELETE → 204.

Ofertas de reconquista de assinatura

Ofertas de reconquista têm como alvo assinantes vencidos — clientes que assinaram anteriormente e cancelaram — e a Apple as exibe automaticamente para clientes elegíveis com base nas regras de elegibilidade da oferta (ou por meio de sua própria mensageria StoreKit). Este é o terceiro tipo de oferta, ao lado das introdutórias e promocionais. Mais ricas que as ofertas promocionais: adicionam segmentação de elegibilidade, agendamento, prioridade e uma intenção de ativo automático. referenceName, offerId, duration, offerMode, periodCount, targetSubscriptionPlanType e os preços são imutáveis após a criação.

  • asc_list_subscription_win_back_offers — lista as ofertas de reconquista configuradas para uma assinatura.
  • asc_get_subscription_win_back_offer — busca uma única oferta, incluindo sua assinatura e preços por território.
  • asc_list_subscription_win_back_offer_prices — lista as linhas de preço por território vinculadas a uma oferta (território + moeda + valor + ID do price point).
  • asc_post_subscription_win_back_offer — cria uma oferta (identidade + regras de elegibilidade + agendamento + prioridade + todos os preços por território) em um único POST atômico. A elegibilidade é expressa como customerEligibilityPaidSubscriptionDurationInMonths, customerEligibilityTimeSinceLastSubscribedInMonths (um intervalo de { minimum, maximum? }) e um customerEligibilityWaitBetweenOffersInMonths opcional. Verifica antecipadamente colisões de offerId e valida o intervalo + endDate > startDate.
  • asc_patch_subscription_win_back_offer — atualiza apenas os atributos mutáveis: elegibilidade, startDate/endDate, priority e promotionIntent. Para alterar identidade, modo, duração, períodos ou preços, exclua e recrie.
  • asc_delete_subscription_win_back_offer — DELETE → 204.

Ativos de revisão de IAP e assinatura

A captura de tela de revisão que a Apple exige antes que uma compra dentro do app ou assinatura possa ser enviada, além das imagens promocionais opcionais — e, desde a v1.5, os anexos de App Review de uma versão (arquivos para o revisor, por exemplo, um vídeo de demonstração). Cinco recursos, cada um no mesmo fluxo de upload em três etapas das capturas de tela do app (reservar → enviar chunks → confirmar), com uma ferramenta composta asc_upload_* que faz todas as três a partir de um arquivo local. A pegadinha de rede é tratada para você: a imagem de IAP se relaciona via inAppPurchase, enquanto a captura de tela de revisão de IAP usa inAppPurchaseV2.

  • Imagens (um-para-muitos, por IAP / assinatura): asc_list_{iap,subscription}_images · asc_get_* · asc_upload_* (composta) · asc_post_* / asc_patch_* (reserva/confirmação bruta) · asc_delete_*.
  • Capturas de tela de revisão (um-para-um, por IAP / assinatura): asc_get_{iap,subscription}_review_screenshot (retorna a única existente, ou null) · asc_upload_* · asc_post_* / asc_patch_* · asc_delete_*. Como é um-para-um, as ferramentas de upload/reserva recusam se já existir uma — exclua-a primeiro.
  • Anexos de App Review (um-para-muitos, por detalhe de revisão da versão): asc_list_review_attachments · asc_get_review_attachment · asc_upload_review_attachment (composta) · asc_post_* / asc_patch_* · asc_delete_*. O ID pai é o ID de appStoreReviewDetail de asc_get_app_store_review_detail.

Detalhes de App Review, envios e lançamento

As últimas etapas manuais entre "metadados prontos" e "build no ar":

  • asc_get_app_store_review_detail / asc_post_… / asc_patch_… — o cartão "O que informar ao App Review" de uma versão: pessoa de contato, conta de demonstração (nome/senha/obrigatória), notas. Um-para-um por versão; a Apple mescla no PATCH.
  • asc_post_app_store_version_release_request — ⚠️ libera uma versão aprovada (PENDING_DEVELOPER_RELEASE) para a App Store pública agora — o clique de "Liberar esta versão", automatizado. Apenas para versões de liberação manual; sem desfazer.
  • asc_post_iap_submission / asc_post_subscription_submission / asc_post_subscription_group_submission — envia as alterações de metadados pendentes de um IAP / assinatura / grupo de assinaturas para revisão de forma independente, sem liberação de versão. Pegadinha de rede tratada: o de IAP se relaciona via inAppPurchaseV2.
  • asc_get_subscription_grace_period / asc_patch_… — período de carência de cobrança por app: optIn / sandboxOptIn, duração (3 / 16 / 28 dias), renewalType (todas as renovações vs. apenas pagas-para-pagas). Mantém assinantes vencidos com acesso enquanto a Apple tenta cobrar novamente.

Disponibilidades (assinaturas, IAPs, planos)

Disponibilidade por território de produtos dentro do app — a contraparte da Disponibilidade de App com uma diferença-chave: a vinculação de território usa códigos ISO de 3 letras simples (territories puro), não os compostos opacos que os apps usam.

  • Assinaturas: asc_get_subscription_availability · asc_list_subscription_available_territories · asc_post_subscription_availability (substituição completa apenas via POST — envie a lista completa de territórios; ⚠️ territórios removidos saem de venda).
  • IAPs: asc_get_iap_availability (lê pelo caminho pai v2) · asc_list_iap_available_territories · asc_post_iap_availability (mesma semântica de substituição).
  • Planos de assinatura (por tipo de plano MONTHLY / UPFRONT): asc_list_subscription_plan_availabilities · asc_list_subscription_plan_available_territories · asc_post_… · asc_patch_… (o único recurso de disponibilidade com PATCH).

Assinatura de ofertas de assinatura (resgate no app)

O assinante criptográfico que torna ofertas promocionais/introdutórias resgatáveis no seu app iOS via StoreKit. Usa uma chave de assinatura separada da chave de API ASC — emitida em App Store Connect → Usuários e Acesso → Integrações → Compra dentro do app. Consulte a seção de configuração opcional para variáveis de ambiente. Construído sobre o @apple/app-store-server-library oficial da Apple.

  • asc_sign_promotional_offer_legacy — assinatura legada ECDSA concatenada usada pelo SKPaymentDiscount do StoreKit 1 e pela API original Product.PurchaseOption.promotionalOffer(offerID:keyID:nonce:signature:timestamp:) do StoreKit 2. Retorna a assinatura base64 além do nonce, timestamp e keyId para o chamador passar ao StoreKit. Gera automaticamente um nonce UUID e timestamp atual; ambos podem ser sobrescritos para testes.
  • asc_sign_promotional_offer — formato JWS v2 introduzido na WWDC 2025 (retroportado para iOS 15). Use com as opções de compra de oferta promocional mais recentes do StoreKit 2. Retorna a serialização compacta JWS diretamente. transactionId (o appTransactionId do cliente) é opcional, mas fortemente recomendado.
  • asc_sign_introductory_offer_eligibility — JWS v2 com aud="introductory-offer-eligibility". Permite sobrescrever a verificação padrão de elegibilidade de oferta introdutória do StoreKit (por exemplo, conceder a um cliente recorrente outro teste grátis). Novo na WWDC 2025.

Todas as assinaturas são válidas por 24 horas a partir do momento da assinatura — assine novamente a cada tentativa de resgate em vez de pré-assinar e armazenar em cache.

Classificação etária

O questionário pelo qual o App Review avalia um app — ele bloqueia o envio, e anteriormente não havia como defini-lo daqui.

  • asc_get_age_rating_declaration — lê as respostas. Mostra apenas as não padrão (uma declaração típica tem 29 atributos, quase todos em NONE/false) além de cada sobrescrita, para que as poucas que realmente definem a classificação se destaquem.
  • asc_patch_age_rating_declaration — responde ao questionário. Perguntas de conteúdo aceitam uma frequência (NONE / INFREQUENT_OR_MILD / FREQUENT_OR_INTENSE); o restante são booleanos, além das sobrescritas de classificação e a faixa etária Kids.

Duas coisas sobre este recurso são fáceis de errar, então as ferramentas lidam com elas para você. Ele depende de AppInfo, não da versão — a classificação etária é metadado por app, como categorias, e /v1/appStoreVersions/{id}/ageRatingDeclaration retorna 404. E seu ID é o ID do AppInfo, então passar appId resolve o destino automaticamente (se um app tiver vários AppInfos entre faixas de notarização, a ferramenta relata os candidatos em vez de adivinhar).

A Apple mescla na escrita: chaves omitidas mantêm seu valor atual, então uma atualização parcial é segura — mas você não pode limpar uma resposta omitindo-a, precisa enviar o NONE/false explícito. Sobrescritas apenas elevam a classificação, nunca a reduzem.

Xcode Cloud (CI/CD)

O lado de build do ciclo de entrega: acompanhe execuções, leia falhas, dispare builds. Hierarquia: produtos → workflows → execuções de build → ações (build/test/archive/analyze) → problemas / resultados de teste / artefatos. Uma execução concluída vincula os builds do TestFlight que produziu, fazendo a transição para as ferramentas do TestFlight.

  • Leituras: asc_list_ci_products · asc_list_ci_workflows / asc_get_ci_workflow (resumo de configuração compacto: sinalizadores, padrões de condição de início, ações, Xcode/macOS resolvidos — raw:true para o documento completo de ~90 mil caracteres da Apple) · asc_list_ci_build_runs (por workflow ou produto) / asc_get_ci_build_run · asc_list_ci_build_actions · asc_list_ci_issues · asc_list_ci_test_results · asc_list_ci_artifacts / asc_get_ci_artifact (downloadUrl pré-assinado e com tempo limitado — busque sem o bearer ASC) · asc_list_ci_build_run_builds (a transição para o TestFlight) · asc_list_ci_environment_versions (catálogos de Xcode/macOS).
  • Leituras de SCM: asc_list_scm_providers · asc_list_scm_repositories · asc_list_scm_git_references (IDs de referência de branch/tag — o que o início de build aceita) · asc_list_scm_pull_requests.
  • Gatilhos: asc_post_ci_build_run (iniciar um build — sobrescrita opcional de branch/tag + clean; usa as horas de computação da equipe) · asc_patch_ci_workflow (pausar/retomar via isEnabled, clean, nome, descrição — condições de início e ações permanecem de propriedade do Xcode por design).

Indicações para destaque

Apresente um lançamento à equipe editorial da Apple para destaque na App Store (aba Hoje, coleções curadas). Rascunhos são privados; o envio é unilateral.

  • asc_list_nominations (filtre por app / estado / tipo) · asc_get_nomination · asc_post_nomination (padrão para um RASCUNHO revisável — submitted:false) · asc_patch_nomination (edite o rascunho; submitted:true o envia para a Apple — sem cancelar envio, apenas archived:true) · asc_delete_nomination.
  • A apresentação está em description + notes; publishStartDate/publishEndDate definem a janela de relevância; supplementalMaterialsUris carregam links de press-kit/TestFlight; launchInSelectMarketsFirst é a chave de rede (Markets, não a expressão "storefronts" da interface).

Provisionamento e assinatura de código

A superfície do Developer portal (território de fastlane match/sigh/cert). Restrição de função: requer uma chave de API Admin (ou Account Holder) — chaves de App Manager/Developer recebem 403 aqui (as ferramentas explicam isso).

  • Bundle IDs: asc_list_bundle_ids (filtro de identificador) · asc_get_bundle_id (com capacidades + perfis) · asc_post_bundle_id (identificador imutável — verifique a string reverse-DNS) · asc_patch_bundle_id (apenas renomear) · asc_delete_bundle_id (recusado enquanto um app estiver anexado).
  • Capacidades: asc_post_bundle_id_capability · asc_patch_bundle_id_capability · asc_delete_bundle_id_capability — alterações de capacidade invalidam perfis existentes; regenere-os depois.
  • Certificados: asc_list_certificates · asc_get_certificate (conteúdo base64 DER) · asc_post_certificate (a partir de um CSR PEM — a chave privada nunca vai para a Apple) · asc_delete_certificate (⚠️ EXCLUIR = revogar; assinatura de CI com ele quebra imediatamente).
  • Perfis: asc_list_profiles · asc_get_profile (profileContent = o .mobileprovision base64 real) · asc_post_profile · asc_delete_profile. Sem PATCH — perfis são imutáveis; gire excluindo + recriando.
  • Dispositivos: asc_list_devices · asc_post_device (⚠️ efetivamente permanente — dispositivos só podem ser desabilitados, nunca excluídos, e contam contra o limite anual de 100 por classe) · asc_patch_device (renomear, ENABLED/DISABLED).

Testadores de sandbox

Contas de teste do StoreKit, para exercitar a superfície de monetização de ponta a ponta. Os testadores são criados na interface do ASC; a API gerencia suas configurações.

  • asc_list_sandbox_testers · asc_patch_sandbox_tester (território, interruptPurchases, subscriptionRenewalRate acelerado — um mês de assinatura renova a cada 3–60 minutos) · asc_post_sandbox_testers_clear_purchase_history (limpeza apenas na sandbox para que fluxos de compra possam ser testados novamente; também redefine a elegibilidade de ofertas introdutórias).

Territórios

  • asc_list_territories — todos os 175 territórios da App Store

Rebalanceamento de PPP

  • ppp_load_index — retorna o snapshot de preço do plano Individual do Apple Music usado como sinal de PPP
  • ppp_compute_proposal — calcula uma tabela de preços proposta por território (dry-run somente leitura; usa as proporções do Apple Music como PPP-FX implícito, ajusta para pontos de preço válidos da Apple, aplica uma estratégia de arredondamento e piso configuráveis). Passe resourceType: "subscription" (padrão) com subscriptionId, resourceType: "app" com appId para apps pagos, resourceType: "iap" com iapId, resourceType: "introductoryOffer" com subscriptionId mais offerMode / duration (e numberOfPeriods para PAY_AS_YOU_GO; PAY_UP_FRONT define como 1 por padrão), ou resourceType: "promotionalOffer" com subscriptionId mais offerMode / duration / promoOfferName / promoOfferCode (e numberOfPeriods para PAY_AS_YOU_GO; PAY_UP_FRONT define como 1 por padrão).
  • ppp_apply_proposal — recalcula e aplica a proposta contra o ASC após confirmar via elicitação MCP (ou confirm: true para uso não supervisionado). Recusa se qualquer linha cair mais de maxDropPct (padrão 90%); pula territórios onde a moeda de cobrança do ASC ≠ moeda do Apple Music.
    • Para assinaturas: POSTs subscriptionPrices por território, ritmados em maxConcurrency (padrão 2), repetindo 429s automaticamente; assinantes existentes são mantidos quando preserveCurrentPrice: true (padrão).
    • Para apps e IAPs: um único POST de substituição de tabela inteira (uma chamada HTTP, atômica). Apps/IAPs não têm mecanismo de manutenção — novos preços ativam em cada startDate da entrada. Requer acknowledgeDeletesScheduledIfBaseChanges: true ao alterar o território base (a Apple apaga alterações programadas pendentes na mudança de base).
    • Para ofertas introdutórias: POSTs subscriptionIntroductoryOffers por território, ritmados em maxConcurrency. A coluna Δ compara o preço da oferta ajustado contra o preço atual da assinatura regular naquele território, então -50% significa que a oferta está com 50% de desconto na assinatura. FREE_TRIAL é rejeitado (sem preço para calcular — use asc_post_subscription_introductory_offer com territoryId omitido para um teste gratuito global único). Ofertas introdutórias são adições, não substituições — a Apple retorna 409 se uma oferta ativa já existir para uma célula (sub, territory), e essas linhas aparecem como failed na tabela de resultados.
    • Para ofertas promocionais: um POST atômico para /v1/subscriptionPromotionalOffers cria a oferta + todos os preços ajustados por PPP por território em uma única solicitação. Somente criação — recusa se offerCode colidir com uma oferta existente ou se a assinatura estiver no limite de 10 ofertas da Apple. FREE_TRIAL rejeitado (sem preço para calcular). Mesmo relatório de Δ-vs-preço-atual-da-assinatura que as ofertas introdutórias.

Formato de resposta

Cada ferramenta de listagem/obtenção retorna uma tabela de texto compacta por padrão — projetada para um LLM ler sem queimar contexto. Cada ferramenta também aceita:

  • raw: true — retorna o payload JSON:API completo (data, included, links, meta) para depuração ou uso avançado.
  • maxItems: number — limita a paginação automática (padrão 500–1000 dependendo da ferramenta). O MCP segue links.next e mescla + deduplica recursos included entre páginas.

Fieldsets esparsos (fields[type]=...) são aplicados por ferramenta para evitar puxar atributos não utilizados. A tabela de preços inteira de 175 territórios retorna em uma chamada paginada (200/página) com aproximadamente 1/10 do tamanho do payload não filtrado.

Suporte a protocolo

Fala a revisão MCP 2026-07-28 e o protocolo da era 2025 da mesma build — seu cliente escolhe. Não há nada para configurar de qualquer forma.

Em 2026-07-28 o servidor é stateless (sem handshake initialize; capacidades vêm de server/discover), e o prompt de confirmação de escrita usa solicitações de múltiplas idas e voltas: ppp_apply_proposal retorna um resultado input_required, seu cliente mostra o reconhecimento, e a mesma chamada de ferramenta é reemitida com sua resposta. Clientes que não suportam elicitação são instruídos a reexecutar com confirm: true, exatamente como antes.

A proposta é recalculada na reentrada em vez de carregada pela ida e volta, então os preços são relidos do App Store Connect imediatamente antes de qualquer escrita — nunca reutilizados de antes de você pausar para considerar. O custo é que uma aplicação interativa calcula duas vezes: em uma assinatura de 64 territórios, isso é aproximadamente 95s em vez de 48s. Execuções não supervisionadas com confirm: true nunca perguntam, então calculam uma vez e não são afetadas.

Comportamento em produção

Alguns detalhes que valem saber antes de executar ppp_apply_proposal contra uma conta App Store Connect ao vivo:

  • Tratamento de limite de taxa. A Apple limita endpoints POST em cerca de 50/min. client.request honra cabeçalhos Retry-After e cai para backoff exponencial (2s → 60s, limitado, até 6 tentativas). Um rebalanceamento de 60 territórios com ritmo através de tentativas termina em cerca de 2 minutos de tempo real com zero intervenção manual.
  • Pulo por incompatibilidade de moeda. Se o índice Apple Music incluído lista um território em uma moeda (digamos BHD) mas o ASC cobra sua assinatura em outra (USD), a proporção PPP-FX quebra dimensionalmente. A proposta marca essas linhas como currency-mismatch (asc=USD, am=BHD) e as exclui do conjunto de aplicação. Comum em mercados do Golfo cobrados em USD (BHR, KWT, OMN). Defina manualmente se quiser.
  • Piso de sanidade. floorFactor (padrão 0.15) é um limite inferior rígido em quedas por território como fração do preço atual — protege contra uma entrada de índice desatualizada colapsando um preço para perto de zero. Para um rebalanceamento mais conservador, passe 0.30 ou 0.50.
  • Teto de sanidade em quedas. maxDropPct (padrão 90%) recusa aplicar qualquer execução onde uma única linha caia mais que isso. Se você já viu o Apple Music derrubar um preço de mercado agressivamente, isso captura o outlier resultante antes de você escrevê-lo no ASC.
  • Atualize o snapshot quando importar. data/apple-music-prices.json é um snapshot curado manualmente. Cada entrada é datada; a data do snapshot é mostrada na saída da proposta. Envie um pull request para atualização quando os preços do Apple Music mudarem e o projeto incorporará.

Relatórios de erro anônimos (opt-in, desligado por padrão)

Este servidor guarda suas credenciais do App Store Connect, então o padrão para qualquer coisa que saia da sua máquina é alto. Telemetria está desligada a menos que você a ligue explicitamente, e não há etapa de "habilitado por padrão, opt-out depois".

appstoreconnect-mcp init pergunta uma vez. Altere a qualquer momento:

appstoreconnect-mcp telemetry status
appstoreconnect-mcp telemetry on
appstoreconnect-mcp telemetry off

O que é enviado

EnviadoNome da ferramenta (asc_patch_subscription_localization), status HTTP (409), código de erro da Apple code (ENTITY_ERROR.ATTRIBUTE.INVALID.UNMODIFIABLE), title genérico da Apple, o ponteiro JSON (/data/attributes/state), versão do pacote, versão do Node, SO + arquitetura, e um UUID de instalação aleatório. Mais um ping de atividade por dia.
Nunca enviadoTexto do erro detail da Apple, URLs ou caminhos de solicitação, IDs de app, bundle IDs, nomes de app, preços, nomes de assinaturas, qualquer corpo de solicitação ou resposta, seu issuer ID, key ID, ou qualquer credencial. Geolocalização é explicitamente desabilitada ($geoip_disable), então nenhuma cidade derivada de IP, código postal ou coordenadas são registrados também.

O limpador é uma allow-list, não uma blocklist: um campo que a Apple adicionar amanhã está ausente por construção, não por revisão. É aplicado por testes em tests/telemetry-scrubbing.test.ts, que afirmam sobre o que está ausente tão fortemente quanto sobre o que está presente.

Por quê

Para que um bug como "A Apple começou a rejeitar todo asc_patch_subscription_localization com 409" apareça como um sinal em vez de esperar alguém abrir uma issue. Esse é um exemplo real — foi encontrado manualmente, e esta é a versão automatizada disso.

Desligando em todos os lugares

  • DO_NOT_TRACK=1 é honrado e vence um opt-in explícito.
  • ASC_MCP_TELEMETRY=0 desabilita forçadamente; =1 habilita para aquela execução sem registrar consentimento em disco.
  • ASC_MCP_TELEMETRY_HOST / ASC_MCP_TELEMETRY_KEY apontam um fork para seu próprio coletor.

O transporte é fire-and-forget atrás de um timeout de 3s: nunca bloqueia uma chamada de ferramenta, nunca lança exceção, e nunca escreve em stdout (esse stream é o canal do protocolo MCP).

Habilidade de rebalanceamento de PPP

O diretório examples/ppp-rebalance/ contém uma habilidade Claude Code que envolve essas ferramentas em um fluxo de trabalho de Paridade de Poder de Compra (dry-run → agendar → reverter) com as pegadinhas incorporadas.

mkdir -p ~/.claude/skills && \
  ln -s "$PWD/examples/ppp-rebalance" ~/.claude/skills/ppp-rebalance

Então pergunte ao Claude: "Rebalanceie meus preços de assinatura usando a habilidade ppp-rebalance."

Roadmap

v0.1–v1.0 cobrem monetização + distribuição beta + a superfície completa da página de produto da App Store + eventos promocionais ao vivo + território / rollout / conformidade de exportação + notificações push + relatórios de receita/análise + feedback de clientes + testes A/B de página de produto + saúde/acessibilidade em tempo de execução + pré-vendas/FX real + distribuição alternativa EU DMA: a superfície completa de preços/IAP/ofertas (assinaturas, apps pagos, IAPs, ofertas introdutórias, ofertas promocionais, campanhas de código de oferta, signers), TestFlight (builds, grupos beta, testadores beta, localizações beta, envios de revisão beta), o texto da página de produto por localidade (notas de versão, descrições, palavras-chave, texto promocional), o ciclo de vida de versão (escrita de App Store Version + envio de revisão V2), superfícies de App Info / categoria / tag / palavra-chave de busca (v0.12), upload de capturas de tela + pré-visualizações + Custom Product Pages (v0.13), In-App Events + Promoted Purchases (v0.14), App Availability + Phased Release + Encryption Declarations (v0.15), o loop de feedback do TestFlight — capturas de tela/crashes de feedback beta, notificações de build, critérios de recrutamento de link público (v0.16), Webhooks — push de eventos por app com histórico de entrega, reentrega e pings de teste (v0.17), downloads de relatórios de vendas/finanças + a cadeia de Analytics Reports (v0.18), avaliações de clientes — ler, responder, resumir (v0.19), App Store Version Experiments — testes A/B de página de produto com tratamentos + ativos de variante (v0.20), superfícies de diagnóstico/perf-potência/acessibilidade (v0.21), pré-vendas por território + PPP FX real (v0.22), e distribuição alternativa EU DMA / (v1.0). O roadmap planejado está completo. O resto é terreno fértil para operações orientadas por LLM porque muito do trabalho da App Store é texto com alto julgamento — respostas de avaliações, posicionamento de preços — que um modelo pode rascunhar e um humano aprova.

FaseDomínioO que desbloqueia
v0.1 ✓Apps · assinaturas · preço de assinaturas · rebalanceamento de PPPAgende alterações de preço por território com base no poder de compra.
v0.2.0 ✓Preço de apps (não assinaturas): lista / pontos de preço da lista / substituir agendamento · cálculo de PPP estendido para appsSimulação de PPP em apps pagos; aplicação manual via asc_post_app_price_schedule.
v0.3.0 ✓Compras dentro do app (v2): lista / obter / leituras e gravações de agendamento de preçosMesma superfície de monetização para IAPs (consumíveis, não consumíveis, assinaturas não renováveis). Assinaturas renováveis permanecem nas ferramentas de Assinaturas.
v0.4.0 ✓ppp_apply_proposal aplicação automática para apps + IAPs · PPP para IAPs · filtro nearAmount em listagens de pontos de preçoRebalanceamento de PPP em uma única etapa para todas as superfícies pagas, não apenas assinaturas.
v0.5.0 ✓Ofertas introdutórias de assinatura (teste grátis / pague conforme usar / pague antecipado): listar / obter / criar / atualizar / excluir · PPP estendido para ofertas introdutóriasPromoções de "primeiro mês" / "primeiros três meses" com ciência de PPP que se adaptam ao poder de compra local em vez de um literal $0,99 em todos os lugares.
v0.6.0 ✓Ofertas promocionais de assinatura (assinantes existentes/vencidos): listar / obter / criar / atualizar preços / excluir · PPP estendido para ofertas promocionais (somente criação, POST único atômico)Campanhas de reconquista com preços por território com ciência de PPP.
v0.7.0 ✓Assinatura de ofertas de assinatura: três assinantes (ECDSA legado, JWS v2 promocional, JWS v2 elegibilidade introdutória) cobrindo todos os formatos atuais suportados pela AppleResgate StoreKit de ponta a ponta — ofertas promocionais da v0.6 agora são utilizáveis em um app iOS, não apenas configuráveis no ASC.
v0.8.0 ✓Códigos de oferta de assinatura (CRUD de campanha menos D · preços por território · lotes de códigos de uso único · exportação texto/csv via /values) · PPP estendido para campanhas de código de ofertaCampanhas de resgate de código promocional (App Store Connect → "Códigos de oferta") — gerar, desativar, exportar CSV.
v0.8.1 ✓Complementos de códigos de oferta de assinatura: códigos personalizados (uso múltiplo) (listar/criar/atualizar) · environment: SANDBOX|PRODUCTION na criação de lote · autoRenewEnabled na criação de campanha · resumo da campanha agora exibe autoRenew + contagens de códigos prod/sbx · aplicação de PPP encaminha autoRenewEnabledStrings resgatáveis voltadas ao público (uma string, muitos resgates) + marcação de lote sandbox-vs-produção + códigos de oferta de uso único não renováveis.
v0.9.0 ✓Superfície TestFlight em 5 subdomínios: builds (listar/obter/expirar/detalhe beta do build) · grupos beta (CRUD + vínculo de testador + vínculo de build) · testadores beta (CRUD + envio/reenvio de convite) · localizações de build beta (CRUD por build × localidade) · localizações de app beta (CRUD por app × localidade) · envios de revisão beta do app + detalhes · versões de pré-lançamento (somente leitura). 32 novas ferramentas."Convide estes 30 testadores para o novo build com esta nota de teste em EN/ES/JA."
v0.10.0 ✓Localizações da página do produto na App Store em 4 superfícies: versões da App Store (lista/obter somente leitura) · localizações de versão da App Store (CRUD — notas de versão / descrição / palavras-chave / texto promocional / URLs de marketing+suporte) · localizações de assinatura (CRUD — nome + descrição por localidade) · localizações de IAP (CRUD — mesma forma na superfície IAP v2). 17 novas ferramentas.A maior vitória para LLMs. Traduza notas de versão para 35 localidades usando localizações existentes como referência de voz, apresente o diff, envie após aprovação.
v0.10.1 ✓Correção: pré-verificação com ciência de estado em asc_patch_app_store_version_localization — recusa lotes de campos incompatíveis no lado do cliente com {state, allowed, blocked, reason, nextEditablePath} antes do 409 STATE_ERROR puro da Apple. Descrição de MarketingUrlSchema reescrita para diferenciar página do produto da App Store vs superfícies TestFlight.Evite idas e voltas de PATCH desperdiçadas contra versões READY_FOR_SALE.
v0.11.0 ✓Superfície de gravação de versão da App Store (criar / atualizar / excluir com exclusão com gate de estado) + fluxo de envio para revisão V2 (criar rascunho → adicionar itens → enviar/cancelar + leituras de status). Fecha o ciclo de lançamento — envie uma nova versão de ponta a ponta pelo MCP sem abrir o ASC."Traduza notas de versão para 35 localidades e envie a versão 2.5 para revisão."
v0.12.0 ✓Informações do app (listar/obter + PATCH com gate de estado para relacionamentos de categoria) · CRUD de AppInfoLocalization (nome + subtítulo + URLs de privacidade + texto de privacidade por localidade) · catálogo AppCategory (somente leitura com subcategorias incluídas) · AppTag (listar por app + alternância de visibilidade PATCH visibleInAppStore) · superfície de leitura agregada SearchKeywords (filtro por plataforma + localidade). 12 novas ferramentas."Troque a categoria secundária do seu app de Viagem para Esportes e depois atualize o subtítulo em todas as 13 localidades."
v0.13.0 ✓Upload de ativos: capturas de tela + pré-visualizações de app (reserva em três etapas / PUT em partes / commit, expostos como atalhos compostos (asc_upload_screenshot, asc_upload_app_preview) E variantes brutas de três etapas para controle manual). Páginas de produto personalizadas: CRUD de página + versão + localização com gate de estado na versão. Peculiaridades fixadas de chaves de wire (isUploaded→uploaded, isVisible→visible, videoURL→videoUrl) e omissão de bloco sem atributos na criação de versão de CPP. ~25 novas ferramentas."Gere capturas de tela da App Store para 12 localidades a partir destes arquivos de origem, envie-os para uma variante de Página de Produto Personalizada chamada paid-ads-summer."
v0.14.0 ✓Eventos dentro do app: CRUD de AppEvent + AppEventLocalization com gate de estado de 10 valores (recusa WAITING_FOR_REVIEW / IN_REVIEW), matrizes TerritorySchedule (ISO 8601) e upload de captura de tela + clipe de vídeo do evento (composto + bruto em três etapas, reutilizando os auxiliares de upload de ativos da v0.13). Compras promovidas: CRUD + vínculo de ordenação por app (PATCH de matriz simples; ordem da matriz = ordem na loja). Peculiaridades fixadas de chaves de wire: isUploaded→uploaded, isVisibleForAllUsers→visibleForAllUsers, isEnabled→enabled. ~28 novas ferramentas."Crie um evento dentro do app 'Abertura da Temporada de Salmão' para seu app rodando de 2026-06-15 a 2026-07-15."
v0.15.0 ✓Disponibilidade do app v2 (somente POST com substituição completa; códigos ISO de 3 letras SÃO os IDs; ferramenta final de pré-venda) + Lançamento faseado (PATCH de ciclo de vida de 4 estados em AppStoreVersion) + Declarações de criptografia (declarações somente anexo + vínculo de build + upload de documento de suporte reutilizando upload de ativos da v0.13). Peculiaridades fixadas de chaves de wire: isAvailableInNewTerritories→availableInNewTerritories, isAvailableOnFrenchStore→availableOnFrenchStore, isUploaded→uploaded, downloadURL→downloadUrl. ~19 novas ferramentas."Habilite seu app em 3 novos territórios e inicie um lançamento faseado na versão 2.5."
v0.16 ✓Complementos TestFlight: envios de feedback beta (capturas de tela + listas de feedback de falhas com filtros de build/testador/dispositivo, busca de texto de log de falhas, exclusões) + notificações de build beta (ping manual de "novo build disponível"; POST somente relacionamentos, sem bloco de atributos) + critérios de recrutamento beta (para-UM por grupo beta; criar/atualizar/excluir + catálogo de opções válidas + verificação de build compatível). Peculiaridade fixada de chave de wire: buildBundleID→buildBundleId (remoção de ID final). DELETEs em feedback + critérios documentados pela Apple, mas ausentes no Swift SDK — verificados contra o JSON de documentação da Apple. Filtro pontilhado filter[build.preReleaseVersion]. 14 novas ferramentas."Resuma o feedback beta no build 132 por frequência e gravidade e elabore uma lista de triagem."
v0.17 ✓Webhooks: CRUD por app (5 atributos obrigatórios de criação incl. HMAC somente gravação secret; pausar/retomar via enabled; rotação de segredo via PATCH) + histórico de entrega (filtros de estado/data com chaves detalhadas filter[createdDateGreaterThanOrEqualTo], status de resposta + erro por tentativa) + reentrega (POST somente relacionamentos com template autorreferencial) + ping de teste. Catálogo de tipos de evento de 12 valores — BETA_FEEDBACK_*_CREATED emparelha com os leitores de feedback da v0.16. Peculiaridades fixadas de chaves de wire: isEnabled→enabled, isRedelivery→redelivery, isPing→ping. 8 novas ferramentas."Configure um webhook para que um canal do Slack saiba de todo novo build beta que for ao ar; liste entregas com FALHA desde ontem e tente novamente."
v0.18 ✓Relatórios de vendas + finanças (NÃO JSON:API — downloads TSV compactados via novo caminho de cliente requestBinary; 10 reportTypes de vendas × subType × frequência; vendorNumber com fallback de env ASC_VENDOR_NUMBER; resumo de pré-visualização TSV + exportação de arquivo completo saveTo) + cadeia de relatórios de análise em quatro níveis (solicitar ONGOING/ONE_TIME_SNAPSHOT → relatórios por categoria → instâncias por granularidade/processingDate → segmentos com URLs pré-assinadas com limite de tempo + ferramenta de download CSV gunzip). Peculiaridades fixadas: isStoppedDueToInactivity→stoppedDueToInactivity, detecção de byte mágico gzip, URLs de segmento buscadas SEM o bearer do ASC. 9 novas ferramentas."Por que o MRR caiu no Brasil na semana passada? Compare com a data de ativação do rebalanceamento."
v0.19 ✓Avaliações de clientes: listas em todo o app + com escopo de versão (filtros de classificação/território, filtro de fila sem resposta exists[publishedResponse], classificações/ordenações por data), leituras de avaliação + resposta, ⚠️ responder voltado ao público (uma resposta por avaliação, SUBSTITUI ao republicar) + exclusão de resposta e resumos de avaliações de clientes (resumo agregado por IA da Apple na página do produto; filter[platform] obrigatório). Peculiaridades fixadas: isExistsPublishedResponse→exists[publishedResponse] (variante de remoção de parâmetro existente), filter[rating] aceita strings. 6 novas ferramentas."Elabore uma resposta para cada avaliação de 1 estrela na versão mais recente que mencione o bug de exportação. Mostre-me antes de publicar."
v0.20 ✓Experimentos de versão da App Store V2 (testes A/B da página do produto, anexados ao app — superfície v1 obsoleta ignorada): CRUD de experimento com gate de ciclo de vida de flag iniciado (⚠️ voltado ao cliente uma vez iniciado; envie via fluxo de envio para revisão da v0.11 primeiro), tratamentos (+ teste de ícone alternativo), localizações de tratamento; capturas de tela/pré-visualizações de variante usam as ferramentas de ativos existentes da v0.13 (parentType appStoreVersionExperimentTreatmentLocalizations). Peculiaridades fixadas: isStarted→started, caminho de lista /v1/apps/{id}/appStoreVersionExperimentsV2 vs CRUD /v2/appStoreVersionExperiments. 12 novas ferramentas."Configure um teste A/B do ícone azul vs o atual com 30% do tráfego, capturas de tela em inglês + alemão."
v0.21 ✓Saúde de runtime + acessibilidade: assinaturas de diagnóstico por build (pontos de acesso DISK_WRITES/HANGS/LAUNCHES, ponderados por impacto) + logs de pilha de chamadas anonimizados (application/vnd.apple.diagnostic-logs+json) + métricas de desempenho/energia do Xcode no nível de app e build (application/vnd.apple.xcode-metrics+json, 8 tipos de métrica) + CRUD de declarações de acessibilidade ("Rótulos de nutrição de acessibilidade": DRAFT → gate de publicação ⚠️ voltado ao cliente → REPLACED). Fixado: a MAIOR família de remoção de "is" até agora (9× isSupports*→supports* + isPublish→publish), dois tipos de conteúdo não JSON:API via substituições de Accept. 8 novas ferramentas."Quais pilhas de chamadas fazem o build 2.5.0 travar? Compare seus percentis de tempo de inicialização com a linha de base do app."
v0.22 ✓Pré-vendas por território (PATCH territoryAvailabilities: available ⚠️ / releaseDate / preOrderEnabled — completa a superfície de disponibilidade da v0.15) + FX real para territórios com moeda incompatível (fxRates em ppp_compute_proposal E ppp_apply_proposal: taxas USD-por-unidade FORNECIDAS PELO USUÁRIO resgatam lojas cobradas em USD onde os preços do Apple Music estão em moeda local; linhas ajustadas por FX marcadas *; este servidor nunca busca taxas de terceiros — egresso permanece somente Apple por design). 1 nova ferramenta + upgrade do mecanismo PPP."Abra pré-vendas no Japão para 1º de setembro; rebalanceie os preços dos territórios do Golfo usando as taxas de hoje de BHD/KWD/OMR."
v1.0 ✓DMA da UE / distribuição alternativa (com gate de direito — as ferramentas explicam o 403 quando a conta não está inscrita): domínios de distribuição web (registrar/listar/excluir ⚠️), chaves de assinatura públicas (a metade privada nunca vai para a Apple), pacotes assinados por versão com URLs de download pré-assinadas + variantes + deltas, detalhes de busca de marketplace (remoção catalogURL→catalogUrl), webhooks de marketplace (remoção endpointURL→endpointUrl, segredo somente gravação). 19 novas ferramentas."Empacote a versão 3.0 para distribuição web e entregue as URLs assinadas ao CDN."
v1.1.0 ✓Ofertas de reativação de assinantes — o terceiro tipo de oferta, direcionado a assinantes inativos (a Apple as exibe automaticamente para clientes cancelados elegíveis): listar / obter / listar preços / criar / atualizar / excluir. Mais completas que ofertas promocionais: segmentação por elegibilidade (duração paga + intervalo de tempo desde a última assinatura {min,max} + espera entre), agendamento (início/fim), prioridade e um recurso automático de ativo promotionIntent; PATCH é somente de atributos (identidade e preços imutáveis — exclua e recrie para alterá-los). 6 novas ferramentas."Reative assinantes que cancelaram há 1–6 meses com uma oferta de três meses com preço PPP, exibida automaticamente pela Apple."
v1.2.0 ✓IAP + assinatura recursos de revisão — a captura de tela de revisão da App Store que a Apple exige antes que um IAP/assinatura possa ser enviado, além de imagens promocionais. Quatro recursos (IAP/assinatura × imagem/captura de tela de revisão) no fluxo de upload em três etapas do v0.13, controlados por uma tabela de configuração: asc_upload_* composto + reserva/commit/delete brutos + leituras. Imagens muitos-para-muitos, capturas de tela de revisão um-para-um (o upload recusa duplicatas). Problema de wire resolvido: imagem de IAP relaciona via inAppPurchase, captura de tela de revisão de IAP via inAppPurchaseV2. 22 novas ferramentas."Anexe a captura de tela de revisão à minha nova assinatura para que eu possa enviá-la."
v1.4.0 ✓Declarações de classificação etária — leitura + PATCH do questionário que a App Review usa para avaliar um app (13 enums de frequência, 11 booleanos, overrides de classificação, faixa etária Kids). Depende do AppInfo, não da versão; id da declaração == id do appInfo (resolvido a partir do appId). A Apple faz merge no PATCH. 2 novas ferramentas."Responda ao questionário de classificação etária para que a versão 3.0 possa ser enviada."
v1.5.0 ✓Completude do ciclo de envio: disponibilidades (assinatura / IAP / tipo de plano por território — vínculo de território com código ISO simples, substituição total somente via POST) + detalhes da App Review (contato / conta demo / notas por versão) com anexos de revisão como o 5º recurso da fábrica de upload + solicitações de lançamento (liberar uma versão aprovada agora) + envios de itens independentes (IAP / assinatura / revisão de grupo sem lançamento de versão) + períodos de carência de cobrança. ~25 novas ferramentas."Preencha o cartão de revisão, anexe o vídeo demo, envie a nova assinatura e libere o build aprovado."

O roadmap v0.1→v1.0 está completo — todas as superfícies planejadas originalmente foram entregues. O trabalho pós-1.0 acompanha as mudanças da API da Apple (novos recursos, drift de contrato — veja scripts/audit-fieldsets.py + scripts/audit-required-attributes.py): v1.1.0 adiciona ofertas de win-back, v1.2.0 adiciona recursos de revisão de IAP/assinatura (fechando a lacuna "não é possível enviar sem captura de tela de revisão"), v1.4.0 adiciona declarações de classificação etária, v1.5.0 fecha o ciclo prepare→submit→release (disponibilidades, detalhes/anexos de revisão, envios independentes, solicitações de lançamento, períodos de carência).

Fora do escopo (Fastlane / Xcode já fazem bem): perfis de provisionamento, certificados, dispositivos, capabilities, configuração do Game Center.

Pense nisso como o companheiro de LLM para operações do App Store Connect. Fastlane é para o pipeline de build/release; isto é para o trabalho de conhecimento pós-lançamento — ciclo de vida de release, tradução, preços, ASO, feedback de clientes, promoção na loja e analytics.

Cada novo domínio é um arquivo em src/domains/<name>.ts mais uma chamada register* em src/index.ts. Contribuições são bem-vindas — veja CONTRIBUTING.md.

Desenvolvimento

git clone https://github.com/akoskomuves/appstoreconnect-mcp.git
cd appstoreconnect-mcp
npm install
npm run dev   # tsx watch mode
npm test
npm run build

Veja CONTRIBUTING.md para o fluxo de contribuidores (changesets, template de PR, nomeação de branches).

Licença

MIT © 2026 Akos Komuves