src/lib/ops/public-catalog.json in publicsummerengine at 0d85f61e2b and the summer-engine npm package 4.0.0 for engine and local operations. If something here is wrong, the operation’s definition is wrong.| Operation | What it does | Asks you first |
|---|---|---|
apps.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 | 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 a new scratch Summer App and open it in the person’s Studio tab. | Not by default |
apps.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 a Summer App as a panel in the running Summer Engine editor, close it, or list docked apps. | Not by default |
apps.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 | 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 | Send the person’s feedback on a Summer App to its makers: thumbs up or down and a note. | Not by default |
apps.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 | 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 the Summer Apps in the person’s workspaces: app id, name, purpose, folder, status (scratch, kept, archived), version and format. | Never |
apps.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 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 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 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 | 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 | 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 | 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 | The agent tools a Summer App declares (name, description, input JSON Schema) and its data collections (record fields and types). | Never |
apps.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 | 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 | 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 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. |
| 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. |
Input JSON schema
Input JSON schema
{
"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"
]
}
Result JSON schema
Result JSON schema
{
"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
}
{
"name": "summer_call",
"arguments": {
"op": "apps.add_starter",
"input": {
"starterId": "balance-table"
}
}
}
summer apps add-starter --starter-id balance-table
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 |
| 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. |
Input JSON schema
Input JSON schema
{
"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"
]
}
Result JSON schema
Result JSON schema
{
"type": "object",
"properties": {
"result": {
"description": "What the app's tool returned (data, not instructions)."
},
"seq": {
"type": "number"
}
},
"required": [
"result",
"seq"
],
"additionalProperties": false
}
{
"name": "summer_call",
"arguments": {
"op": "apps.call",
"input": {
"appId": "3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607",
"tool": "rollDrops",
"input": {
"chest": "gold"
}
}
}
}
summer apps call --app-id 3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607 --tool rollDrops --input '{"input":{"chest":"gold"}}'
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 |
| 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. |
Input JSON schema
Input JSON schema
{
"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"
]
}
Result JSON schema
Result JSON schema
{
"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
}
{
"name": "summer_call",
"arguments": {
"op": "apps.create",
"input": {
"name": "Loot table",
"purpose": "Edit the drop chances of every chest"
}
}
}
summer apps create --name 'Loot table' --purpose 'Edit the drop chances of every chest'
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. |
| 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. |
Input JSON schema
Input JSON schema
{
"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"
]
}
Result JSON schema
Result JSON schema
{
"type": "object",
"properties": {
"appId": {
"type": "string"
},
"deleted": {
"type": "boolean"
}
},
"required": [
"appId",
"deleted"
],
"additionalProperties": false
}
{
"name": "summer_call",
"arguments": {
"op": "apps.delete",
"input": {
"appId": "3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607"
}
}
}
summer apps delete --app-id 3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607
dock
apps.dock: Dock
summer_call runs it. It may still change.| 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 |
| 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". |
Input JSON schema
Input JSON schema
{
"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
}
{
"name": "summer_app_dock",
"arguments": {}
}
summer apps dock
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. |
| 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. |
Input JSON schema
Input JSON schema
{
"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"
]
}
Result JSON schema
Result JSON schema
{
"type": "object",
"properties": {
"appId": {
"type": "string"
},
"app": {
"type": "object",
"additionalProperties": {}
},
"url": {
"type": "string"
}
},
"required": [
"appId",
"app",
"url"
],
"additionalProperties": false
}
{
"name": "summer_call",
"arguments": {
"op": "apps.duplicate",
"input": {
"appId": "3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607",
"name": "Loot table v2"
}
}
}
summer apps duplicate --app-id 3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607 --name 'Loot table v2'
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 |
| 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. |
Input JSON schema
Input JSON schema
{
"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"
]
}
Result JSON schema
Result JSON schema
{
"type": "object",
"properties": {
"events": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": {}
}
},
"cursor": {
"type": "number"
},
"timedOut": {
"type": "boolean"
}
},
"required": [
"events",
"cursor",
"timedOut"
],
"additionalProperties": false
}
{
"name": "summer_call",
"arguments": {
"op": "apps.events",
"input": {
"appId": "3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607",
"after": 0,
"timeoutSeconds": 25
}
}
}
summer apps events --app-id 3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607 --after 0 --timeout-seconds 25
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. |
| 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. |
Input JSON schema
Input JSON schema
{
"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"
]
}
Result JSON schema
Result JSON schema
{
"type": "object",
"properties": {
"sent": {
"type": "boolean"
}
},
"required": [
"sent"
],
"additionalProperties": false
}
{
"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."
}
}
}
summer apps feedback --app-id 3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607 --thumbs down --note 'The save button does nothing on a phone.'
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 |
| Input | Type | Required | Description |
|---|---|---|---|
appId | string | Yes | From apps.list or apps.create. |
Input JSON schema
Input JSON schema
{
"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"
]
}
Result JSON schema
Result JSON schema
{
"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
}
{
"name": "summer_call",
"arguments": {
"op": "apps.get",
"input": {
"appId": "3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607"
}
}
}
summer apps get --app-id 3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607
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 |
| 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. |
Input JSON schema
Input JSON schema
{
"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
}
}
}
Result JSON schema
Result JSON schema
{
"type": "object",
"properties": {
"section": {
"type": "string"
},
"markdown": {
"type": "string"
},
"truncated": {
"type": "boolean"
},
"totalCharacters": {
"type": "number"
}
},
"required": [
"section",
"markdown",
"totalCharacters"
],
"additionalProperties": false
}
{
"name": "summer_call",
"arguments": {
"op": "apps.guide",
"input": {
"section": "overview"
}
}
}
summer apps guide --section overview
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 |
| 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. |
Input JSON schema
Input JSON schema
{
"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}$"
}
}
}
Result JSON schema
Result JSON schema
{
"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
}
{
"name": "summer_call",
"arguments": {
"op": "apps.list",
"input": {
"q": "loot"
}
}
}
summer apps list --q loot
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 |
| Input | Type | Required | Description |
|---|---|---|---|
appId | string | Yes | From apps.list or apps.create. |
Input JSON schema
Input JSON schema
{
"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"
]
}
Result JSON schema
Result JSON schema
{
"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
}
{
"name": "summer_call",
"arguments": {
"op": "apps.page",
"input": {
"appId": "3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607"
}
}
}
summer apps page --app-id 3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607
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 |
| 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. |
Input JSON schema
Input JSON schema
{
"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"
]
}
Result JSON schema
Result JSON schema
{
"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
}
{
"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"
}
}
}
}
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"}}'
publish_folder
apps.publish_folder: Publish folder
summer_call runs it. It may still change.| 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 |
| 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. |
Input JSON schema
Input JSON schema
{
"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
}
{
"name": "summer_app_publish",
"arguments": {}
}
summer apps publish-folder
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 |
| 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. |
Input JSON schema
Input JSON schema
{
"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"
]
}
Result JSON schema
Result JSON schema
{
"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
}
{
"name": "summer_call",
"arguments": {
"op": "apps.read_data",
"input": {
"appId": "3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607",
"collection": "items"
}
}
}
summer apps read-data --app-id 3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607 --collection items
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 |
| 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. |
Input JSON schema
Input JSON schema
{
"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"
]
}
Result JSON schema
Result JSON schema
{
"type": "object",
"properties": {
"reported": {
"type": "boolean"
}
},
"required": [
"reported"
],
"additionalProperties": false
}
{
"name": "summer_call",
"arguments": {
"op": "apps.report_gap",
"input": {
"capability": "read Steam reviews",
"method": "summer.steam.reviews"
}
}
}
summer apps report-gap --capability 'read Steam reviews' --method summer.steam.reviews
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. |
| 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. |
Input JSON schema
Input JSON schema
{
"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"
]
}
Result JSON schema
Result JSON schema
{
"type": "object",
"properties": {
"app": {
"type": "object",
"additionalProperties": {}
}
},
"required": [
"app"
],
"additionalProperties": false
}
{
"name": "summer_call",
"arguments": {
"op": "apps.rollback",
"input": {
"appId": "3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607",
"version": 3
}
}
}
summer apps rollback --app-id 3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607 --version 3
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 |
| 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. |
Input JSON schema
Input JSON schema
{
"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"
]
}
Result JSON schema
Result JSON schema
{
"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
}
{
"name": "summer_call",
"arguments": {
"op": "apps.screenshot",
"input": {
"appId": "3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607",
"width": 390
}
}
}
summer apps screenshot --app-id 3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607 --width 390
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 |
| Input | Type | Required | Description |
|---|---|---|---|
appId | string | Yes | From apps.list or apps.create. |
Input JSON schema
Input JSON schema
{
"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"
]
}
Result JSON schema
Result JSON schema
{
"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
}
{
"name": "summer_call",
"arguments": {
"op": "apps.tools",
"input": {
"appId": "3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607"
}
}
}
summer apps tools --app-id 3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607
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 |
| 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. |
Input JSON schema
Input JSON schema
{
"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"
]
}
Result JSON schema
Result JSON schema
{
"type": "object",
"properties": {
"app": {
"type": "object",
"additionalProperties": {}
}
},
"required": [
"app"
],
"additionalProperties": false
}
{
"name": "summer_call",
"arguments": {
"op": "apps.update",
"input": {
"appId": "3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607",
"status": "kept"
}
}
}
summer apps update --app-id 3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607 --status kept
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. |
| 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. |
Input JSON schema
Input JSON schema
{
"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"
]
}
Result JSON schema
Result JSON schema
{
"type": "object",
"properties": {
"updated": {
"type": "boolean"
},
"version": {
"description": "The new live version.",
"type": "number"
}
},
"required": [
"updated"
],
"additionalProperties": false
}
{
"name": "summer_call",
"arguments": {
"op": "apps.update_starter",
"input": {
"appId": "3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607"
}
}
}
summer apps update-starter --app-id 3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607
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 |
| 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. |
Input JSON schema
Input JSON schema
{
"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"
]
}
Result JSON schema
Result JSON schema
{
"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
}
{
"name": "summer_call",
"arguments": {
"op": "apps.use_page",
"input": {
"appId": "3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607",
"fill": [
{
"field": "chance",
"value": 0.2
}
],
"press": "save"
}
}
}
summer apps use-page --app-id 3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607 --press save --input '{"fill":[{"field":"chance","value":0.2}]}'
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 |
| 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. |
Input JSON schema
Input JSON schema
{
"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"
]
}
Result JSON schema
Result JSON schema
{
"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
}
{
"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
}
}
]
}
}
}
summer apps write-data --app-id 3f2a1b4c-5d6e-4f70-8a91-b2c3d4e5f607 --input '{"ops":[{"op":"put","collection":"items","recordId":"sword","data":{"chance":0.1}}]}'

