Generated from the operation catalog:
src/lib/ops/public-catalog.json in publicsummerengine at 0d85f61e2b and the summer-engine npm package 4.0.0 for engine and local operations. If something here is wrong, the operation’s definition is wrong.| Operation | What it does | Asks you first |
|---|---|---|
store.cancel_publish | Withdraw a publish request that still waits for the owner, so its approval link stops working. | Not by default |
store.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 | 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 | Ask the owner to publish the store page draft with a build and price. | Yes, for now |
store.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 a bundle build that no environment serves from the game’s versions. | Yes, by default |
store.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 | Take the trailer off the store page draft. | Yes, by default |
store.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 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 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 | 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 | 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 | Write the release notes players read for a released bundle build: a title and Markdown text. | Yes, for now |
store.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 | Finish a store upload after every part is PUT: Summer seals it and checks it. | Not by default |
store.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 | 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 |
| 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. |
Input JSON schema
Input JSON schema
{
"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"
]
}
Result JSON schema
Result JSON schema
{
"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
}
{
"name": "summer_call",
"arguments": {
"op": "store.cancel_publish",
"input": {
"gameId": "g_123",
"approvalId": "goa_01J"
}
}
}
summer store cancel-publish --game-id g_123 --approval-id goa_01J
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 |
| 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. |
Input JSON schema
Input JSON schema
{
"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"
]
}
Result JSON schema
Result JSON schema
{
"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
}
{
"name": "summer_store_get_listing",
"arguments": {
"gameId": "g_123"
}
}
summer store get-listing --game-id g_123
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 |
| 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. |
Input JSON schema
Input JSON schema
{
"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"
]
}
Result JSON schema
Result JSON schema
{
"type": "object",
"properties": {
"url": {
"type": "string"
},
"expiresAt": {
"type": "string"
},
"revisionId": {
"type": "string"
}
},
"required": [
"url",
"expiresAt",
"revisionId"
],
"additionalProperties": false
}
{
"name": "summer_call",
"arguments": {
"op": "store.preview_link",
"input": {
"gameId": "g_123",
"expires": "1d"
}
}
}
summer store preview-link --game-id g_123 --expires 1d
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 |
| 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. |
Input JSON schema
Input JSON schema
{
"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
}
Result JSON schema
Result JSON schema
{
"type": "object",
"properties": {
"approvalId": {
"type": "string"
},
"state": {
"type": "string"
}
},
"required": [
"approvalId",
"state"
],
"additionalProperties": false
}
{
"name": "summer_store_publish",
"arguments": {
"gameId": "g_123",
"price": {
"currency": "USD",
"amountMinor": 499
},
"note": "First release."
}
}
summer store publish --game-id g_123 --note 'First release.' --input '{"price":{"currency":"USD","amountMinor":499}}'
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 |
| 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. |
Input JSON schema
Input JSON schema
{
"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"
]
}
Result JSON schema
Result JSON schema
{
"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
}
{
"name": "summer_call",
"arguments": {
"op": "store.release",
"input": {
"gameId": "g_123"
}
}
}
summer store release --game-id g_123
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. |
| 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. |
Input JSON schema
Input JSON schema
{
"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"
]
}
Result JSON schema
Result JSON schema
{
"type": "object",
"properties": {
"uploadId": {
"type": "string"
},
"archivedAt": {
"type": "string"
}
},
"required": [
"uploadId",
"archivedAt"
],
"additionalProperties": false
}
{
"name": "summer_call",
"arguments": {
"op": "store.remove_build",
"input": {
"gameId": "g_123",
"uploadId": "b.pub_9"
}
}
}
summer store remove-build --game-id g_123 --upload-id b.pub_9
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. |
| 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. |
Input JSON schema
Input JSON schema
{
"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"
]
}
Result JSON schema
Result JSON schema
{
"type": "object",
"properties": {
"fileId": {
"type": "string"
},
"fileName": {
"type": "string"
},
"removed": {
"type": "boolean",
"const": true
}
},
"required": [
"fileId",
"fileName",
"removed"
],
"additionalProperties": false
}
{
"name": "summer_call",
"arguments": {
"op": "store.remove_file",
"input": {
"gameId": "g_123",
"fileId": "up_4"
}
}
}
summer store remove-file --game-id g_123 --file-id up_4
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. |
| 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. |
Input JSON schema
Input JSON schema
{
"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"
]
}
Result JSON schema
Result JSON schema
{
"type": "object",
"properties": {
"removed": {
"type": "boolean"
}
},
"required": [
"removed"
],
"additionalProperties": false
}
{
"name": "summer_call",
"arguments": {
"op": "store.remove_trailer",
"input": {
"gameId": "g_123"
}
}
}
summer store remove-trailer --game-id g_123
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 |
| 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. |
Input JSON schema
Input JSON schema
{
"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"
}
},
"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"
]
}
Result JSON schema
Result JSON schema
{
"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
}
{
"name": "summer_call",
"arguments": {
"op": "store.set_art",
"input": {
"gameId": "g_123",
"slot": "desktop.keyArt",
"sources": [
{
"assetId": "a_77"
}
]
}
}
}
summer store set-art --game-id g_123 --slot desktop.keyArt --input '{"sources":[{"assetId":"a_77"}]}'
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 |
| 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. |
Input JSON schema
Input JSON schema
{
"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 (summer_list_my_assets, summer_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"
]
}
Result JSON schema
Result JSON schema
{
"type": "object",
"properties": {
"preset": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
},
"mediaAssetId": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
]
}
},
"required": [
"preset",
"mediaAssetId"
],
"additionalProperties": false
}
{
"name": "summer_call",
"arguments": {
"op": "store.set_sound",
"input": {
"gameId": "g_123",
"source": {
"preset": "rain"
}
}
}
}
summer store set-sound --game-id g_123 --input '{"source":{"preset":"rain"}}'
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 |
| 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. |
Input JSON schema
Input JSON schema
{
"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 (summer_list_my_assets, summer_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"
]
}
Result JSON schema
Result JSON schema
{
"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
}
{
"name": "summer_call",
"arguments": {
"op": "store.set_trailer",
"input": {
"gameId": "g_123",
"source": {
"assetId": "vid_9"
}
}
}
}
summer store set-trailer --game-id g_123 --input '{"source":{"assetId":"vid_9"}}'
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 |
| Input | Type | Required | Description |
|---|---|---|---|
gameId | string | Yes | From games.list. |
Input JSON schema
Input JSON schema
{
"type": "object",
"properties": {
"gameId": {
"description": "From games.list.",
"type": "string",
"pattern": "^[A-Za-z0-9_-]{1,128}$"
}
},
"required": [
"gameId"
]
}
Result JSON schema
Result JSON schema
{
"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
}
{
"name": "summer_store_status",
"arguments": {
"gameId": "g_123"
}
}
summer store status --game-id g_123
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 |
| 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) 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. |
Input JSON schema
Input JSON schema
{
"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"
]
}
Result JSON schema
Result JSON schema
{
"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
}
{
"name": "summer_store_update_listing",
"arguments": {
"gameId": "g_123",
"desktop": {
"tagline": "Stitch the world back together",
"tags": [
"cozy",
"puzzle",
"cooperative"
]
}
}
}
summer store update-listing --game-id g_123 --input '{"desktop":{"tagline":"Stitch the world back together","tags":["cozy","puzzle","cooperative"]}}'
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). |
| 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. |
Input JSON schema
Input JSON schema
{
"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"
]
}
Result JSON schema
Result JSON schema
{
"type": "object",
"properties": {
"uploadId": {
"type": "string"
},
"title": {
"type": "string"
},
"markdown": {
"type": "string"
}
},
"required": [
"uploadId",
"title",
"markdown"
],
"additionalProperties": false
}
{
"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"
}
}
}
summer store update-release-notes --game-id g_123 --upload-id b.pub_9 --title 'Winter update' --markdown '- Snow levels
- Faster loading'
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 |
| 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. |
Input JSON schema
Input JSON schema
{
"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"
]
}
Result JSON schema
Result JSON schema
{
"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
}
{
"name": "summer_call",
"arguments": {
"op": "store.upload_begin",
"input": {
"gameId": "g_123",
"kind": "web",
"sizeBytes": 48000000,
"fileName": "quilt-web.zip",
"label": "1.0.0"
}
}
}
summer store upload-begin --game-id g_123 --kind web --size-bytes 48000000 --file-name quilt-web.zip --label 1.0.0
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 |
| 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. |
Input JSON schema
Input JSON schema
{
"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"
]
}
Result JSON schema
Result JSON schema
{
"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
}
{
"name": "summer_call",
"arguments": {
"op": "store.upload_complete",
"input": {
"gameId": "g_123",
"uploadId": "b.pub_9"
}
}
}
summer store upload-complete --game-id g_123 --upload-id b.pub_9
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 |
| 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. |
Input JSON schema
Input JSON schema
{
"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
}
{
"name": "summer_publish_build",
"arguments": {}
}
summer store upload-file
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 |
| 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. |
Input JSON schema
Input JSON schema
{
"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"
]
}
Result JSON schema
Result JSON schema
{
"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
}
{
"name": "summer_call",
"arguments": {
"op": "store.upload_sign_parts",
"input": {
"gameId": "g_123",
"uploadId": "v.ver_1",
"parts": [
{
"partNumber": 1
}
]
}
}
}
summer store upload-sign-parts --game-id g_123 --upload-id v.ver_1 --input '{"parts":[{"partNumber":1}]}'

