# Terbitkan game dari aplikasi AI Anda dengan MCP PlayDrop

Cara agen AI menerbitkan ke PlayDrop lewat MCP: jalur sederhana dan jalur paket, pengujian privat, publish_game_version, pembaruan, batas, dan pemulihan.

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

Server MCP PlayDrop memungkinkan aplikasi AI menerbitkan game ke akun PlayDrop penggunanya dan mengembalikan tautan yang tetap berfungsi di setiap pembaruan. Panduan ini berisi urutan langkahnya. Setiap langkah menautkan ke panduan yang berisi detailnya.

## Sebelum membangun

1. Panggil `get_documentation({topic:"index"})` dan baca panduan untuk fitur yang akan dipakai game, sebelum menulis kode. Merencanakan tata letak layar penuh, simpanan, dan kontrol sejak awal membuat game tidak perlu ditulis ulang nanti. Untuk signature metode yang persis, baca topik `sdk-types`, `server-sdk-types`, dan `shared-types`.
2. Panggil `list_games`. Jika game sudah ada, Anda akan memperbaruinya dan mempertahankan `name`-nya, sehingga game tetap memiliki tautan dan pemainnya.
3. Pilih jalurnya. Satu berkas HTML mandiri tanpa SDK PlayDrop memakai [jalur sederhana](https://www.playdrop.ai/id/create/learn/html-games). Semua yang lain, termasuk fitur SDK apa pun, media listingan, atau server, memakai [paket](https://www.playdrop.ai/id/create/learn/packaging).

Simpan sendiri proyek sumber kreator. PlayDrop hanya menerima hasil build: PlayDrop bukan cadangan sumber dan tidak bisa mengembalikan kode sumber.

## Jalur sederhana: upload_game

Kirim `requestId`, HTML lengkap (maksimal 10 MiB, 10.485.760 byte UTF-8), dan katalog mini. Berikan `gameId` untuk memperbarui game yang sudah ada. Nomor versi naik secara otomatis. Lihat [game HTML sederhana](https://www.playdrop.ai/id/create/learn/html-games) untuk field-nya.

## Jalur paket: siapkan, unggah, selesaikan

Panggil `prepare_catalogue_upload` dengan `requestId`, `expectedCurrentVersion`, dan satu bentuk input:

- **Folder:** `catalogue` (isi catalogue.json) ditambah `files`, satu deskriptor per berkas dengan jalur relatifnya. Deskriptor berisi `text` langsung, deskripsi unggahan bertanda tangan, pengikatan lampiran, atau `reuse` berkas dari versi yang dipertahankan.
- **ZIP lokal atau .play:** ekstrak secara lokal, lalu kirim katalog root dan deskriptor folder. Jangan pernah memasukkan byte arsip base64 ke dalam panggilan alat.
- **Lampiran ChatGPT:** berikan ZIP atau .play yang sudah disediakan host sebagai `archive`, dengan `download_url` dan `file_id` aslinya. Ukurannya boleh hingga 20 MiB terkompresi dan catalogue.json harus berada di root.

Untuk unggahan bertanda tangan, setiap deskriptor menyertakan `path`, `contentType`, `sizeBytes`, `sha256` (64 karakter heksadesimal huruf kecil), dan `md5Base64`, yang dihitung secara lokal dari byte yang persis. Lakukan PUT byte tersebut ke setiap URL yang dikembalikan dengan semua header yang dikembalikan, lalu panggil `complete_catalogue_upload` dengan `requestId` yang sama.

Di ChatGPT, berkas folder bisa berasal dari lampiran yang diikat berdasarkan posisi:

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

Setiap aplikasi memerlukan `version` yang dideklarasikan, visibilitas (di permintaan atau di aplikasi), dan entri di `expectedCurrentVersion` dengan kunci berupa namanya: `null` untuk membuatnya, atau versi terbitan saat ini dari `list_games` untuk memperbaruinya. Nilai yang usang ditolak, sehingga unggahan lain tidak pernah tertimpa secara tidak sengaja.

## Uji secara privat, lalu rilis

Unggah dengan `visibility: "private"` jika game memakai SDK atau server, atau jika pengguna Anda ingin mencobanya terlebih dahulu. Buka `url` di tanda terima untuk memainkan versi yang persis itu di dalam PlayDrop dengan host SDK sungguhan. Fungsi server yang di-hosting hanya berjalan di versi yang sudah diunggah, jadi uji dengan cara ini.

Setelah berfungsi, rilis versi yang persis itu dengan `publish_game_version`, dengan memberikan `gameId`, `version`, `expectedCurrentVersion`, dan, jika pengguna Anda memilihnya, `visibility` (`public` atau `unlisted`). Panggilan ini memakai ulang berkas, listingan, dan tinjauan yang sudah diuji. Jangan mengunggah game lagi untuk merilisnya.

Untuk mencoba build lokal di frame PlayDrop sebelum mengunggah, buka `https://www.playdrop.ai/@<username>/<slug>/dev?url=<URL-encoded local address>` di browser biasa pada komputer yang menjalankan server lokal.

## Pilih siapa yang bisa bermain

`visibility` menerima `public`, `unlisted`, dan `private`. Untuk game baru tanpa pilihan, gunakan pengaturan yang disimpan kreator: `upload_game` menerapkannya saat Anda tidak menyertakan visibilitas, dan `get_account` menampilkannya sebagai `publishing.defaultVisibility`. Untuk pembaruan, pertahankan `gameVisibility` game dari `list_games` kecuali pengguna Anda mengubahnya; `upload_game` melakukannya saat Anda tidak menyertakan visibilitas, sedangkan paket menyatakannya. Tidak publik berarti siapa saja yang punya tautan bisa bermain; ini bukan daftar teman. Jangan pernah membuat game lebih terlihat daripada yang dimaksudkan pengguna Anda. Detail: [siapa yang bisa bermain](https://www.playdrop.ai/id/create/learn/distribution).

## Berikan tautan yang tepat

Tanda terima untuk game publik dan tidak publik menyertakan `shareUrl`, halaman game yang bertahan: berikan tautan itu kepada pengguna Anda. Versi privat mengembalikan `url`, tautan versi persis untuk pemiliknya. Tanda terima paket mencantumkan setiap item; item yang sudah selesai tetap diterbitkan meskipun item berikutnya gagal.

## Perbarui game

Baca `list_games` dan versi saat ini, pertahankan `name`, lalu kirim snapshot lengkap: setiap berkas yang dimaksud dan semua metadata yang dimaksud, karena field yang tidak disertakan tidak ada di versi baru. Item katalog yang tidak disertakan tidak pernah dihapus. Gunakan `get_game_version` untuk membaca katalog persis dari versi yang Anda ubah, termasuk status Tweaks-nya.

## Batas

- Jalur sederhana: satu berkas HTML berukuran maksimal 10 MiB.
- Paket: 512 deskriptor berkas folder atau 512 entri arsip (termasuk catalogue.json dan direktori), 50 MiB per berkas, total 200 MiB setelah diekstrak, dan 1 MiB JSON katalog.
- Arsip: hanya jalur relatif yang aman; jalur duplikat, symlink, serta arsip terenkripsi, multipart, dan ZIP64 ditolak.
- Unggahan yang sudah disiapkan kedaluwarsa setelah 30 menit.

## Kesalahan dan percobaan ulang

Kesalahan berisi `error`, `message`, `retryable`, `nextAction`, `docsUrl`, dan `documentationTopic`. Ikuti `nextAction`. Setelah respons hilang, coba lagi konten yang identik dengan `requestId` yang sama; konten yang diubah memerlukan ID baru. Lihat [kesalahan dan pemulihan](https://www.playdrop.ai/id/create/learn/errors).

Gunakan `send_feedback` untuk melaporkan masalah yang bisa direproduksi atau langkah yang membingungkan, tanpa token atau URL bertanda tangan.

## Panduan terkait

- [Game HTML sederhana](https://www.playdrop.ai/id/create/learn/html-games): Terbitkan satu berkas HTML mandiri hingga 10 MiB dengan upload_game: apa yang muat, katalog mini, visibilitas, pembaruan, dan kapan beralih ke paket.
- [Pengemasan dan .play](https://www.playdrop.ai/id/create/learn/packaging): Susun folder hasil build, ZIP, atau .play dengan catalogue.json di root, deklarasikan media listingan dan server, lalu unggah dengan prepare_catalogue_upload.
- [Visibilitas dan jangkauan](https://www.playdrop.ai/id/create/learn/distribution): Pilih siapa yang bisa membuka game PlayDrop, cara kerja default akun dan penerbitan versi, serta cara Boost, Tukar main, Instan, dan pencarian menarik pemain.
- [Kesalahan dan pemulihan](https://www.playdrop.ai/id/create/learn/errors): Bentuk kesalahan yang dikembalikan alat MCP PlayDrop, kapan mencoba lagi dengan requestId yang sama, dan perbaikan untuk setiap kode kesalahan umum.
