# Publique jogos pelo seu app de IA com o MCP do PlayDrop

Como agentes de IA publicam no PlayDrop por MCP: caminho simples e de pacote, testes privados, publish_game_version, atualizações, limites e recuperação.

Source: https://www.playdrop.ai/pt-br/create/learn/mcp-publishing

O servidor MCP do PlayDrop permite que um app de IA publique um jogo na conta do PlayDrop da pessoa com quem ele trabalha e devolva um link que continua funcionando depois das atualizações. Este guia mostra a ordem das operações. Cada etapa leva ao guia com os detalhes.

## Antes de desenvolver

1. Chame `get_documentation({topic:"index"})` e leia os guias dos recursos que o jogo vai usar, antes de escrever código. Planejar desde o início o layout em tela cheia, os salvamentos e os controles evita reescrever o jogo depois. Para as assinaturas exatas dos métodos, leia os tópicos `sdk-types`, `server-sdk-types` e `shared-types`.
2. Chame `list_games`. Se o jogo já existir, você vai atualizá-lo e manter o `name` dele, para que ele continue com o mesmo link e os mesmos jogadores.
3. Escolha o caminho. Um único arquivo HTML autocontido sem o SDK do PlayDrop usa [o caminho simples](https://www.playdrop.ai/pt-br/create/learn/html-games). Todo o resto, incluindo qualquer recurso do SDK, mídia da listagem ou um servidor, usa [um pacote](https://www.playdrop.ai/pt-br/create/learn/packaging).

Guarde você mesmo o projeto-fonte do criador. O PlayDrop recebe só o resultado compilado: ele não é um backup do código-fonte e não pode devolvê-lo.

## Caminho simples: upload_game

Envie `requestId`, o HTML completo (no máximo 10 MiB, 10.485.760 bytes em UTF-8) e um minicatálogo. Passe `gameId` para atualizar um jogo existente. As versões aumentam automaticamente. Veja os campos em [jogos em HTML simples](https://www.playdrop.ai/pt-br/create/learn/html-games).

## Caminho de pacote: preparar, enviar, concluir

Chame `prepare_catalogue_upload` com `requestId`, `expectedCurrentVersion` e uma destas formas de entrada:

- **Pasta:** `catalogue` (o conteúdo do catalogue.json) mais `files`, um descritor por arquivo com seu caminho relativo. Um descritor traz `text` embutido, a descrição de um envio assinado, um vínculo com um anexo ou `reuse` de um arquivo de uma versão mantida.
- **ZIP ou .play local:** descompacte-o localmente e depois envie o catálogo da raiz e os descritores da pasta. Nunca coloque os bytes de um arquivo compactado em base64 em uma chamada de ferramenta.
- **Anexo do ChatGPT:** passe como `archive` o ZIP ou .play que o host resolveu, com os `download_url` e `file_id` reais. Ele pode ter até 20 MiB compactado e precisa do catalogue.json na raiz.

Nos envios assinados, cada descritor informa `path`, `contentType`, `sizeBytes`, `sha256` (64 caracteres hexadecimais minúsculos) e `md5Base64`, calculados localmente a partir dos bytes exatos. Faça o PUT desses bytes em cada URL retornada, com todos os cabeçalhos retornados, e depois chame `complete_catalogue_upload` com o mesmo `requestId`.

No ChatGPT, os arquivos da pasta podem vir de anexos vinculados pela posição:

```
attachments: [htmlFile, iconFile]
files: [{path:"index.html", attachmentIndex:0}, {path:"listing/icon.png", attachmentIndex:1, role:"LISTING", app:"my-game"}]
```

Todo app precisa de uma `version` declarada, de uma visibilidade (na solicitação ou no app) e de uma entrada em `expectedCurrentVersion` com o nome dele como chave: `null` para criá-lo ou a versão publicada atual retornada por `list_games` para atualizá-lo. Um valor desatualizado é recusado, para que outro envio nunca seja sobrescrito por acidente.

## Teste em privado e depois lance

Envie com `visibility: "private"` quando o jogo usar o SDK ou um servidor, ou quando a pessoa com quem você trabalha quiser experimentá-lo antes. Abra a `url` do recibo para jogar essa versão exata dentro do PlayDrop, com o host real do SDK. As funções do servidor hospedado só rodam em versões enviadas, então teste-as desse jeito.

Quando tudo funcionar, lance essa versão exata com `publish_game_version`, passando `gameId`, `version`, `expectedCurrentVersion` e, se a pessoa com quem você trabalha tiver escolhido uma, `visibility` (`public` ou `unlisted`). Essa ferramenta reaproveita os arquivos, a listagem e a revisão testados. Não envie o jogo de novo para lançá-lo.

Para experimentar um build local no frame do PlayDrop antes de enviar, abra `https://www.playdrop.ai/@<username>/<slug>/dev?url=<URL-encoded local address>` em um navegador comum, na máquina que roda o servidor local.

## Escolha quem pode jogar

`visibility` aceita `public`, `unlisted` e `private`. Para um jogo novo sem uma escolha, use a configuração salva do criador: `upload_game` a aplica quando você omite a visibilidade, e `get_account` a mostra como `publishing.defaultVisibility`. Para uma atualização, mantenha o `gameVisibility` do jogo retornado por `list_games`, a menos que a pessoa com quem você trabalha o mude; `upload_game` faz isso quando você omite a visibilidade, e um pacote a declara. Não listado significa que qualquer pessoa com o link pode jogar; não é uma lista de amigos. Nunca deixe um jogo mais visível do que a pessoa com quem você trabalha pretendia. Detalhes: [quem pode jogar](https://www.playdrop.ai/pt-br/create/learn/distribution).

## Entregue o link certo

Os recibos de jogos públicos e não listados incluem `shareUrl`, a página permanente do jogo: entregue esse link à pessoa com quem você trabalha. Uma versão privada retorna `url`, o link da versão exata para o dono. Os recibos de pacote listam cada item; os itens concluídos continuam publicados mesmo que um item posterior falhe.

## Atualize um jogo

Leia `list_games` e a versão atual, mantenha o `name` e envie a versão completa: todos os arquivos e todos os metadados pretendidos, porque os campos omitidos não existem na nova versão. Os itens do catálogo omitidos nunca são excluídos. Use `get_game_version` para ler o catálogo exato da versão que você está alterando, incluindo o estado dos valores ajustáveis pelo criador.

## Limites

- Caminho simples: um arquivo HTML de no máximo 10 MiB.
- Pacote: 512 descritores de arquivo na pasta ou 512 entradas no arquivo compactado (incluindo o catalogue.json e os diretórios), 50 MiB por arquivo, 200 MiB descompactados no total e 1 MiB de JSON do catálogo.
- Arquivos compactados: só caminhos relativos seguros; caminhos duplicados, links simbólicos e arquivos criptografados, de vários volumes ou ZIP64 são recusados.
- Os envios preparados expiram depois de 30 minutos.

## Erros e novas tentativas

Os erros trazem `error`, `message`, `retryable`, `nextAction`, `docsUrl` e `documentationTopic`. Siga `nextAction`. Depois de uma resposta perdida, repita o conteúdo idêntico com o mesmo `requestId`; conteúdo alterado precisa de um novo. Veja [erros e recuperação](https://www.playdrop.ai/pt-br/create/learn/errors).

Use `send_feedback` para relatar um problema reproduzível ou uma etapa confusa, sem tokens nem URLs assinadas.

## Guias relacionados

- [Jogos em HTML simples](https://www.playdrop.ai/pt-br/create/learn/html-games): Publique um único arquivo HTML autocontido de até 10 MiB com upload_game: o que cabe, minicatálogo, visibilidade, atualizações e quando mudar para um pacote.
- [Empacotamento e .play](https://www.playdrop.ai/pt-br/create/learn/packaging): Organize uma pasta, ZIP ou .play compilado com o catalogue.json na raiz, declare a mídia da listagem e os servidores e envie com prepare_catalogue_upload.
- [Visibilidade e alcance](https://www.playdrop.ai/pt-br/create/learn/distribution): Escolha quem pode abrir seu jogo, entenda o padrão da conta e a publicação de versões e como Boost, troca de partidas, Instantâneo e busca trazem jogadores.
- [Erros e recuperação](https://www.playdrop.ai/pt-br/create/learn/errors): O formato de erro das ferramentas MCP do PlayDrop, quando repetir com o mesmo requestId e a correção para cada código de erro comum.
