Publicera spel från din AI-app med PlayDrops MCP
Så publicerar AI-agenter på PlayDrop via MCP: den enkla vägen och paketvägen, privat testning, publish_game_version, uppdateringar, gränser och felhantering.
PlayDrops MCP-server låter en AI-app publicera ett spel på användarens PlayDrop-konto och returnera en länk som fortsätter fungera genom uppdateringar. Den här guiden visar arbetsordningen. Varje steg länkar till guiden med detaljerna.
Innan du bygger
- Anropa
get_documentation({topic:"index"})och läs guiderna för de funktioner som spelet ska använda, innan du skriver kod. Att planera helskärmslayout, sparningar och kontroller från början gör att du slipper skriva om spelet senare. Exakta metodsignaturer finns i ämnenasdk-types,server-sdk-typesochshared-types. - Anropa
list_games. Om spelet redan finns uppdaterar du det och behåller dessname, så att det behåller sin länk och sina spelare. - Välj väg. En fristående HTML-fil utan PlayDrop-SDK:t använder den enkla vägen. Allt annat, inklusive alla SDK-funktioner, media för spelsidan eller en server, använder ett paket.
Behåll skaparens källprojekt själv. PlayDrop tar bara emot det byggda resultatet: det är ingen säkerhetskopia av källkoden och kan inte lämna tillbaka källkod.
Den enkla vägen: upload_game
Skicka requestId, hela HTML-koden (högst 10 MiB, 10 485 760 UTF-8-byte) och en minikatalog. Skicka gameId för att uppdatera ett befintligt spel. Versionsnumret räknas upp automatiskt. Fälten beskrivs i enkla HTML-spel.
Paketvägen: förbered, ladda upp, slutför
Anropa prepare_catalogue_upload med requestId, expectedCurrentVersion och en indataform:
- Mapp:
catalogue(innehållet i catalogue.json) plusfiles, en beskrivning per fil med dess relativa sökväg. En beskrivning innehåller inline-text, en beskrivning av en signerad uppladdning, en koppling till en bilaga ellerreuseav en fil från en bevarad version. - Lokal ZIP eller .play: packa upp den lokalt och skicka sedan catalogue.json från roten och filbeskrivningarna för mappen. Lägg aldrig arkivets byte som base64 i ett verktygsanrop.
- Bilaga i ChatGPT: skicka den ZIP eller .play som värden löste upp som
archive, med dess riktigadownload_urlochfile_id. Den får vara upp till 20 MiB komprimerad och behöver catalogue.json i roten.
För signerade uppladdningar anger varje beskrivning path, contentType, sizeBytes, sha256 (64 hexadecimala tecken med gemener) och md5Base64, beräknade lokalt från exakt de byte som skickas. Gör PUT med de byten till varje returnerad URL med alla returnerade headers och anropa sedan complete_catalogue_upload med samma requestId.
I ChatGPT kan mappens filer komma från bilagor som kopplas efter position:
attachments: [htmlFile, iconFile]
files: [{path:"index.html", attachmentIndex:0}, {path:"listing/icon.png", attachmentIndex:1, role:"LISTING", app:"my-game"}]Varje app behöver en deklarerad version, en synlighet (i förfrågan eller i appen) och en post i expectedCurrentVersion med appens namn som nyckel: null för att skapa den, eller den aktuella publicerade versionen från list_games för att uppdatera den. Ett inaktuellt värde avvisas, så att en annan uppladdning aldrig skrivs över av misstag.
Testa privat och släpp sedan
Ladda upp med visibility: "private" när spelet använder SDK:t eller en server, eller när din användare vill prova det först. Öppna kvittots url för att spela exakt den versionen i PlayDrop med den riktiga SDK-värden. Funktioner på den hostade servern körs bara i uppladdade versioner, så testa dem på det här sättet.
När det fungerar släpper du exakt den versionen med publish_game_version och skickar gameId, version, expectedCurrentVersion och, om din användare har valt en, visibility (public eller unlisted). Anropet återanvänder de testade filerna, spelsidan och granskningen. Ladda inte upp spelet igen för att släppa det.
För att prova ett lokalt bygge i PlayDrop-ramen innan du laddar upp öppnar du https://www.playdrop.ai/@<username>/<slug>/dev?url=<URL-encoded local address> i en vanlig webbläsare på datorn som kör den lokala servern.
Välj vem som kan spela
visibility accepterar public, unlisted och private. För ett nytt spel utan uttryckligt val använder du skaparens sparade inställning: upload_game tillämpar den när du utelämnar synligheten, och get_account visar den som publishing.defaultVisibility. För en uppdatering behåller du spelets gameVisibility från list_games om inte din användare ändrar den; upload_game gör det när du utelämnar synligheten, och ett paket anger den. Olistad betyder att alla som har länken kan spela; det är ingen vänlista. Gör aldrig ett spel mer synligt än din användare avsåg. Detaljer: vem som kan spela.
Ge tillbaka rätt länk
Kvitton för offentliga och olistade spel innehåller shareUrl, spelets bestående sida: ge den till din användare. En privat version returnerar url, länken till den exakta versionen för ägaren. Paketkvitton listar varje post; slutförda poster förblir publicerade även om en senare post misslyckas.
Uppdatera ett spel
Läs list_games och den aktuella versionen, behåll name och skicka en fullständig ögonblicksbild: alla avsedda filer och all avsedd metadata, eftersom utelämnade fält saknas i den nya versionen. Katalogposter som du utelämnar raderas aldrig. Använd get_game_version för att läsa den exakta katalogen för versionen som du ändrar, inklusive tillståndet för dess Tweaks.
Gränser
- Den enkla vägen: en HTML-fil på högst 10 MiB.
- Paket: 512 filbeskrivningar i en mapp eller 512 poster i ett arkiv (inklusive catalogue.json och mappar), 50 MiB per fil, totalt 200 MiB uppackat och 1 MiB katalog-JSON.
- Arkiv: bara säkra relativa sökvägar; dubbla sökvägar, symboliska länkar samt krypterade, flerdelade och ZIP64-arkiv avvisas.
- Förberedda uppladdningar går ut efter 30 minuter.
Fel och nya försök
Fel innehåller error, message, retryable, nextAction, docsUrl och documentationTopic. Följ nextAction. Efter ett förlorat svar försöker du igen med identiskt innehåll och samma requestId; ändrat innehåll kräver ett nytt. Se fel och åtgärder.
Använd send_feedback för att rapportera ett problem som går att återskapa eller ett förvirrande steg, utan tokens eller signerade URL:er.