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

# Operations: games

> Your games on Summer Games, and who works on them. For each operation: what it does, whether it asks you first, its inputs and an example call.

Your games on Summer Games, and who works on them. 9 operations. How to call them, and what the answers mean: [Operations reference](/mcp/operations).

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

| Operation | What it does | Asks you first |
| - | - | - |
| [`games.create`](#create) | Create a game on Summer Games with its first store page draft; nothing is published. | Not by default |
| [`games.get`](#get) | Read one of the person's games on Summer Games: name, store address, status, targets, tagline and when it changed. | Never |
| [`games.invite_member`](#invite_member) | Invite someone by email to work on a game, with a role; Summer emails them a link. | Yes, by default |
| [`games.leave`](#leave) | Leave a game the person works on, so they lose access to it; the owner cannot leave. | Yes, by default |
| [`games.list`](#list) | List the person's games on Summer Games: game id, name, status, targets and store link, newest change first. | Never |
| [`games.members`](#members) | The people on one game on Summer Games: members and their roles, pending invites, the person's own role and whether they may manage members. | Never |
| [`games.remove_member`](#remove_member) | Remove a member from a game, so they lose access to it. | Yes, by default |
| [`games.set_member_role`](#set_member_role) | Change what a member may do on a game (admin, developer or viewer). | Yes, for now |
| [`games.withdraw_invite`](#withdraw_invite) | Withdraw a pending invite to a game, so its link stops working. | Yes, by default |

***

### create

`games.create`: **Create a game**

Create a game on Summer Games with its first store page draft; nothing is published. Include web in targets so it can play in the browser. Returns the game id. Next: store.update\_listing, store.set\_art, store.upload\_begin.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "games.create"` |
| **CLI** | `summer games create` |
| **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_create_game` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `title` | string | Yes | Length 1 to 60. |
| `targets` | "web" \| "windows-x64" \| "macos-universal" \| "linux-x64" \| "ios" \| "android"\[] | Yes | web, macos-universal, windows-x64 and linux-x64 open the desktop store; ios and android the mobile store. Items 1 to …. |
| `tagline` | string | No | Default `""`. Length 0 to 80. |
| `description` | string | No | Default `""`. Length 0 to 300. |
| `dryRun` | boolean | No | Check and describe the call without doing it: nothing changes, nothing is spent. |
| `idempotencyKey` | string | No | Retry key. Reuse it only to retry the identical request, so it never happens twice. Length 1 to 128. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "title": {
        "type": "string",
        "minLength": 1,
        "maxLength": 60
      },
      "targets": {
        "description": "web, macos-universal, windows-x64 and linux-x64 open the desktop store; ios and android the mobile store.",
        "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
      },
      "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": [
      "title",
      "targets"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

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

**Example:** A new game that plays in the browser and on Mac.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "games.create",
      "input": {
        "title": "Quilt",
        "targets": [
          "web",
          "macos-universal"
        ],
        "tagline": "Stitch the world back together"
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer games create --title Quilt --targets web --targets macos-universal --tagline 'Stitch the world back together'
  ```
</CodeGroup>

***

### get

`games.get`: **Read a game**

Read one of the person's games on Summer Games: name, store address, status, targets, tagline and when it changed. Next: store.status for review, uploads and releases, or store.get\_listing for the page.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "games.get"` |
| **CLI** | `summer games get` |
| **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. |

**Inputs:**

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

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

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "gameId": {
        "type": "string"
      },
      "name": {
        "type": "string"
      },
      "slug": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      },
      "status": {
        "type": "string"
      },
      "targets": {
        "type": "array",
        "items": {
          "type": "string"
        }
      },
      "storeUrl": {
        "type": "string"
      },
      "updatedAt": {
        "type": "string"
      },
      "tagline": {
        "type": "string"
      },
      "description": {
        "type": "string"
      },
      "pageRevisionId": {
        "description": "The store page version Summer Games shows now, if any.",
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      },
      "createdAt": {
        "type": "string"
      }
    },
    "required": [
      "gameId",
      "name",
      "slug",
      "status",
      "targets",
      "storeUrl",
      "updatedAt",
      "tagline",
      "description",
      "pageRevisionId",
      "createdAt"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** What is this game called and where is its page?

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

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

***

### invite\_member

`games.invite_member`: **Invite someone to a game**

Invite someone by email to work on a game, with a role; Summer emails them a link. Runs when the person allows Contact people (off by default); otherwise answers needs\_approval with a link and sends nothing.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "games.invite_member"` |
| **CLI** | `summer games invite-member` |
| **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** | Yes: **Contact people** is off by default in Agent permissions. |
| **3.x names** | `summer_grow_members#invite` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `gameId` | string | Yes | From games.list. |
| `email` | string | Yes | Who to invite. Length 0 to 254. |
| `role` | "admin" \| "developer" \| "viewer" | Yes | admin, developer or viewer (games.members lists what each can do). |
| `dryRun` | boolean | No | Check and describe the call without doing it: nothing changes, nothing is spent. |
| `idempotencyKey` | string | No | Retry key. Reuse it only to retry the identical request, so it never happens twice. Length 1 to 128. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "gameId": {
        "description": "From games.list.",
        "type": "string",
        "pattern": "^[A-Za-z0-9_-]{1,128}$"
      },
      "email": {
        "description": "Who to invite.",
        "type": "string",
        "maxLength": 254,
        "format": "email",
        "pattern": "^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$"
      },
      "role": {
        "description": "admin, developer or viewer (games.members lists what each can do).",
        "type": "string",
        "enum": [
          "admin",
          "developer",
          "viewer"
        ]
      },
      "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",
      "email",
      "role"
    ]
  }
  ```
</Accordion>

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "game": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "name"
        ],
        "additionalProperties": false
      },
      "invited": {
        "type": "object",
        "properties": {
          "email": {
            "type": "string"
          },
          "role": {
            "type": "string"
          }
        },
        "required": [
          "email",
          "role"
        ],
        "additionalProperties": false
      },
      "emailSent": {
        "type": "boolean"
      },
      "inviteUrl": {
        "type": "string"
      },
      "note": {
        "type": "string"
      },
      "studioUrl": {
        "type": "string"
      }
    },
    "required": [
      "game",
      "invited",
      "emailSent",
      "inviteUrl",
      "note",
      "studioUrl"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** Invite Sam as a developer.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "games.invite_member",
      "input": {
        "gameId": "g_123",
        "email": "sam@example.com",
        "role": "developer"
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer games invite-member --game-id g_123 --email sam@example.com --role developer
  ```
</CodeGroup>

***

### leave

`games.leave`: **Leave a game**

Leave a game the person works on, so they lose access to it; the owner cannot leave. Runs when the person allows Delete for good (off by default); otherwise answers needs\_approval with a link.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "games.leave"` |
| **CLI** | `summer games leave` |
| **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. |
| **3.x names** | `summer_grow_members#leave` |

**Inputs:**

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

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

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

**Example:** Leave this game.

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

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

***

### list

`games.list`: **List my games**

List the person's games on Summer Games: game id, name, status, targets and store link, newest change first. Next: store.get\_listing or analytics.summary with a gameId.

| | |
| - | - |
| **MCP** | `summer_games_list`, a tool on the hosted MCP. Elsewhere: `summer_call` with `"op": "games.list"` |
| **CLI** | `summer games list` |
| **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_list_games` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `limit` | integer | No | Games per page, at most 50 (a bigger number gives 50). Default `20`. Range 1 to 9007199254740991. |
| `cursor` | string | No | nextCursor from the previous page. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "limit": {
        "description": "Games per page, at most 50 (a bigger number gives 50).",
        "default": 20,
        "type": "integer",
        "minimum": 1,
        "maximum": 9007199254740991
      },
      "cursor": {
        "description": "nextCursor from the previous page.",
        "type": "string",
        "pattern": "^\\d{1,3}$"
      }
    }
  }
  ```
</Accordion>

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "items": {
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "gameId": {
              "type": "string"
            },
            "name": {
              "type": "string"
            },
            "slug": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ]
            },
            "status": {
              "type": "string"
            },
            "targets": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "storeUrl": {
              "type": "string"
            },
            "updatedAt": {
              "type": "string"
            }
          },
          "required": [
            "gameId",
            "name",
            "slug",
            "status",
            "targets",
            "storeUrl",
            "updatedAt"
          ],
          "additionalProperties": false
        }
      },
      "nextCursor": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      }
    },
    "required": [
      "items",
      "nextCursor"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** Which games does this person have?

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

  ```bash CLI theme={null}
  summer games list --limit 20
  ```
</CodeGroup>

***

### members

`games.members`: **List a game's members**

The people on one game on Summer Games: members and their roles, pending invites, the person's own role and whether they may manage members. Next: games.invite\_member or games.set\_member\_role.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "games.members"` |
| **CLI** | `summer games members` |
| **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_grow_members` |

**Inputs:**

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

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

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "game": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "name"
        ],
        "additionalProperties": false
      },
      "yourRole": {
        "type": "string"
      },
      "canManage": {
        "type": "boolean"
      },
      "members": {
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "userId": {
              "type": "string"
            },
            "name": {
              "type": "string"
            },
            "handle": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ]
            },
            "role": {
              "type": "string"
            },
            "you": {
              "type": "boolean"
            }
          },
          "required": [
            "userId",
            "name",
            "handle",
            "role",
            "you"
          ],
          "additionalProperties": false
        }
      },
      "invitations": {
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "id": {
              "type": "string"
            },
            "email": {
              "type": "string"
            },
            "role": {
              "type": "string"
            },
            "expiresAt": {
              "type": "string"
            }
          },
          "required": [
            "id",
            "email",
            "role",
            "expiresAt"
          ],
          "additionalProperties": false
        }
      },
      "roles": {
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "role": {
              "type": "string"
            },
            "label": {
              "type": "string"
            },
            "can": {
              "type": "string"
            }
          },
          "required": [
            "role",
            "label",
            "can"
          ],
          "additionalProperties": false
        }
      },
      "studioUrl": {
        "type": "string"
      }
    },
    "required": [
      "game",
      "yourRole",
      "canManage",
      "members",
      "invitations",
      "roles",
      "studioUrl"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** Who works on this game?

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

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

***

### remove\_member

`games.remove_member`: **Remove a member from a game**

Remove a member from a game, so they lose access to it. Runs when the person allows Delete for good (off by default); otherwise answers needs\_approval with a link and changes nothing.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "games.remove_member"` |
| **CLI** | `summer games remove-member` |
| **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. |
| **3.x names** | `summer_grow_members#remove` |

**Inputs:**

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

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "gameId": {
        "description": "From games.list.",
        "type": "string",
        "pattern": "^[A-Za-z0-9_-]{1,128}$"
      },
      "memberId": {
        "description": "A member's userId from games.members.",
        "type": "string",
        "minLength": 1,
        "maxLength": 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",
      "memberId"
    ]
  }
  ```
</Accordion>

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

**Example:** Take this member off the game.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "games.remove_member",
      "input": {
        "gameId": "g_123",
        "memberId": "u_77"
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer games remove-member --game-id g_123 --member-id u_77
  ```
</CodeGroup>

***

### set\_member\_role

`games.set_member_role`: **Change a member's role**

Change what a member may do on a game (admin, developer or viewer). Runs when the person allows Prices and live changes; otherwise answers needs\_approval with a link. Next: games.members.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "games.set_member_role"` |
| **CLI** | `summer games set-member-role` |
| **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). |
| **3.x names** | `summer_grow_members#set_role` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `gameId` | string | Yes | From games.list. |
| `memberId` | string | Yes | A member's userId from games.members. Length 1 to 128. |
| `role` | "admin" \| "developer" \| "viewer" | Yes | admin, developer or viewer (games.members lists what each can do). |
| `dryRun` | boolean | No | Check and describe the call without doing it: nothing changes, nothing is spent. |
| `idempotencyKey` | string | No | Retry key. Reuse it only to retry the identical request, so it never happens twice. Length 1 to 128. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "gameId": {
        "description": "From games.list.",
        "type": "string",
        "pattern": "^[A-Za-z0-9_-]{1,128}$"
      },
      "memberId": {
        "description": "A member's userId from games.members.",
        "type": "string",
        "minLength": 1,
        "maxLength": 128
      },
      "role": {
        "description": "admin, developer or viewer (games.members lists what each can do).",
        "type": "string",
        "enum": [
          "admin",
          "developer",
          "viewer"
        ]
      },
      "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",
      "memberId",
      "role"
    ]
  }
  ```
</Accordion>

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "game": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "name"
        ],
        "additionalProperties": false
      },
      "member": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "role": {
            "type": "string"
          }
        },
        "required": [
          "name",
          "role"
        ],
        "additionalProperties": false
      },
      "studioUrl": {
        "type": "string"
      }
    },
    "required": [
      "game",
      "member",
      "studioUrl"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** Make this member an admin.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "games.set_member_role",
      "input": {
        "gameId": "g_123",
        "memberId": "u_77",
        "role": "admin"
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer games set-member-role --game-id g_123 --member-id u_77 --role admin
  ```
</CodeGroup>

***

### withdraw\_invite

`games.withdraw_invite`: **Withdraw a game invite**

Withdraw a pending invite to a game, so its link stops working. Runs when the person allows Delete for good (off by default); otherwise answers needs\_approval with a link and changes nothing.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "games.withdraw_invite"` |
| **CLI** | `summer games withdraw-invite` |
| **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. |
| **3.x names** | `summer_grow_members#withdraw` |

**Inputs:**

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

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "gameId": {
        "description": "From games.list.",
        "type": "string",
        "pattern": "^[A-Za-z0-9_-]{1,128}$"
      },
      "inviteId": {
        "description": "An invitation id from games.members.",
        "type": "string",
        "minLength": 1,
        "maxLength": 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",
      "inviteId"
    ]
  }
  ```
</Accordion>

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "game": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "name"
        ],
        "additionalProperties": false
      },
      "withdrawn": {
        "type": "object",
        "properties": {
          "email": {
            "type": "string"
          }
        },
        "required": [
          "email"
        ],
        "additionalProperties": false
      },
      "studioUrl": {
        "type": "string"
      }
    },
    "required": [
      "game",
      "withdrawn",
      "studioUrl"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** Cancel the pending invite.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "games.withdraw_invite",
      "input": {
        "gameId": "g_123",
        "inviteId": "inv_5"
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer games withdraw-invite --game-id g_123 --invite-id inv_5
  ```
</CodeGroup>


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