Two-step uploads: publish real games, not just demos
August 13, 2026 MCPPublishing

A new start_game_upload plus finish_game_upload pair lets your agent PUT the full HTML file directly to R2, then create the draft server-side. No more hitting MCP argument size limits on real games.
The original upload_game tool took the full HTML as one JSON argument. That is fine for a few KB, but real browser games are hundreds of KB or more, and MCP tool arguments are not designed for large blobs.
The new flow: start_game_upload returns a signed R2 PUT URL plus an opaque upload_id. Your agent PUTs the HTML directly to R2 (which is what R2 is good at), then calls finish_game_upload with the upload_id. The server reads the file from storage, validates its size and shape, and creates a private draft as if you had called upload_game.
Why it matters
- No practical size ceiling short of the R2 object size limit
- The HTML crosses the wire exactly once, from your agent straight to R2
- byte-for-byte SHA-256 verification returned in the finish response
- Signed upload_id expires in 15 minutes, so lost tokens never become a security surface
As of the MCP Phase 2 launch, this pipe also underpins the Godot HTML5 upload flow and the auto-mint of upload_ids by generate_browser_game.
Try it now
Read the two-step upload docs