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.
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
- 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ópicossdk-types,server-sdk-typeseshared-types. - Chame
list_games. Se o jogo já existir, você vai atualizá-lo e manter onamedele, para que ele continue com o mesmo link e os mesmos jogadores. - Escolha o caminho. Um único arquivo HTML autocontido sem o SDK do PlayDrop usa o caminho simples. Todo o resto, incluindo qualquer recurso do SDK, mídia da listagem ou um servidor, usa um pacote.
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.
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) maisfiles, um descritor por arquivo com seu caminho relativo. Um descritor traztextembutido, a descrição de um envio assinado, um vínculo com um anexo oureusede 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
archiveo ZIP ou .play que o host resolveu, com osdownload_urlefile_idreais. 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.
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.
Use send_feedback para relatar um problema reproduzível ou uma etapa confusa, sem tokens nem URLs assinadas.