> ## Documentation Index
> Fetch the complete documentation index at: https://docs.summerengine.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Operations: store and publishing

> A game's store page, uploads, publishing and releases. For each operation: what it does, whether it asks you first, its inputs and an example call.

A game's store page, uploads, publishing and releases. 18 operations. How to call them, and what the answers mean: [Operations reference](/mcp/operations).

<Note>
  Generated from the `summer-engine` npm package `4.2.0`: its public operation catalog (`registry/operations/public-catalog.json`) and its engine and local operations. If something here is wrong, the operation's definition is wrong.
</Note>

| Operation | What it does | Asks you first |
| - | - | - |
| [`store.cancel_publish`](#cancel_publish) | Withdraw a publish request that still waits for the owner, so its approval link stops working. | Not by default |
| [`store.get_listing`](#get_listing) | Read a game's store page as the store will show it: page state, targets, text per store, art per slot, price, the publish checklist (what is missing), publish requests and the tags a page can pick. | Never |
| [`store.preview_link`](#preview_link) | Make a private link to the saved store page draft on summer.games (not indexed; Buy and Play do nothing) to look at it or show it to someone. | Not by default |
| [`store.publish`](#publish) | Ask the owner to publish the store page draft with a build and price. | Yes, for now |
| [`store.release`](#release) | Release the bundle build the owner approved with store.publish to players, once Summer approved the game. | Yes, for now |
| [`store.remove_build`](#remove_build) | Remove a bundle build that no environment serves from the game's versions. | Yes, by default |
| [`store.remove_file`](#remove_file) | Remove a file that was kept privately for Summer review (store.status files): it leaves the list, and no build uses it. | Yes, by default |
| [`store.remove_trailer`](#remove_trailer) | Take the trailer off the store page draft. | Yes, by default |
| [`store.set_art`](#set_art) | Put images into one store art slot from the person's assets (assetId) or public image URLs. | Not by default |
| [`store.set_sound`](#set_sound) | Set the soft loop visitors hear on the game's summer.games page: a loop from the summer.games sound library (preset), the person's audio asset, or a public MP3 or M4A URL; source null removes it. | Not by default |
| [`store.set_trailer`](#set_trailer) | Set the store page trailer from the person's video asset or a public MP4 or WebM URL; Summer Games checks it first. | Not by default |
| [`store.status`](#status) | Read where a game stands on Summer Games in one call: the review and its feedback, a publish request waiting for the owner, every upload and its checks, and what players get now on each platform. | Never |
| [`store.update_listing`](#update_listing) | Edit the store page draft: title, targets, desktop and mobile text, tags, long description, support contact, release stage, content rating and other languages. | Not by default |
| [`store.update_release_notes`](#update_release_notes) | Write the release notes players read for a released bundle build: a title and Markdown text. | Yes, for now |
| [`store.upload_begin`](#upload_begin) | Start uploading a build to a game: kind bundle (the summer.games export or one .pck), web (an HTML5 zip with index.html) or download (a desktop archive). | Not by default |
| [`store.upload_complete`](#upload_complete) | Finish a store upload after every part is PUT: Summer seals it and checks it. | Not by default |
| [`store.upload_file`](#upload_file) | Upload an export from summer\_export\_game to the creator's store game, confirm-gated - a store bundle as a Build, or a web or native download as a store version. | Not by default |
| [`store.upload_sign_parts`](#upload_sign_parts) | Get upload URLs for parts of a store upload, up to 100 at a time. | Not by default |

***

### cancel\_publish

`store.cancel_publish`: **Withdraw a publish request**

Withdraw a publish request that still waits for the owner, so its approval link stops working. Nothing that is live changes. Next: store.publish for a new request.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "store.cancel_publish"` |
| **CLI** | `summer store cancel-publish` |
| **Runs** | On Summer's servers: the hosted MCP, or the npm MCP after `summer login`. Needs your Summer sign-in. |
| **Effect** | Changes your own drafts, files or settings. Nobody else sees it yet. |
| **Asks you first** | No: **Make and build** is on by default in Agent permissions. When it is off, your agent asks you first. |
| **3.x names** | `summer_store_cancel_submission` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `gameId` | string | Yes | From games.list. |
| `approvalId` | string | Yes | From store.publish or store.status. |
| `dryRun` | boolean | No | Check and describe the call without doing it: nothing changes, nothing is spent. |
| `idempotencyKey` | string | No | Retry key. Reuse it only to retry the identical request, so it never happens twice. Length 1 to 128. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "gameId": {
        "description": "From games.list.",
        "type": "string",
        "pattern": "^[A-Za-z0-9_-]{1,128}$"
      },
      "approvalId": {
        "description": "From store.publish or store.status.",
        "type": "string",
        "pattern": "^[A-Za-z0-9_-]{1,128}$"
      },
      "dryRun": {
        "description": "Check and describe the call without doing it: nothing changes, nothing is spent.",
        "type": "boolean"
      },
      "idempotencyKey": {
        "description": "Retry key. Reuse it only to retry the identical request, so it never happens twice.",
        "type": "string",
        "minLength": 1,
        "maxLength": 128
      }
    },
    "required": [
      "gameId",
      "approvalId"
    ]
  }
  ```
</Accordion>

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "approvalId": {
        "type": "string"
      },
      "state": {
        "description": "AWAITING_OWNER_APPROVAL, APPROVED, CANCELLED or STALE.",
        "type": "string"
      },
      "jobId": {
        "description": "jobs.wait on it to learn the owner's answer.",
        "type": "string"
      },
      "approvalUrl": {
        "description": "Where the owner approves, in Studio.",
        "type": "string"
      },
      "uploadId": {
        "description": "The bundle build it publishes, if it names one.",
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      },
      "price": {
        "description": "unchanged, free, or the proposed price.",
        "type": "string"
      },
      "createdAt": {
        "type": "string"
      }
    },
    "required": [
      "approvalId",
      "state",
      "jobId",
      "approvalUrl",
      "uploadId",
      "price",
      "createdAt"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** Take back a publish request before the owner answers.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "store.cancel_publish",
      "input": {
        "gameId": "g_123",
        "approvalId": "goa_01J"
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer store cancel-publish --game-id g_123 --approval-id goa_01J
  ```
</CodeGroup>

***

### get\_listing

`store.get_listing`: **Read the store page**

Read a game's store page as the store will show it: page state, targets, text per store, art per slot, price, the publish checklist (what is missing), publish requests and the tags a page can pick. Next: store.update\_listing.

| | |
| - | - |
| **MCP** | `summer_store_get_listing`, a tool on the hosted MCP. Elsewhere: `summer_call` with `"op": "store.get_listing"` |
| **CLI** | `summer store get-listing` |
| **Runs** | On Summer's servers: the hosted MCP, or the npm MCP after `summer login`. Needs your Summer sign-in. |
| **Effect** | Reads only. Changes nothing. |
| **Asks you first** | No. It changes nothing. |
| **3.x names** | `summer_store_get_listing` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `gameId` | string | Yes | From games.list. |
| `previews` | boolean | No | Also return short-lived image URLs for the art, to look at it. Default `false`. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "gameId": {
        "description": "From games.list.",
        "type": "string",
        "pattern": "^[A-Za-z0-9_-]{1,128}$"
      },
      "previews": {
        "description": "Also return short-lived image URLs for the art, to look at it.",
        "default": false,
        "type": "boolean"
      }
    },
    "required": [
      "gameId"
    ]
  }
  ```
</Accordion>

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "gameId": {
        "type": "string"
      },
      "name": {
        "type": "string"
      },
      "slug": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      },
      "storeUrl": {
        "type": "string"
      },
      "page": {
        "description": "The newest store page version; editing a published or sent-back page starts a new draft.",
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "revisionId": {
                "type": "string"
              },
              "state": {
                "type": "string"
              },
              "label": {
                "type": "string"
              },
              "editable": {
                "type": "boolean"
              }
            },
            "required": [
              "revisionId",
              "state",
              "label",
              "editable"
            ],
            "additionalProperties": false
          },
          {
            "type": "null"
          }
        ]
      },
      "targets": {
        "type": "array",
        "items": {
          "type": "string"
        }
      },
      "flows": {
        "description": "desktop and mobile: which store each target opens.",
        "type": "array",
        "items": {
          "type": "string"
        }
      },
      "text": {
        "description": "Title, desktop and mobile text, long description, support, links, release stage, languages, content rating.",
        "type": "object",
        "additionalProperties": {}
      },
      "art": {
        "description": "Art per slot (media asset ids), trailers and sound.",
        "type": "object",
        "additionalProperties": {}
      },
      "price": {
        "type": "object",
        "properties": {
          "state": {
            "type": "string",
            "enum": [
              "free",
              "paid",
              "unknown"
            ]
          },
          "amount": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "currency": {
                    "type": "string",
                    "const": "USD"
                  },
                  "amountMinor": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 9007199254740991
                  }
                },
                "required": [
                  "currency",
                  "amountMinor"
                ],
                "additionalProperties": false
              },
              {
                "type": "null"
              }
            ]
          },
          "discountPercent": {
            "anyOf": [
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ]
          }
        },
        "required": [
          "state",
          "amount",
          "discountPercent"
        ],
        "additionalProperties": false
      },
      "checklist": {
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "id": {
              "type": "string"
            },
            "label": {
              "type": "string"
            },
            "required": {
              "type": "boolean"
            },
            "done": {
              "type": "boolean"
            },
            "detail": {
              "type": "string"
            }
          },
          "required": [
            "id",
            "label",
            "required",
            "done",
            "detail"
          ],
          "additionalProperties": false
        }
      },
      "readyToPublish": {
        "type": "boolean"
      },
      "publishRequests": {
        "description": "The newest owner approvals for this game.",
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "approvalId": {
              "type": "string"
            },
            "state": {
              "description": "AWAITING_OWNER_APPROVAL, APPROVED, CANCELLED or STALE.",
              "type": "string"
            },
            "jobId": {
              "description": "jobs.wait on it to learn the owner's answer.",
              "type": "string"
            },
            "approvalUrl": {
              "description": "Where the owner approves, in Studio.",
              "type": "string"
            },
            "uploadId": {
              "description": "The bundle build it publishes, if it names one.",
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ]
            },
            "price": {
              "description": "unchanged, free, or the proposed price.",
              "type": "string"
            },
            "createdAt": {
              "type": "string"
            }
          },
          "required": [
            "approvalId",
            "state",
            "jobId",
            "approvalUrl",
            "uploadId",
            "price",
            "createdAt"
          ],
          "additionalProperties": false
        }
      },
      "availableTags": {
        "anyOf": [
          {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "label": {
                  "type": "string"
                },
                "category": {
                  "type": "string"
                },
                "aliases": {
                  "type": "array",
                  "items": {
                    "type": "string"
                  }
                }
              },
              "required": [
                "id",
                "label",
                "category"
              ],
              "additionalProperties": false
            }
          },
          {
            "type": "null"
          }
        ]
      },
      "previewUrls": {
        "description": "Short-lived image URLs per media asset id, to look at the art.",
        "type": "object",
        "additionalProperties": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        }
      }
    },
    "required": [
      "gameId",
      "name",
      "slug",
      "storeUrl",
      "page",
      "targets",
      "flows",
      "text",
      "art",
      "price",
      "checklist",
      "readyToPublish",
      "publishRequests",
      "availableTags"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** What does the store page still need?

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_store_get_listing",
    "arguments": {
      "gameId": "g_123"
    }
  }
  ```

  ```bash CLI theme={null}
  summer store get-listing --game-id g_123
  ```
</CodeGroup>

***

### preview\_link

`store.preview_link`: **Make a store preview link**

Make a private link to the saved store page draft on summer.games (not indexed; Buy and Play do nothing) to look at it or show it to someone. Expires after 1h, 1d or 7d. Returns the url.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "store.preview_link"` |
| **CLI** | `summer store preview-link` |
| **Runs** | On Summer's servers: the hosted MCP, or the npm MCP after `summer login`. Needs your Summer sign-in. |
| **Effect** | Changes your own drafts, files or settings. Nobody else sees it yet. |
| **Asks you first** | No: **Make and build** is on by default in Agent permissions. When it is off, your agent asks you first. |
| **3.x names** | `summer_store_preview_link` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `gameId` | string | Yes | From games.list. |
| `expires` | "1h" \| "1d" \| "7d" | No | Default `"1d"`. |
| `dryRun` | boolean | No | Check and describe the call without doing it: nothing changes, nothing is spent. |
| `idempotencyKey` | string | No | Retry key. Reuse it only to retry the identical request, so it never happens twice. Length 1 to 128. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "gameId": {
        "description": "From games.list.",
        "type": "string",
        "pattern": "^[A-Za-z0-9_-]{1,128}$"
      },
      "expires": {
        "default": "1d",
        "type": "string",
        "enum": [
          "1h",
          "1d",
          "7d"
        ]
      },
      "dryRun": {
        "description": "Check and describe the call without doing it: nothing changes, nothing is spent.",
        "type": "boolean"
      },
      "idempotencyKey": {
        "description": "Retry key. Reuse it only to retry the identical request, so it never happens twice.",
        "type": "string",
        "minLength": 1,
        "maxLength": 128
      }
    },
    "required": [
      "gameId"
    ]
  }
  ```
</Accordion>

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "url": {
        "type": "string"
      },
      "expiresAt": {
        "type": "string"
      },
      "revisionId": {
        "type": "string"
      }
    },
    "required": [
      "url",
      "expiresAt",
      "revisionId"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** A link to look at the draft page.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "store.preview_link",
      "input": {
        "gameId": "g_123",
        "expires": "1d"
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer store preview-link --game-id g_123 --expires 1d
  ```
</CodeGroup>

***

### publish

`store.publish`: **Ask the owner to publish**

Ask the owner to publish the store page draft with a build and price. Checks the publish checklist first. Never publishes alone: answers an approval link for the owner and a job. Needs an idempotencyKey. Next: jobs.wait, then store.status.

| | |
| - | - |
| **MCP** | `summer_store_publish`, a tool on the hosted MCP. Elsewhere: `summer_call` with `"op": "store.publish"` |
| **CLI** | `summer store publish` |
| **Runs** | On Summer's servers: the hosted MCP, or the npm MCP after `summer login`. Needs your Summer sign-in. |
| **Effect** | Publishes: makes something public or live. |
| **Asks you first** | Yes, for now: Summer Games still asks the game's owner first. Soon it follows **Publish** in Agent permissions (on by default). |
| **Retry key** | Required: send a new `idempotencyKey` for each new request, the same one only to retry it. |
| **3.x names** | `summer_store_submit` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `gameId` | string | Yes | From games.list. |
| `uploadId` | string | No | The bundle build to publish (a b. upload id from store.status); the newest ready one when omitted. A ready web build or download counts on its own. Length 3 to 140. |
| `price` | object | No | The price to propose, in US cents (amountMinor 50-100000, or 0 for free). Omit to keep the current price. |
| `price.currency` | "USD" | Yes | |
| `price.amountMinor` | integer | Yes | Range 0 to 9007199254740991. |
| `note` | string | No | A short note for the owner: what changed and why. Length 0 to 500. |
| `webBuild` | "include" \| "skip" | No | include: a ready web build is listed, adding web to the targets. skip: the owner chose no browser play. Default `"include"`. |
| `dryRun` | boolean | No | Check and describe the call without doing it: nothing changes, nothing is spent. |
| `idempotencyKey` | string | Yes | Retry key, required: a new one for each new request; reuse it only to retry the identical request. Length 1 to 128. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "gameId": {
        "description": "From games.list.",
        "type": "string",
        "pattern": "^[A-Za-z0-9_-]{1,128}$"
      },
      "uploadId": {
        "description": "The bundle build to publish (a b. upload id from store.status); the newest ready one when omitted. A ready web build or download counts on its own.",
        "type": "string",
        "minLength": 3,
        "maxLength": 140
      },
      "price": {
        "description": "The price to propose, in US cents (amountMinor 50-100000, or 0 for free). Omit to keep the current price.",
        "type": "object",
        "properties": {
          "currency": {
            "type": "string",
            "const": "USD"
          },
          "amountMinor": {
            "type": "integer",
            "minimum": 0,
            "maximum": 9007199254740991
          }
        },
        "required": [
          "currency",
          "amountMinor"
        ]
      },
      "note": {
        "description": "A short note for the owner: what changed and why.",
        "type": "string",
        "maxLength": 500
      },
      "webBuild": {
        "description": "include: a ready web build is listed, adding web to the targets. skip: the owner chose no browser play.",
        "default": "include",
        "type": "string",
        "enum": [
          "include",
          "skip"
        ]
      },
      "dryRun": {
        "description": "Check and describe the call without doing it: nothing changes, nothing is spent.",
        "type": "boolean"
      },
      "idempotencyKey": {
        "description": "Retry key, required: a new one for each new request; reuse it only to retry the identical request.",
        "type": "string",
        "minLength": 1,
        "maxLength": 128
      }
    },
    "required": [
      "gameId",
      "idempotencyKey"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "approvalId": {
        "type": "string"
      },
      "state": {
        "type": "string"
      }
    },
    "required": [
      "approvalId",
      "state"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** Ask the owner to publish

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_store_publish",
    "arguments": {
      "gameId": "g_123",
      "price": {
        "currency": "USD",
        "amountMinor": 499
      },
      "note": "First release."
    }
  }
  ```

  ```bash CLI theme={null}
  summer store publish --game-id g_123 --note 'First release.' --input '{"price":{"currency":"USD","amountMinor":499}}'
  ```
</CodeGroup>

***

### release

`store.release`: **Release the approved build**

Release the bundle build the owner approved with store.publish to players, once Summer approved the game. Answers a job while it goes live (jobs.wait). Needs an idempotencyKey. Web builds and downloads need no release.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "store.release"` |
| **CLI** | `summer store release` |
| **Runs** | On Summer's servers: the hosted MCP, or the npm MCP after `summer login`. Needs your Summer sign-in. |
| **Effect** | Publishes: makes something public or live. |
| **Asks you first** | Yes, for now: Summer Games still asks the game's owner first. Soon it follows **Publish** in Agent permissions (on by default). |
| **Long work** | Answers with a job at once. Wait with `jobs.wait`. |
| **Retry key** | Required: send a new `idempotencyKey` for each new request, the same one only to retry it. |
| **3.x names** | `summer_build_release` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `gameId` | string | Yes | From games.list. |
| `dryRun` | boolean | No | Check and describe the call without doing it: nothing changes, nothing is spent. |
| `idempotencyKey` | string | Yes | Retry key, required: a new one for each new request; reuse it only to retry the identical request. Length 1 to 128. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "gameId": {
        "description": "From games.list.",
        "type": "string",
        "pattern": "^[A-Za-z0-9_-]{1,128}$"
      },
      "dryRun": {
        "description": "Check and describe the call without doing it: nothing changes, nothing is spent.",
        "type": "boolean"
      },
      "idempotencyKey": {
        "description": "Retry key, required: a new one for each new request; reuse it only to retry the identical request.",
        "type": "string",
        "minLength": 1,
        "maxLength": 128
      }
    },
    "required": [
      "gameId",
      "idempotencyKey"
    ]
  }
  ```
</Accordion>

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "state": {
        "description": "current: players already get this build.",
        "type": "string",
        "enum": [
          "current"
        ]
      },
      "uploadId": {
        "type": "string"
      },
      "version": {
        "type": "string"
      },
      "live": {
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "platform": {
              "type": "string"
            },
            "version": {
              "type": "string"
            }
          },
          "required": [
            "platform",
            "version"
          ],
          "additionalProperties": false
        }
      }
    },
    "required": [
      "state",
      "uploadId",
      "version",
      "live"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** Ship the build the owner approved.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "store.release",
      "input": {
        "gameId": "g_123"
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer store release --game-id g_123
  ```
</CodeGroup>

***

### remove\_build

`store.remove_build`: **Remove a build**

Remove a bundle build that no environment serves from the game's versions. Its version number stays used; a live build cannot be removed. Asks the person first. Next: store.status.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "store.remove_build"` |
| **CLI** | `summer store remove-build` |
| **Runs** | On Summer's servers: the hosted MCP, or the npm MCP after `summer login`. Needs your Summer sign-in. |
| **Effect** | Removes or stops something for good. |
| **Asks you first** | Yes: **Delete for good** is off by default in Agent permissions. |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `gameId` | string | Yes | From games.list. |
| `uploadId` | string | Yes | A bundle build (b.) from store.status. Length 3 to 140. |
| `dryRun` | boolean | No | Check and describe the call without doing it: nothing changes, nothing is spent. |
| `idempotencyKey` | string | No | Retry key. Reuse it only to retry the identical request, so it never happens twice. Length 1 to 128. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "gameId": {
        "description": "From games.list.",
        "type": "string",
        "pattern": "^[A-Za-z0-9_-]{1,128}$"
      },
      "uploadId": {
        "description": "A bundle build (b.) from store.status.",
        "type": "string",
        "minLength": 3,
        "maxLength": 140
      },
      "dryRun": {
        "description": "Check and describe the call without doing it: nothing changes, nothing is spent.",
        "type": "boolean"
      },
      "idempotencyKey": {
        "description": "Retry key. Reuse it only to retry the identical request, so it never happens twice.",
        "type": "string",
        "minLength": 1,
        "maxLength": 128
      }
    },
    "required": [
      "gameId",
      "uploadId"
    ]
  }
  ```
</Accordion>

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "uploadId": {
        "type": "string"
      },
      "archivedAt": {
        "type": "string"
      }
    },
    "required": [
      "uploadId",
      "archivedAt"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** Remove a failed build from Versions.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "store.remove_build",
      "input": {
        "gameId": "g_123",
        "uploadId": "b.pub_9"
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer store remove-build --game-id g_123 --upload-id b.pub_9
  ```
</CodeGroup>

***

### remove\_file

`store.remove_file`: **Remove a file kept for review**

Remove a file that was kept privately for Summer review (store.status files): it leaves the list, and no build uses it. Asks the person first. Next: store.status.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "store.remove_file"` |
| **CLI** | `summer store remove-file` |
| **Runs** | On Summer's servers: the hosted MCP, or the npm MCP after `summer login`. Needs your Summer sign-in. |
| **Effect** | Removes or stops something for good. |
| **Asks you first** | Yes: **Delete for good** is off by default in Agent permissions. |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `gameId` | string | Yes | From games.list. |
| `fileId` | string | Yes | From store.status files. |
| `dryRun` | boolean | No | Check and describe the call without doing it: nothing changes, nothing is spent. |
| `idempotencyKey` | string | No | Retry key. Reuse it only to retry the identical request, so it never happens twice. Length 1 to 128. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "gameId": {
        "description": "From games.list.",
        "type": "string",
        "pattern": "^[A-Za-z0-9_-]{1,128}$"
      },
      "fileId": {
        "description": "From store.status files.",
        "type": "string",
        "pattern": "^[A-Za-z0-9_-]{1,128}$"
      },
      "dryRun": {
        "description": "Check and describe the call without doing it: nothing changes, nothing is spent.",
        "type": "boolean"
      },
      "idempotencyKey": {
        "description": "Retry key. Reuse it only to retry the identical request, so it never happens twice.",
        "type": "string",
        "minLength": 1,
        "maxLength": 128
      }
    },
    "required": [
      "gameId",
      "fileId"
    ]
  }
  ```
</Accordion>

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "fileId": {
        "type": "string"
      },
      "fileName": {
        "type": "string"
      },
      "removed": {
        "type": "boolean",
        "const": true
      }
    },
    "required": [
      "fileId",
      "fileName",
      "removed"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** Remove an old file Summer kept for review.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "store.remove_file",
      "input": {
        "gameId": "g_123",
        "fileId": "up_4"
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer store remove-file --game-id g_123 --file-id up_4
  ```
</CodeGroup>

***

### remove\_trailer

`store.remove_trailer`: **Remove the store trailer**

Take the trailer off the store page draft. The live page keeps its trailer until the owner approves publishing the draft. Asks the person first. Next: store.get\_listing.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "store.remove_trailer"` |
| **CLI** | `summer store remove-trailer` |
| **Runs** | On Summer's servers: the hosted MCP, or the npm MCP after `summer login`. Needs your Summer sign-in. |
| **Effect** | Removes or stops something for good. |
| **Asks you first** | Yes: **Delete for good** is off by default in Agent permissions. |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `gameId` | string | Yes | From games.list. |
| `dryRun` | boolean | No | Check and describe the call without doing it: nothing changes, nothing is spent. |
| `idempotencyKey` | string | No | Retry key. Reuse it only to retry the identical request, so it never happens twice. Length 1 to 128. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "gameId": {
        "description": "From games.list.",
        "type": "string",
        "pattern": "^[A-Za-z0-9_-]{1,128}$"
      },
      "dryRun": {
        "description": "Check and describe the call without doing it: nothing changes, nothing is spent.",
        "type": "boolean"
      },
      "idempotencyKey": {
        "description": "Retry key. Reuse it only to retry the identical request, so it never happens twice.",
        "type": "string",
        "minLength": 1,
        "maxLength": 128
      }
    },
    "required": [
      "gameId"
    ]
  }
  ```
</Accordion>

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "removed": {
        "type": "boolean"
      }
    },
    "required": [
      "removed"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** Drop the old trailer before a new one is ready.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "store.remove_trailer",
      "input": {
        "gameId": "g_123"
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer store remove-trailer --game-id g_123
  ```
</CodeGroup>

***

### set\_art

`store.set_art`: **Set store art**

Put images into one store art slot from the person's assets (assetId) or public image URLs. Each is checked for the slot's shape and size, then by Summer Games. Screenshots take a list; an empty list clears the slot. Next: store.get\_listing.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "store.set_art"` |
| **CLI** | `summer store set-art` |
| **Runs** | On Summer's servers: the hosted MCP, or the npm MCP after `summer login`. Needs your Summer sign-in. |
| **Effect** | Changes your own drafts, files or settings. Nobody else sees it yet. |
| **Asks you first** | No: **Make and build** is on by default in Agent permissions. When it is off, your agent asks you first. |
| **3.x names** | `summer_store_set_art` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `gameId` | string | Yes | |
| `slot` | "desktop.keyArt" \| "desktop.screenshots" \| "desktop.icon" \| "desktop.capsuleTall" \| "desktop.capsuleWide" \| "mobile.icon" \| "mobile.tallCover" \| "mobile.keyArt" \| "mobile.screenshots" | Yes | |
| `sources` | object\[] | Yes | Items 0 to 8. |
| `mode` | "replace" \| "append" | No | Default `"replace"`. |
| `focalPoint` | object | No | The part that must stay in view when the store crops it (0..1 from left/top). Key art and covers only. |
| `focalPoint.x` | number | Yes | Range 0 to 1. |
| `focalPoint.y` | number | Yes | Range 0 to 1. |
| `dryRun` | boolean | No | Check and describe the call without doing it: nothing changes, nothing is spent. |
| `idempotencyKey` | string | No | Retry key. Reuse it only to retry the identical request, so it never happens twice. Length 1 to 128. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "gameId": {
        "type": "string",
        "pattern": "^[A-Za-z0-9_-]{1,128}$"
      },
      "slot": {
        "type": "string",
        "enum": [
          "desktop.keyArt",
          "desktop.screenshots",
          "desktop.icon",
          "desktop.capsuleTall",
          "desktop.capsuleWide",
          "mobile.icon",
          "mobile.tallCover",
          "mobile.keyArt",
          "mobile.screenshots"
        ]
      },
      "sources": {
        "maxItems": 8,
        "type": "array",
        "items": {
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "assetId": {
                  "description": "One of your Summer assets (assets.search with scope mine, assets.generate_image).",
                  "type": "string",
                  "minLength": 1
                }
              },
              "required": [
                "assetId"
              ]
            },
            {
              "type": "object",
              "properties": {
                "url": {
                  "description": "A public https image URL.",
                  "type": "string"
                }
              },
              "required": [
                "url"
              ]
            }
          ]
        }
      },
      "mode": {
        "default": "replace",
        "type": "string",
        "enum": [
          "replace",
          "append"
        ]
      },
      "focalPoint": {
        "description": "The part that must stay in view when the store crops it (0..1 from left/top). Key art and covers only.",
        "type": "object",
        "properties": {
          "x": {
            "type": "number",
            "minimum": 0,
            "maximum": 1
          },
          "y": {
            "type": "number",
            "minimum": 0,
            "maximum": 1
          }
        },
        "required": [
          "x",
          "y"
        ]
      },
      "dryRun": {
        "description": "Check and describe the call without doing it: nothing changes, nothing is spent.",
        "type": "boolean"
      },
      "idempotencyKey": {
        "description": "Retry key. Reuse it only to retry the identical request, so it never happens twice.",
        "type": "string",
        "minLength": 1,
        "maxLength": 128
      }
    },
    "required": [
      "gameId",
      "slot",
      "sources"
    ]
  }
  ```
</Accordion>

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "slot": {
        "type": "string"
      },
      "placed": {
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "mediaAssetId": {
              "type": "string"
            },
            "width": {
              "type": "number"
            },
            "height": {
              "type": "number"
            },
            "warning": {
              "type": "string"
            }
          },
          "required": [
            "mediaAssetId",
            "width",
            "height"
          ],
          "additionalProperties": false
        }
      },
      "checklist": {
        "description": "The checklist items for this slot and the page's media budget.",
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "id": {
              "type": "string"
            },
            "label": {
              "type": "string"
            },
            "required": {
              "type": "boolean"
            },
            "done": {
              "type": "boolean"
            },
            "detail": {
              "type": "string"
            }
          },
          "required": [
            "id",
            "label",
            "required",
            "done",
            "detail"
          ],
          "additionalProperties": false
        }
      }
    },
    "required": [
      "slot",
      "placed",
      "checklist"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** Use a generated image as the key art.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "store.set_art",
      "input": {
        "gameId": "g_123",
        "slot": "desktop.keyArt",
        "sources": [
          {
            "assetId": "a_77"
          }
        ]
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer store set-art --game-id g_123 --slot desktop.keyArt --input '{"sources":[{"assetId":"a_77"}]}'
  ```
</CodeGroup>

***

### set\_sound

`store.set_sound`: **Set the store sound**

Set the soft loop visitors hear on the game's summer.games page: a loop from the summer.games sound library (preset), the person's audio asset, or a public MP3 or M4A URL; source null removes it. Next: store.get\_listing.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "store.set_sound"` |
| **CLI** | `summer store set-sound` |
| **Runs** | On Summer's servers: the hosted MCP, or the npm MCP after `summer login`. Needs your Summer sign-in. |
| **Effect** | Changes your own drafts, files or settings. Nobody else sees it yet. |
| **Asks you first** | No: **Make and build** is on by default in Agent permissions. When it is off, your agent asks you first. |
| **3.x names** | `summer_store_set_sound` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `gameId` | string | Yes | |
| `source` | object \| null | Yes | The sound, or null to remove it. |
| `dryRun` | boolean | No | Check and describe the call without doing it: nothing changes, nothing is spent. |
| `idempotencyKey` | string | No | Retry key. Reuse it only to retry the identical request, so it never happens twice. Length 1 to 128. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "gameId": {
        "type": "string",
        "pattern": "^[A-Za-z0-9_-]{1,128}$"
      },
      "source": {
        "description": "The sound, or null to remove it.",
        "anyOf": [
          {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "preset": {
                    "description": "A loop from the summer.games sound library, such as rain, campfire, tavern, forest or synth (the full list: https://summer.games/store-sounds/manifest.json).",
                    "type": "string",
                    "pattern": "^[a-z0-9][a-z0-9-]{0,47}$"
                  }
                },
                "required": [
                  "preset"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "assetId": {
                    "description": "One of your Summer audio assets, MP3 or M4A (assets.search with scope mine, assets.generate_audio music).",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "assetId"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "url": {
                    "description": "A public https MP3 or M4A URL.",
                    "type": "string"
                  }
                },
                "required": [
                  "url"
                ]
              }
            ]
          },
          {
            "type": "null"
          }
        ]
      },
      "dryRun": {
        "description": "Check and describe the call without doing it: nothing changes, nothing is spent.",
        "type": "boolean"
      },
      "idempotencyKey": {
        "description": "Retry key. Reuse it only to retry the identical request, so it never happens twice.",
        "type": "string",
        "minLength": 1,
        "maxLength": 128
      }
    },
    "required": [
      "gameId",
      "source"
    ]
  }
  ```
</Accordion>

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "preset": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      },
      "mediaAssetId": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      }
    },
    "required": [
      "preset",
      "mediaAssetId"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** Soft rain on the store page.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "store.set_sound",
      "input": {
        "gameId": "g_123",
        "source": {
          "preset": "rain"
        }
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer store set-sound --game-id g_123 --input '{"source":{"preset":"rain"}}'
  ```
</CodeGroup>

***

### set\_trailer

`store.set_trailer`: **Set the store trailer**

Set the store page trailer from the person's video asset or a public MP4 or WebM URL; Summer Games checks it first. Muted and looping at the top of the page. To remove it: store.remove\_trailer. Next: store.get\_listing.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "store.set_trailer"` |
| **CLI** | `summer store set-trailer` |
| **Runs** | On Summer's servers: the hosted MCP, or the npm MCP after `summer login`. Needs your Summer sign-in. |
| **Effect** | Changes your own drafts, files or settings. Nobody else sees it yet. |
| **Asks you first** | No: **Make and build** is on by default in Agent permissions. When it is off, your agent asks you first. |
| **3.x names** | `summer_store_set_trailer` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `gameId` | string | Yes | |
| `source` | object \| null | Yes | The video, or null to remove the trailer. |
| `dryRun` | boolean | No | Check and describe the call without doing it: nothing changes, nothing is spent. |
| `idempotencyKey` | string | No | Retry key. Reuse it only to retry the identical request, so it never happens twice. Length 1 to 128. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "gameId": {
        "type": "string",
        "pattern": "^[A-Za-z0-9_-]{1,128}$"
      },
      "source": {
        "description": "The video, or null to remove the trailer.",
        "anyOf": [
          {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "assetId": {
                    "description": "One of your Summer video assets (assets.search with scope mine, assets.generate_video).",
                    "type": "string",
                    "minLength": 1
                  }
                },
                "required": [
                  "assetId"
                ]
              },
              {
                "type": "object",
                "properties": {
                  "url": {
                    "description": "A public https MP4 or WebM URL.",
                    "type": "string"
                  }
                },
                "required": [
                  "url"
                ]
              }
            ]
          },
          {
            "type": "null"
          }
        ]
      },
      "dryRun": {
        "description": "Check and describe the call without doing it: nothing changes, nothing is spent.",
        "type": "boolean"
      },
      "idempotencyKey": {
        "description": "Retry key. Reuse it only to retry the identical request, so it never happens twice.",
        "type": "string",
        "minLength": 1,
        "maxLength": 128
      }
    },
    "required": [
      "gameId",
      "source"
    ]
  }
  ```
</Accordion>

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "trailer": {
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "mediaAssetId": {
                "type": "string"
              }
            },
            "required": [
              "mediaAssetId"
            ],
            "additionalProperties": false
          },
          {
            "type": "null"
          }
        ]
      },
      "removed": {
        "type": "boolean"
      }
    },
    "required": [
      "trailer",
      "removed"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** Use a generated gameplay video as the trailer.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "store.set_trailer",
      "input": {
        "gameId": "g_123",
        "source": {
          "assetId": "vid_9"
        }
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer store set-trailer --game-id g_123 --input '{"source":{"assetId":"vid_9"}}'
  ```
</CodeGroup>

***

### status

`store.status`: **Check where a game stands**

Read where a game stands on Summer Games in one call: the review and its feedback, a publish request waiting for the owner, every upload and its checks, and what players get now on each platform. Returns one next step.

| | |
| - | - |
| **MCP** | `summer_store_status`, a tool on the hosted MCP. Elsewhere: `summer_call` with `"op": "store.status"` |
| **CLI** | `summer store status` |
| **Runs** | On Summer's servers: the hosted MCP, or the npm MCP after `summer login`. Needs your Summer sign-in. |
| **Effect** | Reads only. Changes nothing. |
| **Asks you first** | No. It changes nothing. |
| **3.x names** | `summer_store_review`, `summer_store_releases`, `summer_build_status`, `summer_store_version_status` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `gameId` | string | Yes | From games.list. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "gameId": {
        "description": "From games.list.",
        "type": "string",
        "pattern": "^[A-Za-z0-9_-]{1,128}$"
      }
    },
    "required": [
      "gameId"
    ]
  }
  ```
</Accordion>

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "gameId": {
        "type": "string"
      },
      "name": {
        "type": "string"
      },
      "storeUrl": {
        "type": "string"
      },
      "page": {
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "revisionId": {
                "type": "string"
              },
              "state": {
                "type": "string"
              },
              "label": {
                "type": "string"
              }
            },
            "required": [
              "revisionId",
              "state",
              "label"
            ],
            "additionalProperties": false
          },
          {
            "type": "null"
          }
        ]
      },
      "review": {
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "state": {
                "description": "UNREVIEWED, PENDING, APPROVED, REJECTED or REVOKED.",
                "type": "string"
              },
              "decision": {
                "description": "The latest decision: APPROVED, CHANGES_REQUESTED, REJECTED or REVOKED.",
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "decidedBy": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "decidedAt": {
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "feedback": {
                "description": "What the reviewer asks the creator to fix.",
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "needsChanges": {
                "type": "boolean"
              }
            },
            "required": [
              "state",
              "decision",
              "decidedBy",
              "decidedAt",
              "feedback",
              "needsChanges"
            ],
            "additionalProperties": false
          },
          {
            "type": "null"
          }
        ]
      },
      "publishRequest": {
        "description": "The publish request waiting for the owner, else the newest approved one.",
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "approvalId": {
                "type": "string"
              },
              "state": {
                "description": "AWAITING_OWNER_APPROVAL, APPROVED, CANCELLED or STALE.",
                "type": "string"
              },
              "jobId": {
                "description": "jobs.wait on it to learn the owner's answer.",
                "type": "string"
              },
              "approvalUrl": {
                "description": "Where the owner approves, in Studio.",
                "type": "string"
              },
              "uploadId": {
                "description": "The bundle build it publishes, if it names one.",
                "anyOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "null"
                  }
                ]
              },
              "price": {
                "description": "unchanged, free, or the proposed price.",
                "type": "string"
              },
              "createdAt": {
                "type": "string"
              }
            },
            "required": [
              "approvalId",
              "state",
              "jobId",
              "approvalUrl",
              "uploadId",
              "price",
              "createdAt"
            ],
            "additionalProperties": false
          },
          {
            "type": "null"
          }
        ]
      },
      "live": {
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "platform": {
              "type": "string"
            },
            "version": {
              "type": "string"
            }
          },
          "required": [
            "platform",
            "version"
          ],
          "additionalProperties": false
        }
      },
      "releaseInProgress": {
        "type": "boolean"
      },
      "releaseBlocker": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      },
      "uploads": {
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "uploadId": {
              "type": "string"
            },
            "kind": {
              "type": "string",
              "enum": [
                "bundle",
                "web",
                "download"
              ]
            },
            "platforms": {
              "description": "bundle: the player platforms it is checked for; web or download: its one platform.",
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "version": {
              "description": "bundle: its client version; web or download: its label.",
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ]
            },
            "fileName": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ]
            },
            "state": {
              "description": "uploading (parts still to send), processing, checking (per platform), ready or failed.",
              "type": "string",
              "enum": [
                "uploading",
                "processing",
                "checking",
                "ready",
                "failed"
              ]
            },
            "detail": {
              "type": "string"
            },
            "playUrl": {
              "description": "web: where it plays once ready.",
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ]
            },
            "createdAt": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ]
            },
            "jobId": {
              "description": "Follow it with jobs.get or jobs.wait.",
              "type": "string"
            },
            "live": {
              "description": "bundle: players get this build now.",
              "type": "boolean"
            },
            "releasable": {
              "description": "bundle: store.release could release it now.",
              "type": "boolean"
            },
            "ownerApproved": {
              "description": "bundle: the owner approved publishing this build.",
              "type": "boolean"
            },
            "uploadedParts": {
              "description": "web or download still uploading: the parts already stored.",
              "type": "array",
              "items": {
                "type": "number"
              }
            }
          },
          "required": [
            "uploadId",
            "kind",
            "platforms",
            "version",
            "fileName",
            "state",
            "detail",
            "playUrl",
            "createdAt",
            "jobId",
            "live",
            "releasable",
            "ownerApproved"
          ],
          "additionalProperties": false
        }
      },
      "files": {
        "description": "Files kept privately for Summer review that are not builds (picked in Studio). store.remove_file removes one.",
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "fileId": {
              "type": "string"
            },
            "fileName": {
              "type": "string"
            },
            "sizeBytes": {
              "type": "number"
            },
            "state": {
              "type": "string"
            },
            "kind": {
              "description": "What Summer read it as: zip, godot-pck, windows-pe, android-app, ios-app or unknown.",
              "type": "string"
            },
            "createdAt": {
              "type": "string"
            }
          },
          "required": [
            "fileId",
            "fileName",
            "sizeBytes",
            "state",
            "kind",
            "createdAt"
          ],
          "additionalProperties": false
        }
      },
      "next": {
        "type": "object",
        "properties": {
          "op": {
            "type": "string"
          },
          "input": {
            "type": "object",
            "additionalProperties": {}
          },
          "note": {
            "type": "string"
          }
        },
        "required": [
          "note"
        ],
        "additionalProperties": false
      }
    },
    "required": [
      "gameId",
      "name",
      "storeUrl",
      "page",
      "review",
      "publishRequest",
      "live",
      "releaseInProgress",
      "releaseBlocker",
      "uploads",
      "files",
      "next"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** Did Summer approve the game, and what do players get now?

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_store_status",
    "arguments": {
      "gameId": "g_123"
    }
  }
  ```

  ```bash CLI theme={null}
  summer store status --game-id g_123
  ```
</CodeGroup>

***

### update\_listing

`store.update_listing`: **Edit the store page**

Edit the store page draft: title, targets, desktop and mobile text, tags, long description, support contact, release stage, content rating and other languages. Omitted fields keep their value; saving never publishes. Next: store.get\_listing, then store.publish.

| | |
| - | - |
| **MCP** | `summer_store_update_listing`, a tool on the hosted MCP. Elsewhere: `summer_call` with `"op": "store.update_listing"` |
| **CLI** | `summer store update-listing` |
| **Runs** | On Summer's servers: the hosted MCP, or the npm MCP after `summer login`. Needs your Summer sign-in. |
| **Effect** | Changes your own drafts, files or settings. Nobody else sees it yet. |
| **Asks you first** | No: **Make and build** is on by default in Agent permissions. When it is off, your agent asks you first. |
| **3.x names** | `summer_store_update_listing` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `gameId` | string | Yes | |
| `title` | string | No | |
| `targets` | "web" \| "windows-x64" \| "macos-universal" \| "linux-x64" \| "ios" \| "android"\[] | No | Items 1 to …. |
| `desktop` | object | No | |
| `desktop.tagline` | string | No | |
| `desktop.description` | string | No | |
| `desktop.tags` | string\[] | No | Tag ids or labels from the store's tag list. |
| `mobile` | object | No | null shows the desktop text on phones. |
| `mobile.tagline` | string \| null | No | |
| `mobile.description` | string \| null | No | |
| `mobileSameAsDesktop` | boolean | No | Copy the desktop tagline and description into the mobile store now (later desktop edits do not follow). |
| `longDescription` | string \| null | No | "About this game" on the game page: a few paragraphs of plain text (no markdown), a blank line between paragraphs, up to 12000 characters. null removes it. |
| `support` | string \| null | No | Where players get help: one email address ([help@yourgame.com](mailto:help@yourgame.com)) or an https page. Shown as "Get support" on the game page. null removes it. |
| `release` | object \| null | No | \{stage, date?}: in\_development, coming\_soon, early\_access or released. null: released once published, no date shown. |
| `contentRating` | "everyone" \| "everyone10Plus" \| "teen" | No | |
| `contentDescriptors` | "mildFantasyAction" \| "competitivePlay" \| "userGeneratedContent" \| "flashingLights" \| "simulatedGambling"\[] | No | Empty list: none apply. |
| `localized` | object | No | The page in other languages, by language tag. summer.games offers es (Español), pt-br (Português (Brasil)), de (Deutsch), fr (Français), ja (日本語), ko (한국어), zh-hans (简体中文), ru (Русский), it (Italiano). Each language changes only the texts it names; null or "" removes one text, and a language set to null is removed. Missing texts show the main text. |
| `dryRun` | boolean | No | Check and describe the call without doing it: nothing changes, nothing is spent. |
| `idempotencyKey` | string | No | Retry key. Reuse it only to retry the identical request, so it never happens twice. Length 1 to 128. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "gameId": {
        "type": "string",
        "pattern": "^[A-Za-z0-9_-]{1,128}$"
      },
      "title": {
        "type": "string"
      },
      "targets": {
        "minItems": 1,
        "type": "array",
        "items": {
          "type": "string",
          "enum": [
            "web",
            "windows-x64",
            "macos-universal",
            "linux-x64",
            "ios",
            "android"
          ]
        }
      },
      "desktop": {
        "type": "object",
        "properties": {
          "tagline": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "tags": {
            "description": "Tag ids or labels from the store's tag list.",
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1
            }
          }
        }
      },
      "mobile": {
        "description": "null shows the desktop text on phones.",
        "type": "object",
        "properties": {
          "tagline": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "description": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          }
        }
      },
      "mobileSameAsDesktop": {
        "description": "Copy the desktop tagline and description into the mobile store now (later desktop edits do not follow).",
        "type": "boolean"
      },
      "longDescription": {
        "description": "\"About this game\" on the game page: a few paragraphs of plain text (no markdown), a blank line between paragraphs, up to 12000 characters. null removes it.",
        "anyOf": [
          {
            "type": "string",
            "maxLength": 12000
          },
          {
            "type": "null"
          }
        ]
      },
      "support": {
        "description": "Where players get help: one email address (help@yourgame.com) or an https page. Shown as \"Get support\" on the game page. null removes it.",
        "anyOf": [
          {
            "type": "string",
            "maxLength": 2048
          },
          {
            "type": "null"
          }
        ]
      },
      "release": {
        "description": "{stage, date?}: in_development, coming_soon, early_access or released. null: released once published, no date shown.",
        "anyOf": [
          {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "stage": {
                    "description": "in_development: playable prototype or game jam entry, not finished, only on the In development page. coming_soon: wishlistable, not playable. early_access: playable, in the main store, still being finished. released: finished.",
                    "type": "string",
                    "enum": [
                      "in_development",
                      "coming_soon",
                      "early_access",
                      "released"
                    ]
                  },
                  "date": {
                    "description": "in_development, coming_soon: planned day \"2026-11-14\", month \"2026-11\", quarter \"2026-Q4\" or year \"2026\". early_access: start day \"2026-11-14\". released: the day it came out. Omit for no date.",
                    "type": "string",
                    "pattern": "^\\d{4}(-(0[1-9]|1[0-2])(-(0[1-9]|[12]\\d|3[01]))?|-Q[1-4])?$"
                  }
                },
                "required": [
                  "stage"
                ]
              },
              {
                "description": "Older form: comingSoon true is coming_soon, false is released.",
                "type": "object",
                "properties": {
                  "comingSoon": {
                    "type": "boolean"
                  },
                  "date": {
                    "type": "string",
                    "pattern": "^\\d{4}(-(0[1-9]|1[0-2])(-(0[1-9]|[12]\\d|3[01]))?|-Q[1-4])?$"
                  }
                },
                "required": [
                  "comingSoon"
                ]
              }
            ]
          },
          {
            "type": "null"
          }
        ]
      },
      "contentRating": {
        "type": "string",
        "enum": [
          "everyone",
          "everyone10Plus",
          "teen"
        ]
      },
      "contentDescriptors": {
        "description": "Empty list: none apply.",
        "type": "array",
        "items": {
          "type": "string",
          "enum": [
            "mildFantasyAction",
            "competitivePlay",
            "userGeneratedContent",
            "flashingLights",
            "simulatedGambling"
          ]
        }
      },
      "localized": {
        "description": "The page in other languages, by language tag. summer.games offers es (Español), pt-br (Português (Brasil)), de (Deutsch), fr (Français), ja (日本語), ko (한국어), zh-hans (简体中文), ru (Русский), it (Italiano). Each language changes only the texts it names; null or \"\" removes one text, and a language set to null is removed. Missing texts show the main text.",
        "type": "object",
        "additionalProperties": {
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "title": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "tagline": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "description": {
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                },
                "longDescription": {
                  "description": "About this game in this language: plain text, a blank line between paragraphs.",
                  "anyOf": [
                    {
                      "type": "string"
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              }
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "dryRun": {
        "description": "Check and describe the call without doing it: nothing changes, nothing is spent.",
        "type": "boolean"
      },
      "idempotencyKey": {
        "description": "Retry key. Reuse it only to retry the identical request, so it never happens twice.",
        "type": "string",
        "minLength": 1,
        "maxLength": 128
      }
    },
    "required": [
      "gameId"
    ]
  }
  ```
</Accordion>

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "saved": {
        "type": "boolean"
      },
      "revisionId": {
        "description": "The draft that holds the change.",
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      },
      "readyToPublish": {
        "anyOf": [
          {
            "type": "boolean"
          },
          {
            "type": "null"
          }
        ]
      },
      "missing": {
        "description": "Required checklist items still open.",
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "id": {
              "type": "string"
            },
            "label": {
              "type": "string"
            },
            "required": {
              "type": "boolean"
            },
            "done": {
              "type": "boolean"
            },
            "detail": {
              "type": "string"
            }
          },
          "required": [
            "id",
            "label",
            "required",
            "done",
            "detail"
          ],
          "additionalProperties": false
        }
      },
      "warnings": {
        "type": "array",
        "items": {
          "type": "string"
        }
      }
    },
    "required": [
      "saved",
      "revisionId",
      "readyToPublish",
      "missing",
      "warnings"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** Set the tagline and tags.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_store_update_listing",
    "arguments": {
      "gameId": "g_123",
      "desktop": {
        "tagline": "Stitch the world back together",
        "tags": [
          "cozy",
          "puzzle",
          "cooperative"
        ]
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer store update-listing --game-id g_123 --input '{"desktop":{"tagline":"Stitch the world back together","tags":["cozy","puzzle","cooperative"]}}'
  ```
</CodeGroup>

***

### update\_release\_notes

`store.update_release_notes`: **Write release notes**

Write the release notes players read for a released bundle build: a title and Markdown text. Players see them at once once the release is live. Empty title and text take them down. Asks the owner first. Next: store.status.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "store.update_release_notes"` |
| **CLI** | `summer store update-release-notes` |
| **Runs** | On Summer's servers: the hosted MCP, or the npm MCP after `summer login`. Needs your Summer sign-in. |
| **Effect** | Changes what players see or pay, or who can act on a game. |
| **Asks you first** | Yes, for now: Summer Games still asks you first. Soon it follows **Prices and live changes** in Agent permissions (on by default). |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `gameId` | string | Yes | From games.list. |
| `uploadId` | string | Yes | The released bundle build (b.) from store.status. Length 3 to 140. |
| `title` | string | Yes | A short title, e.g. "Winter update". Length 0 to 120. |
| `markdown` | string | Yes | What changed, in Markdown. Images only ones uploaded to Summer. Length 0 to 32768. |
| `dryRun` | boolean | No | Check and describe the call without doing it: nothing changes, nothing is spent. |
| `idempotencyKey` | string | No | Retry key. Reuse it only to retry the identical request, so it never happens twice. Length 1 to 128. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "gameId": {
        "description": "From games.list.",
        "type": "string",
        "pattern": "^[A-Za-z0-9_-]{1,128}$"
      },
      "uploadId": {
        "description": "The released bundle build (b.) from store.status.",
        "type": "string",
        "minLength": 3,
        "maxLength": 140
      },
      "title": {
        "description": "A short title, e.g. \"Winter update\".",
        "type": "string",
        "maxLength": 120
      },
      "markdown": {
        "description": "What changed, in Markdown. Images only ones uploaded to Summer.",
        "type": "string",
        "maxLength": 32768
      },
      "dryRun": {
        "description": "Check and describe the call without doing it: nothing changes, nothing is spent.",
        "type": "boolean"
      },
      "idempotencyKey": {
        "description": "Retry key. Reuse it only to retry the identical request, so it never happens twice.",
        "type": "string",
        "minLength": 1,
        "maxLength": 128
      }
    },
    "required": [
      "gameId",
      "uploadId",
      "title",
      "markdown"
    ]
  }
  ```
</Accordion>

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "uploadId": {
        "type": "string"
      },
      "title": {
        "type": "string"
      },
      "markdown": {
        "type": "string"
      }
    },
    "required": [
      "uploadId",
      "title",
      "markdown"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** Tell players what changed in the new build.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "store.update_release_notes",
      "input": {
        "gameId": "g_123",
        "uploadId": "b.pub_9",
        "title": "Winter update",
        "markdown": "- Snow levels\n- Faster loading"
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer store update-release-notes --game-id g_123 --upload-id b.pub_9 --title 'Winter update' --markdown '- Snow levels
  - Faster loading'
  ```
</CodeGroup>

***

### upload\_begin

`store.upload_begin`: **Start a store upload**

Start uploading a build to a game: kind bundle (the summer.games export or one .pck), web (an HTML5 zip with index.html) or download (a desktop archive). Returns uploadId and the part plan. Next: store.upload\_sign\_parts.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "store.upload_begin"` |
| **CLI** | `summer store upload-begin` |
| **Runs** | On Summer's servers: the hosted MCP, or the npm MCP after `summer login`. Needs your Summer sign-in. |
| **Effect** | Changes your own drafts, files or settings. Nobody else sees it yet. |
| **Asks you first** | No: **Make and build** is on by default in Agent permissions. When it is off, your agent asks you first. |
| **3.x names** | `summer_build_begin_upload`, `summer_store_version_begin_upload` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `gameId` | string | Yes | From games.list. |
| `kind` | "bundle" \| "web" \| "download" | Yes | |
| `sizeBytes` | integer | Yes | Size of the whole file. Range 1 to 42949672960. |
| `format` | "summer-bundle" \| "pck" | No | bundle only: the summer.games export (.zip) or one .pck. |
| `sha256` | string | No | bundle only: SHA-256 of the whole file, 64 hex characters. |
| `clientVersion` | string | No | bundle only: vMAJOR.MINOR.PATCH, e.g. v1.0.0; a new one per upload. |
| `targetPlatforms` | "ios" \| "android" \| "macos" \| "windows"\[] | No | bundle only: player platforms it is checked and shipped for. A game without a server targets ios and android only. Items 1 to …. |
| `entryPoint` | string | No | bundle only: res\:// path of the main scene. |
| `hostedBuild` | string | No | bundle only, a hosted game: its summer.build.json as text, as exported. Length 0 to 200000. |
| `platform` | "windows-x64" \| "macos-universal" \| "linux-x64" | No | download only: macos-universal, windows-x64 or linux-x64. |
| `fileName` | string | No | web or download: the file name players see. Length 1 to 255. |
| `label` | string | No | web or download: a version label players may see, e.g. 1.0.2. Length 0 to 80. |
| `dryRun` | boolean | No | Check and describe the call without doing it: nothing changes, nothing is spent. |
| `idempotencyKey` | string | No | Retry key. Reuse it only to retry the identical request, so it never happens twice. Length 1 to 128. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "gameId": {
        "description": "From games.list.",
        "type": "string",
        "pattern": "^[A-Za-z0-9_-]{1,128}$"
      },
      "kind": {
        "type": "string",
        "enum": [
          "bundle",
          "web",
          "download"
        ]
      },
      "sizeBytes": {
        "description": "Size of the whole file.",
        "type": "integer",
        "minimum": 1,
        "maximum": 42949672960
      },
      "format": {
        "description": "bundle only: the summer.games export (.zip) or one .pck.",
        "type": "string",
        "enum": [
          "summer-bundle",
          "pck"
        ]
      },
      "sha256": {
        "description": "bundle only: SHA-256 of the whole file, 64 hex characters.",
        "type": "string"
      },
      "clientVersion": {
        "description": "bundle only: vMAJOR.MINOR.PATCH, e.g. v1.0.0; a new one per upload.",
        "type": "string"
      },
      "targetPlatforms": {
        "description": "bundle only: player platforms it is checked and shipped for. A game without a server targets ios and android only.",
        "minItems": 1,
        "type": "array",
        "items": {
          "type": "string",
          "enum": [
            "ios",
            "android",
            "macos",
            "windows"
          ]
        }
      },
      "entryPoint": {
        "description": "bundle only: res:// path of the main scene.",
        "type": "string"
      },
      "hostedBuild": {
        "description": "bundle only, a hosted game: its summer.build.json as text, as exported.",
        "type": "string",
        "maxLength": 200000
      },
      "platform": {
        "description": "download only: macos-universal, windows-x64 or linux-x64.",
        "type": "string",
        "enum": [
          "windows-x64",
          "macos-universal",
          "linux-x64"
        ]
      },
      "fileName": {
        "description": "web or download: the file name players see.",
        "type": "string",
        "minLength": 1,
        "maxLength": 255
      },
      "label": {
        "description": "web or download: a version label players may see, e.g. 1.0.2.",
        "type": "string",
        "maxLength": 80
      },
      "dryRun": {
        "description": "Check and describe the call without doing it: nothing changes, nothing is spent.",
        "type": "boolean"
      },
      "idempotencyKey": {
        "description": "Retry key. Reuse it only to retry the identical request, so it never happens twice.",
        "type": "string",
        "minLength": 1,
        "maxLength": 128
      }
    },
    "required": [
      "gameId",
      "kind",
      "sizeBytes"
    ]
  }
  ```
</Accordion>

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "uploadId": {
        "type": "string"
      },
      "kind": {
        "type": "string",
        "enum": [
          "bundle",
          "web",
          "download"
        ]
      },
      "partSizeBytes": {
        "type": "number"
      },
      "partCount": {
        "type": "number"
      },
      "resumed": {
        "description": "bundle: an unfinished upload of the same version continues.",
        "type": "boolean"
      },
      "partsNeedSha256": {
        "description": "bundle: each part URL is bound to the part's SHA-256.",
        "type": "boolean"
      }
    },
    "required": [
      "uploadId",
      "kind",
      "partSizeBytes",
      "partCount",
      "resumed",
      "partsNeedSha256"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** A web build that plays on summer.games.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "store.upload_begin",
      "input": {
        "gameId": "g_123",
        "kind": "web",
        "sizeBytes": 48000000,
        "fileName": "quilt-web.zip",
        "label": "1.0.0"
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer store upload-begin --game-id g_123 --kind web --size-bytes 48000000 --file-name quilt-web.zip --label 1.0.0
  ```
</CodeGroup>

***

### upload\_complete

`store.upload_complete`: **Finish a store upload**

Finish a store upload after every part is PUT: Summer seals it and checks it. Answers a job while it checks (jobs.wait), or the finished status. Safe to call again. On a live game only the owner may finish a web build or download.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "store.upload_complete"` |
| **CLI** | `summer store upload-complete` |
| **Runs** | On Summer's servers: the hosted MCP, or the npm MCP after `summer login`. Needs your Summer sign-in. |
| **Effect** | Changes your own drafts, files or settings. Nobody else sees it yet. |
| **Asks you first** | No: **Make and build** is on by default in Agent permissions. When it is off, your agent asks you first. |
| **Long work** | Answers with a job at once. Wait with `jobs.wait`. |
| **3.x names** | `summer_build_complete_upload`, `summer_store_version_complete` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `gameId` | string | Yes | From games.list. |
| `uploadId` | string | Yes | From store.upload\_begin or store.status. Length 3 to 140. |
| `dryRun` | boolean | No | Check and describe the call without doing it: nothing changes, nothing is spent. |
| `idempotencyKey` | string | No | Retry key. Reuse it only to retry the identical request, so it never happens twice. Length 1 to 128. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "gameId": {
        "description": "From games.list.",
        "type": "string",
        "pattern": "^[A-Za-z0-9_-]{1,128}$"
      },
      "uploadId": {
        "description": "From store.upload_begin or store.status.",
        "type": "string",
        "minLength": 3,
        "maxLength": 140
      },
      "dryRun": {
        "description": "Check and describe the call without doing it: nothing changes, nothing is spent.",
        "type": "boolean"
      },
      "idempotencyKey": {
        "description": "Retry key. Reuse it only to retry the identical request, so it never happens twice.",
        "type": "string",
        "minLength": 1,
        "maxLength": 128
      }
    },
    "required": [
      "gameId",
      "uploadId"
    ]
  }
  ```
</Accordion>

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "uploadId": {
        "type": "string"
      },
      "kind": {
        "type": "string",
        "enum": [
          "bundle",
          "web",
          "download"
        ]
      },
      "platforms": {
        "description": "bundle: the player platforms it is checked for; web or download: its one platform.",
        "type": "array",
        "items": {
          "type": "string"
        }
      },
      "version": {
        "description": "bundle: its client version; web or download: its label.",
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      },
      "fileName": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      },
      "state": {
        "description": "uploading (parts still to send), processing, checking (per platform), ready or failed.",
        "type": "string",
        "enum": [
          "uploading",
          "processing",
          "checking",
          "ready",
          "failed"
        ]
      },
      "detail": {
        "type": "string"
      },
      "playUrl": {
        "description": "web: where it plays once ready.",
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      },
      "createdAt": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      },
      "jobId": {
        "description": "Follow it with jobs.get or jobs.wait.",
        "type": "string"
      }
    },
    "required": [
      "uploadId",
      "kind",
      "platforms",
      "version",
      "fileName",
      "state",
      "detail",
      "playUrl",
      "createdAt",
      "jobId"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** Finish a bundle upload and follow its checks.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "store.upload_complete",
      "input": {
        "gameId": "g_123",
        "uploadId": "b.pub_9"
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer store upload-complete --game-id g_123 --upload-id b.pub_9
  ```
</CodeGroup>

***

### upload\_file

`store.upload_file`: **Upload file**

Upload an export from summer\_export\_game to the creator's store game, confirm-gated - a store bundle as a Build, or a web or native download as a store version.

| | |
| - | - |
| **MCP** | `summer_publish_build` in the npm MCP |
| **CLI** | `summer store upload-file` |
| **Runs** | On your computer, in the `summer-engine` npm package. |
| **Effect** | Publishes: makes something public or live. |
| **Asks you first** | No: **Publish** is on by default in Agent permissions. When it is off, your agent asks you first. |
| **3.x names** | `summer_publish_build` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `gameId` | string | No | The store game id (from games.list, or the Studio store page URL). Without it the call fails with game\_required and lists your store games, or says why the store did not list them. |
| `file` | string | No | Exported .zip. Defaults to the last summer\_export\_game result. |
| `clientVersion` | string | Yes | Build version, vMAJOR.MINOR.PATCH (e.g. v1.0.0); a new upload needs a new version. |
| `publish` | boolean | No | Bundles only: also approve the Build for players. A game that has not passed review keeps it as a preview; an agent needs the owner's approval. Default `false`. |
| `platform` | "web" \| "macos-universal" \| "windows-x64" \| "linux-x64" | No | Web builds and native downloads: the store platform. Defaults to the last export's platform; omit for a store bundle. |
| `confirm` | boolean | No | Set true only after the user approves the exact upload. Default `false`. |
| `waitSeconds` | integer | No | How long to wait for Summer to make the Build (default 600). On timeout, call again to keep waiting. Range 0 to 1800. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "gameId": {
        "type": "string",
        "description": "The store game id (from games.list, or the Studio store page URL). Without it the call fails with game_required and lists your store games, or says why the store did not list them."
      },
      "file": {
        "type": "string",
        "description": "Exported .zip. Defaults to the last summer_export_game result."
      },
      "clientVersion": {
        "type": "string",
        "description": "Build version, vMAJOR.MINOR.PATCH (e.g. v1.0.0); a new upload needs a new version."
      },
      "publish": {
        "type": "boolean",
        "default": false,
        "description": "Bundles only: also approve the Build for players. A game that has not passed review keeps it as a preview; an agent needs the owner's approval."
      },
      "platform": {
        "type": "string",
        "enum": [
          "web",
          "macos-universal",
          "windows-x64",
          "linux-x64"
        ],
        "description": "Web builds and native downloads: the store platform. Defaults to the last export's platform; omit for a store bundle."
      },
      "confirm": {
        "type": "boolean",
        "default": false,
        "description": "Set true only after the user approves the exact upload."
      },
      "waitSeconds": {
        "type": "integer",
        "minimum": 0,
        "maximum": 1800,
        "description": "How long to wait for Summer to make the Build (default 600). On timeout, call again to keep waiting."
      }
    },
    "required": [
      "clientVersion"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** Upload file

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_publish_build",
    "arguments": {}
  }
  ```

  ```bash CLI theme={null}
  summer store upload-file
  ```
</CodeGroup>

***

### upload\_sign\_parts

`store.upload_sign_parts`: **Sign upload parts**

Get upload URLs for parts of a store upload, up to 100 at a time. PUT each part to its URL with every returned header; sign again for a part that failed or expired. Bundle parts need their SHA-256. Next: store.upload\_complete.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "store.upload_sign_parts"` |
| **CLI** | `summer store upload-sign-parts` |
| **Runs** | On Summer's servers: the hosted MCP, or the npm MCP after `summer login`. Needs your Summer sign-in. |
| **Effect** | Changes your own drafts, files or settings. Nobody else sees it yet. |
| **Asks you first** | No: **Make and build** is on by default in Agent permissions. When it is off, your agent asks you first. |
| **3.x names** | `summer_build_sign_parts`, `summer_store_version_sign_parts` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `gameId` | string | Yes | From games.list. |
| `uploadId` | string | Yes | From store.upload\_begin or store.status. Length 3 to 140. |
| `parts` | object\[] | Yes | Items 1 to 100. |
| `parts[].partNumber` | integer | Yes | Range 1 to 10000. |
| `parts[].sha256` | string | No | bundle: the part's SHA-256, 64 hex characters. |
| `dryRun` | boolean | No | Check and describe the call without doing it: nothing changes, nothing is spent. |
| `idempotencyKey` | string | No | Retry key. Reuse it only to retry the identical request, so it never happens twice. Length 1 to 128. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "gameId": {
        "description": "From games.list.",
        "type": "string",
        "pattern": "^[A-Za-z0-9_-]{1,128}$"
      },
      "uploadId": {
        "description": "From store.upload_begin or store.status.",
        "type": "string",
        "minLength": 3,
        "maxLength": 140
      },
      "parts": {
        "minItems": 1,
        "maxItems": 100,
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "partNumber": {
              "type": "integer",
              "minimum": 1,
              "maximum": 10000
            },
            "sha256": {
              "description": "bundle: the part's SHA-256, 64 hex characters.",
              "type": "string"
            }
          },
          "required": [
            "partNumber"
          ]
        }
      },
      "dryRun": {
        "description": "Check and describe the call without doing it: nothing changes, nothing is spent.",
        "type": "boolean"
      },
      "idempotencyKey": {
        "description": "Retry key. Reuse it only to retry the identical request, so it never happens twice.",
        "type": "string",
        "minLength": 1,
        "maxLength": 128
      }
    },
    "required": [
      "gameId",
      "uploadId",
      "parts"
    ]
  }
  ```
</Accordion>

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "parts": {
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "partNumber": {
              "type": "number"
            },
            "method": {
              "type": "string",
              "const": "PUT"
            },
            "url": {
              "type": "string"
            },
            "headers": {
              "type": "object",
              "additionalProperties": {
                "type": "string"
              }
            },
            "expiresAt": {
              "type": "string"
            }
          },
          "required": [
            "partNumber",
            "method",
            "url",
            "headers",
            "expiresAt"
          ],
          "additionalProperties": false
        }
      }
    },
    "required": [
      "parts"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** The URL for the one part of a small web build.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "store.upload_sign_parts",
      "input": {
        "gameId": "g_123",
        "uploadId": "v.ver_1",
        "parts": [
          {
            "partNumber": 1
          }
        ]
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer store upload-sign-parts --game-id g_123 --upload-id v.ver_1 --input '{"parts":[{"partNumber":1}]}'
  ```
</CodeGroup>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.