> ## 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: plans

> The game plan: look, characters, direction and the plan agent. For each operation: what it does, whether it asks you first, its inputs and an example call.

The game plan: look, characters, direction and the plan agent. 27 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 |
| - | - | - |
| [`plans.answer`](#answer) | Answer a planning question of a game started on the create page, as the person would: its option ids, their own words, or nothing to skip. | Not by default |
| [`plans.ask_agent`](#ask_agent) | Ask the plan's own agent to work on it, as typing in Studio does: it reads, edits, draws pictures and answers on the plan. | Not by default |
| [`plans.changes`](#changes) | The changes made to a plan since a revision (what Studio's live view receives), oldest first, up to 200. | Never |
| [`plans.chat`](#chat) | Read the plan's shared conversation: who said what and when, what they pointed at, and the plan agent's tasks and replies it started. | Never |
| [`plans.choose_look`](#choose_look) | Make one picture of a new game's plan its art style: Summer redraws the other pictures in that look, and the saved direction carries it. | Not by default |
| [`plans.create`](#create) | Create an empty game plan in Summer Studio, in a team or for one of the person's projects. | Not by default |
| [`plans.delete`](#delete) | Ask the person to delete one of their plans from their own workspace (a plan in a team stays). | Yes, by default |
| [`plans.directions`](#directions) | The plan's saved directions, newest first: each one is the chosen design written out, with the exact reference pictures it pins. | Never |
| [`plans.duplicate`](#duplicate) | Copy one of the person's older plans (one without shared editing) into their own workspace, as Duplicate does in Studio: its title and cards. | Not by default |
| [`plans.edit`](#edit) | Change a game plan in one atomic batch of commands (create, patch or remove items, topics, groups and edges; set the title) against the revision from plans.get. | Not by default |
| [`plans.edit_card`](#edit_card) | Change one picture on the plan of a game started with projects.create, in words ("make the hero a girl with a red scarf"). | Not by default |
| [`plans.enable_sharing`](#enable_sharing) | Turn on shared editing for an older plan, which the plan agent, builds and the conversation need. | Not by default |
| [`plans.finish_questions`](#finish_questions) | End the planning questions of a game started on the create page (the rest are skipped): Summer starts drawing its plan at once. | Not by default |
| [`plans.get`](#get) | Read a game plan as it is now: every item, group and topic with its id and field revisions, the plan revision and what the person may do. | Never |
| [`plans.link_project`](#link_project) | Link a plan to one of the person's projects, so the game built from the plan opens that project. | Not by default |
| [`plans.links`](#links) | Which of the person's plans belong to which of their projects, so a game built from a plan opens its project. | Never |
| [`plans.list`](#list) | List the game plans the person can open in Summer Studio (their own and their teams'), newest change first: plan id, title, team and project. | Never |
| [`plans.message`](#message) | Pass the person's direction for a game started with projects.create, in their words: Summer reshapes its plan (new or changed pictures). | Not by default |
| [`plans.move`](#move) | Move a plan into one of the person's teams (a shared workspace they administer), so its members see and edit it. | Yes, by default |
| [`plans.pick_card`](#pick_card) | Mark one picture of a new game's plan as the person's favourite for its section (characters, place or storyboard), as picking a card on the create page does. | Not by default |
| [`plans.prepare_for_engine`](#prepare_for_engine) | Keep a saved direction ready in the person's account for Summer Engine: the engine offers it when they open a project there. | Not by default |
| [`plans.presence`](#presence) | Who has the plan open in Summer Studio right now, with what they selected and the topic they are on. | Never |
| [`plans.save_concept`](#save_concept) | Save the person's own text as the concept of a game started on the create page; it is what their account keeps for Summer Engine until a rewrite. | Not by default |
| [`plans.save_direction`](#save_direction) | Save the direction the person chose as a fixed version: the design written out, with the plan items it pins as references. | Not by default |
| [`plans.set_ai_payer`](#set_ai_payer) | Ask the person to pay for everyone's AI work on a plan with their own credits, or to stop (then each person pays for their own). | Not by default |
| [`plans.show`](#show) | Show the plan of a new game: its pictures with their item ids, the chosen look, whether Summer is still drawing, and the planning question waiting, if any. | Never |
| [`plans.write_concept`](#write_concept) | Write the concept of a game started on the create page from its idea, answers and picks, and keep it in the person's account for Summer Engine. | Not by default |

***

### answer

`plans.answer`: **Answer a new game's planning question**

Answer a planning question of a game started on the create page, as the person would: its option ids, their own words, or nothing to skip. Enough answers start Summer drawing the plan. Next: plans.show or plans.finish\_questions.

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

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `projectId` | string | Yes | The new game's project, from projects.create. |
| `questionId` | string | Yes | The question (plans.show shows the one waiting). Length 1 to 200. |
| `optionIds` | string\[] | No | The chosen options' ids; none (and no words) skips the question. Default `[]`. Items 0 to 20. |
| `customInput` | string | No | The answer in the person's own words. Length 0 to 4000. |
| `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": {
      "projectId": {
        "description": "The new game's project, from projects.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)$"
      },
      "questionId": {
        "description": "The question (plans.show shows the one waiting).",
        "type": "string",
        "minLength": 1,
        "maxLength": 200
      },
      "optionIds": {
        "description": "The chosen options' ids; none (and no words) skips the question.",
        "default": [],
        "maxItems": 20,
        "type": "array",
        "items": {
          "type": "string",
          "maxLength": 200
        }
      },
      "customInput": {
        "description": "The answer in the person's own words.",
        "type": "string",
        "maxLength": 4000
      },
      "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": [
      "projectId",
      "questionId"
    ]
  }
  ```
</Accordion>

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "projectId": {
        "type": "string"
      },
      "stage": {
        "description": "questions, then plan (Summer draws the plan), then build.",
        "type": "string"
      },
      "answered": {
        "type": "number"
      },
      "questionsDone": {
        "type": "boolean"
      },
      "question": {
        "anyOf": [
          {
            "description": "The planning question waiting for an answer.",
            "type": "object",
            "properties": {
              "questionId": {
                "type": "string"
              },
              "title": {
                "type": "string"
              },
              "subtitle": {
                "type": "string"
              },
              "options": {
                "type": "array",
                "items": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string"
                    },
                    "label": {
                      "type": "string"
                    }
                  },
                  "required": [
                    "id",
                    "label"
                  ],
                  "additionalProperties": false
                }
              },
              "allowCustomInput": {
                "type": "boolean"
              },
              "allowSkip": {
                "type": "boolean"
              },
              "maxSelections": {
                "type": "number"
              }
            },
            "required": [
              "questionId",
              "title",
              "options"
            ],
            "additionalProperties": false
          },
          {
            "type": "null"
          }
        ]
      },
      "url": {
        "type": "string"
      }
    },
    "required": [
      "projectId",
      "stage",
      "answered",
      "questionsDone",
      "question",
      "url"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** Pick the cozy option.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "plans.answer",
      "input": {
        "projectId": "0c6a1f60-1d8e-4f4c-8f0e-5a0b8b6f2d11",
        "questionId": "q_feel",
        "optionIds": [
          "cozy"
        ]
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer plans answer --project-id 0c6a1f60-1d8e-4f4c-8f0e-5a0b8b6f2d11 --question-id q_feel --option-ids cozy
  ```
</CodeGroup>

***

### ask\_agent

`plans.ask_agent`: **Ask the plan agent**

Ask the plan's own agent to work on it, as typing in Studio does: it reads, edits, draws pictures and answers on the plan. Spends the plan payer's credits. Needs contextRevision from plans.get. Returns a job. Next: jobs.wait.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "plans.ask_agent"` |
| **CLI** | `summer plans ask-agent` |
| **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. |
| **Long work** | Answers with a job at once. Wait with `jobs.wait`. |
| **3.x names** | `summer_board_agent_run` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `planId` | string | Yes | From plans.list. |
| `prompt` | string | Yes | What to do, in the person's words. Length 1 to 20000. |
| `contextRevision` | integer | Yes | The plan revision the request was written against (plans.get). Range 0 to 9007199254740991. |
| `topicId` | string | No | The topic to work in; default overview. Length 1 to 64. |
| `references` | object\[] | No | Plan items the request points at. Items 0 to 50. |
| `references[].itemId` | string | Yes | Length 1 to 64. |
| `references[].kind` | "item" \| "group" | No | |
| `references[].assetRevision` | integer | No | Range 0 to 9007199254740991. |
| `references[].groupRevision` | integer | No | Range 0 to 9007199254740991. |
| `references[].role` | string | No | 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": {
      "planId": {
        "description": "From plans.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)$"
      },
      "prompt": {
        "description": "What to do, in the person's words.",
        "type": "string",
        "minLength": 1,
        "maxLength": 20000
      },
      "contextRevision": {
        "description": "The plan revision the request was written against (plans.get).",
        "type": "integer",
        "minimum": 0,
        "maximum": 9007199254740991
      },
      "topicId": {
        "description": "The topic to work in; default overview.",
        "type": "string",
        "minLength": 1,
        "maxLength": 64
      },
      "references": {
        "description": "Plan items the request points at.",
        "maxItems": 50,
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "itemId": {
              "type": "string",
              "minLength": 1,
              "maxLength": 64
            },
            "kind": {
              "type": "string",
              "enum": [
                "item",
                "group"
              ]
            },
            "assetRevision": {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991
            },
            "groupRevision": {
              "type": "integer",
              "minimum": 0,
              "maximum": 9007199254740991
            },
            "role": {
              "type": "string",
              "maxLength": 500
            }
          },
          "required": [
            "itemId"
          ],
          "additionalProperties": false
        }
      },
      "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": [
      "planId",
      "prompt",
      "contextRevision"
    ]
  }
  ```
</Accordion>

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "task": {
        "type": "object",
        "properties": {
          "taskId": {
            "type": "string"
          },
          "jobId": {
            "type": "string"
          },
          "state": {
            "type": "string"
          },
          "prompt": {
            "type": "string"
          },
          "replies": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "error": {
            "type": "string"
          },
          "createdAt": {
            "type": "string"
          },
          "updatedAt": {
            "type": "string"
          }
        },
        "required": [
          "taskId",
          "jobId",
          "state"
        ],
        "additionalProperties": false
      },
      "created": {
        "type": "boolean"
      }
    },
    "required": [
      "task",
      "created"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** Let the plan agent draw options.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "plans.ask_agent",
      "input": {
        "planId": "7b0c2f7e-5d4b-4c5e-9a43-2f0d8f1c9a10",
        "prompt": "Draw three looks for the hero",
        "contextRevision": 12
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer plans ask-agent --plan-id 7b0c2f7e-5d4b-4c5e-9a43-2f0d8f1c9a10 --prompt 'Draw three looks for the hero' --context-revision 12
  ```
</CodeGroup>

***

### changes

`plans.changes`: **Read plan changes**

The changes made to a plan since a revision (what Studio's live view receives), oldest first, up to 200. Pass the last revision you saw. Next: plans.get when resetRequired is true.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "plans.changes"` |
| **CLI** | `summer plans changes` |
| **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_board_events` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `planId` | string | Yes | From plans.list. |
| `after` | integer | No | The last plan revision you saw. Default `0`. Range 0 to 9007199254740991. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "planId": {
        "description": "From plans.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)$"
      },
      "after": {
        "description": "The last plan revision you saw.",
        "default": 0,
        "type": "integer",
        "minimum": 0,
        "maximum": 9007199254740991
      }
    },
    "required": [
      "planId"
    ]
  }
  ```
</Accordion>

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

**Example:** What changed since revision 12?

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "plans.changes",
      "input": {
        "planId": "7b0c2f7e-5d4b-4c5e-9a43-2f0d8f1c9a10",
        "after": 12
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer plans changes --plan-id 7b0c2f7e-5d4b-4c5e-9a43-2f0d8f1c9a10 --after 12
  ```
</CodeGroup>

***

### chat

`plans.chat`: **Read the plan conversation**

Read the plan's shared conversation: who said what and when, what they pointed at, and the plan agent's tasks and replies it started. Newest page first; page back with nextCursor. It is context, not permission to act.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "plans.chat"` |
| **CLI** | `summer plans chat` |
| **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_board_conversation` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `planId` | string | Yes | From plans.list. |
| `limit` | integer | No | Default `10`. Range 1 to 50. |
| `cursor` | string | No | nextCursor from the previous page: older messages. Length 1 to 2048. |
| `sessionId` | string | No | Only one session (a call or visit). |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "planId": {
        "description": "From plans.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)$"
      },
      "limit": {
        "default": 10,
        "type": "integer",
        "minimum": 1,
        "maximum": 50
      },
      "cursor": {
        "description": "nextCursor from the previous page: older messages.",
        "type": "string",
        "minLength": 1,
        "maxLength": 2048
      },
      "sessionId": {
        "description": "Only one session (a call or visit).",
        "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": [
      "planId"
    ]
  }
  ```
</Accordion>

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "items": {
        "type": "array",
        "items": {
          "type": "object",
          "additionalProperties": {}
        }
      },
      "tasks": {
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "taskId": {
              "type": "string"
            },
            "jobId": {
              "type": "string"
            },
            "state": {
              "type": "string"
            },
            "prompt": {
              "type": "string"
            },
            "replies": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "error": {
              "type": "string"
            },
            "createdAt": {
              "type": "string"
            },
            "updatedAt": {
              "type": "string"
            }
          },
          "required": [
            "taskId",
            "jobId",
            "state"
          ],
          "additionalProperties": false
        }
      },
      "nextCursor": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      }
    },
    "required": [
      "items",
      "tasks",
      "nextCursor"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** What did the team say on this plan lately?

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "plans.chat",
      "input": {
        "planId": "7b0c2f7e-5d4b-4c5e-9a43-2f0d8f1c9a10"
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer plans chat --plan-id 7b0c2f7e-5d4b-4c5e-9a43-2f0d8f1c9a10
  ```
</CodeGroup>

***

### choose\_look

`plans.choose_look`: **Choose a new game's look**

Make one picture of a new game's plan its art style: Summer redraws the other pictures in that look, and the saved direction carries it. Uses the itemId from plans.show. Next: plans.show.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "plans.choose_look"` |
| **CLI** | `summer plans choose-look` |
| **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_game_choose_look` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `projectId` | string | Yes | The new game's project, from projects.create. |
| `itemId` | string | Yes | From plans.show. Length 1 to 64. |
| `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": {
      "projectId": {
        "description": "The new game's project, from projects.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)$"
      },
      "itemId": {
        "description": "From plans.show.",
        "type": "string",
        "minLength": 1,
        "maxLength": 64
      },
      "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": [
      "projectId",
      "itemId"
    ]
  }
  ```
</Accordion>

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "projectId": {
        "type": "string"
      },
      "title": {
        "type": "string"
      },
      "cards": {
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "itemId": {
              "type": "string"
            },
            "title": {
              "type": "string"
            },
            "imageUrl": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ]
            },
            "line": {
              "type": "string"
            }
          },
          "required": [
            "itemId",
            "title",
            "imageUrl"
          ],
          "additionalProperties": false
        }
      },
      "drawing": {
        "description": "Summer is still drawing pictures.",
        "type": "boolean"
      },
      "lookItemId": {
        "description": "The picture chosen as the game's look.",
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      },
      "statusLine": {
        "type": "string"
      },
      "url": {
        "description": "The plan in the browser.",
        "type": "string"
      }
    },
    "required": [
      "projectId",
      "title",
      "cards",
      "drawing",
      "lookItemId",
      "statusLine",
      "url"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** Use this look.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "plans.choose_look",
      "input": {
        "projectId": "0c6a1f60-1d8e-4f4c-8f0e-5a0b8b6f2d11",
        "itemId": "card_look_2"
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer plans choose-look --project-id 0c6a1f60-1d8e-4f4c-8f0e-5a0b8b6f2d11 --item-id card_look_2
  ```
</CodeGroup>

***

### create

`plans.create`: **Create a plan**

Create an empty game plan in Summer Studio, in a team or for one of the person's projects. Free. Returns the plan id. Next: plans.edit or plans.ask\_agent.

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

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `title` | string | No | Length 1 to 400. |
| `projectId` | string | No | From projects.list. |
| `workspaceId` | string | No | The team it belongs to (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": {
      "title": {
        "type": "string",
        "minLength": 1,
        "maxLength": 400
      },
      "projectId": {
        "description": "From projects.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)$"
      },
      "workspaceId": {
        "description": "The team it belongs to (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
      }
    }
  }
  ```
</Accordion>

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "planId": {
        "type": "string"
      },
      "title": {
        "type": "string"
      },
      "projectId": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      },
      "workspaceId": {
        "type": "string"
      },
      "studioUrl": {
        "type": "string"
      }
    },
    "required": [
      "planId",
      "title",
      "projectId",
      "workspaceId",
      "studioUrl"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** A new plan for a game idea.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "plans.create",
      "input": {
        "title": "Frog jumper"
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer plans create --title 'Frog jumper'
  ```
</CodeGroup>

***

### delete

`plans.delete`: **Delete a plan**

Ask the person to delete one of their plans from their own workspace (a plan in a team stays). Running AI work on it stops. Returns a link; nothing changes until they confirm. Next: jobs.wait.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "plans.delete"` |
| **CLI** | `summer plans 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 |
| - | - | - | - |
| `planId` | string | Yes | From plans.list. |
| `dryRun` | boolean | No | Check and describe the call without doing it: nothing changes, nothing is spent. |
| `idempotencyKey` | string | No | Retry key. Reuse it only to retry the identical request, so it never happens twice. Length 1 to 128. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "planId": {
        "description": "From plans.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)$"
      },
      "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": [
      "planId"
    ]
  }
  ```
</Accordion>

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

**Example:** Throw away a plan they no longer want.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "plans.delete",
      "input": {
        "planId": "7b0c2f7e-5d4b-4c5e-9a43-2f0d8f1c9a10"
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer plans delete --plan-id 7b0c2f7e-5d4b-4c5e-9a43-2f0d8f1c9a10
  ```
</CodeGroup>

***

### directions

`plans.directions`: **Read saved directions**

The plan's saved directions, newest first: each one is the chosen design written out, with the exact reference pictures it pins. Use one to build the game. Next: projects.build or projects.open\_in\_engine.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "plans.directions"` |
| **CLI** | `summer plans directions` |
| **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_board_game_soul` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `planId` | string | Yes | From plans.list. |
| `limit` | integer | No | Default `10`. Range 1 to 50. |
| `maxCharacters` | integer | No | Most characters of each direction's text. Default `4000`. Range 200 to 50000. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "planId": {
        "description": "From plans.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)$"
      },
      "limit": {
        "default": 10,
        "type": "integer",
        "minimum": 1,
        "maximum": 50
      },
      "maxCharacters": {
        "description": "Most characters of each direction's text.",
        "default": 4000,
        "type": "integer",
        "minimum": 200,
        "maximum": 50000
      }
    },
    "required": [
      "planId"
    ]
  }
  ```
</Accordion>

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "items": {
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "directionId": {
              "type": "string"
            },
            "revision": {
              "description": "The plan revision it was saved from.",
              "type": "number"
            },
            "title": {
              "type": "string"
            },
            "markdown": {
              "type": "string"
            },
            "truncated": {
              "type": "boolean"
            },
            "references": {
              "description": "The exact pictures and items it pins.",
              "type": "array",
              "items": {
                "type": "object",
                "additionalProperties": {}
              }
            },
            "createdAt": {
              "type": "string"
            }
          },
          "required": [
            "directionId",
            "revision",
            "title",
            "markdown",
            "references",
            "createdAt"
          ],
          "additionalProperties": false
        }
      },
      "latestId": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      }
    },
    "required": [
      "items",
      "latestId"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** The latest saved direction.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "plans.directions",
      "input": {
        "planId": "7b0c2f7e-5d4b-4c5e-9a43-2f0d8f1c9a10",
        "limit": 1
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer plans directions --plan-id 7b0c2f7e-5d4b-4c5e-9a43-2f0d8f1c9a10 --limit 1
  ```
</CodeGroup>

***

### duplicate

`plans.duplicate`: **Copy an older plan**

Copy one of the person's older plans (one without shared editing) into their own workspace, as Duplicate does in Studio: its title and cards. Returns the copy's plan id. Next: plans.list.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "plans.duplicate"` |
| **CLI** | `summer plans 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 |
| - | - | - | - |
| `planId` | string | Yes | From plans.list. |
| `dryRun` | boolean | No | Check and describe the call without doing it: nothing changes, nothing is spent. |
| `idempotencyKey` | string | No | Retry key. Reuse it only to retry the identical request, so it never happens twice. Length 1 to 128. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "planId": {
        "description": "From plans.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)$"
      },
      "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": [
      "planId"
    ]
  }
  ```
</Accordion>

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

**Example:** A copy to try another direction.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "plans.duplicate",
      "input": {
        "planId": "7b0c2f7e-5d4b-4c5e-9a43-2f0d8f1c9a10"
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer plans duplicate --plan-id 7b0c2f7e-5d4b-4c5e-9a43-2f0d8f1c9a10
  ```
</CodeGroup>

***

### edit

`plans.edit`: **Edit a plan**

Change a game plan in one atomic batch of commands (create, patch or remove items, topics, groups and edges; set the title) against the revision from plans.get. Patched fields must match their fieldRevisions. Next: plans.get.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "plans.edit"` |
| **CLI** | `summer plans edit` |
| **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_board_edit` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `planId` | string | Yes | From plans.list. |
| `baseRevision` | integer | Yes | The plan revision the commands were written against (plans.get). Range 0 to 9007199254740991. |
| `commands` | object\[] | Yes | Items 1 to 100. |
| `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": {
      "planId": {
        "description": "From plans.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)$"
      },
      "baseRevision": {
        "description": "The plan revision the commands were written against (plans.get).",
        "type": "integer",
        "minimum": 0,
        "maximum": 9007199254740991
      },
      "commands": {
        "minItems": 1,
        "maxItems": 100,
        "type": "array",
        "items": {
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "type": {
                  "type": "string",
                  "const": "registerType"
                },
                "definition": {
                  "type": "object",
                  "properties": {
                    "id": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 48,
                      "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
                    },
                    "version": {
                      "type": "integer",
                      "minimum": 1,
                      "maximum": 10000
                    },
                    "label": {
                      "type": "string",
                      "minLength": 1,
                      "maxLength": 120
                    },
                    "description": {
                      "type": "string",
                      "maxLength": 1000
                    },
                    "properties": {
                      "maxItems": 40,
                      "type": "array",
                      "items": {
                        "anyOf": [
                          {
                            "type": "object",
                            "properties": {
                              "key": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 48,
                                "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
                              },
                              "label": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 120
                              },
                              "required": {
                                "type": "boolean"
                              },
                              "description": {
                                "type": "string",
                                "maxLength": 500
                              },
                              "kind": {
                                "type": "string",
                                "const": "text"
                              }
                            },
                            "required": [
                              "key",
                              "label",
                              "kind"
                            ],
                            "additionalProperties": false
                          },
                          {
                            "type": "object",
                            "properties": {
                              "key": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 48,
                                "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
                              },
                              "label": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 120
                              },
                              "required": {
                                "type": "boolean"
                              },
                              "description": {
                                "type": "string",
                                "maxLength": 500
                              },
                              "kind": {
                                "type": "string",
                                "const": "number"
                              }
                            },
                            "required": [
                              "key",
                              "label",
                              "kind"
                            ],
                            "additionalProperties": false
                          },
                          {
                            "type": "object",
                            "properties": {
                              "key": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 48,
                                "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
                              },
                              "label": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 120
                              },
                              "required": {
                                "type": "boolean"
                              },
                              "description": {
                                "type": "string",
                                "maxLength": 500
                              },
                              "kind": {
                                "type": "string",
                                "const": "boolean"
                              }
                            },
                            "required": [
                              "key",
                              "label",
                              "kind"
                            ],
                            "additionalProperties": false
                          },
                          {
                            "type": "object",
                            "properties": {
                              "key": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 48,
                                "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
                              },
                              "label": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 120
                              },
                              "required": {
                                "type": "boolean"
                              },
                              "description": {
                                "type": "string",
                                "maxLength": 500
                              },
                              "kind": {
                                "type": "string",
                                "const": "choice"
                              },
                              "options": {
                                "minItems": 1,
                                "maxItems": 50,
                                "type": "array",
                                "items": {
                                  "type": "string",
                                  "minLength": 1,
                                  "maxLength": 120
                                }
                              }
                            },
                            "required": [
                              "key",
                              "label",
                              "kind",
                              "options"
                            ],
                            "additionalProperties": false
                          },
                          {
                            "type": "object",
                            "properties": {
                              "key": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 48,
                                "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
                              },
                              "label": {
                                "type": "string",
                                "minLength": 1,
                                "maxLength": 120
                              },
                              "required": {
                                "type": "boolean"
                              },
                              "description": {
                                "type": "string",
                                "maxLength": 500
                              },
                              "kind": {
                                "type": "string",
                                "const": "text-list"
                              }
                            },
                            "required": [
                              "key",
                              "label",
                              "kind"
                            ],
                            "additionalProperties": false
                          }
                        ]
                      }
                    },
                    "relations": {
                      "maxItems": 30,
                      "type": "array",
                      "items": {
                        "type": "object",
                        "properties": {
                          "key": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 48,
                            "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
                          },
                          "label": {
                            "type": "string",
                            "minLength": 1,
                            "maxLength": 120
                          },
                          "targetTypeIds": {
                            "minItems": 1,
                            "maxItems": 30,
                            "type": "array",
                            "items": {
                              "type": "string",
                              "minLength": 1,
                              "maxLength": 48,
                              "pattern": "^[a-zA-Z][a-zA-Z0-9_-]*$"
                            }
                          },
                          "cardinality": {
                            "type": "string",
                            "enum": [
                              "one",
                              "many"
                            ]
                          },
                          "description": {
                            "type": "string",
                            "maxLength": 500
                          }
                        },
                        "required": [
                          "key",
                          "label",
                          "targetTypeIds",
                          "cardinality"
                        ],
                        "additionalProperties": false
                      }
                    }
                  },
                  "required": [
                    "id",
                    "version",
                    "label",
                    "properties",
                    "relations"
                  ],
                  "additionalProperties": false
                }
              },
              "required": [
                "type",
                "definition"
              ],
              "additionalProperties": false
            },
            {
              "type": "object",
              "properties": {
                "type": {
                  "type": "string",
                  "const": "create"
                },
                "collection": {
                  "type": "string",
                  "enum": [
                    "items",
                    "topics",
                    "groups",
                    "edges"
                  ]
                },
                "value": {
                  "type": "object",
                  "additionalProperties": {}
                }
              },
              "required": [
                "type",
                "collection",
                "value"
              ],
              "additionalProperties": false
            },
            {
              "type": "object",
              "properties": {
                "type": {
                  "type": "string",
                  "const": "patch"
                },
                "collection": {
                  "type": "string",
                  "enum": [
                    "items",
                    "topics",
                    "groups",
                    "edges"
                  ]
                },
                "id": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 64,
                  "pattern": "^[a-zA-Z0-9_-]+$"
                },
                "patch": {
                  "type": "object",
                  "additionalProperties": {}
                },
                "expected": {
                  "type": "object",
                  "additionalProperties": {
                    "type": "integer",
                    "minimum": 0,
                    "maximum": 9007199254740991
                  }
                },
                "expectedMembership": {
                  "type": "object",
                  "properties": {
                    "itemIds": {
                      "maxItems": 2000,
                      "type": "array",
                      "items": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 64,
                        "pattern": "^[a-zA-Z0-9_-]+$"
                      }
                    },
                    "groupIds": {
                      "maxItems": 500,
                      "type": "array",
                      "items": {
                        "type": "string",
                        "minLength": 1,
                        "maxLength": 64,
                        "pattern": "^[a-zA-Z0-9_-]+$"
                      }
                    }
                  },
                  "required": [
                    "itemIds",
                    "groupIds"
                  ],
                  "additionalProperties": false
                }
              },
              "required": [
                "type",
                "collection",
                "id",
                "patch",
                "expected"
              ],
              "additionalProperties": false
            },
            {
              "type": "object",
              "properties": {
                "type": {
                  "type": "string",
                  "const": "remove"
                },
                "collection": {
                  "type": "string",
                  "enum": [
                    "items",
                    "topics",
                    "groups",
                    "edges"
                  ]
                },
                "id": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 64,
                  "pattern": "^[a-zA-Z0-9_-]+$"
                },
                "expectedRevision": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 9007199254740991
                }
              },
              "required": [
                "type",
                "collection",
                "id",
                "expectedRevision"
              ],
              "additionalProperties": false
            },
            {
              "type": "object",
              "properties": {
                "type": {
                  "type": "string",
                  "const": "title"
                },
                "title": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 200
                },
                "expectedRevision": {
                  "type": "integer",
                  "minimum": 0,
                  "maximum": 9007199254740991
                }
              },
              "required": [
                "type",
                "title",
                "expectedRevision"
              ],
              "additionalProperties": false
            }
          ]
        }
      },
      "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": [
      "planId",
      "baseRevision",
      "commands"
    ]
  }
  ```
</Accordion>

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "planId": {
        "type": "string"
      },
      "revision": {
        "type": "number"
      },
      "workspaceId": {
        "type": "string"
      },
      "projectId": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      },
      "permissions": {
        "type": "object",
        "properties": {
          "canEdit": {
            "type": "boolean"
          },
          "canManage": {
            "type": "boolean"
          },
          "canGenerate": {
            "type": "boolean"
          }
        },
        "required": [
          "canEdit",
          "canManage",
          "canGenerate"
        ],
        "additionalProperties": false
      },
      "document": {
        "description": "The plan: items, groups, edges and topics, each with its id, revision and fieldRevisions.",
        "type": "object",
        "additionalProperties": {}
      },
      "studioUrl": {
        "type": "string"
      },
      "replayed": {
        "type": "boolean"
      }
    },
    "required": [
      "planId",
      "revision",
      "workspaceId",
      "projectId",
      "permissions",
      "document",
      "studioUrl",
      "replayed"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** Rename one card.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "plans.edit",
      "input": {
        "planId": "7b0c2f7e-5d4b-4c5e-9a43-2f0d8f1c9a10",
        "baseRevision": 12,
        "commands": [
          {
            "type": "patch",
            "collection": "items",
            "id": "item_hero",
            "patch": {
              "label": "Hero: a frog knight"
            },
            "expected": {
              "label": 3
            }
          }
        ]
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer plans edit --plan-id 7b0c2f7e-5d4b-4c5e-9a43-2f0d8f1c9a10 --base-revision 12 --input '{"commands":[{"type":"patch","collection":"items","id":"item_hero","patch":{"label":"Hero: a frog knight"},"expected":{"label":3}}]}'
  ```
</CodeGroup>

***

### edit\_card

`plans.edit_card`: **Change a picture on a new game's plan**

Change one picture on the plan of a game started with projects.create, in words ("make the hero a girl with a red scarf"). Takes a few seconds. Uses the itemId from plans.show. Next: plans.show.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "plans.edit_card"` |
| **CLI** | `summer plans edit-card` |
| **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_game_edit_card` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `projectId` | string | Yes | The new game's project, from projects.create. |
| `itemId` | string | Yes | From plans.show. Length 1 to 200. |
| `change` | string | Yes | Length 1 to 400. |
| `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": {
      "projectId": {
        "description": "The new game's project, from projects.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)$"
      },
      "itemId": {
        "description": "From plans.show.",
        "type": "string",
        "minLength": 1,
        "maxLength": 200
      },
      "change": {
        "type": "string",
        "minLength": 1,
        "maxLength": 400
      },
      "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": [
      "projectId",
      "itemId",
      "change"
    ]
  }
  ```
</Accordion>

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "projectId": {
        "type": "string"
      },
      "title": {
        "type": "string"
      },
      "cards": {
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "itemId": {
              "type": "string"
            },
            "title": {
              "type": "string"
            },
            "imageUrl": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ]
            },
            "line": {
              "type": "string"
            }
          },
          "required": [
            "itemId",
            "title",
            "imageUrl"
          ],
          "additionalProperties": false
        }
      },
      "drawing": {
        "description": "Summer is still drawing pictures.",
        "type": "boolean"
      },
      "lookItemId": {
        "description": "The picture chosen as the game's look.",
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      },
      "statusLine": {
        "type": "string"
      },
      "url": {
        "description": "The plan in the browser.",
        "type": "string"
      }
    },
    "required": [
      "projectId",
      "title",
      "cards",
      "drawing",
      "lookItemId",
      "statusLine",
      "url"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** Change one picture.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "plans.edit_card",
      "input": {
        "projectId": "0c6a1f60-1d8e-4f4c-8f0e-5a0b8b6f2d11",
        "itemId": "card_hero",
        "change": "give the hero a red scarf"
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer plans edit-card --project-id 0c6a1f60-1d8e-4f4c-8f0e-5a0b8b6f2d11 --item-id card_hero --change 'give the hero a red scarf'
  ```
</CodeGroup>

***

### enable\_sharing

`plans.enable_sharing`: **Turn on plan sharing**

Turn on shared editing for an older plan, which the plan agent, builds and the conversation need. Only the plan's owner or a team admin can. Safe to repeat. Next: plans.get.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "plans.enable_sharing"` |
| **CLI** | `summer plans enable-sharing` |
| **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_board_enable_collaboration` |

**Inputs:**

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

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "planId": {
        "description": "From plans.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)$"
      },
      "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": [
      "planId"
    ]
  }
  ```
</Accordion>

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

**Example:** An older plan the agent cannot edit yet.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "plans.enable_sharing",
      "input": {
        "planId": "7b0c2f7e-5d4b-4c5e-9a43-2f0d8f1c9a10"
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer plans enable-sharing --plan-id 7b0c2f7e-5d4b-4c5e-9a43-2f0d8f1c9a10
  ```
</CodeGroup>

***

### finish\_questions

`plans.finish_questions`: **Finish a new game's questions**

End the planning questions of a game started on the create page (the rest are skipped): Summer starts drawing its plan at once. Safe to repeat. Returns the plan's pictures. Next: plans.show.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "plans.finish_questions"` |
| **CLI** | `summer plans finish-questions` |
| **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. |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `projectId` | string | Yes | The new game's project, from projects.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": {
      "projectId": {
        "description": "The new game's project, from projects.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": [
      "projectId"
    ]
  }
  ```
</Accordion>

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "projectId": {
        "type": "string"
      },
      "title": {
        "type": "string"
      },
      "cards": {
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "itemId": {
              "type": "string"
            },
            "title": {
              "type": "string"
            },
            "imageUrl": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ]
            },
            "line": {
              "type": "string"
            }
          },
          "required": [
            "itemId",
            "title",
            "imageUrl"
          ],
          "additionalProperties": false
        }
      },
      "drawing": {
        "description": "Summer is still drawing pictures.",
        "type": "boolean"
      },
      "lookItemId": {
        "description": "The picture chosen as the game's look.",
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      },
      "statusLine": {
        "type": "string"
      },
      "url": {
        "description": "The plan in the browser.",
        "type": "string"
      }
    },
    "required": [
      "projectId",
      "title",
      "cards",
      "drawing",
      "lookItemId",
      "statusLine",
      "url"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** Enough questions; draw the plan.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "plans.finish_questions",
      "input": {
        "projectId": "0c6a1f60-1d8e-4f4c-8f0e-5a0b8b6f2d11"
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer plans finish-questions --project-id 0c6a1f60-1d8e-4f4c-8f0e-5a0b8b6f2d11
  ```
</CodeGroup>

***

### get

`plans.get`: **Read a plan**

Read a game plan as it is now: every item, group and topic with its id and field revisions, the plan revision and what the person may do. Read before plans.edit; read again after a conflict.

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

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `planId` | string | Yes | From plans.list. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "planId": {
        "description": "From plans.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)$"
      }
    },
    "required": [
      "planId"
    ]
  }
  ```
</Accordion>

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "planId": {
        "type": "string"
      },
      "revision": {
        "type": "number"
      },
      "workspaceId": {
        "type": "string"
      },
      "projectId": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      },
      "permissions": {
        "type": "object",
        "properties": {
          "canEdit": {
            "type": "boolean"
          },
          "canManage": {
            "type": "boolean"
          },
          "canGenerate": {
            "type": "boolean"
          }
        },
        "required": [
          "canEdit",
          "canManage",
          "canGenerate"
        ],
        "additionalProperties": false
      },
      "document": {
        "description": "The plan: items, groups, edges and topics, each with its id, revision and fieldRevisions.",
        "type": "object",
        "additionalProperties": {}
      },
      "studioUrl": {
        "type": "string"
      }
    },
    "required": [
      "planId",
      "revision",
      "workspaceId",
      "projectId",
      "permissions",
      "document",
      "studioUrl"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** What is on this plan now?

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "plans.get",
      "input": {
        "planId": "7b0c2f7e-5d4b-4c5e-9a43-2f0d8f1c9a10"
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer plans get --plan-id 7b0c2f7e-5d4b-4c5e-9a43-2f0d8f1c9a10
  ```
</CodeGroup>

***

### link\_project

`plans.link_project`: **Link a plan to a project**

Link a plan to one of the person's projects, so the game built from the plan opens that project. A project has one plan: this replaces its earlier link. Next: plans.links.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "plans.link_project"` |
| **CLI** | `summer plans link-project` |
| **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_board_link_project` |

**Inputs:**

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

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "planId": {
        "description": "From plans.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)$"
      },
      "projectId": {
        "description": "From projects.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)$"
      },
      "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": [
      "planId",
      "projectId"
    ]
  }
  ```
</Accordion>

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

**Example:** This plan is for that project.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "plans.link_project",
      "input": {
        "planId": "7b0c2f7e-5d4b-4c5e-9a43-2f0d8f1c9a10",
        "projectId": "0c6a1f60-1d8e-4f4c-8f0e-5a0b8b6f2d11"
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer plans link-project --plan-id 7b0c2f7e-5d4b-4c5e-9a43-2f0d8f1c9a10 --project-id 0c6a1f60-1d8e-4f4c-8f0e-5a0b8b6f2d11
  ```
</CodeGroup>

***

### links

`plans.links`: **Read plan and project links**

Which of the person's plans belong to which of their projects, so a game built from a plan opens its project. Next: plans.link\_project.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "plans.links"` |
| **CLI** | `summer plans links` |
| **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_board_project_links` |

**Inputs:**

No inputs.

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

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

**Example:** Which plan is this project's?

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "plans.links",
      "input": {}
    }
  }
  ```

  ```bash CLI theme={null}
  summer plans links
  ```
</CodeGroup>

***

### list

`plans.list`: **List my plans**

List the game plans the person can open in Summer Studio (their own and their teams'), newest change first: plan id, title, team and project. Next: plans.get with a planId.

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

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `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": {
      "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": {
            "planId": {
              "type": "string"
            },
            "title": {
              "type": "string"
            },
            "workspaceId": {
              "type": "string"
            },
            "projectId": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ]
            },
            "updatedAt": {
              "type": "string"
            },
            "studioUrl": {
              "type": "string"
            }
          },
          "required": [
            "planId",
            "title",
            "workspaceId",
            "projectId",
            "updatedAt",
            "studioUrl"
          ],
          "additionalProperties": false
        }
      },
      "nextCursor": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      }
    },
    "required": [
      "items",
      "nextCursor"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

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

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "plans.list",
      "input": {
        "limit": 10
      }
    }
  }
  ```

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

***

### message

`plans.message`: **Tell Summer about a new game**

Pass the person's direction for a game started with projects.create, in their words: Summer reshapes its plan (new or changed pictures). Answers at once; the pictures follow. Next: plans.show.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "plans.message"` |
| **CLI** | `summer plans message` |
| **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_game_message` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `projectId` | string | Yes | The new game's project, from projects.create. |
| `text` | string | Yes | The direction, e.g. "Make the frog bigger and the pads sink faster". Length 1 to 8000. |
| `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": {
      "projectId": {
        "description": "The new game's project, from projects.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)$"
      },
      "text": {
        "description": "The direction, e.g. \"Make the frog bigger and the pads sink faster\".",
        "type": "string",
        "minLength": 1,
        "maxLength": 8000
      },
      "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": [
      "projectId",
      "text"
    ]
  }
  ```
</Accordion>

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "projectId": {
        "type": "string"
      },
      "title": {
        "type": "string"
      },
      "cards": {
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "itemId": {
              "type": "string"
            },
            "title": {
              "type": "string"
            },
            "imageUrl": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ]
            },
            "line": {
              "type": "string"
            }
          },
          "required": [
            "itemId",
            "title",
            "imageUrl"
          ],
          "additionalProperties": false
        }
      },
      "drawing": {
        "description": "Summer is still drawing pictures.",
        "type": "boolean"
      },
      "lookItemId": {
        "description": "The picture chosen as the game's look.",
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      },
      "statusLine": {
        "type": "string"
      },
      "url": {
        "description": "The plan in the browser.",
        "type": "string"
      }
    },
    "required": [
      "projectId",
      "title",
      "cards",
      "drawing",
      "lookItemId",
      "statusLine",
      "url"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** Steer the plan.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "plans.message",
      "input": {
        "projectId": "0c6a1f60-1d8e-4f4c-8f0e-5a0b8b6f2d11",
        "text": "Make it night time and spookier"
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer plans message --project-id 0c6a1f60-1d8e-4f4c-8f0e-5a0b8b6f2d11 --text 'Make it night time and spookier'
  ```
</CodeGroup>

***

### move

`plans.move`: **Move a plan into a team**

Move a plan into one of the person's teams (a shared workspace they administer), so its members see and edit it. Shares it with people, so it asks the person unless they let agents contact people. Next: jobs.wait.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "plans.move"` |
| **CLI** | `summer plans move` |
| **Runs** | On Summer's servers: the hosted MCP, or the npm MCP after `summer login`. Needs your Summer sign-in. |
| **Effect** | Changes your own drafts, files or settings. Nobody else sees it yet. |
| **Asks you first** | Yes: **Contact people** is off by default in Agent permissions. |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `planId` | string | Yes | From plans.list. |
| `workspaceId` | string | Yes | The team to move it into (from team.list). |
| `dryRun` | boolean | No | Check and describe the call without doing it: nothing changes, nothing is spent. |
| `idempotencyKey` | string | No | Retry key. Reuse it only to retry the identical request, so it never happens twice. Length 1 to 128. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "planId": {
        "description": "From plans.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)$"
      },
      "workspaceId": {
        "description": "The team to move it into (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)$"
      },
      "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": [
      "planId",
      "workspaceId"
    ]
  }
  ```
</Accordion>

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

**Example:** Share the plan with the team.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "plans.move",
      "input": {
        "planId": "7b0c2f7e-5d4b-4c5e-9a43-2f0d8f1c9a10",
        "workspaceId": "9d8c7b6a-5f4e-4d3c-8b2a-1f0e9d8c7b6a"
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer plans move --plan-id 7b0c2f7e-5d4b-4c5e-9a43-2f0d8f1c9a10 --workspace-id 9d8c7b6a-5f4e-4d3c-8b2a-1f0e9d8c7b6a
  ```
</CodeGroup>

***

### pick\_card

`plans.pick_card`: **Pick a favourite picture**

Mark one picture of a new game's plan as the person's favourite for its section (characters, place or storyboard), as picking a card on the create page does. The build brief carries the picks. Next: plans.write\_concept.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "plans.pick_card"` |
| **CLI** | `summer plans pick-card` |
| **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 |
| - | - | - | - |
| `projectId` | string | Yes | The new game's project, from projects.create. |
| `section` | "characters" \| "place" \| "storyboard" | Yes | |
| `itemId` | string | Yes | From plans.show. Length 1 to 64. |
| `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": {
      "projectId": {
        "description": "The new game's project, from projects.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)$"
      },
      "section": {
        "type": "string",
        "enum": [
          "characters",
          "place",
          "storyboard"
        ]
      },
      "itemId": {
        "description": "From plans.show.",
        "type": "string",
        "minLength": 1,
        "maxLength": 64
      },
      "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": [
      "projectId",
      "section",
      "itemId"
    ]
  }
  ```
</Accordion>

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

**Example:** This hero is the one.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "plans.pick_card",
      "input": {
        "projectId": "0c6a1f60-1d8e-4f4c-8f0e-5a0b8b6f2d11",
        "section": "characters",
        "itemId": "card_hero"
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer plans pick-card --project-id 0c6a1f60-1d8e-4f4c-8f0e-5a0b8b6f2d11 --section characters --item-id card_hero
  ```
</CodeGroup>

***

### prepare\_for\_engine

`plans.prepare_for_engine`: **Get a direction ready for Summer Engine**

Keep a saved direction ready in the person's account for Summer Engine: the engine offers it when they open a project there. Free. Returns the handoff. Next: tell the person to open Summer Engine.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "plans.prepare_for_engine"` |
| **CLI** | `summer plans prepare-for-engine` |
| **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 |
| - | - | - | - |
| `planId` | string | Yes | From plans.list. |
| `directionId` | string | Yes | From plans.directions. |
| `projectId` | string | No | The project it is for (from projects.list); default the project the person opens. |
| `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": {
      "planId": {
        "description": "From plans.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)$"
      },
      "directionId": {
        "description": "From plans.directions.",
        "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)$"
      },
      "projectId": {
        "description": "The project it is for (from projects.list); default the project the person opens.",
        "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": [
      "planId",
      "directionId"
    ]
  }
  ```
</Accordion>

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "handoffId": {
        "type": "string"
      },
      "planId": {
        "type": "string"
      },
      "directionId": {
        "type": "string"
      },
      "projectId": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      },
      "status": {
        "type": "string"
      },
      "title": {
        "type": "string"
      }
    },
    "required": [
      "handoffId",
      "planId",
      "directionId",
      "projectId",
      "status",
      "title"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** Build this direction in Summer Engine.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "plans.prepare_for_engine",
      "input": {
        "planId": "7b0c2f7e-5d4b-4c5e-9a43-2f0d8f1c9a10",
        "directionId": "5f1d2c3b-4a59-4e6f-8a7b-9c0d1e2f3a4b"
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer plans prepare-for-engine --plan-id 7b0c2f7e-5d4b-4c5e-9a43-2f0d8f1c9a10 --direction-id 5f1d2c3b-4a59-4e6f-8a7b-9c0d1e2f3a4b
  ```
</CodeGroup>

***

### presence

`plans.presence`: **See who is on a plan**

Who has the plan open in Summer Studio right now, with what they selected and the topic they are on. Next: plans.chat.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "plans.presence"` |
| **CLI** | `summer plans presence` |
| **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_board_presence` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `planId` | string | Yes | From plans.list. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "planId": {
        "description": "From plans.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)$"
      }
    },
    "required": [
      "planId"
    ]
  }
  ```
</Accordion>

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

**Example:** Is anyone looking at this plan?

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "plans.presence",
      "input": {
        "planId": "7b0c2f7e-5d4b-4c5e-9a43-2f0d8f1c9a10"
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer plans presence --plan-id 7b0c2f7e-5d4b-4c5e-9a43-2f0d8f1c9a10
  ```
</CodeGroup>

***

### save\_concept

`plans.save_concept`: **Save a new game's concept text**

Save the person's own text as the concept of a game started on the create page; it is what their account keeps for Summer Engine until a rewrite. Next: projects.open\_in\_engine.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "plans.save_concept"` |
| **CLI** | `summer plans save-concept` |
| **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 |
| - | - | - | - |
| `projectId` | string | Yes | The new game's project, from projects.create. |
| `markdown` | string | Yes | The concept in Markdown. Length 1 to 40000. |
| `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": {
      "projectId": {
        "description": "The new game's project, from projects.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)$"
      },
      "markdown": {
        "description": "The concept in Markdown.",
        "type": "string",
        "minLength": 1,
        "maxLength": 40000
      },
      "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": [
      "projectId",
      "markdown"
    ]
  }
  ```
</Accordion>

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "projectId": {
        "type": "string"
      },
      "title": {
        "type": "string"
      },
      "markdown": {
        "description": "The game concept as the person's account keeps it; Summer Engine starts a project from it.",
        "type": "string"
      },
      "references": {
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "label": {
              "type": "string"
            },
            "url": {
              "type": "string"
            },
            "assetId": {
              "type": "string"
            }
          },
          "required": [
            "label",
            "url"
          ],
          "additionalProperties": false
        }
      },
      "coverUrl": {
        "type": "string"
      },
      "edited": {
        "description": "The text is the person's own edit.",
        "type": "boolean"
      },
      "stale": {
        "description": "Their edit was made for other picks; plans.write_concept with rewrite writes it again.",
        "type": "boolean"
      }
    },
    "required": [
      "projectId",
      "title",
      "markdown",
      "references"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** Keep the person's wording.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "plans.save_concept",
      "input": {
        "projectId": "0c6a1f60-1d8e-4f4c-8f0e-5a0b8b6f2d11",
        "markdown": "## The game\nA frog knight hops across sinking lily pads."
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer plans save-concept --project-id 0c6a1f60-1d8e-4f4c-8f0e-5a0b8b6f2d11 --markdown '## The game
  A frog knight hops across sinking lily pads.'
  ```
</CodeGroup>

***

### save\_direction

`plans.save_direction`: **Save a direction**

Save the direction the person chose as a fixed version: the design written out, with the plan items it pins as references. Needs the current plan revision. Returns the direction id. Next: projects.build.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "plans.save_direction"` |
| **CLI** | `summer plans save-direction` |
| **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_board_save_direction` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `planId` | string | Yes | From plans.list. |
| `revision` | integer | Yes | The current plan revision (plans.get). Range 0 to 9007199254740991. |
| `title` | string | No | Length 1 to 200. |
| `markdown` | string | Yes | The chosen design, written out. Length 1 to 50000. |
| `selectedItemIds` | string\[] | Yes | The plan items it pins as references (ids from plans.get). Items 0 to 100. |
| `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": {
      "planId": {
        "description": "From plans.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)$"
      },
      "revision": {
        "description": "The current plan revision (plans.get).",
        "type": "integer",
        "minimum": 0,
        "maximum": 9007199254740991
      },
      "title": {
        "type": "string",
        "minLength": 1,
        "maxLength": 200
      },
      "markdown": {
        "description": "The chosen design, written out.",
        "type": "string",
        "minLength": 1,
        "maxLength": 50000
      },
      "selectedItemIds": {
        "description": "The plan items it pins as references (ids from plans.get).",
        "maxItems": 100,
        "type": "array",
        "items": {
          "type": "string",
          "minLength": 1,
          "maxLength": 64
        }
      },
      "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": [
      "planId",
      "revision",
      "markdown",
      "selectedItemIds"
    ]
  }
  ```
</Accordion>

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "directionId": {
        "type": "string"
      },
      "planId": {
        "type": "string"
      },
      "revision": {
        "type": "number"
      },
      "title": {
        "type": "string"
      },
      "createdAt": {
        "type": "string"
      }
    },
    "required": [
      "directionId",
      "planId",
      "revision",
      "title",
      "createdAt"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** Save the chosen design.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "plans.save_direction",
      "input": {
        "planId": "7b0c2f7e-5d4b-4c5e-9a43-2f0d8f1c9a10",
        "revision": 12,
        "markdown": "# Frog Knight\nA fast platformer...",
        "selectedItemIds": [
          "item_hero"
        ]
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer plans save-direction --plan-id 7b0c2f7e-5d4b-4c5e-9a43-2f0d8f1c9a10 --revision 12 --markdown '# Frog Knight
  A fast platformer...' --selected-item-ids item_hero
  ```
</CodeGroup>

***

### set\_ai\_payer

`plans.set_ai_payer`: **Pay for a plan's AI**

Ask the person to pay for everyone's AI work on a plan with their own credits, or to stop (then each person pays for their own). Returns a link; nothing changes until they confirm. Next: jobs.wait.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "plans.set_ai_payer"` |
| **CLI** | `summer plans set-ai-payer` |
| **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 |
| - | - | - | - |
| `planId` | string | Yes | From plans.list. |
| `enabled` | boolean | Yes | true: the person's credits pay for everyone's AI work on the plan; false: each person pays for their own again. |
| `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": {
      "planId": {
        "description": "From plans.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)$"
      },
      "enabled": {
        "description": "true: the person's credits pay for everyone's AI work on the plan; false: each person pays for their own again.",
        "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": [
      "planId",
      "enabled"
    ]
  }
  ```
</Accordion>

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

**Example:** The person pays for the team's AI on this plan.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "plans.set_ai_payer",
      "input": {
        "planId": "7b0c2f7e-5d4b-4c5e-9a43-2f0d8f1c9a10",
        "enabled": true
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer plans set-ai-payer --plan-id 7b0c2f7e-5d4b-4c5e-9a43-2f0d8f1c9a10 --enabled
  ```
</CodeGroup>

***

### show

`plans.show`: **Show a new game's plan**

Show the plan of a new game: its pictures with their item ids, the chosen look, whether Summer is still drawing, and the planning question waiting, if any. Next: plans.message, plans.answer or projects.open\_in\_engine.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "plans.show"` |
| **CLI** | `summer plans show` |
| **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_game` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `projectId` | string | Yes | The new game's project, from projects.create. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "projectId": {
        "description": "The new game's project, from projects.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": [
      "projectId"
    ]
  }
  ```
</Accordion>

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "projectId": {
        "type": "string"
      },
      "title": {
        "type": "string"
      },
      "cards": {
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "itemId": {
              "type": "string"
            },
            "title": {
              "type": "string"
            },
            "imageUrl": {
              "anyOf": [
                {
                  "type": "string"
                },
                {
                  "type": "null"
                }
              ]
            },
            "line": {
              "type": "string"
            }
          },
          "required": [
            "itemId",
            "title",
            "imageUrl"
          ],
          "additionalProperties": false
        }
      },
      "drawing": {
        "description": "Summer is still drawing pictures.",
        "type": "boolean"
      },
      "lookItemId": {
        "description": "The picture chosen as the game's look.",
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      },
      "statusLine": {
        "type": "string"
      },
      "url": {
        "description": "The plan in the browser.",
        "type": "string"
      },
      "question": {
        "description": "The planning question waiting for an answer.",
        "type": "object",
        "properties": {
          "questionId": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "subtitle": {
            "type": "string"
          },
          "options": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string"
                },
                "label": {
                  "type": "string"
                }
              },
              "required": [
                "id",
                "label"
              ],
              "additionalProperties": false
            }
          },
          "allowCustomInput": {
            "type": "boolean"
          },
          "allowSkip": {
            "type": "boolean"
          },
          "maxSelections": {
            "type": "number"
          }
        },
        "required": [
          "questionId",
          "title",
          "options"
        ],
        "additionalProperties": false
      }
    },
    "required": [
      "projectId",
      "title",
      "cards",
      "drawing",
      "lookItemId",
      "statusLine",
      "url"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** Is the plan drawn yet?

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "plans.show",
      "input": {
        "projectId": "0c6a1f60-1d8e-4f4c-8f0e-5a0b8b6f2d11"
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer plans show --project-id 0c6a1f60-1d8e-4f4c-8f0e-5a0b8b6f2d11
  ```
</CodeGroup>

***

### write\_concept

`plans.write_concept`: **Write a new game's concept**

Write the concept of a game started on the create page from its idea, answers and picks, and keep it in the person's account for Summer Engine. Keeps the person's own edit unless rewrite. Free. Next: projects.open\_in\_engine.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "plans.write_concept"` |
| **CLI** | `summer plans write-concept` |
| **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 |
| - | - | - | - |
| `projectId` | string | Yes | The new game's project, from projects.create. |
| `rewrite` | boolean | No | Drop the person's own edit and write it again from the picks. Default `false`. |
| `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": {
      "projectId": {
        "description": "The new game's project, from projects.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)$"
      },
      "rewrite": {
        "description": "Drop the person's own edit and write it again from the picks.",
        "default": false,
        "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": [
      "projectId"
    ]
  }
  ```
</Accordion>

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "projectId": {
        "type": "string"
      },
      "title": {
        "type": "string"
      },
      "markdown": {
        "description": "The game concept as the person's account keeps it; Summer Engine starts a project from it.",
        "type": "string"
      },
      "references": {
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "label": {
              "type": "string"
            },
            "url": {
              "type": "string"
            },
            "assetId": {
              "type": "string"
            }
          },
          "required": [
            "label",
            "url"
          ],
          "additionalProperties": false
        }
      },
      "coverUrl": {
        "type": "string"
      },
      "edited": {
        "description": "The text is the person's own edit.",
        "type": "boolean"
      },
      "stale": {
        "description": "Their edit was made for other picks; plans.write_concept with rewrite writes it again.",
        "type": "boolean"
      }
    },
    "required": [
      "projectId",
      "title",
      "markdown",
      "references"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** Write the concept from the picks.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "plans.write_concept",
      "input": {
        "projectId": "0c6a1f60-1d8e-4f4c-8f0e-5a0b8b6f2d11"
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer plans write-concept --project-id 0c6a1f60-1d8e-4f4c-8f0e-5a0b8b6f2d11
  ```
</CodeGroup>


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