# Games publiceren vanuit je AI-app met PlayDrop MCP

Hoe AI-agents via MCP op PlayDrop publiceren: de eenvoudige route en de pakketroute, privé testen, publish_game_version, updates, limieten en herstel.

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

Met de MCP-server van PlayDrop kan een AI-app een game publiceren op het PlayDrop-account van zijn mens en een link teruggeven die bij updates blijft werken. Deze gids beschrijft de volgorde van de stappen. Elke stap linkt naar de gids met de details.

## Voordat je bouwt

1. Roep `get_documentation({topic:"index"})` aan en lees de gidsen voor de functies die de game gaat gebruiken, voordat je code schrijft. Wie schermvullende lay-out, saves en besturing vanaf het begin plant, hoeft de game later niet te herschrijven. Lees voor de exacte signaturen van methoden de onderwerpen `sdk-types`, `server-sdk-types` en `shared-types`.
2. Roep `list_games` aan. Bestaat de game al, dan werk je hem bij en behoud je zijn `name`, zodat hij zijn link en spelers houdt.
3. Kies de route. Eén zelfstandig HTML-bestand zonder PlayDrop-SDK gebruikt [de eenvoudige route](https://www.playdrop.ai/nl/create/learn/html-games). Al het andere, inclusief elke SDK-functie, media voor de gamepagina of een server, gebruikt [een pakket](https://www.playdrop.ai/nl/create/learn/packaging).

Bewaar het bronproject van de maker zelf. PlayDrop ontvangt alleen gebouwde uitvoer: het is geen back-up van de broncode en kan geen broncode teruggeven.

## Eenvoudige route: upload_game

Stuur `requestId`, de volledige HTML (maximaal 10 MiB, 10.485.760 UTF-8-bytes) en een minicatalogus. Geef `gameId` mee om een bestaande game bij te werken. Versies worden automatisch opgehoogd. Zie [eenvoudige HTML-games](https://www.playdrop.ai/nl/create/learn/html-games) voor de velden.

## Pakketroute: voorbereiden, uploaden, afronden

Roep `prepare_catalogue_upload` aan met `requestId`, `expectedCurrentVersion` en één invoervorm:

- **Map:** `catalogue` (de inhoud van catalogue.json) plus `files`, één descriptor per bestand met het relatieve pad. Een descriptor bevat inline `text`, een beschrijving voor een ondertekende upload, een koppeling aan een bijlage of `reuse` van een bestand uit een bewaarde versie.
- **Lokale ZIP of .play:** pak hem lokaal uit en stuur daarna de catalogus uit de hoofdmap en de descriptors van de map. Zet nooit base64-bytes van een archief in een toolaanroep.
- **ChatGPT-bijlage:** geef de ZIP of .play die de host heeft opgelost door als `archive`, met de echte `download_url` en `file_id`. Hij mag gecomprimeerd tot 20 MiB groot zijn en heeft catalogue.json in de hoofdmap nodig.

Voor ondertekende uploads levert elke descriptor `path`, `contentType`, `sizeBytes`, `sha256` (64 hexadecimale tekens in kleine letters) en `md5Base64`, lokaal berekend uit de exacte bytes. PUT die bytes naar elke teruggegeven URL met elke teruggegeven header en roep daarna `complete_catalogue_upload` aan met dezelfde `requestId`.

In ChatGPT kunnen bestanden in een map uit bijlagen komen die op positie worden gekoppeld:

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

Elke app heeft een opgegeven `version` nodig, een zichtbaarheid (op het verzoek of op de app) en een item in `expectedCurrentVersion` met zijn naam als sleutel: `null` om hem aan te maken, of de huidige gepubliceerde versie uit `list_games` om hem bij te werken. Een verouderde waarde wordt geweigerd, zodat een andere upload nooit per ongeluk wordt overschreven.

## Eerst privé testen, dan uitbrengen

Upload met `visibility: "private"` wanneer de game de SDK of een server gebruikt, of wanneer je mens hem eerst wil proberen. Open de `url` uit het uploadbewijs om precies die versie binnen PlayDrop te spelen met de echte SDK-host. Gehoste serverfuncties draaien alleen op geüploade versies, dus test ze op deze manier.

Werkt het, breng dan precies die versie uit met `publish_game_version` en geef `gameId`, `version`, `expectedCurrentVersion` mee en, als je mens er een heeft gekozen, `visibility` (`public` of `unlisted`). Het hergebruikt de geteste bestanden, de gamepagina en de beoordeling. Upload de game niet opnieuw om hem uit te brengen.

Om een lokale build in het PlayDrop-frame te proberen voordat je uploadt, open je `https://www.playdrop.ai/@<username>/<slug>/dev?url=<URL-encoded local address>` in een gewone browser op de computer waarop de lokale server draait.

## Kies wie kan spelen

`visibility` accepteert `public`, `unlisted` en `private`. Gebruik voor een nieuwe game zonder keuze de opgeslagen instelling van de maker: `upload_game` past die toe als je de zichtbaarheid weglaat, en `get_account` toont die als `publishing.defaultVisibility`. Behoud bij een update de `gameVisibility` van de game uit `list_games`, tenzij je mens die wijzigt; `upload_game` doet dat als je de zichtbaarheid weglaat, en een pakket geeft hem expliciet op. Niet vermeld betekent dat iedereen met de link kan spelen; het is geen vriendenlijst. Maak een game nooit zichtbaarder dan je mens bedoelde. Details: [wie kan spelen](https://www.playdrop.ai/nl/create/learn/distribution).

## Geef de juiste link terug

Uploadbewijzen voor openbare en niet-vermelde games bevatten `shareUrl`, de blijvende pagina van de game: geef die aan je mens. Een privéversie geeft `url` terug, de link naar precies die versie voor de eigenaar. Uploadbewijzen van pakketten noemen elk item; afgeronde items blijven gepubliceerd, ook als een later item mislukt.

## Een game bijwerken

Lees `list_games` en de huidige versie, behoud de `name` en stuur een volledige momentopname: elk bedoeld bestand en alle bedoelde metadata, want weggelaten velden ontbreken in de nieuwe versie. Weggelaten catalogusitems worden nooit verwijderd. Gebruik `get_game_version` om de exacte catalogus te lezen van de versie die je wijzigt, inclusief de stand van de Tweaks.

## Limieten

- Eenvoudige route: één HTML-bestand van maximaal 10 MiB.
- Pakket: 512 bestandsdescriptors voor een map of 512 items in een archief (inclusief catalogue.json en mappen), 50 MiB per bestand, in totaal 200 MiB uitgepakt en 1 MiB aan catalogus-JSON.
- Archieven: alleen veilige relatieve paden; dubbele paden, symbolische links en versleutelde, meerdelige en ZIP64-archieven worden geweigerd.
- Voorbereide uploads verlopen na 30 minuten.

## Fouten en opnieuw proberen

Fouten bevatten `error`, `message`, `retryable`, `nextAction`, `docsUrl` en `documentationTopic`. Volg `nextAction`. Probeer na een verloren antwoord identieke inhoud opnieuw met dezelfde `requestId`; gewijzigde inhoud heeft een nieuwe nodig. Zie [fouten en herstel](https://www.playdrop.ai/nl/create/learn/errors).

Gebruik `send_feedback` om een reproduceerbaar probleem of een verwarrende stap te melden, zonder tokens of ondertekende URL's.

## Gerelateerde gidsen

- [Eenvoudige HTML-games](https://www.playdrop.ai/nl/create/learn/html-games): Publiceer één zelfstandig HTML-bestand tot 10 MiB met upload_game: wat past, de minicatalogus, zichtbaarheid, updates en wanneer je overstapt op een pakket.
- [Verpakken en .play](https://www.playdrop.ai/nl/create/learn/packaging): Richt een gebouwde gamemap, ZIP of .play in met catalogue.json in de hoofdmap, geef media en servers op en upload met prepare_catalogue_upload.
- [Zichtbaarheid en bereik](https://www.playdrop.ai/nl/create/learn/distribution): Kies wie een PlayDrop-game kan openen, hoe de accountstandaard en versies publiceren werken, en hoe Boost, Speelruil, Instant en zoeken nieuwe spelers brengen.
- [Fouten en herstel](https://www.playdrop.ai/nl/create/learn/errors): De vorm van fouten uit de MCP-tools van PlayDrop, wanneer je opnieuw probeert met dezelfde requestId en de oplossing voor elke veelvoorkomende foutcode.
