app-store-connect-mcp
It is an MCP server that exposes App Store Connect data (analytics, sales, finance, reviews, performance) to AI assistants through read-only tools.
App discovery:
list_appsto find numeric app IDs.Analytics reports: list report categories/requests/reports/instances, create one report request per app, and download/parse analytics data.
Sales & Trends: fetch sales reports (units, proceeds, installs, subscriptions) with valid type/subtype/frequency combinations.
Finance reports: download monthly finance reports by region.
Customer reviews: list App Store reviews, filtered by rating and territory.
Performance metrics: get Xcode power/performance metrics for recent app versions.
Safety features: parsed JSON output, row/byte caps, gzip decompression, and pagination support.
Provides tools for interacting with App Store Connect, enabling retrieval of app analytics, sales and trends reports, finance reports, customer reviews, and performance metrics.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@app-store-connect-mcp list my apps and fetch daily analytics for the last week"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
App Store Connect MCP Server
Servidor MCP (Model Context Protocol) para puxar dados de analytics e relatórios do App Store Connect, espelhando a arquitetura do mcp-google-play-console (Python + FastMCP + credenciais por variável de ambiente).
Fontes de dados
Fonte | O que cobre |
Sessões, dispositivos ativos, instalações e exclusões, crashes, impressões e páginas de produto, compras e assinaturas, uso de frameworks, métricas de performance — em TSV diário, semanal e mensal | |
Unidades vendidas, proceeds, instalações, assinaturas, assinantes, resgates de offer code | |
Finance Reports | Pagamentos e proceeds por mês fiscal e região |
Customer Reviews / perfPowerMetrics | Avaliações da App Store e métricas de launch, hangs, memória, disco e bateria do Xcode |
Related MCP server: app-store-connect-mcp
Ferramentas expostas
Descoberta
list_apps— lista os apps que a chave enxerga (use primeiro, para descobrir os app IDs)list_report_categories— descreve as categorias de relatório e o fluxo da Analytics Reports API
Analytics Reports
fetch_analytics_report— caminho completo em uma chamada: app → request → relatório → instância → linhas já parseadaslist_report_requests— requests de relatório existentes do appcreate_report_request— única operação de escrita; habilita a geração de relatórios (uma vez por app)list_reports— relatórios disponíveis dentro de um request, com filtro por categoria e nomelist_report_instances— instâncias por granularidade (DAILY/WEEKLY/MONTHLY) e data de processamentolist_report_segments— segmentos de uma instância, com a URL de download (válida por 5 minutos)download_report_instance— baixa todos os segmentos de uma instância e devolve as linhas em JSON
Vendas, finanças, avaliações e performance
list_sales_report_types— combinações válidas dereportType/reportSubType/frequency/versiondownload_sales_report— relatório de Sales and Trends já descompactado e parseadodownload_finance_report— relatório financeiro do mês fiscallist_customer_reviews— avaliações da App Store, com filtro por nota e territórioget_perf_power_metrics— métricas de energia e performance das versões recentes
Todas as ferramentas são somente-leitura (readOnlyHint), exceto create_report_request.
Pré-requisitos
uv: baixa e executa o servidor. Se a máquina não tiver Python 3.10 ou mais novo, o
uvbaixa um sozinho.git: o
uvxusa o git para baixar o código deste repositório.
macOS, com Homebrew:
brew install uv gitSem Homebrew, instale o uv com curl -LsSf https://astral.sh/uv/install.sh | sh e o git com xcode-select --install.
Windows, no PowerShell:
winget install --id=astral-sh.uv -e
winget install --id=Git.Git -eDepois de instalar, feche e abra o PowerShell de novo. Sem isso, o terminal não encontra os comandos uv e git.
Configuração
1. Crie uma chave da App Store Connect API
Em App Store Connect → Users and Access → Integrations → App Store Connect API, gere uma chave e baixe o arquivo AuthKey_XXXXXXXXXX.p8 (só é possível baixar uma vez). Anote o Key ID e o Issuer ID.
Guarde o .p8 num local fixo e anote o caminho completo. Exemplos: /Users/voce/.appstoreconnect/private_keys/AuthKey_2X9R4HXF34.p8 no macOS e C:\Users\voce\.appstoreconnect\private_keys\AuthKey_2X9R4HXF34.p8 no Windows.
O papel da chave define o que dá para ler:
Dado | Papel mínimo |
Analytics Reports | Admin, App Manager, Developer ou Marketing |
Sales and Trends | Sales ou Finance |
Finance Reports | Finance |
Customer Reviews | Admin, App Manager, Developer ou Marketing |
2. Credenciais
O servidor lê as credenciais destas variáveis de ambiente:
Variável | Valor |
| Key ID da chave, ex. |
| Issuer ID, ex. |
| Caminho completo do |
| Vendor number; só é necessário para sales e finance |
Os valores vão no --env do Claude Code ou no bloco env do Claude Desktop quando você registrar o servidor no cliente MCP (seção Instalação e uso).
Chaves individuais (sem Issuer ID) funcionam: deixe
APP_STORE_CONNECT_ISSUER_IDsem definir e o servidor assina o token comsub: user.Em vez do caminho, dá para passar o PEM inline em
APP_STORE_CONNECT_PRIVATE_KEY.O vendor number aparece em App Store Connect → Payments and Financial Reports.
Arquivo .env (opcional): para não repetir os valores em cada cliente MCP, grave as variáveis num arquivo .env. O servidor lê o primeiro arquivo que encontrar:
$APP_STORE_CONNECT_ENV_FILE, se definido;~/.config/app-store-connect/.env;.envno diretório de trabalho.
No macOS, no Terminal:
mkdir -p ~/.config/app-store-connect
cat > ~/.config/app-store-connect/.env <<'ENV'
APP_STORE_CONNECT_KEY_ID=2X9R4HXF34
APP_STORE_CONNECT_ISSUER_ID=57246542-96fe-1a63-e053-0824d011072a
APP_STORE_CONNECT_PRIVATE_KEY_PATH=~/.appstoreconnect/private_keys/AuthKey_2X9R4HXF34.p8
APP_STORE_CONNECT_VENDOR_NUMBER=12345678
ENV
chmod 600 ~/.config/app-store-connect/.envNo Windows, no PowerShell:
New-Item -ItemType Directory -Force "$HOME\.config\app-store-connect" | Out-Null
@"
APP_STORE_CONNECT_KEY_ID=2X9R4HXF34
APP_STORE_CONNECT_ISSUER_ID=57246542-96fe-1a63-e053-0824d011072a
APP_STORE_CONNECT_PRIVATE_KEY_PATH=~/.appstoreconnect/private_keys/AuthKey_2X9R4HXF34.p8
APP_STORE_CONNECT_VENDOR_NUMBER=12345678
"@ | Set-Content -Encoding utf8 "$HOME\.config\app-store-connect\.env"Variáveis já definidas no ambiente, inclusive pelo --env ou pelo env do cliente MCP, têm prioridade sobre o arquivo. O servidor lê o arquivo uma vez por processo, e a ausência do arquivo não é erro. O arquivo aceita export no começo da linha, comentários com # e valores entre aspas. O servidor expande o ~ no caminho do .p8.
3. Habilite os relatórios de analytics do app
A Apple só gera relatórios depois que existe um report request. Uma vez por app:
create_report_request(app_id="1234567890", access_type="ONGOING")ONGOING passa a gerar dados a partir do dia seguinte; ONE_TIME_SNAPSHOT devolve o histórico disponível de uma vez. As instâncias expiram depois de um tempo — baixe logo após listar.
Relatórios mais usados
list_report_categories devolve esta lista; use list_reports para o conjunto completo do app (são ~156, a maioria de FRAMEWORK_USAGE).
Categoria | Relatórios |
| App Sessions Standard/Detailed, App Store Installation and Deletion Standard/Detailed, App Crashes, Platform App Installs |
| App Store Discovery and Engagement Standard/Detailed, App Store Web Preview Engagement, Retention Messaging |
| App Downloads Standard/Detailed, App Store Purchases, App Store Subscription Event/State Report |
| App Install Performance, Networking Connection Activity, CAMetalLayer Performance, Bluetooth System Wakes |
Standard é pré-agregado; Detailed quebra o mesmo dado por mais dimensões e é bem maior.
Instalação e uso
Direto do GitHub (recomendado)
Com os pré-requisitos instalados, não é preciso clonar nada: o uvx baixa, instala e executa o servidor a partir deste repositório. Para testar, rode o comando abaixo, que é igual no macOS e no Windows:
uvx --from git+https://github.com/brunosemfio/mcp-app-store-connect.git app-store-connect-mcpSe o servidor subir sem erro, ele fica aguardando um cliente MCP. Encerre com Ctrl+C.
Claude Code
Registre o servidor. O
--scope userdeixa o servidor disponível em qualquer pasta. Sem o--scope user, o servidor só aparece na pasta onde você rodou o comando.macOS, no Terminal:
claude mcp add --scope user app-store-connect \ --env APP_STORE_CONNECT_KEY_ID=2X9R4HXF34 \ --env APP_STORE_CONNECT_ISSUER_ID=57246542-96fe-1a63-e053-0824d011072a \ --env APP_STORE_CONNECT_PRIVATE_KEY_PATH=/Users/voce/.appstoreconnect/private_keys/AuthKey_2X9R4HXF34.p8 \ --env APP_STORE_CONNECT_VENDOR_NUMBER=12345678 \ -- uvx --from git+https://github.com/brunosemfio/mcp-app-store-connect.git app-store-connect-mcpWindows, no PowerShell:
claude mcp add --scope user app-store-connect ` --env "APP_STORE_CONNECT_KEY_ID=2X9R4HXF34" ` --env "APP_STORE_CONNECT_ISSUER_ID=57246542-96fe-1a63-e053-0824d011072a" ` --env "APP_STORE_CONNECT_PRIVATE_KEY_PATH=C:\Users\voce\.appstoreconnect\private_keys\AuthKey_2X9R4HXF34.p8" ` --env "APP_STORE_CONNECT_VENDOR_NUMBER=12345678" ` -- uvx --from git+https://github.com/brunosemfio/mcp-app-store-connect.git app-store-connect-mcpTroque os valores de
--envpelos da sua chave.Com chave individual, remova a linha do
APP_STORE_CONNECT_ISSUER_ID.Sem sales e finance, remova a linha do
APP_STORE_CONNECT_VENDOR_NUMBER.Com o arquivo
.envda seção 2, remova todas as linhas--env.
Rode
claude mcp list. Oapp-store-connectdeve aparecer como conectado.Numa conversa nova do Claude Code, peça "liste os apps que você enxerga no App Store Connect". Se o servidor estiver funcionando, o Claude chama a ferramenta
list_appse mostra os apps. Se der erro, digite/mcpdentro do Claude Code para ver o status do servidor.
Para trocar algum valor, remova o servidor com claude mcp remove --scope user app-store-connect e registre de novo pelo passo 1.
Claude Desktop
Descubra o caminho completo do
uvx. O Claude Desktop aberto pelo Dock ou pelo menu Iniciar pode não enxergar o PATH do terminal e falhar comspawn uvx ENOENT. Com o caminho completo, o app não depende do PATH.macOS: rode
which uvx. Em Macs com Apple Silicon e Homebrew, o resultado costuma ser/opt/homebrew/bin/uvx.Windows: rode
where.exe uvxno PowerShell.
Abra o arquivo de configuração do Claude Desktop. Pelo app, o caminho é Settings → Developer → Edit Config. Pelo terminal, os comandos abaixo criam o arquivo se ele ainda não existir e não apagam um arquivo existente.
macOS, no Terminal (abre no TextEdit):
mkdir -p ~/Library/Application\ Support/Claude touch ~/Library/Application\ Support/Claude/claude_desktop_config.json open -e ~/Library/Application\ Support/Claude/claude_desktop_config.jsonWindows, no PowerShell (abre no Bloco de Notas):
$config = "$env:APPDATA\Claude\claude_desktop_config.json" if (-not (Test-Path $config)) { New-Item -ItemType File -Force $config | Out-Null } notepad $configAdicione o servidor ao arquivo e salve. Se o arquivo estiver vazio, cole o bloco inteiro abaixo. Se o arquivo já tiver
mcpServers, inclua só a entradaapp-store-connectdentro dele. Se o arquivo tiver outras chaves mas não tivermcpServers, acrescente a chavemcpServersao objeto principal.{ "mcpServers": { "app-store-connect": { "command": "/opt/homebrew/bin/uvx", "args": [ "--from", "git+https://github.com/brunosemfio/mcp-app-store-connect.git", "app-store-connect-mcp" ], "env": { "APP_STORE_CONNECT_KEY_ID": "2X9R4HXF34", "APP_STORE_CONNECT_ISSUER_ID": "57246542-96fe-1a63-e053-0824d011072a", "APP_STORE_CONNECT_PRIVATE_KEY_PATH": "/Users/voce/.appstoreconnect/private_keys/AuthKey_2X9R4HXF34.p8", "APP_STORE_CONNECT_VENDOR_NUMBER": "12345678" } } } }Troque
/opt/homebrew/bin/uvxpelo caminho do passo 1 e os valores deenvpelos da sua chave.No Windows, dobre as barras invertidas nos dois caminhos, como o JSON exige. Exemplo:
"C:\\Users\\voce\\.appstoreconnect\\private_keys\\AuthKey_2X9R4HXF34.p8".Com chave individual, remova a linha do
APP_STORE_CONNECT_ISSUER_ID.Sem sales e finance, remova a linha do
APP_STORE_CONNECT_VENDOR_NUMBERe apague a vírgula que sobrar no fim da linha de cima.Com o arquivo
.envda seção 2, remova o blocoenvinteiro e apague a vírgula que sobrar depois do]deargs.
Encerre o Claude Desktop e abra de novo. Fechar a janela não basta, porque o app continua rodando com a configuração antiga. No macOS, use Cmd+Q. No Windows, clique com o botão direito no ícone do Claude na bandeja do sistema e escolha Sair.
Numa conversa nova, peça "liste os apps que você enxerga no App Store Connect". Se o servidor estiver funcionando, o Claude chama a ferramenta
list_appse mostra os apps. Se der erro, veja o log do servidor:macOS:
~/Library/Logs/Claude/mcp-server-app-store-connect.logWindows:
%APPDATA%\Claude\logs\mcp-server-app-store-connect.log
Outros clientes MCP aceitam o mesmo bloco mcpServers do passo 3 no arquivo de configuração deles.
O uvx faz cache do build: para atualizar após novos commits, rode o comando uma vez com --refresh. Para fixar uma versão, aponte para uma tag ou commit: git+https://...@<tag-ou-sha>.
A partir de um clone local (desenvolvimento)
Os comandos são iguais no macOS e no Windows:
git clone https://github.com/brunosemfio/mcp-app-store-connect.git
cd mcp-app-store-connect
uv sync
uv run app-store-connect-mcp # stdio (padrão)
uv run app-store-connect-mcp --transport streamable-http --port 8000Para registrar no cliente MCP, use como comando o executável que o uv sync cria dentro do clone:
macOS:
/caminho/do/clone/.venv/bin/app-store-connect-mcpWindows:
C:\caminho\do\clone\.venv\Scripts\app-store-connect-mcp.exe
Desenvolvimento
uv sync --extra dev # ou: pip install -e '.[dev]'
uv run pytest # testes unitários (offline, com fakes)
uv run ruff check app_store_connect_mcp tests
uv run mypy app_store_connect_mcp
# Testes de integração (batem na API real; precisam de credenciais):
APP_STORE_CONNECT_KEY_ID=... APP_STORE_CONNECT_ISSUER_ID=... \
APP_STORE_CONNECT_PRIVATE_KEY_PATH=... uv run pytest -m integrationNo PowerShell, defina as variáveis antes do comando:
$env:APP_STORE_CONNECT_KEY_ID = "..."
$env:APP_STORE_CONNECT_ISSUER_ID = "..."
$env:APP_STORE_CONNECT_PRIVATE_KEY_PATH = "C:\caminho\AuthKey.p8"
uv run pytest -m integrationO CI (GitHub Actions, branch main) roda ruff, mypy e a suíte unitária com cobertura mínima de 65% em Python 3.10 e 3.12.
Exemplos de perguntas
"Quantas sessões o app teve por dia no último relatório diário?"
"Baixe o relatório de instalações e exclusões e compare com o mês passado."
"Quantas unidades vendemos em 2026-08 e quanto entrou de proceeds?"
"Quais as avaliações 1 estrela mais recentes no Brasil?"
Notas
O token JWT é ES256, vive 15 minutos e é reaproveitado entre chamadas — bem abaixo do limite de 20 minutos da Apple.
Os relatórios de analytics vêm como TSV comprimido em gzip; sales e finance também. O servidor descompacta, detecta o separador (tab ou vírgula) e devolve as linhas em JSON, com
truncatedquandomax_rowsé atingido.max_bytesé aplicado no download e de novo após a descompressão, então um gzip pequeno que explode em disco não passa.Relatórios grandes vêm partidos em vários segmentos;
download_report_instanceefetch_analytics_reportjuntam todos até o limite de linhas.As URLs de segmento expiram em 5 minutos: liste e baixe na mesma conversa.
Um request
ONGOINGrecém-criado não tem dados no mesmo dia, e a Apple para de gerar relatórios de requests inativos —stoppedDueToInactivitysinaliza isso emlist_report_requests.Datas de Sales and Trends seguem a frequência:
YYYY-MM-DD(diário/semanal),YYYY-MM(mensal),YYYY(anual); o servidor valida o formato antes de chamar a API.Fora
create_report_request, nada aqui escreve no App Store Connect.
Available Tools
14 toolscreate_report_requestA
Enable analytics reports for an app by creating a report request.
This is the only write operation in this server, and it is required once per app: without a request App Store Connect generates no reports. ONGOING requests start producing data the day after creation; ONE_TIME_SNAPSHOT returns the available historical data.
Inputs: app_id (required), access_type. Returns: object
download_finance_reportARead-onlyIdempotent
Download a finance report (payments and proceeds) as parsed rows.
Inputs: report_date (required), max_rows, max_bytes, region_code, +2 more. Returns: object
download_report_instanceARead-onlyIdempotent
Download every segment of a report instance and return the parsed rows.
Inputs: instance_id (required), max_rows, max_bytes. Returns: object
download_sales_reportARead-onlyIdempotent
Download a Sales and Trends report and return it as parsed rows.
Covers units sold, proceeds, installs, subscriptions, subscribers and offer code redemptions. See list_sales_report_types for the valid combinations.
Inputs: frequency (required), report_date (required), report_type (required), report_sub_type (required), +4 more. Returns: object
fetch_analytics_reportARead-onlyIdempotent
Fetch one analytics report end to end: request, report, instance, rows.
Resolves the app's report request, finds the report by name, picks the instance (the latest processing date unless one is given) and downloads its segments. Call list_reports first if you do not know the exact report name.
Inputs: app_id (required), report_name (required), max_rows, max_bytes, +3 more. Returns: object
get_perf_power_metricsARead-onlyIdempotent
Get the Xcode power and performance metrics of an app's recent versions.
Covers launch time, hangs, memory, disk writes, battery and terminations, aggregated from devices that opted into sharing diagnostics.
Inputs: app_id (required), platform, device_type, metric_type. Returns: object
list_appsARead-onlyIdempotent
List the apps the configured API key can access.
Use this first to discover the numeric app IDs the other tools take.
Inputs: name, limit, cursor, bundle_id. Returns: object
list_customer_reviewsARead-onlyIdempotent
List App Store customer reviews of an app.
Inputs: app_id (required), sort, limit, cursor, +2 more. Returns: object
list_report_categoriesARead-onlyIdempotent
Describe the Analytics Reports categories and how the API is structured.
commonReports lists the names Apple ships for most apps; the full set
depends on the app and changes over time, so confirm with list_reports.
Standard reports are pre-aggregated; Detailed ones break the same data down
by more dimensions and are much larger.
Inputs: no named parameters. Returns: object
list_report_instancesARead-onlyIdempotent
List the instances of a report: one per granularity and processing date.
Inputs: report_id (required), limit, cursor, granularity, +1 more. Returns: object
list_report_requestsBRead-onlyIdempotent
List the analytics report requests that exist for an app.
Inputs: app_id (required), limit, access_type. Returns: object
list_reportsARead-onlyIdempotent
List the reports available inside an analytics report request.
Inputs: request_id (required), name, limit, cursor, +1 more. Returns: object
list_report_segmentsARead-onlyIdempotent
List the segments of a report instance, each with a download URL.
Large reports are split into several segments. The URLs expire 5 minutes after this call; download_report_instance fetches and parses them for you.
Inputs: instance_id (required), limit. Returns: object
list_sales_report_typesARead-onlyIdempotent
List the valid reportType/reportSubType/frequency/version combinations of download_sales_report. Other combinations are rejected by the API.
Inputs: no named parameters. Returns: object
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 14 tools
The analytics report tools form a clear hierarchical pipeline (request -> report -> instance -> segments -> download), and sales/finance/reviews/perf tools are distinct. However, fetch_analytics_report overlaps with download_report_instance as a convenience wrapper, and list_report_categories could be mistaken for a concrete report-listing tool.
All tools use a consistent snake_case verb_noun pattern: list_*, create_*, download_*, fetch_*, get_*. The compound nouns (report_instances, report_segments, sales_report_types) are uniform and readable.
14 tools is a well-scoped size for a reporting-focused App Store Connect server. Each tool maps to a distinct API operation or hierarchy step, with no obvious redundancy or bloat.
The read/reporting workflows are covered end-to-end: apps, report requests, report discovery, instance/segment download, sales/finance reports, reviews, and performance metrics. Minor gaps exist, such as no update/delete for report requests, no finance report type discovery tool, and only a list operation for reviews.
Maintenance
Related MCP Connectors
Read products, sales, subscribers and offer codes; verify, enable and disable product licenses.
Read-only revenue analytics from Stripe, Paddle, Polar, Lemon Squeezy, Creem and Freemius.
Read-only analytics for your Shopify apps: MRR, churn, uninstall reasons, App Store rank, reviews.
Read-only analytics for short-term rentals: bookings, occupancy, forecasts, reviews, owner payouts.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables analysis and management of iOS/macOS apps via the App Store Connect API, including app management, reviews, sales reports, analytics, performance metrics, and TestFlight.14 npm2MIT
- AlicenseNot gradedqualityDmaintenanceMCP server for App Store Connect that enables reading app/version data, analytics reports, sales/finance reports, and safely preparing metadata updates via natural language.MIT
- FlicenseNot gradedqualityCmaintenanceEnables querying and managing Apple App Store Connect resources such as apps, builds, TestFlight groups, reviews, sales reports, and more through MCP tools, with support for multiple Apple accounts and both remote and local deployment modes.9 npm-
- AlicenseAqualityBmaintenanceLets coding agents manage apps in App Store Connect through workflow-level tools: shipping TestFlight builds, managing testers and groups, editing listings, replacing and reordering screenshots, handling subscriptions, replying to reviews, downloading sales reports, and submitting for App Review. It is read-only unless writes are explicitly enabled, and destructive actions run as dry runs until confirmed.31MIT