> ## 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.

# MCP tools: publish

> Publish tools of the Summer Engine MCP. Export, upload builds, write the store page and ask the owner to publish. For each tool: what it does, what it needs, inputs, output and an example.

Export, upload builds, write the store page and ask the owner to publish. 25 tools. What each column means, and how to connect: [MCP tools reference](/mcp/tools-reference).

<Note>
  Generated from the tools' own definitions: the `summer-engine` npm package `3.3.0` (its MCP server's `tools/list`, `library/tools/*/resource.yaml` and `registry/generated/index.json` in [SummerEngine/summer](https://github.com/SummerEngine/summer)) and the hosted Summer Engine MCP (`src/lib/mcp/hosted` at commit `8c4351ee30`). If something here is wrong, the tool definition is wrong.
</Note>

| Tool | Needs | What it does |
| - | - | - |
| [`summer_build_begin_upload`](#summer_build_begin_upload) | Summer account | Start uploading an exported game build (the summer.games .zip bundle or one .pck) to a store game: the same build-publication steps as Studio upload. |
| [`summer_build_complete_upload`](#summer_build_complete_upload) | Summer account | Finish a build upload after every part is PUT: Summer seals it, makes the Build and names its client pack, then checks it on each target platform. |
| [`summer_build_release`](#summer_build_release) | Summer account | After the owner approved publishing and Summer staff approved the game, release the approved bundle build to players on every platform it passed its checks for. |
| [`summer_build_sign_parts`](#summer_build_sign_parts) | Summer account | Get upload URLs for parts of a build started with summer\_build\_begin\_upload. |
| [`summer_build_status`](#summer_build_status) | Summer account | Read uploaded builds of a store game (or one, by publicationId): version, targets, state (uploading, processing, checking, ready, failed) and what to do next. |
| [`summer_creator_config`](#summer_creator_config) | Engine | Read or update the shared non-secret \~/.summer configuration used by the CLI and this MCP. |
| [`summer_creator_publish`](#summer_creator_publish) | Engine + Creator token | Deprecated: use summer\_export\_game, then summer\_publish\_build, which upload the summer.games .zip to the game's store listing. |
| [`summer_creator_releases`](#summer_creator_releases) | Creator token | List real creator-owned releases from the versioned Summer Platform creator API. |
| [`summer_export_game`](#summer_export_game) | Nothing | Export the game in the exact file the Summer Games store takes, with the installed Summer Engine headless (no window). |
| [`summer_export_templates`](#summer_export_templates) | Nothing | List, download and install Summer Engine export templates from Summer's CDN into the folder the installed engine reads, checking each file's sha256. |
| [`summer_get_project`](#summer_get_project) | Summer account | Get one Studio project: name, kind, its board id (summer\_board\_read), the idea it was made from, share state and address. |
| [`summer_list_projects`](#summer_list_projects) | Summer account | List the user's Summer Studio projects (games), newest first: id, name, kind (create: made in the browser; cloud; desktop), last edit, share state and where it opens. |
| [`summer_publish_build`](#summer_publish_build) | Store sign-in | Upload an export from summer\_export\_game to the creator's game on summer.games, through the same store upload Studio uses, straight from disk. |
| [`summer_store_cancel_submission`](#summer_store_cancel_submission) | Summer account | Withdraw a waiting owner approval (from summer\_store\_submit) so its link no longer works. |
| [`summer_store_create_game`](#summer_store_create_game) | Summer account | Create a game on the Summer Games store with its first store page draft. |
| [`summer_store_get_listing`](#summer_store_get_listing) | Summer account | Read a game's store page as the store will show it: review state, targets and store flows, text per flow (desktop, mobile), art per slot, price, uploaded builds, the publish checklist (what is missing), and any owner… |
| [`summer_store_list_games`](#summer_store_list_games) | Summer account | List the user's games on the Summer Games store (the creator catalog): game id, name, status and targets. |
| [`summer_store_preview_link`](#summer_store_preview_link) | Summer account | Make a private link to the saved store page draft on summer.games (noindex; Buy and Play do nothing) to show it to someone or look at it. |
| [`summer_store_set_art`](#summer_store_set_art) | Summer account | Put images into one store art slot from your Summer assets (assetId) or public image URLs. |
| [`summer_store_submit`](#summer_store_submit) | Summer account | Ask the owner to publish the store page draft with a build and price. |
| [`summer_store_update_listing`](#summer_store_update_listing) | Summer account | Edit the store page draft: title, targets, desktop text (tagline, description, 3-8 tags), mobile text (its own shorter tagline and description, or mobileSameAsDesktop to copy the desktop text once), release date and… |
| [`summer_store_version_begin_upload`](#summer_store_version_begin_upload) | Summer account | Start uploading a web build or a desktop download to a store game (summer\_export\_game with format "download" makes these). |
| [`summer_store_version_complete`](#summer_store_version_complete) | Summer account | Finish a store version upload after every part is PUT. |
| [`summer_store_version_sign_parts`](#summer_store_version_sign_parts) | Summer account | Get upload URLs for parts of a store version (web build or download). |
| [`summer_store_version_status`](#summer_store_version_status) | Summer account | Read a store game's web builds and downloads (or one, by versionId): platform, status (awaiting\_upload, processing, ready, rejected) and, while uploading, the parts already stored. |

### summer\_build\_begin\_upload

On the hosted MCP.

Start uploading an exported game build (the summer.games .zip bundle or one .pck) to a store game: the same build-publication steps as Studio upload. Returns publicationId and the part plan (64 MiB parts). Then hash each part, call [`summer_build_sign_parts`](/mcp/tools/publish#summer_build_sign_parts), PUT each part to its URL with every returned header, and finish with [`summer_build_complete_upload`](/mcp/tools/publish#summer_build_complete_upload). The local summer-engine MCP does all of this from disk ([`summer_publish_build`](/mcp/tools/publish#summer_publish_build)). Calling again for the same file resumes.

| | |
| - | - |
| **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `gameId` | string | Yes | |
| `format` | "summer-bundle" \| "pck" | Yes | |
| `sha256` | string | Yes | SHA-256 of the whole file. |
| `sizeBytes` | integer | Yes | Range 1 to 42949672960. |
| `clientVersion` | string | Yes | |
| `targetPlatforms` | "ios" \| "android" \| "macos" \| "windows"\[] | Yes | The client platforms this build is checked and shipped for. A game without a server may target only ios and android; ship macOS and Windows as downloads (summer\_store\_version\_\*). Items 1 to …. |
| `entryPoint` | string | Yes | |
| `hostedBuild` | object | No | A hosted game's summer.build.json, as exported. |
| `idempotencyKey` | string | No | 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}$"
      },
      "format": {
        "type": "string",
        "enum": [
          "summer-bundle",
          "pck"
        ]
      },
      "sha256": {
        "description": "SHA-256 of the whole file.",
        "type": "string",
        "pattern": "^(sha256:)?[0-9a-f]{64}$"
      },
      "sizeBytes": {
        "type": "integer",
        "minimum": 1,
        "maximum": 42949672960
      },
      "clientVersion": {
        "type": "string",
        "pattern": "^v(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(-r[1-9]\\d*)?$"
      },
      "targetPlatforms": {
        "description": "The client platforms this build is checked and shipped for. A game without a server may target only ios and android; ship macOS and Windows as downloads (summer_store_version_*).",
        "minItems": 1,
        "type": "array",
        "items": {
          "type": "string",
          "enum": [
            "ios",
            "android",
            "macos",
            "windows"
          ]
        }
      },
      "entryPoint": {
        "type": "string",
        "pattern": "^res:\\/\\/"
      },
      "hostedBuild": {
        "description": "A hosted game's summer.build.json, as exported.",
        "type": "object",
        "propertyNames": {
          "type": "string"
        },
        "additionalProperties": {}
      },
      "idempotencyKey": {
        "type": "string",
        "minLength": 1,
        "maxLength": 128
      }
    },
    "required": [
      "gameId",
      "format",
      "sha256",
      "sizeBytes",
      "clientVersion",
      "targetPlatforms",
      "entryPoint"
    ]
  }
  ```
</Accordion>

**Output:** MCP text content holding JSON; errors set `isError`. From the tool's own description: Returns publicationId and the part plan (64 MiB parts).

```json Example call theme={null}
{
  "name": "summer_build_begin_upload",
  "arguments": {
    "gameId": "<gameId>",
    "format": "summer-bundle",
    "sha256": "<sha256>",
    "sizeBytes": 1,
    "clientVersion": "<clientVersion>",
    "targetPlatforms": [
      "ios"
    ],
    "entryPoint": "<entryPoint>"
  }
}
```

***

### summer\_build\_complete\_upload

On the hosted MCP.

Finish a build upload after every part is PUT: Summer seals it, makes the Build and names its client pack, then checks it on each target platform. Safe to call again with the same arguments until it reports ready or failed. A store page that has not passed review keeps the build as a preview; nothing goes live here.

| | |
| - | - |
| **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `gameId` | string | Yes | |
| `publicationId` | string | Yes | |
| `clientVersion` | string | Yes | |
| `entryPoint` | string | Yes | |
| `clientPack` | object | Yes | The client .pck: the uploaded file itself for a .pck upload, or client.pck inside the summer.games bundle. |
| `clientPack.sha256` | string | Yes | |
| `clientPack.sizeBytes` | integer | Yes | Range 1 to 9007199254740991. |
| `compositionPath` | string | No | Hosted games: res\:// path of the network composition. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "gameId": {
        "type": "string",
        "pattern": "^[A-Za-z0-9_-]{1,128}$"
      },
      "publicationId": {
        "type": "string",
        "pattern": "^[A-Za-z0-9_-]{1,128}$"
      },
      "clientVersion": {
        "type": "string",
        "pattern": "^v(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(-r[1-9]\\d*)?$"
      },
      "entryPoint": {
        "type": "string",
        "pattern": "^res:\\/\\/"
      },
      "clientPack": {
        "description": "The client .pck: the uploaded file itself for a .pck upload, or client.pck inside the summer.games bundle.",
        "type": "object",
        "properties": {
          "sha256": {
            "type": "string",
            "pattern": "^(sha256:)?[0-9a-f]{64}$"
          },
          "sizeBytes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 9007199254740991
          }
        },
        "required": [
          "sha256",
          "sizeBytes"
        ]
      },
      "compositionPath": {
        "description": "Hosted games: res:// path of the network composition.",
        "type": "string",
        "pattern": "^res:\\/\\/"
      }
    },
    "required": [
      "gameId",
      "publicationId",
      "clientVersion",
      "entryPoint",
      "clientPack"
    ]
  }
  ```
</Accordion>

**Output:** MCP text content holding JSON; errors set `isError`.

```json Example call theme={null}
{
  "name": "summer_build_complete_upload",
  "arguments": {
    "gameId": "<gameId>",
    "publicationId": "<publicationId>",
    "clientVersion": "<clientVersion>",
    "entryPoint": "<entryPoint>",
    "clientPack": {
      "sha256": "<sha256>",
      "sizeBytes": 1
    }
  }
}
```

***

### summer\_build\_release

On the hosted MCP.

After the owner approved publishing and Summer staff approved the game, release the approved bundle build to players on every platform it passed its checks for. Works only for the exact build the owner approved ([`summer_store_submit`](/mcp/tools/publish#summer_store_submit)); anything else is the owner's click in Studio. Web builds and downloads need no release: they play as soon as the store page is live.

| | |
| - | - |
| **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `gameId` | string | Yes | |

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

**Output:** MCP text content holding JSON; errors set `isError`.

```json Example call theme={null}
{
  "name": "summer_build_release",
  "arguments": {
    "gameId": "<gameId>"
  }
}
```

***

### summer\_build\_sign\_parts

On the hosted MCP.

Get upload URLs for parts of a build started with [`summer_build_begin_upload`](/mcp/tools/publish#summer_build_begin_upload). Each URL is bound to its part's SHA-256; send every returned header with the PUT. Sign again for any part that failed or expired: re-sending a part is safe.

| | |
| - | - |
| **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `gameId` | string | Yes | |
| `publicationId` | string | Yes | |
| `parts` | object\[] | Yes | Items 1 to 100. |
| `parts[].partNumber` | integer | Yes | Range 1 to 10000. |
| `parts[].sha256` | string | Yes | |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "gameId": {
        "type": "string",
        "pattern": "^[A-Za-z0-9_-]{1,128}$"
      },
      "publicationId": {
        "type": "string",
        "pattern": "^[A-Za-z0-9_-]{1,128}$"
      },
      "parts": {
        "minItems": 1,
        "maxItems": 100,
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "partNumber": {
              "type": "integer",
              "minimum": 1,
              "maximum": 10000
            },
            "sha256": {
              "type": "string",
              "pattern": "^(sha256:)?[0-9a-f]{64}$"
            }
          },
          "required": [
            "partNumber",
            "sha256"
          ]
        }
      }
    },
    "required": [
      "gameId",
      "publicationId",
      "parts"
    ]
  }
  ```
</Accordion>

**Output:** MCP text content holding JSON; errors set `isError`.

```json Example call theme={null}
{
  "name": "summer_build_sign_parts",
  "arguments": {
    "gameId": "<gameId>",
    "publicationId": "<publicationId>",
    "parts": [
      {
        "partNumber": 1,
        "sha256": "<sha256>"
      }
    ]
  }
}
```

***

### summer\_build\_status

On the hosted MCP.

Read uploaded builds of a store game (or one, by publicationId): version, targets, state (uploading, processing, checking, ready, failed) and what to do next.

| | |
| - | - |
| **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |
| **Hints** | `readOnlyHint` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `gameId` | string | Yes | |
| `publicationId` | string | No | |

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

**Output:** MCP text content holding JSON; errors set `isError`.

```json Example call theme={null}
{
  "name": "summer_build_status",
  "arguments": {
    "gameId": "<gameId>"
  }
}
```

***

### summer\_creator\_config

On the local MCP (`summer-engine` npm).

Read or update the shared non-secret \~/.summer configuration used by the CLI and this MCP. Mutations require confirm=true. Tokens are never returned or accepted by this tool.

| | |
| - | - |
| **Needs** | Summer Engine open with your project |
| **Effects** | writes files |
| **CLI** | `summer config` |

**Use when:**

* inspecting or changing shared CLI and MCP configuration values
* "which creator project id / channel is this CLI pointed at?"
* switching the default publish channel

**Do not use when:**

* reading or setting auth tokens — they never pass through this tool; use summer login / logout

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `action` | "list" \| "get" \| "set" \| "unset" | Yes | |
| `key` | "gateway.url" \| "creator.apiUrl" \| "creator.projectId" \| "creator.channel" | No | |
| `value` | string | No | |
| `confirm` | boolean | No | Default `false`. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "action": {
        "type": "string",
        "enum": [
          "list",
          "get",
          "set",
          "unset"
        ]
      },
      "key": {
        "type": "string",
        "enum": [
          "gateway.url",
          "creator.apiUrl",
          "creator.projectId",
          "creator.channel"
        ]
      },
      "value": {
        "type": "string"
      },
      "confirm": {
        "type": "boolean",
        "default": false
      }
    },
    "required": [
      "action"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Output:** MCP text content holding JSON; errors set `isError`.

```json Example call theme={null}
{
  "name": "summer_creator_config",
  "arguments": {
    "action": "list"
  }
}
```

***

### summer\_creator\_publish

On the local MCP (`summer-engine` npm).

Deprecated: use [`summer_export_game`](/mcp/tools/publish#summer_export_game), then [`summer_publish_build`](/mcp/tools/publish#summer_publish_build), which upload the summer.games .zip to the game's store listing. This old path publishes a .pck to the legacy Summercraft creator API with a separate sc\_ token and will be removed. First call with confirm=false and present the returned project, version, digest, size, artifact path, channel, and notes; set confirm only after the user approves that exact target. The server independently verifies token scope, ownership, bytes, and review state.

| | |
| - | - |
| **Needs** | Summer Engine open with your project<br />Creator token: `summer login --creator` |
| **Effects** | writes files, uses the network, publishes |
| **CLI** | `summer publish` |

**Use when:**

* releasing a user-approved build to a Summercraft channel
* "ship this exported build to the live channel"
* "release version 1.2.0 of my game"

**Do not use when:**

* uploading to summer.games — [`summer_export_game`](/mcp/tools/publish#summer_export_game), then [`summer_publish_build`](/mcp/tools/publish#summer_publish_build)
* the user has not approved the exact version, digest, and channel
* the game is not exported yet — export the .pck first (skill/export-and-ship)

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `project` | string | No | Project root. Defaults to the current working directory. |
| `artifact` | string | Yes | Exact path to the exported Summer .pck artifact. |
| `version` | string | Yes | Immutable release version. |
| `manifest` | string | No | Optional path to a JSON release manifest. |
| `projectId` | string | No | Creator project ID. Defaults to \~/.summer/config.json. |
| `channel` | string | No | Release channel. Defaults to the configured channel or production. |
| `notes` | string | No | Release notes shown during confirmation and recorded in the local audit. |
| `confirm` | boolean | No | Set true only after the user approves the exact release target. Default `false`. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "project": {
        "type": "string",
        "description": "Project root. Defaults to the current working directory."
      },
      "artifact": {
        "type": "string",
        "description": "Exact path to the exported Summer .pck artifact."
      },
      "version": {
        "type": "string",
        "description": "Immutable release version."
      },
      "manifest": {
        "type": "string",
        "description": "Optional path to a JSON release manifest."
      },
      "projectId": {
        "type": "string",
        "description": "Creator project ID. Defaults to ~/.summer/config.json."
      },
      "channel": {
        "type": "string",
        "description": "Release channel. Defaults to the configured channel or production."
      },
      "notes": {
        "type": "string",
        "description": "Release notes shown during confirmation and recorded in the local audit."
      },
      "confirm": {
        "type": "boolean",
        "default": false,
        "description": "Set true only after the user approves the exact release target."
      }
    },
    "required": [
      "artifact",
      "version"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Output:** MCP text content holding JSON; errors set `isError`.

```json Example call theme={null}
{
  "name": "summer_creator_publish",
  "arguments": {
    "artifact": "<artifact>",
    "version": "<version>"
  }
}
```

***

### summer\_creator\_releases

On the local MCP (`summer-engine` npm).

List real creator-owned releases from the versioned Summer Platform creator API. The server independently verifies the exact publish scope and project ownership.

| | |
| - | - |
| **Needs** | Creator token: `summer login --creator` |
| **Effects** | uses the network |
| **CLI** | `summer releases` |

**Use when:**

* reviewing which versions of a project are live per channel
* "what version is live right now?"
* "did the publish go through?" — confirming a release landed

**Do not use when:**

* publishing a new release — [`summer_publish_build`](/mcp/tools/publish#summer_publish_build)

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `projectId` | string | No | Creator project ID. Defaults to \~/.summer/config.json. |
| `limit` | integer | No | Default `20`. Range 1 to 100. |
| `cursor` | string | No | Opaque nextCursor from the previous page. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "projectId": {
        "type": "string",
        "description": "Creator project ID. Defaults to ~/.summer/config.json."
      },
      "limit": {
        "type": "integer",
        "minimum": 1,
        "maximum": 100,
        "default": 20
      },
      "cursor": {
        "type": "string",
        "description": "Opaque nextCursor from the previous page."
      }
    },
    "additionalProperties": false
  }
  ```
</Accordion>

**Output:** MCP text content holding JSON; errors set `isError`.

```json Example call theme={null}
{
  "name": "summer_creator_releases",
  "arguments": {}
}
```

***

### summer\_export\_game

On the local MCP (`summer-engine` npm).

Export the game in the exact file the Summer Games store takes, with the installed Summer Engine headless (no window). format "bundle" (default): the summer.games .zip the Summer apps run on iPhone, Android, macOS and Windows; targets picks the platforms (a game without a server: ios and android only); upload it with [`summer_publish_build`](/mcp/tools/publish#summer_publish_build). format "download" with one target: web (an HTML5 .zip on Summer's WebGPU Forward+ web template, played on summer.games), macos (.app zip, macos-universal) or windows (.exe zip, windows-x64); these need the export template from [`summer_export_templates`](/mcp/tools/publish#summer_export_templates) and are uploaded as store versions. Works without the editor running. Returns path, sha256, size, the manifest or store platform, and warnings.

| | |
| - | - |
| **Needs** | No open editor and no sign-in |
| **Effects** | writes files |
| **CLI** | `summer tool export-game --args '<json>'` |

**Use when:**

* "export my game for summer.games"
* "make a build I can upload to my store page"
* "export my game for iPhone and Android on Summer Games"
* "make a web build of my game for summer.games"
* "export a Mac or Windows download for my store page"
* preparing the bundle that [`summer_publish_build`](/mcp/tools/publish#summer_publish_build) uploads

**Do not use when:**

* exporting for Steam, itch.io, the App Store, Google Play or other stores — skill/export-and-ship
* the game is still being built; export when the user wants a Build

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `project` | string | No | Project folder with project.godot. Defaults to the MCP's bound project, then the working directory. |
| `out` | string | No | Output .zip path. Defaults to \<project>/.summer/exports/. |
| `targets` | "macos" \| "windows" \| "ios" \| "android" \| "web"\[] | No | Store platforms. Bundle: any of macos, windows, ios, android (omit to use every platform the project declares). Download: exactly one of web, macos, windows. |
| `format` | "bundle" \| "download" | No | bundle (default): the summer.games store build. download: a web build or native download; the default when targets is \["web"]. |
| `debug` | boolean | No | Export a debug build (--export-debug). Default `false`. |
| `timeoutSeconds` | integer | No | Stop the engine after this many seconds (default 900; a first export imports every asset). Range 10 to 7200. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "project": {
        "type": "string",
        "description": "Project folder with project.godot. Defaults to the MCP's bound project, then the working directory."
      },
      "out": {
        "type": "string",
        "description": "Output .zip path. Defaults to <project>/.summer/exports/."
      },
      "targets": {
        "type": "array",
        "items": {
          "type": "string",
          "enum": [
            "macos",
            "windows",
            "ios",
            "android",
            "web"
          ]
        },
        "description": "Store platforms. Bundle: any of macos, windows, ios, android (omit to use every platform the project declares). Download: exactly one of web, macos, windows."
      },
      "format": {
        "type": "string",
        "enum": [
          "bundle",
          "download"
        ],
        "description": "bundle (default): the summer.games store build. download: a web build or native download; the default when targets is [\"web\"]."
      },
      "debug": {
        "type": "boolean",
        "default": false,
        "description": "Export a debug build (--export-debug)."
      },
      "timeoutSeconds": {
        "type": "integer",
        "minimum": 10,
        "maximum": 7200,
        "description": "Stop the engine after this many seconds (default 900; a first export imports every asset)."
      }
    },
    "additionalProperties": false
  }
  ```
</Accordion>

**Output:** MCP text content holding JSON; errors set `isError`. From the tool's own description: Returns path, sha256, size, the manifest or store platform, and warnings.

```json Example call theme={null}
{
  "name": "summer_export_game",
  "arguments": {}
}
```

***

### summer\_export\_templates

On the local MCP (`summer-engine` npm).

List, download and install Summer Engine export templates from Summer's CDN into the folder the installed engine reads, checking each file's sha256. Needed only for [`summer_export_game`](/mcp/tools/publish#summer_export_game) format "download": web (Summer's WebGPU Forward+ template), macos, windows. Store bundles (format "bundle") need no template. action list shows what is installed and published; action install fetches the platforms asked (default web).

| | |
| - | - |
| **Needs** | No open editor and no sign-in |
| **Effects** | writes files, uses the network |
| **CLI** | `summer tool export-templates --args '<json>'` |

**Use when:**

* "install the web export template"
* "[`summer_export_game`](/mcp/tools/publish#summer_export_game) says an export template is missing"
* "which export templates do I have"
* before a web build or a macOS/Windows download export on a machine whose Summer Engine does not bundle that template

**Do not use when:**

* exporting the summer.games store bundle (iPhone, Android, macOS, Windows apps) — it needs no template, tool/export-game
* exporting for Steam, itch.io or other stores — skill/export-and-ship

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `action` | "list" \| "install" | Yes | list: installed and published templates. install: download and install. |
| `platforms` | "web" \| "macos" \| "windows" \| "linux" \| "ios" \| "android"\[] | No | Template platforms to install (default \["web"]). |
| `includeDebug` | boolean | No | Also install the debug templates (for exports with debug true). Default `false`. |
| `summerVersion` | string | No | The installed Summer Engine version (Help > About, e.g. 0.7.1). Read automatically on macOS; needed on Windows and Linux. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "action": {
        "type": "string",
        "enum": [
          "list",
          "install"
        ],
        "description": "list: installed and published templates. install: download and install."
      },
      "platforms": {
        "type": "array",
        "items": {
          "type": "string",
          "enum": [
            "web",
            "macos",
            "windows",
            "linux",
            "ios",
            "android"
          ]
        },
        "description": "Template platforms to install (default [\"web\"])."
      },
      "includeDebug": {
        "type": "boolean",
        "default": false,
        "description": "Also install the debug templates (for exports with debug true)."
      },
      "summerVersion": {
        "type": "string",
        "description": "The installed Summer Engine version (Help > About, e.g. 0.7.1). Read automatically on macOS; needed on Windows and Linux."
      }
    },
    "required": [
      "action"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Output:** MCP text content holding JSON; errors set `isError`.

```json Example call theme={null}
{
  "name": "summer_export_templates",
  "arguments": {
    "action": "list"
  }
}
```

***

### summer\_get\_project

On the hosted MCP.

Get one Studio project: name, kind, its board id ([`summer_board_read`](/mcp/tools/build#summer_board_read)), the idea it was made from, share state and address.

| | |
| - | - |
| **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |
| **Hints** | `readOnlyHint` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `projectId` | string | Yes | |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "projectId": {
        "type": "string",
        "format": "uuid",
        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
      }
    },
    "required": [
      "projectId"
    ]
  }
  ```
</Accordion>

**Output:** MCP text content holding JSON; errors set `isError`.

```json Example call theme={null}
{
  "name": "summer_get_project",
  "arguments": {
    "projectId": "<projectId>"
  }
}
```

***

### summer\_list\_projects

On the hosted MCP.

List the user's Summer Studio projects (games), newest first: id, name, kind (create: made in the browser; cloud; desktop), last edit, share state and where it opens.

| | |
| - | - |
| **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |
| **Hints** | `readOnlyHint` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `limit` | integer | No | Default `20`. Range 1 to 100. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "limit": {
        "default": 20,
        "type": "integer",
        "minimum": 1,
        "maximum": 100
      }
    }
  }
  ```
</Accordion>

**Output:** MCP text content holding JSON; errors set `isError`.

```json Example call theme={null}
{
  "name": "summer_list_projects",
  "arguments": {}
}
```

***

### summer\_publish\_build

On the local MCP (`summer-engine` npm).

Upload an export from [`summer_export_game`](/mcp/tools/publish#summer_export_game) to the creator's game on summer.games, through the same store upload Studio uses, straight from disk. A store bundle (format bundle): declare, upload parts, seal, wait until Summer makes the Build, name its client pack, and with publish=true approve it. A web build or native download (format download): upload it as the game's store version for its platform (web, macos-universal, windows-x64, linux-x64; read from the last export) and wait until Summer has checked it. First call with confirm=false and show the user the returned target; set confirm only after they approve. Needs "summer login --store". A retry with the same file and clientVersion continues the same upload. Nothing here makes a game live: the owner approves publishing ([`summer_store_submit`](/mcp/tools/publish#summer_store_submit)).

| | |
| - | - |
| **Needs** | Store sign-in: `summer login --store` |
| **Effects** | writes files, uses the network, publishes |
| **CLI** | `summer tool publish-build --args '<json>'` |

**Use when:**

* "upload my game to summer.games"
* "publish this build to my store page"
* "put my game online so my friends can play it"
* uploading the .zip from [`summer_export_game`](/mcp/tools/publish#summer_export_game) as a new Build
* uploading a web build or a macOS or Windows download from [`summer_export_game`](/mcp/tools/publish#summer_export_game) format download

**Do not use when:**

* the user has not approved the exact game, file, digest, version and publish choice
* the game is not exported yet — [`summer_export_game`](/mcp/tools/publish#summer_export_game) first
* store page text, images or price — those are edited in Studio

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `gameId` | string | No | The store game id (Studio store page URL). Omit to get the list of your games. |
| `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 (Studio store page URL). Omit to get the list of your games."
      },
      "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>

**Output:** MCP text content holding JSON; errors set `isError`.

```json Example call theme={null}
{
  "name": "summer_publish_build",
  "arguments": {
    "clientVersion": "<clientVersion>"
  }
}
```

***

### summer\_store\_cancel\_submission

On the hosted MCP.

Withdraw a waiting owner approval (from [`summer_store_submit`](/mcp/tools/publish#summer_store_submit)) so its link no longer works.

| | |
| - | - |
| **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `gameId` | string | Yes | |
| `approvalId` | string | Yes | |

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

**Output:** MCP text content holding JSON; errors set `isError`.

```json Example call theme={null}
{
  "name": "summer_store_cancel_submission",
  "arguments": {
    "gameId": "<gameId>",
    "approvalId": "<approvalId>"
  }
}
```

***

### summer\_store\_create\_game

On the hosted MCP.

Create a game on the Summer Games store with its first store page draft. Targets decide the store flows: web, macos-universal, windows-x64, linux-x64 open the desktop store; ios, android open the mobile store. Nothing is published. Slot sizes and text rules: read the store-art and store-listing skills (MCP prompts/resources).

| | |
| - | - |
| **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `title` | string | Yes | Length 1 to 60. |
| `targets` | "web" \| "windows-x64" \| "macos-universal" \| "linux-x64" \| "ios" \| "android"\[] | Yes | Items 1 to …. |
| `tagline` | string | No | Default `""`. Length 0 to 80. |
| `description` | string | No | Default `""`. Length 0 to 300. |
| `idempotencyKey` | string | No | Reuse only to retry the identical create. Length 1 to 128. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "title": {
        "type": "string",
        "minLength": 1,
        "maxLength": 60
      },
      "targets": {
        "minItems": 1,
        "type": "array",
        "items": {
          "type": "string",
          "enum": [
            "web",
            "windows-x64",
            "macos-universal",
            "linux-x64",
            "ios",
            "android"
          ]
        }
      },
      "tagline": {
        "default": "",
        "type": "string",
        "maxLength": 80
      },
      "description": {
        "default": "",
        "type": "string",
        "maxLength": 300
      },
      "idempotencyKey": {
        "description": "Reuse only to retry the identical create.",
        "type": "string",
        "minLength": 1,
        "maxLength": 128
      }
    },
    "required": [
      "title",
      "targets"
    ]
  }
  ```
</Accordion>

**Output:** MCP text content holding JSON; errors set `isError`.

```json Example call theme={null}
{
  "name": "summer_store_create_game",
  "arguments": {
    "title": "<title>",
    "targets": [
      "web"
    ]
  }
}
```

***

### summer\_store\_get\_listing

On the hosted MCP.

Read a game's store page as the store will show it: review state, targets and store flows, text per flow (desktop, mobile), art per slot, price, uploaded builds, the publish checklist (what is missing), and any owner approvals with their links.

| | |
| - | - |
| **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |
| **Hints** | `readOnlyHint` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `gameId` | string | Yes | |
| `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": {
        "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>

**Output:** MCP text content holding JSON; errors set `isError`.

```json Example call theme={null}
{
  "name": "summer_store_get_listing",
  "arguments": {
    "gameId": "<gameId>"
  }
}
```

***

### summer\_store\_list\_games

On the hosted MCP.

List the user's games on the Summer Games store (the creator catalog): game id, name, status and targets. A Studio project and its store game are separate records.

| | |
| - | - |
| **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |
| **Hints** | `readOnlyHint` |

**Inputs:**

No inputs.

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {}
  }
  ```
</Accordion>

**Output:** MCP text content holding JSON; errors set `isError`.

```json Example call theme={null}
{
  "name": "summer_store_list_games",
  "arguments": {}
}
```

***

### summer\_store\_preview\_link

On the hosted MCP.

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

| | |
| - | - |
| **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `gameId` | string | Yes | |
| `expires` | "1h" \| "1d" \| "7d" | No | Default `"1d"`. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "gameId": {
        "type": "string",
        "pattern": "^[A-Za-z0-9_-]{1,128}$"
      },
      "expires": {
        "default": "1d",
        "type": "string",
        "enum": [
          "1h",
          "1d",
          "7d"
        ]
      }
    },
    "required": [
      "gameId"
    ]
  }
  ```
</Accordion>

**Output:** MCP text content holding JSON; errors set `isError`.

```json Example call theme={null}
{
  "name": "summer_store_preview_link",
  "arguments": {
    "gameId": "<gameId>"
  }
}
```

***

### summer\_store\_set\_art

On the hosted MCP.

Put images into one store art slot from your Summer assets (assetId) or public image URLs. Slots: desktop.keyArt, desktop.screenshots, desktop.icon, desktop.capsuleTall, desktop.capsuleWide, mobile.icon, mobile.tallCover, mobile.keyArt, mobile.screenshots. Each image is checked against the slot's shape and minimum size before upload (icons 1:1, key art 16:9, tall capsule 3:4, wide capsule 460:215, mobile tall cover 9:16, phone screenshots 16:9 or 9:16); no text in key art, icons, the tall cover or screenshots. Screenshots take a list (mode replace or append); other slots take one image. An empty sources list clears the slot. Generate missing art with [`summer_generate_image`](/mcp/tools/create-assets#summer_generate_image) first. Slot sizes and text rules: read the store-art and store-listing skills (MCP prompts/resources).

| | |
| - | - |
| **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |

**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. |

<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 (summer_list_my_assets, summer_generate_image).",
                  "type": "string",
                  "minLength": 1
                }
              },
              "required": [
                "assetId"
              ]
            },
            {
              "type": "object",
              "properties": {
                "url": {
                  "description": "A public https image URL.",
                  "type": "string",
                  "format": "uri"
                }
              },
              "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"
        ]
      }
    },
    "required": [
      "gameId",
      "slot",
      "sources"
    ]
  }
  ```
</Accordion>

**Output:** MCP text content holding JSON; errors set `isError`.

```json Example call theme={null}
{
  "name": "summer_store_set_art",
  "arguments": {
    "gameId": "<gameId>",
    "slot": "desktop.keyArt",
    "sources": [
      {
        "assetId": "<assetId>"
      }
    ]
  }
}
```

***

### summer\_store\_submit

On the hosted MCP.

Ask the owner to publish the store page draft with a build and price. This never publishes by itself: Summer Games records exactly this version and waits for the owner, signed in to Studio, to click "Approve publishing" at the returned approvalUrl. Give the owner that link. After approval Summer staff review the game; then it can go live. Checks the publish checklist first and lists what is missing.

| | |
| - | - |
| **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `gameId` | string | Yes | |
| `buildPublicationId` | string | No | The build to publish; defaults to the newest ready build. |
| `priceUsdCents` | integer | No | Proposed price in US cents (50-100000); 0 proposes free; omit to keep the current price. Range 0 to 100000. |
| `note` | string | No | A short note for the owner: what changed and why. Length 0 to 500. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "gameId": {
        "type": "string",
        "pattern": "^[A-Za-z0-9_-]{1,128}$"
      },
      "buildPublicationId": {
        "description": "The build to publish; defaults to the newest ready build.",
        "type": "string",
        "pattern": "^[A-Za-z0-9_-]{1,128}$"
      },
      "priceUsdCents": {
        "description": "Proposed price in US cents (50-100000); 0 proposes free; omit to keep the current price.",
        "type": "integer",
        "minimum": 0,
        "maximum": 100000
      },
      "note": {
        "description": "A short note for the owner: what changed and why.",
        "type": "string",
        "maxLength": 500
      }
    },
    "required": [
      "gameId"
    ]
  }
  ```
</Accordion>

**Output:** MCP text content holding JSON; errors set `isError`.

```json Example call theme={null}
{
  "name": "summer_store_submit",
  "arguments": {
    "gameId": "<gameId>"
  }
}
```

***

### summer\_store\_update\_listing

On the hosted MCP.

Edit the store page draft: title, targets, desktop text (tagline, description, 3-8 tags), mobile text (its own shorter tagline and description, or mobileSameAsDesktop to copy the desktop text once), release date and content classification. Omitted fields keep their value. A page that was published or sent back starts a new draft; a page in review cannot change. Saving never submits. Slot sizes and text rules: read the store-art and store-listing skills (MCP prompts/resources).

| | |
| - | - |
| **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |

**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). |
| `release` | object \| null | No | Coming soon with a date, or released (\{comingSoon:false, date:"YYYY-MM-DD"}); null: out once published. |
| `contentRating` | "everyone" \| "everyone10Plus" \| "teen" | No | |
| `contentDescriptors` | "mildFantasyAction" \| "competitivePlay" \| "userGeneratedContent" \| "flashingLights" \| "simulatedGambling"\[] | No | Empty list: none apply. |

<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"
      },
      "release": {
        "description": "Coming soon with a date, or released ({comingSoon:false, date:\"YYYY-MM-DD\"}); null: out once published.",
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "comingSoon": {
                "type": "boolean"
              },
              "date": {
                "description": "\"2026-11-14\", \"2026-11\", \"2026-Q4\" or \"2026\"; omit for TBA.",
                "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"
          ]
        }
      }
    },
    "required": [
      "gameId"
    ]
  }
  ```
</Accordion>

**Output:** MCP text content holding JSON; errors set `isError`.

```json Example call theme={null}
{
  "name": "summer_store_update_listing",
  "arguments": {
    "gameId": "<gameId>"
  }
}
```

***

### summer\_store\_version\_begin\_upload

On the hosted MCP.

Start uploading a web build or a desktop download to a store game ([`summer_export_game`](/mcp/tools/publish#summer_export_game) with format "download" makes these). web: a .zip with index.html at its root (at most 500 MiB, 2000 files), played on summer.games in a frame. macos-universal, windows-x64, linux-x64: the archive players download (at most 20 GiB). Returns versionId and the part plan; then [`summer_store_version_sign_parts`](/mcp/tools/publish#summer_store_version_sign_parts), PUT each part, [`summer_store_version_complete`](/mcp/tools/publish#summer_store_version_complete). The local summer-engine MCP does all of this from disk.

| | |
| - | - |
| **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `gameId` | string | Yes | |
| `platform` | "web" \| "windows-x64" \| "macos-universal" \| "linux-x64" | Yes | |
| `fileName` | string | Yes | Length 1 to 255. |
| `sizeBytes` | integer | Yes | Range 1 to 9007199254740991. |
| `label` | string | No | A version label players may see, e.g. 1.0.2. Default `""`. Length 0 to 80. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "gameId": {
        "type": "string",
        "pattern": "^[A-Za-z0-9_-]{1,128}$"
      },
      "platform": {
        "type": "string",
        "enum": [
          "web",
          "windows-x64",
          "macos-universal",
          "linux-x64"
        ]
      },
      "fileName": {
        "type": "string",
        "minLength": 1,
        "maxLength": 255
      },
      "sizeBytes": {
        "type": "integer",
        "minimum": 1,
        "maximum": 9007199254740991
      },
      "label": {
        "description": "A version label players may see, e.g. 1.0.2.",
        "default": "",
        "type": "string",
        "maxLength": 80
      }
    },
    "required": [
      "gameId",
      "platform",
      "fileName",
      "sizeBytes"
    ]
  }
  ```
</Accordion>

**Output:** MCP text content holding JSON; errors set `isError`. From the tool's own description: Returns versionId and the part plan; then summer\_store\_version\_sign\_parts, PUT each part, summer\_store\_version\_complete.

```json Example call theme={null}
{
  "name": "summer_store_version_begin_upload",
  "arguments": {
    "gameId": "<gameId>",
    "platform": "web",
    "fileName": "<fileName>",
    "sizeBytes": 1
  }
}
```

***

### summer\_store\_version\_complete

On the hosted MCP.

Finish a store version upload after every part is PUT. Summer checks the file (a web zip needs index.html at its root) and marks it ready or rejected. On a game that is already live, a finished version goes live at once, so Summer Games lets only the owner finish it there. Safe to call again.

| | |
| - | - |
| **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `gameId` | string | Yes | |
| `versionId` | string | Yes | |

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

**Output:** MCP text content holding JSON; errors set `isError`.

```json Example call theme={null}
{
  "name": "summer_store_version_complete",
  "arguments": {
    "gameId": "<gameId>",
    "versionId": "<versionId>"
  }
}
```

***

### summer\_store\_version\_sign\_parts

On the hosted MCP.

Get upload URLs for parts of a store version (web build or download). Send every returned header with the PUT. Sign again for any part that failed; [`summer_store_version_status`](/mcp/tools/publish#summer_store_version_status) lists the parts already stored.

| | |
| - | - |
| **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `gameId` | string | Yes | |
| `versionId` | string | Yes | |
| `partNumbers` | integer\[] | Yes | Items 1 to 100. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "gameId": {
        "type": "string",
        "pattern": "^[A-Za-z0-9_-]{1,128}$"
      },
      "versionId": {
        "type": "string",
        "pattern": "^[A-Za-z0-9_-]{1,128}$"
      },
      "partNumbers": {
        "minItems": 1,
        "maxItems": 100,
        "type": "array",
        "items": {
          "type": "integer",
          "minimum": 1,
          "maximum": 10000
        }
      }
    },
    "required": [
      "gameId",
      "versionId",
      "partNumbers"
    ]
  }
  ```
</Accordion>

**Output:** MCP text content holding JSON; errors set `isError`.

```json Example call theme={null}
{
  "name": "summer_store_version_sign_parts",
  "arguments": {
    "gameId": "<gameId>",
    "versionId": "<versionId>",
    "partNumbers": [
      1
    ]
  }
}
```

***

### summer\_store\_version\_status

On the hosted MCP.

Read a store game's web builds and downloads (or one, by versionId): platform, status (awaiting\_upload, processing, ready, rejected) and, while uploading, the parts already stored.

| | |
| - | - |
| **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |
| **Hints** | `readOnlyHint` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `gameId` | string | Yes | |
| `versionId` | string | No | |

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

**Output:** MCP text content holding JSON; errors set `isError`.

```json Example call theme={null}
{
  "name": "summer_store_version_status",
  "arguments": {
    "gameId": "<gameId>"
  }
}
```

***


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