> ## 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: summer apps

> Team tools that agents build inside Summer Studio. For each operation: what it does, whether it asks you first, its inputs and an example call.

Team tools that agents build inside Summer Studio. 23 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 |
| - | - | - |
| [`apps.add_starter`](#add_starter) | Add one of Summer's starter apps (pick-one, asset-tracker, balance-table, live-ops) to a team as a kept app; a team that has it already gets its copy back. | Not by default |
| [`apps.call`](#call) | Run one of a Summer App's own agent tools in the person's open app, with their rights; waits up to 60 seconds. | Not by default |
| [`apps.create`](#create) | Create a new scratch Summer App and open it in the person's Studio tab. | Not by default |
| [`apps.delete`](#delete) | Ask the person to delete a Summer App: it leaves the team's Apps for everyone, with its data. | Yes, by default |
| [`apps.dock`](#dock) | Dock a Summer App as a panel in the running Summer Engine editor, close it, or list docked apps. | Not by default |
| [`apps.duplicate`](#duplicate) | Copy a Summer App and its live version into a new scratch app, in the same team or another of the person's teams. | Not by default |
| [`apps.events`](#events) | Wait up to timeoutSeconds (at most 50) for what a Summer App sends its agent: agent events, errors in the app, people's feedback, agent tool calls. | Never |
| [`apps.feedback`](#feedback) | Send the person's feedback on a Summer App to its makers: thumbs up or down and a note. | Not by default |
| [`apps.get`](#get) | Read one Summer App before changing it: its summary and manifest, its current version's files (or layout) and a summary of its shared data collections. | Never |
| [`apps.guide`](#guide) | Read the guide to building a Summer App (a tool for the person's team inside Studio): start with overview, then the section the app needs (examples, sdk, manifest, kit, design, layout, types). | Never |
| [`apps.list`](#list) | List the Summer Apps in the person's workspaces: app id, name, purpose, folder, status (scratch, kept, archived), version and format. | Never |
| [`apps.page`](#page) | Read the fields and buttons a Summer App declared while it is open in the person's Studio tab or editor dock. | Never |
| [`apps.publish`](#publish) | Publish a new version of a Summer App for the person's team: files with index.html (code apps) or a layout (layout apps), plus the manifest. | Not by default |
| [`apps.publish_folder`](#publish_folder) | Publish a new version of a Summer App from a local folder, files or a layout; the person's Studio tab boots it. | Not by default |
| [`apps.read_data`](#read_data) | Read a Summer App's shared data with no app open: its records (one collection or all, paged) and the record shape each collection declares. | Never |
| [`apps.report_gap`](#report_gap) | Tell Summer about something a Summer App needed that the SDK cannot do yet (for example "read Steam reviews"), so it can be built for everyone. | Not by default |
| [`apps.rollback`](#rollback) | Ask the owner to make an older version of a Summer App the live one everyone on the team runs (newer versions stay in Versions). | Not by default |
| [`apps.screenshot`](#screenshot) | See a Summer App without the person: renders it headless with their data, read-only, and returns the picture plus what to fix (console lines, errors, refused calls, the fields and tools it declared). | Never |
| [`apps.tools`](#tools) | The agent tools a Summer App declares (name, description, input JSON Schema) and its data collections (record fields and types). | Never |
| [`apps.update`](#update) | Rename a Summer App, change its purpose or folder, set its status (kept, archived, scratch) or pin it to the person's sidebar. | Not by default |
| [`apps.update_starter`](#update_starter) | Ask the owner to make the newest starter the live version of a starter app the team changed (the team's versions stay in Versions). | Not by default |
| [`apps.use_page`](#use_page) | Fill fields and press one button a Summer App declared, while it is open in the person's Studio tab or editor dock. | Not by default |
| [`apps.write_data`](#write_data) | Write a Summer App's shared data in one revision, with no app open: put, patch (null removes a key) or remove records; ifRevision applies one only if the record is still at that revision. | Not by default |

***

### add\_starter

`apps.add_starter`: **Add a starter app**

Add one of Summer's starter apps (pick-one, asset-tracker, balance-table, live-ops) to a team as a kept app; a team that has it already gets its copy back. Free. Returns the app id. Next: apps.get.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "apps.add_starter"` |
| **CLI** | `summer apps add-starter` |
| **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. |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `starterId` | "pick-one" \| "asset-tracker" \| "balance-table" \| "live-ops" | Yes | |
| `workspaceId` | string | No | The team (from team.list). Default: the person's own workspace. |
| `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": {
      "starterId": {
        "type": "string",
        "enum": [
          "pick-one",
          "asset-tracker",
          "balance-table",
          "live-ops"
        ]
      },
      "workspaceId": {
        "description": "The team (from team.list). Default: the person's own workspace.",
        "type": "string",
        "format": "uuid",
        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
      },
      "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": [
      "starterId"
    ]
  }
  ```
</Accordion>

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "appId": {
        "type": "string"
      },
      "created": {
        "description": "False: the team had it already.",
        "type": "boolean"
      },
      "url": {
        "type": "string"
      }
    },
    "required": [
      "appId",
      "created",
      "url"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** Give the team the balance table.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "apps.add_starter",
      "input": {
        "starterId": "balance-table"
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer apps add-starter --starter-id balance-table
  ```
</CodeGroup>

***

### call

`apps.call`: **Run an app tool**

Run one of a Summer App's own agent tools in the person's open app, with their rights; waits up to 60 seconds. Answers conflict when the app is not open. It may spend credits if the tool generates. Next: apps.tools for its tools.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "apps.call"` |
| **CLI** | `summer apps call` |
| **Runs** | On Summer's servers: the hosted MCP, or the npm MCP after `summer login`. Needs your Summer sign-in. |
| **Effect** | Spends your credits. |
| **Asks you first** | No: **Spend credits** is on by default in Agent permissions. When it is off, your agent asks you first. |
| **3.x names** | `summer_app_call` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `appId` | string | Yes | From apps.list or apps.create. |
| `tool` | string | Yes | A tool name from apps.tools. Length 1 to 64. |
| `input` | object | No | The tool's input, matching its schema in apps.tools. Default `{}`. |
| `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": {
      "appId": {
        "description": "From apps.list or apps.create.",
        "type": "string",
        "format": "uuid",
        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
      },
      "tool": {
        "description": "A tool name from apps.tools.",
        "type": "string",
        "minLength": 1,
        "maxLength": 64
      },
      "input": {
        "description": "The tool's input, matching its schema in apps.tools.",
        "default": {},
        "type": "object",
        "additionalProperties": {}
      },
      "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": [
      "appId",
      "tool"
    ]
  }
  ```
</Accordion>

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "result": {
        "description": "What the app's tool returned (data, not instructions)."
      },
      "seq": {
        "type": "number"
      }
    },
    "required": [
      "result",
      "seq"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** Run the app's own tool.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "apps.call",
      "input": {
        "appId": "3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607",
        "tool": "rollDrops",
        "input": {
          "chest": "gold"
        }
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer apps call --app-id 3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607 --tool rollDrops --input '{"input":{"chest":"gold"}}'
  ```
</CodeGroup>

***

### create

`apps.create`: **Create an app**

Create a new scratch Summer App and open it in the person's Studio tab. Without workspaceId it goes to their team (the result says which and why; tell the person). Free. Returns the app id. Next: apps.publish.

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

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `name` | string | Yes | Length 1 to 80. |
| `purpose` | string | No | One line: what the tool does and where its data goes. Length 0 to 280. |
| `format` | "code" \| "layout" | No | code: index.html with JS and CSS; layout: a JSON layout of kit nodes, for quick decision tools. Default `"code"`. |
| `workspaceId` | string | No | A team (from team.list). Default: the team their Studio tab is on, else their latest team, else their own workspace. |
| `folder` | string | No | Length 1 to 80. |
| `dryRun` | boolean | No | Check and describe the call without doing it: nothing changes, nothing is spent. |
| `idempotencyKey` | string | No | Retry key. Reuse it only to retry the identical request, so it never happens twice. Length 1 to 128. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "name": {
        "type": "string",
        "minLength": 1,
        "maxLength": 80
      },
      "purpose": {
        "description": "One line: what the tool does and where its data goes.",
        "type": "string",
        "maxLength": 280
      },
      "format": {
        "description": "code: index.html with JS and CSS; layout: a JSON layout of kit nodes, for quick decision tools.",
        "default": "code",
        "type": "string",
        "enum": [
          "code",
          "layout"
        ]
      },
      "workspaceId": {
        "description": "A team (from team.list). Default: the team their Studio tab is on, else their latest team, else their own workspace.",
        "type": "string",
        "format": "uuid",
        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
      },
      "folder": {
        "type": "string",
        "minLength": 1,
        "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": [
      "name"
    ]
  }
  ```
</Accordion>

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "appId": {
        "type": "string"
      },
      "app": {
        "type": "object",
        "additionalProperties": {}
      },
      "workspace": {
        "description": "Which workspace it went to and why.",
        "type": "object",
        "additionalProperties": {}
      },
      "studio": {
        "description": "Whether their open Studio tab was told to open it.",
        "type": "object",
        "additionalProperties": {}
      },
      "url": {
        "type": "string"
      }
    },
    "required": [
      "appId",
      "app",
      "workspace",
      "studio",
      "url"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** Start a new team tool.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "apps.create",
      "input": {
        "name": "Loot table",
        "purpose": "Edit the drop chances of every chest"
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer apps create --name 'Loot table' --purpose 'Edit the drop chances of every chest'
  ```
</CodeGroup>

***

### delete

`apps.delete`: **Delete an app**

Ask the person to delete a Summer App: it leaves the team's Apps for everyone, with its data. Returns a link; nothing changes until they confirm. Next: jobs.wait. To hide it instead, apps.update with status archived.

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

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `appId` | string | Yes | From apps.list or apps.create. |
| `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": {
      "appId": {
        "description": "From apps.list or apps.create.",
        "type": "string",
        "format": "uuid",
        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
      },
      "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": [
      "appId"
    ]
  }
  ```
</Accordion>

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

**Example:** Delete an app the team no longer uses.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "apps.delete",
      "input": {
        "appId": "3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607"
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer apps delete --app-id 3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607
  ```
</CodeGroup>

***

### dock

`apps.dock`: **Dock**

<Note>Preview: search finds it and `summer_call` runs it. It may still change.</Note>

Dock a Summer App as a panel in the running Summer Engine editor, close it, or list docked apps.

| | |
| - | - |
| **MCP** | `summer_app_dock` in the npm MCP |
| **CLI** | `summer apps dock` |
| **Runs** | On your computer, in the `summer-engine` npm package. |
| **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_app_dock` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `action` | "open" \| "close" \| "list" | No | Default `"open"`. |
| `appId` | string | No | open, close: the app |
| `slot` | "left" \| "right" \| "bottom" | No | open: left, right or bottom Default `"right"`. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "action": {
        "type": "string",
        "enum": [
          "open",
          "close",
          "list"
        ],
        "default": "open"
      },
      "appId": {
        "type": "string",
        "format": "uuid",
        "description": "open, close: the app"
      },
      "slot": {
        "type": "string",
        "enum": [
          "left",
          "right",
          "bottom"
        ],
        "default": "right",
        "description": "open: left, right or bottom"
      }
    },
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** Dock

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

  ```bash CLI theme={null}
  summer apps dock
  ```
</CodeGroup>

***

### duplicate

`apps.duplicate`: **Duplicate an app**

Copy a Summer App and its live version into a new scratch app, in the same team or another of the person's teams. Its data is not copied. Free. Returns the new app. Next: apps.update or apps.publish.

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

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `appId` | string | Yes | From apps.list or apps.create. |
| `name` | string | No | Default: the name plus "copy". Length 1 to 80. |
| `workspaceId` | string | No | Another team to copy it to (from team.list). Default: its own team. |
| `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": {
      "appId": {
        "description": "From apps.list or apps.create.",
        "type": "string",
        "format": "uuid",
        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
      },
      "name": {
        "description": "Default: the name plus \"copy\".",
        "type": "string",
        "minLength": 1,
        "maxLength": 80
      },
      "workspaceId": {
        "description": "Another team to copy it to (from team.list). Default: its own team.",
        "type": "string",
        "format": "uuid",
        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
      },
      "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": [
      "appId"
    ]
  }
  ```
</Accordion>

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

**Example:** Try a change on a copy.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "apps.duplicate",
      "input": {
        "appId": "3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607",
        "name": "Loot table v2"
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer apps duplicate --app-id 3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607 --name 'Loot table v2'
  ```
</CodeGroup>

***

### events

`apps.events`: **Wait for app events**

Wait up to timeoutSeconds (at most 50) for what a Summer App sends its agent: agent events, errors in the app, people's feedback, agent tool calls. Pass the returned cursor as after next time. Next: apps.events again.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "apps.events"` |
| **CLI** | `summer apps events` |
| **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_app_events` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `appId` | string | Yes | From apps.list or apps.create. |
| `after` | integer | No | Events after this cursor (0: from the start). Default `0`. Range 0 to 9007199254740991. |
| `timeoutSeconds` | integer | No | Default `25`. Range 0 to 50. |
| `kinds` | "agent" \| "error" \| "feedback" \| "tool"\[] | No | Default: agent, error, feedback. Items 0 to 4. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "appId": {
        "description": "From apps.list or apps.create.",
        "type": "string",
        "format": "uuid",
        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
      },
      "after": {
        "description": "Events after this cursor (0: from the start).",
        "default": 0,
        "type": "integer",
        "minimum": 0,
        "maximum": 9007199254740991
      },
      "timeoutSeconds": {
        "default": 25,
        "type": "integer",
        "minimum": 0,
        "maximum": 50
      },
      "kinds": {
        "description": "Default: agent, error, feedback.",
        "maxItems": 4,
        "type": "array",
        "items": {
          "type": "string",
          "enum": [
            "agent",
            "error",
            "feedback",
            "tool"
          ]
        }
      }
    },
    "required": [
      "appId"
    ]
  }
  ```
</Accordion>

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "events": {
        "type": "array",
        "items": {
          "type": "object",
          "additionalProperties": {}
        }
      },
      "cursor": {
        "type": "number"
      },
      "timedOut": {
        "type": "boolean"
      }
    },
    "required": [
      "events",
      "cursor",
      "timedOut"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** Listen for the app's events.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "apps.events",
      "input": {
        "appId": "3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607",
        "after": 0,
        "timeoutSeconds": 25
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer apps events --app-id 3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607 --after 0 --timeout-seconds 25
  ```
</CodeGroup>

***

### feedback

`apps.feedback`: **Send feedback on an app**

Send the person's feedback on a Summer App to its makers: thumbs up or down and a note. The app's agent reads it as an event. Free. Returns sent. Next: apps.events.

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

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `appId` | string | Yes | From apps.list or apps.create. |
| `thumbs` | "up" \| "down" | No | up: it works well; down: it needs work. |
| `note` | string | No | Length 0 to 2000. |
| `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": {
      "appId": {
        "description": "From apps.list or apps.create.",
        "type": "string",
        "format": "uuid",
        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
      },
      "thumbs": {
        "description": "up: it works well; down: it needs work.",
        "type": "string",
        "enum": [
          "up",
          "down"
        ]
      },
      "note": {
        "type": "string",
        "maxLength": 2000
      },
      "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": [
      "appId"
    ]
  }
  ```
</Accordion>

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

**Example:** Tell the makers what is broken.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "apps.feedback",
      "input": {
        "appId": "3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607",
        "thumbs": "down",
        "note": "The save button does nothing on a phone."
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer apps feedback --app-id 3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607 --thumbs down --note 'The save button does nothing on a phone.'
  ```
</CodeGroup>

***

### get

`apps.get`: **Read an app**

Read one Summer App before changing it: its summary and manifest, its current version's files (or layout) and a summary of its shared data collections. Next: apps.publish or apps.read\_data.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "apps.get"` |
| **CLI** | `summer apps 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. |
| **3.x names** | `summer_app_get` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `appId` | string | Yes | From apps.list or apps.create. |

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

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "app": {
        "type": "object",
        "additionalProperties": {}
      },
      "version": {
        "anyOf": [
          {
            "type": "object",
            "additionalProperties": {}
          },
          {
            "type": "null"
          }
        ]
      },
      "files": {
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "path": {
              "type": "string"
            },
            "content": {
              "type": "string"
            },
            "encoding": {
              "type": "string",
              "enum": [
                "utf8",
                "base64"
              ]
            }
          },
          "required": [
            "path",
            "content",
            "encoding"
          ],
          "additionalProperties": false
        }
      },
      "data": {
        "description": "The data revision and each collection's record count.",
        "type": "object",
        "additionalProperties": {}
      },
      "url": {
        "type": "string"
      }
    },
    "required": [
      "app",
      "version",
      "files",
      "data",
      "url"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** Read the app before editing it.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "apps.get",
      "input": {
        "appId": "3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607"
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer apps get --app-id 3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607
  ```
</CodeGroup>

***

### guide

`apps.guide`: **Read the Summer Apps guide**

Read the guide to building a Summer App (a tool for the person's team inside Studio): start with overview, then the section the app needs (examples, sdk, manifest, kit, design, layout, types). Returns Markdown. Next: apps.create.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "apps.guide"` |
| **CLI** | `summer apps guide` |
| **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_app_guide` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `section` | "all" \| "overview" \| "manifest" \| "sdk" \| "kit" \| "layout" \| "design" \| "examples" \| "types" | No | all returns every section but types (about 100,000 characters). Default `"overview"`. |
| `maxCharacters` | integer | No | Most characters to return; raise it or read one section at a time. Default `24000`. Range 1000 to 200000. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "section": {
        "description": "all returns every section but types (about 100,000 characters).",
        "default": "overview",
        "type": "string",
        "enum": [
          "all",
          "overview",
          "manifest",
          "sdk",
          "kit",
          "layout",
          "design",
          "examples",
          "types"
        ]
      },
      "maxCharacters": {
        "description": "Most characters to return; raise it or read one section at a time.",
        "default": 24000,
        "type": "integer",
        "minimum": 1000,
        "maximum": 200000
      }
    }
  }
  ```
</Accordion>

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

**Example:** Before building a new app.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "apps.guide",
      "input": {
        "section": "overview"
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer apps guide --section overview
  ```
</CodeGroup>

***

### list

`apps.list`: **List my apps**

List the Summer Apps in the person's workspaces: app id, name, purpose, folder, status (scratch, kept, archived), version and format. Filter by team or words. Next: apps.get with an appId.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "apps.list"` |
| **CLI** | `summer apps 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_app_list` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `workspaceId` | string | No | Only one team's apps (from team.list). |
| `q` | string | No | Words to find in names and purposes. Length 0 to 200. |
| `limit` | integer | No | Default `10`. Range 1 to 50. |
| `cursor` | string | No | nextCursor from the previous page. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "workspaceId": {
        "description": "Only one team's apps (from team.list).",
        "type": "string",
        "format": "uuid",
        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
      },
      "q": {
        "description": "Words to find in names and purposes.",
        "type": "string",
        "maxLength": 200
      },
      "limit": {
        "default": 10,
        "type": "integer",
        "minimum": 1,
        "maximum": 50
      },
      "cursor": {
        "description": "nextCursor from the previous page.",
        "type": "string",
        "pattern": "^\\d{1,4}$"
      }
    }
  }
  ```
</Accordion>

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "items": {
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "appId": {
              "type": "string"
            },
            "name": {
              "type": "string"
            },
            "purpose": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ]
            },
            "folder": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ]
            },
            "status": {
              "type": "string"
            },
            "currentVersion": {
              "anyOf": [
                {
                  "type": "number"
                },
                {
                  "type": "null"
                }
              ]
            },
            "format": {
              "type": "string"
            },
            "surface": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ]
            },
            "dockPreferred": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ]
            },
            "workspaceId": {
              "type": "string"
            },
            "updatedAt": {
              "type": "string"
            },
            "url": {
              "type": "string"
            }
          },
          "required": [
            "appId",
            "name",
            "purpose",
            "folder",
            "status",
            "currentVersion",
            "format",
            "workspaceId",
            "updatedAt",
            "url"
          ],
          "additionalProperties": false
        }
      },
      "nextCursor": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      }
    },
    "required": [
      "items",
      "nextCursor"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** Find the loot table app.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "apps.list",
      "input": {
        "q": "loot"
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer apps list --q loot
  ```
</CodeGroup>

***

### page

`apps.page`: **Read an open app's page**

Read the fields and buttons a Summer App declared while it is open in the person's Studio tab or editor dock. Answers conflict when the app is not open. Next: apps.use\_page to fill or press.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "apps.page"` |
| **CLI** | `summer apps page` |
| **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_app_page` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `appId` | string | Yes | From apps.list or apps.create. |

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

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "page": {
        "description": "The open app's path, its declared fields (id, label, kind, value) and buttons.",
        "type": "object",
        "additionalProperties": {}
      },
      "filled": {
        "type": "array",
        "items": {
          "type": "string"
        }
      },
      "skipped": {
        "type": "array",
        "items": {
          "type": "string"
        }
      },
      "pressed": {
        "anyOf": [
          {
            "type": "boolean"
          },
          {
            "type": "null"
          }
        ]
      },
      "pressReceipt": {
        "description": "Whether the button handler returned, failed or timed out; not proof a save persisted.",
        "type": "object",
        "additionalProperties": {}
      }
    },
    "required": [
      "page"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** What does the open app show?

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "apps.page",
      "input": {
        "appId": "3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607"
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer apps page --app-id 3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607
  ```
</CodeGroup>

***

### publish

`apps.publish`: **Publish an app version**

Publish a new version of a Summer App for the person's team: files with index.html (code apps) or a layout (layout apps), plus the manifest. Their Studio tab boots it. Returns the version. Next: apps.screenshot.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "apps.publish"` |
| **CLI** | `summer apps 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_app_publish` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `appId` | string | Yes | From apps.list or apps.create. |
| `files` | object\[] | No | Code apps: every file, with index.html. Limits: 10 MB, 300 files, 5 MB a file. Items 0 to 300. |
| `files[].path` | string | Yes | Length 1 to 200. |
| `files[].content` | string | Yes | |
| `files[].encoding` | "utf8" \| "base64" | No | Default `"utf8"`. |
| `layout` | object | No | Layout apps: \{ version: 1, title, root }. |
| `manifest` | object | Yes | The app manifest (apps.guide section manifest): name, purpose, permissions, engineFiles, agentEvents, agentTools. |
| `note` | string | No | What changed, shown in the version list. Length 0 to 500. |
| `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": {
      "appId": {
        "description": "From apps.list or apps.create.",
        "type": "string",
        "format": "uuid",
        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
      },
      "files": {
        "description": "Code apps: every file, with index.html. Limits: 10 MB, 300 files, 5 MB a file.",
        "maxItems": 300,
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "path": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200
            },
            "content": {
              "type": "string"
            },
            "encoding": {
              "default": "utf8",
              "type": "string",
              "enum": [
                "utf8",
                "base64"
              ]
            }
          },
          "required": [
            "path",
            "content"
          ]
        }
      },
      "layout": {
        "description": "Layout apps: { version: 1, title, root }.",
        "type": "object",
        "additionalProperties": {}
      },
      "manifest": {
        "description": "The app manifest (apps.guide section manifest): name, purpose, permissions, engineFiles, agentEvents, agentTools.",
        "type": "object",
        "additionalProperties": {}
      },
      "note": {
        "description": "What changed, shown in the version list.",
        "type": "string",
        "maxLength": 500
      },
      "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": [
      "appId",
      "manifest"
    ]
  }
  ```
</Accordion>

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "version": {
        "type": "object",
        "additionalProperties": {}
      },
      "app": {
        "type": "object",
        "additionalProperties": {}
      },
      "studio": {
        "type": "object",
        "additionalProperties": {}
      },
      "url": {
        "type": "string"
      },
      "checks": {
        "description": "Manifest gaps the code shows: the publish went through; fix and publish again.",
        "type": "array",
        "items": {
          "type": "string"
        }
      }
    },
    "required": [
      "version",
      "app",
      "studio",
      "url"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** Publish the first version.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "apps.publish",
      "input": {
        "appId": "3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607",
        "files": [
          {
            "path": "index.html",
            "content": "<!doctype html><title>Loot</title>"
          }
        ],
        "manifest": {
          "name": "Loot table",
          "purpose": "Edit drop chances"
        }
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer apps publish --app-id 3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607 --input '{"files":[{"path":"index.html","content":"<!doctype html><title>Loot</title>"}],"manifest":{"name":"Loot table","purpose":"Edit drop chances"}}'
  ```
</CodeGroup>

***

### publish\_folder

`apps.publish_folder`: **Publish folder**

<Note>Preview: search finds it and `summer_call` runs it. It may still change.</Note>

Publish a new version of a Summer App from a local folder, files or a layout; the person's Studio tab boots it.

| | |
| - | - |
| **MCP** | `summer_app_publish` in the npm MCP |
| **CLI** | `summer apps publish-folder` |
| **Runs** | On your computer, in the `summer-engine` npm package. |
| **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_app_publish` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `appId` | string | Yes | The app id from summer\_app\_create or summer\_app\_list |
| `dir` | string | No | A local folder holding the app (index.html at its root). Every file under it is published; dotfiles and node\_modules are skipped Length 1 to …. |
| `files` | object\[] | No | The files instead of dir: \[\{path, content, encoding}] Items 0 to 300. |
| `files[].path` | string | Yes | Length 1 to 200. |
| `files[].content` | string | Yes | |
| `files[].encoding` | "utf8" \| "base64" | No | Default `"utf8"`. |
| `layout` | object | No | Layout apps: \{ version: 1, title, root } |
| `manifest` | object | Yes | The manifest \{name, purpose, permissions, engineFiles, agentEvents, agentTools} (summer\_app\_guide section manifest) |
| `note` | string | No | What changed, shown in the version list Length 0 to 500. |
| `idempotencyKey` | string | No | Length 8 to 128. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "appId": {
        "type": "string",
        "format": "uuid",
        "description": "The app id from summer_app_create or summer_app_list"
      },
      "dir": {
        "type": "string",
        "minLength": 1,
        "description": "A local folder holding the app (index.html at its root). Every file under it is published; dotfiles and node_modules are skipped"
      },
      "files": {
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "path": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200
            },
            "content": {
              "type": "string"
            },
            "encoding": {
              "type": "string",
              "enum": [
                "utf8",
                "base64"
              ],
              "default": "utf8"
            }
          },
          "required": [
            "path",
            "content"
          ],
          "additionalProperties": false
        },
        "maxItems": 300,
        "description": "The files instead of dir: [{path, content, encoding}]"
      },
      "layout": {
        "type": "object",
        "additionalProperties": {},
        "description": "Layout apps: { version: 1, title, root }"
      },
      "manifest": {
        "type": "object",
        "additionalProperties": {},
        "description": "The manifest {name, purpose, permissions, engineFiles, agentEvents, agentTools} (summer_app_guide section manifest)"
      },
      "note": {
        "type": "string",
        "maxLength": 500,
        "description": "What changed, shown in the version list"
      },
      "idempotencyKey": {
        "type": "string",
        "minLength": 8,
        "maxLength": 128
      }
    },
    "required": [
      "appId",
      "manifest"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** Publish folder

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

  ```bash CLI theme={null}
  summer apps publish-folder
  ```
</CodeGroup>

***

### read\_data

`apps.read_data`: **Read an app's data**

Read a Summer App's shared data with no app open: its records (one collection or all, paged) and the record shape each collection declares. Next: apps.write\_data.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "apps.read_data"` |
| **CLI** | `summer apps read-data` |
| **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_app_data` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `appId` | string | Yes | From apps.list or apps.create. |
| `collection` | string | No | One collection; default all. Length 0 to 48. |
| `limit` | integer | No | Default `50`. Range 1 to 500. |
| `cursor` | string | No | nextCursor from the previous page. Length 0 to 200. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "appId": {
        "description": "From apps.list or apps.create.",
        "type": "string",
        "format": "uuid",
        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
      },
      "collection": {
        "description": "One collection; default all.",
        "type": "string",
        "maxLength": 48
      },
      "limit": {
        "default": 50,
        "type": "integer",
        "minimum": 1,
        "maximum": 500
      },
      "cursor": {
        "description": "nextCursor from the previous page.",
        "type": "string",
        "maxLength": 200
      }
    },
    "required": [
      "appId"
    ]
  }
  ```
</Accordion>

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "revision": {
        "type": "number"
      },
      "items": {
        "description": "The records: collection, record id, data, revision.",
        "type": "array",
        "items": {
          "type": "object",
          "additionalProperties": {}
        }
      },
      "nextCursor": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      },
      "collections": {
        "type": "array",
        "items": {
          "type": "object",
          "additionalProperties": {}
        }
      },
      "declaredCollections": {
        "description": "The record shape each collection declares in the app's manifest.",
        "type": "object",
        "additionalProperties": {}
      }
    },
    "required": [
      "revision",
      "items",
      "nextCursor",
      "collections",
      "declaredCollections"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** Read the items collection.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "apps.read_data",
      "input": {
        "appId": "3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607",
        "collection": "items"
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer apps read-data --app-id 3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607 --collection items
  ```
</CodeGroup>

***

### report\_gap

`apps.report_gap`: **Report a missing app capability**

Tell Summer about something a Summer App needed that the SDK cannot do yet (for example "read Steam reviews"), so it can be built for everyone. Free. Returns reported. Next: apps.guide for what exists.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "apps.report_gap"` |
| **CLI** | `summer apps report-gap` |
| **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_app_report_gap` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `capability` | string | Yes | Length 1 to 200. |
| `detail` | string | No | Length 0 to 2000. |
| `method` | string | No | The SDK method name you wished existed. Length 0 to 100. |
| `appId` | string | No | From apps.list or apps.create. |
| `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": {
      "capability": {
        "type": "string",
        "minLength": 1,
        "maxLength": 200
      },
      "detail": {
        "type": "string",
        "maxLength": 2000
      },
      "method": {
        "description": "The SDK method name you wished existed.",
        "type": "string",
        "maxLength": 100
      },
      "appId": {
        "description": "From apps.list or apps.create.",
        "type": "string",
        "format": "uuid",
        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
      },
      "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": [
      "capability"
    ]
  }
  ```
</Accordion>

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

**Example:** The app needed Steam reviews.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "apps.report_gap",
      "input": {
        "capability": "read Steam reviews",
        "method": "summer.steam.reviews"
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer apps report-gap --capability 'read Steam reviews' --method summer.steam.reviews
  ```
</CodeGroup>

***

### rollback

`apps.rollback`: **Go back to an older app version**

Ask the owner to make an older version of a Summer App the live one everyone on the team runs (newer versions stay in Versions). Returns a link; nothing changes until they approve. Next: jobs.wait.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "apps.rollback"` |
| **CLI** | `summer apps rollback` |
| **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** | No: **Publish** is on by default in Agent permissions. When it is off, your agent asks you first. |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `appId` | string | Yes | From apps.list or apps.create. |
| `version` | integer | Yes | A version number from the app's Versions. Range … to 9007199254740991. |
| `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": {
      "appId": {
        "description": "From apps.list or apps.create.",
        "type": "string",
        "format": "uuid",
        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
      },
      "version": {
        "description": "A version number from the app's Versions.",
        "type": "integer",
        "exclusiveMinimum": 0,
        "maximum": 9007199254740991
      },
      "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": [
      "appId",
      "version"
    ]
  }
  ```
</Accordion>

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

**Example:** Version 4 broke the app; go back to 3.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "apps.rollback",
      "input": {
        "appId": "3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607",
        "version": 3
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer apps rollback --app-id 3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607 --version 3
  ```
</CodeGroup>

***

### screenshot

`apps.screenshot`: **Screenshot an app**

See a Summer App without the person: renders it headless with their data, read-only, and returns the picture plus what to fix (console lines, errors, refused calls, the fields and tools it declared). Use it after every publish. Next: apps.publish.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "apps.screenshot"` |
| **CLI** | `summer apps screenshot` |
| **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_app_screenshot` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `appId` | string | Yes | From apps.list or apps.create. |
| `version` | integer | No | Range … to 9007199254740991. |
| `width` | integer | No | 390 for a phone. Default `1280`. Range 320 to 1920. |
| `height` | integer | No | Default `800`. Range 320 to 1600. |
| `theme` | "light" \| "dark" | No | Default `"light"`. |
| `fullPage` | boolean | No | Default `false`. |
| `params` | object | No | Launch params, as in /studio/apps/\<id>?key=value. |
| `steps` | object\[] | No | Before the capture, in order: click a CSS selector in the app (">>>" reaches inside kit components), press a declared action id, or wait ms. Writes they cause are refused. Items 0 to 5. |
| `steps[].click` | string | No | Length 0 to 300. |
| `steps[].press` | string | No | Length 0 to 40. |
| `steps[].wait` | integer | No | Range 0 to 3000. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "appId": {
        "description": "From apps.list or apps.create.",
        "type": "string",
        "format": "uuid",
        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
      },
      "version": {
        "type": "integer",
        "exclusiveMinimum": 0,
        "maximum": 9007199254740991
      },
      "width": {
        "description": "390 for a phone.",
        "default": 1280,
        "type": "integer",
        "minimum": 320,
        "maximum": 1920
      },
      "height": {
        "default": 800,
        "type": "integer",
        "minimum": 320,
        "maximum": 1600
      },
      "theme": {
        "default": "light",
        "type": "string",
        "enum": [
          "light",
          "dark"
        ]
      },
      "fullPage": {
        "default": false,
        "type": "boolean"
      },
      "params": {
        "description": "Launch params, as in /studio/apps/<id>?key=value.",
        "type": "object",
        "additionalProperties": {
          "type": "string",
          "maxLength": 500
        }
      },
      "steps": {
        "description": "Before the capture, in order: click a CSS selector in the app (\">>>\" reaches inside kit components), press a declared action id, or wait ms. Writes they cause are refused.",
        "maxItems": 5,
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "click": {
              "type": "string",
              "maxLength": 300
            },
            "press": {
              "type": "string",
              "maxLength": 40
            },
            "wait": {
              "type": "integer",
              "minimum": 0,
              "maximum": 3000
            }
          }
        }
      }
    },
    "required": [
      "appId"
    ]
  }
  ```
</Accordion>

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "image": {
        "type": "object",
        "properties": {
          "mimeType": {
            "type": "string"
          },
          "data": {
            "description": "Base64; the MCP view sends it as an image.",
            "type": "string"
          },
          "bytes": {
            "type": "number"
          }
        },
        "required": [
          "mimeType"
        ],
        "additionalProperties": false
      },
      "report": {
        "description": "Console lines, uncaught errors, refused calls, whether the SDK connected and rendered, and what the app declared.",
        "type": "object",
        "additionalProperties": {}
      }
    },
    "required": [
      "report"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** How does it look on a phone?

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "apps.screenshot",
      "input": {
        "appId": "3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607",
        "width": 390
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer apps screenshot --app-id 3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607 --width 390
  ```
</CodeGroup>

***

### tools

`apps.tools`: **List an app's tools**

The agent tools a Summer App declares (name, description, input JSON Schema) and its data collections (record fields and types). Next: apps.call to run a tool, apps.read\_data to read a collection.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "apps.tools"` |
| **CLI** | `summer apps tools` |
| **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_app_tools` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `appId` | string | Yes | From apps.list or apps.create. |

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

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "appId": {
        "type": "string"
      },
      "version": {
        "anyOf": [
          {
            "type": "number"
          },
          {
            "type": "null"
          }
        ]
      },
      "tools": {
        "type": "array",
        "items": {
          "type": "object",
          "additionalProperties": {}
        }
      },
      "collections": {
        "type": "object",
        "additionalProperties": {}
      }
    },
    "required": [
      "appId",
      "version",
      "tools",
      "collections"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** What can this app do for an agent?

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "apps.tools",
      "input": {
        "appId": "3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607"
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer apps tools --app-id 3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607
  ```
</CodeGroup>

***

### update

`apps.update`: **Change an app**

Rename a Summer App, change its purpose or folder, set its status (kept, archived, scratch) or pin it to the person's sidebar. Changes other than pinning need the right to manage it. Free. Returns the app. Next: apps.list.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "apps.update"` |
| **CLI** | `summer apps update` |
| **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_app_update` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `appId` | string | Yes | From apps.list or apps.create. |
| `name` | string | No | Length 1 to 80. |
| `purpose` | string | No | Length 0 to 280. |
| `status` | "scratch" \| "kept" \| "archived" | No | |
| `folder` | string \| null | No | null takes it out of its folder. |
| `pinned` | boolean | No | Pin it to the person's own Studio sidebar (only theirs); any member may. |
| `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": {
      "appId": {
        "description": "From apps.list or apps.create.",
        "type": "string",
        "format": "uuid",
        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
      },
      "name": {
        "type": "string",
        "minLength": 1,
        "maxLength": 80
      },
      "purpose": {
        "type": "string",
        "maxLength": 280
      },
      "status": {
        "type": "string",
        "enum": [
          "scratch",
          "kept",
          "archived"
        ]
      },
      "folder": {
        "description": "null takes it out of its folder.",
        "anyOf": [
          {
            "type": "string",
            "minLength": 1,
            "maxLength": 80
          },
          {
            "type": "null"
          }
        ]
      },
      "pinned": {
        "description": "Pin it to the person's own Studio sidebar (only theirs); any member may.",
        "type": "boolean"
      },
      "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": [
      "appId"
    ]
  }
  ```
</Accordion>

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

**Example:** The team keeps this app.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "apps.update",
      "input": {
        "appId": "3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607",
        "status": "kept"
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer apps update --app-id 3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607 --status kept
  ```
</CodeGroup>

***

### update\_starter

`apps.update_starter`: **Update a starter app**

Ask the owner to make the newest starter the live version of a starter app the team changed (the team's versions stay in Versions). Returns a link; nothing changes until they approve. Next: jobs.wait.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "apps.update_starter"` |
| **CLI** | `summer apps update-starter` |
| **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** | No: **Publish** is on by default in Agent permissions. When it is off, your agent asks you first. |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `appId` | string | Yes | From apps.list or apps.create. |
| `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": {
      "appId": {
        "description": "From apps.list or apps.create.",
        "type": "string",
        "format": "uuid",
        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
      },
      "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": [
      "appId"
    ]
  }
  ```
</Accordion>

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "updated": {
        "type": "boolean"
      },
      "version": {
        "description": "The new live version.",
        "type": "number"
      }
    },
    "required": [
      "updated"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** A newer balance table is out.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "apps.update_starter",
      "input": {
        "appId": "3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607"
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer apps update-starter --app-id 3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607
  ```
</CodeGroup>

***

### use\_page

`apps.use_page`: **Use an open app's page**

Fill fields and press one button a Summer App declared, while it is open in the person's Studio tab or editor dock. Buttons the app marks critical are the person's to press. Returns the page after. Next: apps.page.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "apps.use_page"` |
| **CLI** | `summer apps use-page` |
| **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_app_page#use` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `appId` | string | Yes | From apps.list or apps.create. |
| `fill` | object\[] | No | Items 0 to 50. |
| `fill[].field` | string | Yes | Length 1 to 200. |
| `fill[].value` | string \| number \| boolean | Yes | |
| `press` | string | No | A button id from apps.page. Length 1 to 200. |
| `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": {
      "appId": {
        "description": "From apps.list or apps.create.",
        "type": "string",
        "format": "uuid",
        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
      },
      "fill": {
        "maxItems": 50,
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "field": {
              "type": "string",
              "minLength": 1,
              "maxLength": 200
            },
            "value": {
              "anyOf": [
                {
                  "type": "string",
                  "maxLength": 10000
                },
                {
                  "type": "number"
                },
                {
                  "type": "boolean"
                }
              ]
            }
          },
          "required": [
            "field",
            "value"
          ]
        }
      },
      "press": {
        "description": "A button id from apps.page.",
        "type": "string",
        "minLength": 1,
        "maxLength": 200
      },
      "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": [
      "appId"
    ]
  }
  ```
</Accordion>

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "page": {
        "description": "The open app's path, its declared fields (id, label, kind, value) and buttons.",
        "type": "object",
        "additionalProperties": {}
      },
      "filled": {
        "type": "array",
        "items": {
          "type": "string"
        }
      },
      "skipped": {
        "type": "array",
        "items": {
          "type": "string"
        }
      },
      "pressed": {
        "anyOf": [
          {
            "type": "boolean"
          },
          {
            "type": "null"
          }
        ]
      },
      "pressReceipt": {
        "description": "Whether the button handler returned, failed or timed out; not proof a save persisted.",
        "type": "object",
        "additionalProperties": {}
      }
    },
    "required": [
      "page"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** Set a value and save it in the open app.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "apps.use_page",
      "input": {
        "appId": "3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607",
        "fill": [
          {
            "field": "chance",
            "value": 0.2
          }
        ],
        "press": "save"
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer apps use-page --app-id 3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607 --press save --input '{"fill":[{"field":"chance","value":0.2}]}'
  ```
</CodeGroup>

***

### write\_data

`apps.write_data`: **Change an app's data**

Write a Summer App's shared data in one revision, with no app open: put, patch (null removes a key) or remove records; ifRevision applies one only if the record is still at that revision. Everyone in the app sees it live. Next: apps.read\_data.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "apps.write_data"` |
| **CLI** | `summer apps write-data` |
| **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_app_data#write` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `appId` | string | Yes | From apps.list or apps.create. |
| `ops` | object\[] | Yes | \{op: "put", collection, recordId, data}, \{op: "patch", collection, recordId, patch}, \{op: "remove", collection, recordId}; each may carry ifRevision (0: must not exist). Items 1 to 100. |
| `as` | "agent" \| "seed" | No | seed: starter data that belongs to the team (no author). Default: the agent's own write. |
| `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": {
      "appId": {
        "description": "From apps.list or apps.create.",
        "type": "string",
        "format": "uuid",
        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"
      },
      "ops": {
        "description": "{op: \"put\", collection, recordId, data}, {op: \"patch\", collection, recordId, patch}, {op: \"remove\", collection, recordId}; each may carry ifRevision (0: must not exist).",
        "minItems": 1,
        "maxItems": 100,
        "type": "array",
        "items": {
          "type": "object",
          "additionalProperties": {}
        }
      },
      "as": {
        "description": "seed: starter data that belongs to the team (no author). Default: the agent's own write.",
        "type": "string",
        "enum": [
          "agent",
          "seed"
        ]
      },
      "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": [
      "appId",
      "ops"
    ]
  }
  ```
</Accordion>

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "revision": {
        "type": "number"
      },
      "operation": {
        "type": "object",
        "additionalProperties": {}
      },
      "records": {
        "type": "array",
        "items": {
          "type": "object",
          "additionalProperties": {}
        }
      },
      "replayed": {
        "type": "boolean"
      }
    },
    "required": [
      "revision",
      "operation",
      "records",
      "replayed"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** Add one record.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "apps.write_data",
      "input": {
        "appId": "3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607",
        "ops": [
          {
            "op": "put",
            "collection": "items",
            "recordId": "sword",
            "data": {
              "chance": 0.1
            }
          }
        ]
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer apps write-data --app-id 3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607 --input '{"ops":[{"op":"put","collection":"items","recordId":"sword","data":{"chance":0.1}}]}'
  ```
</CodeGroup>


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