Skip to main content
Glama
brunosemfio

Upload App MCP Server

by brunosemfio

Upload App MCP Server

Servidor MCP (Model Context Protocol) para enviar um .aab para uma faixa de teste da Google Play ou um .ipa para o TestFlight e depois promover para produção. O servidor não gera o build: cada projeto de app gera o próprio arquivo, e as ferramentas só recebem o caminho. Por baixo, o servidor roda lanes do fastlane que vêm dentro do pacote.

Ferramentas expostas

  • upload_android — envia um .aab para uma faixa de teste (internal, alpha, beta ou o nome de uma faixa fechada personalizada; padrão internal)

  • promote_android — promove um version code de uma faixa de teste para produção, com rollout gradual e notas da versão opcionais

  • update_rollout_android — muda a fração de uma release de produção, completa o rollout com 1 ou para a release com halt=true

  • status_android — lista as releases de cada faixa, com version codes, status e fração do rollout

  • upload_ios — envia um .ipa para o TestFlight, sem esperar o processamento da Apple

  • release_ios — anexa um build do TestFlight a uma versão da App Store, cria a versão se ela não existir e envia para review, com as novidades da versão opcionais

  • status_ios — mostra as últimas versões da App Store com o estado de cada uma e os últimos builds com o estado do processamento

promote_android, update_rollout_android e release_ios só publicam com confirm=true. Sem ele, as duas ferramentas do Android validam a mudança na Google Play sem publicar nada, e release_ios só descreve o que vai fazer.

Related MCP server: appstore-connect-mcp

Pré-requisitos

Funciona só no macOS, porque o envio para o TestFlight depende do Xcode.

  • uv: baixa e executa o servidor. Se a máquina não tiver Python 3.10 ou mais novo, o uv baixa um sozinho.

  • git: o uvx usa o git para baixar o código deste repositório.

  • fastlane: faz os envios para as lojas.

  • Xcode: necessário para upload_ios.

Com Homebrew:

brew install uv git fastlane

Configuração

1. Google Play

  1. No Google Cloud, habilite a Google Play Android Developer API, crie uma service account e baixe a chave JSON.

  2. No Play Console, em Usuários e permissões → Convidar novo usuário, convide o e-mail da service account com as permissões de lançamento em faixas de teste e em produção nos apps desejados.

  3. Guarde a chave num local fixo e anote o caminho completo. O caminho vai na variável GOOGLE_APPLICATION_CREDENTIALS quando você registrar o servidor no cliente MCP.

Se você já criou o arquivo ~/.config/google-play-console/.env para o mcp-google-play-console, este servidor lê o mesmo arquivo. Acrescente ao arquivo o caminho da chave de publicação na variável SUPPLY_JSON_KEY:

echo 'SUPPLY_JSON_KEY=/Users/voce/keys/play-publisher.json' >> ~/.config/google-play-console/.env

Se a mesma service account publica e lê relatórios, use o mesmo caminho do PLAY_CONSOLE_CREDENTIALS. Para usar outro arquivo, defina PLAY_CONSOLE_ENV_FILE com o caminho dele. Variáveis já definidas no ambiente têm prioridade sobre o arquivo, mas o SUPPLY_JSON_KEY do arquivo tem prioridade sobre o GOOGLE_APPLICATION_CREDENTIALS do ambiente.

2. App Store Connect

O servidor usa as mesmas variáveis do mcp-app-store-connect:

Variável

Valor

APP_STORE_CONNECT_KEY_ID

Key ID da chave, ex. 2X9R4HXF34

APP_STORE_CONNECT_ISSUER_ID

Issuer ID, ex. 57246542-96fe-1a63-e053-0824d011072a

APP_STORE_CONNECT_PRIVATE_KEY_PATH

Caminho completo do .p8

Se você já criou o arquivo ~/.config/app-store-connect/.env para aquele servidor, este lê o mesmo arquivo e não precisa de mais nada. Para usar outro arquivo, defina APP_STORE_CONNECT_ENV_FILE com o caminho dele. Variáveis já definidas no ambiente têm prioridade sobre o arquivo.

A chave precisa da função App Manager ou Admin para enviar builds para review.

Instalação e uso

Claude Code

  1. Registre o servidor. O --scope user deixa o servidor disponível em qualquer pasta.

    claude mcp add --scope user upload-app \
      --env GOOGLE_APPLICATION_CREDENTIALS=/Users/voce/keys/play-publisher.json \
      -- uvx --from git+https://github.com/brunosemfio/mcp-upload-app.git upload-app-mcp

    Se a chave do Google Play estiver no arquivo .env, remova a linha de --env.

  2. Rode claude mcp list. O upload-app deve aparecer como conectado.

Para trocar algum valor, remova o servidor com claude mcp remove --scope user upload-app e registre de novo.

Claude Desktop

Abra o arquivo de configuração em Settings → Developer → Edit Config e adicione o servidor dentro de mcpServers:

{
  "mcpServers": {
    "upload-app": {
      "command": "/opt/homebrew/bin/uvx",
      "args": [
        "--from",
        "git+https://github.com/brunosemfio/mcp-upload-app.git",
        "upload-app-mcp"
      ],
      "env": {
        "GOOGLE_APPLICATION_CREDENTIALS": "/Users/voce/keys/play-publisher.json",
        "PATH": "/opt/homebrew/bin:/usr/bin:/bin"
      }
    }
  }
}
  • Troque /opt/homebrew/bin/uvx pelo resultado de which uvx.

  • O PATH deixa o servidor encontrar o fastlane. O Claude Desktop aberto pelo Dock não enxerga o PATH do terminal.

  • Se a chave do Google Play estiver no arquivo .env, remova a linha do GOOGLE_APPLICATION_CREDENTIALS.

Encerre o Claude Desktop com Cmd+Q e abra de novo para carregar a configuração.

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)

git clone https://github.com/brunosemfio/mcp-upload-app.git
cd mcp-upload-app
uv sync
uv run upload-app-mcp

Para registrar no cliente MCP, use como comando o executável que o uv sync cria dentro do clone: /caminho/do/clone/.venv/bin/upload-app-mcp.

Desenvolvimento

uv sync --extra dev
uv run pytest
uv run ruff check upload_app_mcp tests
uv run mypy upload_app_mcp

Os testes não chamam o fastlane nem as lojas. O CI (GitHub Actions, branch main) roda ruff, mypy e a suíte com cobertura mínima de 65% em Python 3.10 e 3.12.

Exemplos de perguntas

  • "Envie /caminho/app-release.aab para a faixa internal do com.example.app."

  • "Promova o version code 42 do com.example.app para produção com rollout de 20% e a nota 'Correções de bugs'."

  • "O crash rate da versão 42 subiu. Pare o rollout."

  • "O build 15 do com.example.app já terminou de processar? Se sim, envie a versão 1.2.0 para review."

Notas

  • upload_ios não espera o processamento da Apple, que costuma levar de 10 a 30 minutos. Use status_ios: o build só pode ir para review quando estiver VALID.

  • Sem release_notes, release_ios não altera os metadados da versão, e as novidades precisam estar preenchidas no App Store Connect. Com release_notes, o texto vai para todos os idiomas da versão publicada, ou para o idioma principal do app se ainda não houver versão publicada.

  • No promote_android, locale é o código de idioma da Play para as notas da versão, por padrão pt-BR.

  • O Info.plist do app precisa declarar ITSAppUsesNonExemptEncryption; sem isso, a Apple pede a conformidade de exportação e o envio para review falha.

  • rollout aceita valores maiores que 0 e até 1. Abaixo de 1, a release entra em produção como lançamento gradual. Para retomar uma release parada, chame update_rollout_android com uma nova fração.

  • Cada ferramenta devolve as últimas 40 linhas da saída do fastlane e tem timeout de 30 minutos.

Available Tools

7 tools
promote_androidA

Promote a version code from a Google Play test track to production. A rollout below 1 starts a staged rollout. release_notes sets the release notes in the given Play language code. Without confirm=true it only validates with Google Play and publishes nothing.

ParametersJSON Schema
NameRequiredDescriptionDefault
localeNopt-BR
confirmNo
rolloutNo
from_trackNointernal
package_nameYes
version_codeYes
release_notesNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well on the highest-risk trait: without confirm=true it only validates and publishes nothing, which prevents accidental production deploys. It also explains staged-rollout semantics for sub-1 values. It omits auth/permission requirements, whether an existing production release is replaced, and whether the promotion can be halted after the fact.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with the action, then the rollout rule, then the safety gate. No filler and no repetition of schema structure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The output schema covers return values and the description covers the dry-run gate, so the core is present. But for a 7-parameter production-mutation tool with zero annotations and zero schema descriptions, missing notes on the source-track default, locale default, and permission/irreversibility leave the agent short of fully safe invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate and it only partially does. It gives real semantics for confirm, rollout, and release_notes, and 'given Play language code' implicitly explains locale, but from_track (defaulting to internal), the non-obvious locale default of pt-BR, and the exact meaning of package_name/version_code are left to inference.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource with scope: promoting a version code from a Play test track to production. This is distinguishable from upload_android (which pushes artifacts) and update_rollout_android (which adjusts an existing rollout), though it never names a sibling explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied rather than stated: the confirm=true gate tells the agent a dry-run pass comes first, and 'a rollout below 1 starts a staged rollout' hints at when to use partial rollout. There is no explicit statement of when to prefer update_rollout_android instead of a fresh promotion, nor any prerequisite about the version already existing on the source track.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

release_iosA

Attach a TestFlight build to an App Store version, creating the version if needed, and submit it for review. release_notes sets What's New in every language of the live version. Without confirm=true it only describes what it would do.

ParametersJSON Schema
NameRequiredDescriptionDefault
confirmNo
app_versionYes
build_numberYes
release_notesNo
app_identifierYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full load and does well: it discloses that the version may be created as a side effect, that the tool submits for review (an external, non-trivial action), and that release_notes overwrites What's New in every language of the live version. It omits permission/auth requirements and whether a submitted review can be withdrawn.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the action, then the side effect, then the safety gate. No filler; each sentence adds information an agent needs.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, and the description covers the dry-run gate, version creation, and live-version side effects. Gaps remain around auth/prerequisites and failure or rollback behavior for a review submission.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate. It explains confirm (dry-run gate) and release_notes (all-languages What's New) precisely, but leaves app_identifier, app_version, and build_number to inference with no format hints (bundle ID vs numeric App Store ID, build vs version string).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb chain and resource: attach a TestFlight build to an App Store version, create the version if missing, and submit for review. That is clearly distinct from upload_ios or status_ios in substance, but the description never names a sibling to route against.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The line 'Without confirm=true it only describes what it would do' gives useful invocation guidance for a dry run, but there is no explicit when-to-use-this-vs-alternatives statement (e.g., after upload_ios, instead of manual promotion). Usage context is implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

status_androidB

List the Google Play releases of every track with version codes, status and rollout fraction.

ParametersJSON Schema
NameRequiredDescriptionDefault
package_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are given, so the description carries the burden; 'List' implies a read-only operation and the sentence discloses what data is returned (version codes, status, rollout fraction). However, it says nothing about permissions, auth scope, pagination, or behavior when the app has no releases.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single well-formed sentence with the key details front-loaded and no filler. Nothing is wasted, though it could be augmented without bloat.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values needn't be explained, and the shape of the tool is simple. Still, the required package_name parameter is entirely undocumented, which is a meaningful gap for the agent invoking it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the description never mentions the sole required parameter, package_name. An agent must guess that this string is the Android application's package identifier and what format it takes.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: list Google Play releases of every track, including version codes, status and rollout fraction. The 'Google Play' scope distinguishes it from the sibling status_ios, though it doesn't name the sibling explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no explicit when-to-use guidance, no mention of alternatives such as status_ios or promote_android, and no stated preconditions. The agent must infer the usage context solely from the tool name and the phrase 'every track'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

status_iosB

Show the latest App Store versions with their state and the latest builds with their processing state. A build can be submitted only after it is VALID.

ParametersJSON Schema
NameRequiredDescriptionDefault
app_identifierYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the burden. 'Show' signals a read operation and the description names what is returned (version state, build processing state), but it says nothing about permissions, scope of the query, or whether builds from all versions are included.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, both informative, with the return content front-loaded. The second sentence is a prerequisite note that only loosely belongs to this read tool but is short enough not to be waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need not be described, and there is only one parameter. However, the identifier format ambiguity and the absence of any statement about read-only/non-mutating behavior leave small but real gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the single parameter app_identifier is never mentioned in the description. The name is largely self-explanatory, but whether it expects a bundle ID, numeric App Store ID, or app name is left ambiguous.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Show') and specific resources (App Store versions with state, latest builds with processing state). The 'App Store' framing implicitly distinguishes it from status_android, though it never names the sibling or says 'iOS' explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The note 'A build can be submitted only after it is VALID' implies a workflow use (check status before upload/release), but it never explicitly says when to call this tool versus upload_ios or release_ios. Usage is inferable rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_rollout_androidA

Change a Google Play production release: a new rollout fraction, 1 to complete it, or halt=true to stop it. Without confirm=true it only validates with Google Play and publishes nothing.

ParametersJSON Schema
NameRequiredDescriptionDefault
haltNo
confirmNo
rolloutNo
package_nameYes
version_codeYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well: it discloses the critical safety behavior that without confirm=true the call only validates against Google Play and publishes nothing, and it explains that halt stops a rollout rather than advancing it. Gaps remain on required OAuth/permission scope and whether a halted or completed rollout is reversible.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single tight sentence, front-loaded with the verb and resource, then the three outcome modes, then the safety caveat. No filler and nothing buried.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with zero annotations, the description covers the highest-risk unknown (dry-run by default) and the mode selection, and an output schema exists so return values need no prose. What's still missing is permission/auth requirements and the effect of competing or concurrent rollout changes, which matters for a production release operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across five parameters, so the description must compensate and largely does: it defines rollout as a fraction where 1 means complete, defines halt=true, and defines confirm=true as the publish gate. Only package_name and version_code are left unelaborated, which is acceptable since they are self-evident identifiers.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb (change) and a specific resource (a Google Play production release's rollout), and enumerates the three distinct outcomes it can produce (set fraction, complete at 1, halt). This is enough for an agent to tell it apart from upload_android, promote_android, and status_android without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage through its parameter narrative ('1 to complete it, or halt=true to stop it') and the confirm behavior, but never states when to choose this tool over the closely related promote_android or release_ios siblings. There are no explicit exclusions or prerequisites, so the agent must infer the routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upload_androidB

Upload an .aab to a Google Play test track: internal, alpha, beta or the name of a custom closed track.

ParametersJSON Schema
NameRequiredDescriptionDefault
trackNointernal
aab_pathYes
package_nameYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden but only states the destination and track options. It does not disclose authentication or permission requirements, overwrite or version-conflict behavior, whether custom tracks must already exist, or likely failure modes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded sentence that states the action, artifact, destination, and valid track choices without waste. Every phrase contributes useful selection or invocation context.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an upload mutation with no annotations and 0% schema description coverage, the description is too thin operationally. It covers purpose and track selection, but omits permissions, conflict handling, and other prerequisites an agent needs to invoke it safely; the output schema does not need explanation, but invocation context is incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate for all parameter meaning. It usefully clarifies the track values (internal, alpha, beta, custom closed track name) and implies aab_path refers to an .aab file, but it does not explain package_name format or path constraints for the two required parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific action (upload), artifact (.aab), and destination (Google Play test track), and enumerates track types. The Android-specific scope and test-track focus clearly distinguish it from upload_ios and from promotion/rollout siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The context implies use for uploading Android app bundles to a test track, but there is no explicit guidance on when to use this versus promote_android or update_rollout_android, nor when not to use it such as for production. The valid tracks are listed, but alternatives and exclusions are left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upload_iosC

Upload an .ipa to TestFlight without waiting for Apple's processing.

ParametersJSON Schema
NameRequiredDescriptionDefault
ipa_pathYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It usefully discloses that the tool returns before Apple finishes processing, which is a meaningful behavioral trait for a mutation tool, but it omits authentication requirements, whether an existing build is replaced, and what happens to the uploaded artifact.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single efficient sentence with the core action front-loaded. It is appropriately sized for a one-parameter tool, though the phrase about Apple's processing could be clearer.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be explained, but the description still lacks essential context for a mutation tool with no annotations: permissions, processing behavior details, and relationship to sibling tools like release_ios. Given the 0% parameter coverage, this leaves too much undocumented.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single required parameter ipa_path has 0% schema description coverage. The description does not clarify whether the path is local, absolute, remote, or what format is expected, so it does not compensate for the documentation gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: upload an .ipa to TestFlight. This is clearer than a generic 'upload' and implicitly distinguishes from upload_android, though it doesn't explicitly distinguish from release_ios or status_ios.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to use this versus release_ios, status_ios, or other siblings. The phrase 'without waiting for Apple's processing' hints at an async workflow but doesn't state prerequisites or when-not-to-use conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 7 tool updatesv0.1.0
    • First observedpromote_android
    • First observedrelease_ios
    • First observedstatus_android
    • First observedstatus_ios
    • First observedupdate_rollout_android
    • First observedupload_android
    • First observedupload_ios

TDQS

A3.7/5.0

Scored across 7 tools

Disambiguation5/5

Each tool maps to a distinct platform and lifecycle action: iOS status/upload/release versus Android upload/promote/rollout-update/status. The closest overlap, promote_android and update_rollout_android, is clarified by one promoting to production and the other modifying an existing production rollout.

Naming Consistency5/5

All names use snake_case with a clear action plus platform suffix pattern (status_ios, upload_android, promote_android, release_ios, etc.). The convention is predictable across both platforms.

Tool Count5/5

Seven tools is well-scoped for a mobile app upload/release server. Each tool covers a meaningful lifecycle operation without redundant variants.

Completeness4/5

The surface covers core upload, status, promotion, rollout, and review-submission workflows for both iOS and Android. Minor gaps remain, such as Android build-processing status and iOS review cancellation, but the main lifecycle is covered.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers