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

> Services Summer runs for a game, and the Content videos and brand pack. For each operation: what it does, whether it asks you first, its inputs and an example call.

Services Summer runs for a game, and the Content videos and brand pack. 9 operations. How to call them, and what the answers mean: [Operations reference](/mcp/operations).

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

| Operation | What it does | Asks you first |
| - | - | - |
| [`marketing.applications`](#applications) | The growth applications sent for one game (from marketing.apply or the Grow pages): service, status, goals, budget and when, newest first. | Never |
| [`marketing.apply`](#apply) | Send an application for a service Summer runs for a game (promotion, paid ads, email outreach, creator introductions, featured placement, A/B test). | Yes, by default |
| [`marketing.content_feed`](#content_feed) | The trends that fit a Content game, each with its video idea (title, what we make, character, caption, hashtags), whether the list is unlocked, and how many videos it may still make. | Never |
| [`marketing.content_videos`](#content_videos) | A Content game's videos, newest first, with the running ones brought up to date: status, the video and the version to post. | Never |
| [`marketing.get_brand_pack`](#get_brand_pack) | Read a Content game's brand pack: its name, logo, characters with their pictures, colours, style, do and don't rules, niches. | Never |
| [`marketing.list_content_games`](#list_content_games) | The games the person set up in Grow Content (each with its brand pack): Content id and name. | Never |
| [`marketing.make_video`](#make_video) | Make the video for one idea of a Content game: the trend's clip with the game's character swapped in. | Not by default |
| [`marketing.mark_posted`](#mark_posted) | Record that the person posted a ready Content video (when they say so). | Not by default |
| [`marketing.save_brand_pack`](#save_brand_pack) | Save a Content game's brand pack, or make a new Content game from a pack (no game). | Not by default |

***

### applications

`marketing.applications`: **List growth applications**

The growth applications sent for one game (from marketing.apply or the Grow pages): service, status, goals, budget and when, newest first. Next: marketing.apply.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "marketing.applications"` |
| **CLI** | `summer marketing applications` |
| **Runs** | On Summer's servers: the hosted MCP, or the npm MCP after `summer login`. Needs your Summer sign-in. |
| **Effect** | Reads only. Changes nothing. |
| **Asks you first** | No. It changes nothing. |
| **3.x names** | `summer_grow_applications` |

**Inputs:**

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

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

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "game": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "id",
          "name"
        ],
        "additionalProperties": false
      },
      "applications": {
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "id": {
              "type": "string"
            },
            "service": {
              "type": "string"
            },
            "status": {
              "type": "string"
            },
            "goals": {
              "type": "string"
            },
            "budget": {
              "type": "string"
            },
            "sentAt": {
              "type": "string"
            }
          },
          "required": [
            "id",
            "service",
            "status",
            "goals",
            "budget",
            "sentAt"
          ],
          "additionalProperties": false
        }
      },
      "note": {
        "type": "string"
      },
      "studioUrl": {
        "type": "string"
      }
    },
    "required": [
      "game",
      "applications",
      "note",
      "studioUrl"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** What did we apply for?

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

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

***

### apply

`marketing.apply`: **Apply for a growth service**

Send an application for a service Summer runs for a game (promotion, paid ads, email outreach, creator introductions, featured placement, A/B test). Never a purchase; the Summer team replies by email. Runs when the person allows Contact people; otherwise needs\_approval.

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

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `service` | "promotion" \| "paid\_ads" \| "email\_outreach" \| "creator\_connect" \| "featured\_placement" \| "ab\_test" | Yes | |
| `gameId` | string | Yes | From games.list. |
| `goals` | string | Yes | What the person hopes to achieve, in their words. Length 1 to 2000. |
| `budget` | object | Yes | The budget they have in mind (paid\_ads: the whole ad budget). |
| `budget.amount` | number | Yes | Range 0 to 1000000000. |
| `budget.currency` | "USD" \| "EUR" \| "GBP" \| "CAD" \| "AUD" \| "JPY" \| "SEK" \| "NOK" \| "DKK" \| "CHF" \| "BRL" | No | Default `"USD"`. |
| `details` | object | No | The service's own fields; leave out what does not apply. |
| `details.channels` | "google\_search" \| "youtube" \| "meta" \| "tiktok" \| "reddit"\[] | No | paid\_ads: where the ads run. Items 0 to 5. |
| `details.countries` | string\[] | No | paid\_ads: ISO country codes. Items 0 to 50. |
| `details.durationDays` | integer | No | paid\_ads: how many days. Range 7 to 90. |
| `details.goal` | "players" \| "wishlists" \| "sales" | No | paid\_ads: what the ads aim for. |
| `details.creative` | "own" \| "summer\_makes\_it" | No | paid\_ads: who makes the ads. |
| `details.creativeNote` | string | No | Length 0 to 300. |
| `details.audience` | string | No | email\_outreach: who to email; promotion: everyone, new, returning or lapsed players. Length 0 to 200. |
| `details.message` | string | No | email\_outreach: what the email is about. Length 0 to 1000. |
| `details.partners` | "streamers" \| "video\_makers" \| "game\_creators"\[] | No | creator\_connect: who to meet. Items 0 to 3. |
| `details.idea` | string | No | creator\_connect: the idea for a collaboration. Length 0 to 1000. |
| `details.placement` | "home-hero" \| "new-noteworthy" \| "seasonal" \| "genre-shelf" | No | featured\_placement. |
| `details.pitch` | string | No | featured\_placement: why it should be featured. Length 0 to 400. |
| `details.when` | string | No | featured\_placement: when, e.g. Next available. Length 0 to 40. |
| `details.discountPercent` | integer | No | promotion. Range 5 to 90. |
| `details.startsAt` | string | No | promotion: start (UTC). Length 0 to 40. |
| `details.endsAt` | string | No | promotion: end (UTC). Length 0 to 40. |
| `details.kind` | "store-art" \| "price" \| "flag" | No | ab\_test: what changes. |
| `details.variants` | string\[] | No | ab\_test: the versions, control first. Items 0 to 4. |
| `details.metric` | "store-to-play" \| "d1" \| "purchase" \| "session-length" | No | ab\_test: the primary metric. |
| `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": {
      "service": {
        "type": "string",
        "enum": [
          "promotion",
          "paid_ads",
          "email_outreach",
          "creator_connect",
          "featured_placement",
          "ab_test"
        ]
      },
      "gameId": {
        "description": "From games.list.",
        "type": "string",
        "pattern": "^[A-Za-z0-9_-]{1,128}$"
      },
      "goals": {
        "description": "What the person hopes to achieve, in their words.",
        "type": "string",
        "minLength": 1,
        "maxLength": 2000
      },
      "budget": {
        "description": "The budget they have in mind (paid_ads: the whole ad budget).",
        "type": "object",
        "properties": {
          "amount": {
            "type": "number",
            "minimum": 0,
            "maximum": 1000000000
          },
          "currency": {
            "default": "USD",
            "type": "string",
            "enum": [
              "USD",
              "EUR",
              "GBP",
              "CAD",
              "AUD",
              "JPY",
              "SEK",
              "NOK",
              "DKK",
              "CHF",
              "BRL"
            ]
          }
        },
        "required": [
          "amount"
        ]
      },
      "details": {
        "description": "The service's own fields; leave out what does not apply.",
        "type": "object",
        "properties": {
          "channels": {
            "description": "paid_ads: where the ads run.",
            "maxItems": 5,
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "google_search",
                "youtube",
                "meta",
                "tiktok",
                "reddit"
              ]
            }
          },
          "countries": {
            "description": "paid_ads: ISO country codes.",
            "maxItems": 50,
            "type": "array",
            "items": {
              "type": "string",
              "pattern": "^[A-Za-z]{2}$"
            }
          },
          "durationDays": {
            "description": "paid_ads: how many days.",
            "type": "integer",
            "minimum": 7,
            "maximum": 90
          },
          "goal": {
            "description": "paid_ads: what the ads aim for.",
            "type": "string",
            "enum": [
              "players",
              "wishlists",
              "sales"
            ]
          },
          "creative": {
            "description": "paid_ads: who makes the ads.",
            "type": "string",
            "enum": [
              "own",
              "summer_makes_it"
            ]
          },
          "creativeNote": {
            "type": "string",
            "maxLength": 300
          },
          "audience": {
            "description": "email_outreach: who to email; promotion: everyone, new, returning or lapsed players.",
            "type": "string",
            "maxLength": 200
          },
          "message": {
            "description": "email_outreach: what the email is about.",
            "type": "string",
            "maxLength": 1000
          },
          "partners": {
            "description": "creator_connect: who to meet.",
            "maxItems": 3,
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "streamers",
                "video_makers",
                "game_creators"
              ]
            }
          },
          "idea": {
            "description": "creator_connect: the idea for a collaboration.",
            "type": "string",
            "maxLength": 1000
          },
          "placement": {
            "description": "featured_placement.",
            "type": "string",
            "enum": [
              "home-hero",
              "new-noteworthy",
              "seasonal",
              "genre-shelf"
            ]
          },
          "pitch": {
            "description": "featured_placement: why it should be featured.",
            "type": "string",
            "maxLength": 400
          },
          "when": {
            "description": "featured_placement: when, e.g. Next available.",
            "type": "string",
            "maxLength": 40
          },
          "discountPercent": {
            "description": "promotion.",
            "type": "integer",
            "minimum": 5,
            "maximum": 90
          },
          "startsAt": {
            "description": "promotion: start (UTC).",
            "type": "string",
            "maxLength": 40
          },
          "endsAt": {
            "description": "promotion: end (UTC).",
            "type": "string",
            "maxLength": 40
          },
          "kind": {
            "description": "ab_test: what changes.",
            "type": "string",
            "enum": [
              "store-art",
              "price",
              "flag"
            ]
          },
          "variants": {
            "description": "ab_test: the versions, control first.",
            "maxItems": 4,
            "type": "array",
            "items": {
              "type": "string",
              "maxLength": 200
            }
          },
          "metric": {
            "description": "ab_test: the primary metric.",
            "type": "string",
            "enum": [
              "store-to-play",
              "d1",
              "purchase",
              "session-length"
            ]
          }
        },
        "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": [
      "service",
      "gameId",
      "goals",
      "budget"
    ]
  }
  ```
</Accordion>

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "applicationId": {
        "type": "string"
      },
      "status": {
        "type": "string"
      },
      "service": {
        "type": "string"
      },
      "charged": {
        "type": "boolean",
        "const": false
      },
      "message": {
        "type": "string"
      },
      "growUrl": {
        "type": "string"
      }
    },
    "required": [
      "applicationId",
      "status",
      "service",
      "charged",
      "message",
      "growUrl"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** Apply for two weeks of video ads.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "marketing.apply",
      "input": {
        "service": "paid_ads",
        "gameId": "g_123",
        "goals": "More wishlists before launch",
        "budget": {
          "amount": 500,
          "currency": "USD"
        },
        "details": {
          "channels": [
            "youtube",
            "tiktok"
          ],
          "durationDays": 14,
          "goal": "wishlists"
        }
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer marketing apply --service paid_ads --game-id g_123 --goals 'More wishlists before launch' --input '{"budget":{"amount":500,"currency":"USD"},"details":{"channels":["youtube","tiktok"],"durationDays":14,"goal":"wishlists"}}'
  ```
</CodeGroup>

***

### content\_feed

`marketing.content_feed`: **Read a game's Content ideas**

The trends that fit a Content game, each with its video idea (title, what we make, character, caption, hashtags), whether the list is unlocked, and how many videos it may still make. Locked rows show a title only. Next: marketing.make\_video.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "marketing.content_feed"` |
| **CLI** | `summer marketing content-feed` |
| **Runs** | On Summer's servers: the hosted MCP, or the npm MCP after `summer login`. Needs your Summer sign-in. |
| **Effect** | Reads only. Changes nothing. |
| **Asks you first** | No. It changes nothing. |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `game` | string | Yes | The game's Content id, from marketing.list\_content\_games. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "game": {
        "description": "The game's Content id, from marketing.list_content_games.",
        "type": "string",
        "pattern": "^[a-z0-9](?:[a-z0-9-]{0,38}[a-z0-9])?$"
      }
    },
    "required": [
      "game"
    ]
  }
  ```
</Accordion>

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "game": {
        "type": "object",
        "properties": {
          "game": {
            "type": "string"
          },
          "name": {
            "type": "string"
          }
        },
        "required": [
          "game",
          "name"
        ],
        "additionalProperties": false
      },
      "unlocked": {
        "type": "boolean"
      },
      "totalIdeas": {
        "type": "number"
      },
      "items": {
        "description": "Each trend and its idea; ideaId is the trend id.",
        "type": "array",
        "items": {
          "type": "object",
          "additionalProperties": {}
        }
      },
      "pending": {
        "description": "Ideas still being written; read again shortly.",
        "type": "number"
      },
      "videosLeft": {
        "description": "Videos it may still make before the list is unlocked; null once unlocked.",
        "anyOf": [
          {
            "type": "number"
          },
          {
            "type": "null"
          }
        ]
      }
    },
    "required": [
      "game",
      "unlocked",
      "totalIdeas",
      "items",
      "pending",
      "videosLeft"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** What videos could we make?

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "marketing.content_feed",
      "input": {
        "game": "dont-pray"
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer marketing content-feed --game dont-pray
  ```
</CodeGroup>

***

### content\_videos

`marketing.content_videos`: **List a game's Content videos**

A Content game's videos, newest first, with the running ones brought up to date: status, the video and the version to post. Next: marketing.mark\_posted once the person posted one.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "marketing.content_videos"` |
| **CLI** | `summer marketing content-videos` |
| **Runs** | On Summer's servers: the hosted MCP, or the npm MCP after `summer login`. Needs your Summer sign-in. |
| **Effect** | Reads only. Changes nothing. |
| **Asks you first** | No. It changes nothing. |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `game` | string | Yes | The game's Content id, from marketing.list\_content\_games. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "game": {
        "description": "The game's Content id, from marketing.list_content_games.",
        "type": "string",
        "pattern": "^[a-z0-9](?:[a-z0-9-]{0,38}[a-z0-9])?$"
      }
    },
    "required": [
      "game"
    ]
  }
  ```
</Accordion>

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "items": {
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "videoId": {
              "type": "string"
            },
            "ideaId": {
              "type": "string"
            },
            "status": {
              "type": "string",
              "enum": [
                "running",
                "ready",
                "failed"
              ]
            },
            "createdAt": {
              "type": "string"
            },
            "videoUrl": {
              "type": "string"
            },
            "postVideoUrl": {
              "description": "The same video with the \"Play on summer.games\" line, for posting.",
              "type": "string"
            },
            "message": {
              "type": "string"
            },
            "postedAt": {
              "type": "string"
            }
          },
          "required": [
            "videoId",
            "ideaId",
            "status",
            "createdAt"
          ],
          "additionalProperties": false
        }
      }
    },
    "required": [
      "items"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** Is the video ready?

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "marketing.content_videos",
      "input": {
        "game": "dont-pray"
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer marketing content-videos --game dont-pray
  ```
</CodeGroup>

***

### get\_brand\_pack

`marketing.get_brand_pack`: **Read a game's brand pack**

Read a Content game's brand pack: its name, logo, characters with their pictures, colours, style, do and don't rules, niches. Next: marketing.save\_brand\_pack to change it.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "marketing.get_brand_pack"` |
| **CLI** | `summer marketing get-brand-pack` |
| **Runs** | On Summer's servers: the hosted MCP, or the npm MCP after `summer login`. Needs your Summer sign-in. |
| **Effect** | Reads only. Changes nothing. |
| **Asks you first** | No. It changes nothing. |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `game` | string | Yes | The game's Content id, from marketing.list\_content\_games. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "game": {
        "description": "The game's Content id, from marketing.list_content_games.",
        "type": "string",
        "pattern": "^[a-z0-9](?:[a-z0-9-]{0,38}[a-z0-9])?$"
      }
    },
    "required": [
      "game"
    ]
  }
  ```
</Accordion>

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

**Example:** The brand pack of a game.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "marketing.get_brand_pack",
      "input": {
        "game": "dont-pray"
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer marketing get-brand-pack --game dont-pray
  ```
</CodeGroup>

***

### list\_content\_games

`marketing.list_content_games`: **List my Content games**

The games the person set up in Grow Content (each with its brand pack): Content id and name. Next: marketing.content\_feed or marketing.get\_brand\_pack with a game.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "marketing.list_content_games"` |
| **CLI** | `summer marketing list-content-games` |
| **Runs** | On Summer's servers: the hosted MCP, or the npm MCP after `summer login`. Needs your Summer sign-in. |
| **Effect** | Reads only. Changes nothing. |
| **Asks you first** | No. It changes nothing. |

**Inputs:**

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": {
            "game": {
              "type": "string"
            },
            "name": {
              "type": "string"
            }
          },
          "required": [
            "game",
            "name"
          ],
          "additionalProperties": false
        }
      },
      "studioUrl": {
        "type": "string"
      }
    },
    "required": [
      "items",
      "studioUrl"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** Which games have Content set up?

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

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

***

### make\_video

`marketing.make_video`: **Make a Content video**

Make the video for one idea of a Content game: the trend's clip with the game's character swapped in. Spends the person's credits. Takes a few minutes. Returns the video. Next: marketing.content\_videos until it is ready.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "marketing.make_video"` |
| **CLI** | `summer marketing make-video` |
| **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 |
| - | - | - | - |
| `game` | string | Yes | The game's Content id, from marketing.list\_content\_games. |
| `ideaId` | string | Yes | A trend id from marketing.content\_feed. Length 1 to 81. |
| `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": {
      "game": {
        "description": "The game's Content id, from marketing.list_content_games.",
        "type": "string",
        "pattern": "^[a-z0-9](?:[a-z0-9-]{0,38}[a-z0-9])?$"
      },
      "ideaId": {
        "description": "A trend id from marketing.content_feed.",
        "type": "string",
        "minLength": 1,
        "maxLength": 81
      },
      "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": [
      "game",
      "ideaId"
    ]
  }
  ```
</Accordion>

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "video": {
        "type": "object",
        "properties": {
          "videoId": {
            "type": "string"
          },
          "ideaId": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": [
              "running",
              "ready",
              "failed"
            ]
          },
          "createdAt": {
            "type": "string"
          },
          "videoUrl": {
            "type": "string"
          },
          "postVideoUrl": {
            "description": "The same video with the \"Play on summer.games\" line, for posting.",
            "type": "string"
          },
          "message": {
            "type": "string"
          },
          "postedAt": {
            "type": "string"
          }
        },
        "required": [
          "videoId",
          "ideaId",
          "status",
          "createdAt"
        ],
        "additionalProperties": false
      }
    },
    "required": [
      "video"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** Make this idea's video.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "marketing.make_video",
      "input": {
        "game": "dont-pray",
        "ideaId": "pov-hide-from-monster"
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer marketing make-video --game dont-pray --idea-id pov-hide-from-monster
  ```
</CodeGroup>

***

### mark\_posted

`marketing.mark_posted`: **Mark a Content video as posted**

Record that the person posted a ready Content video (when they say so). Returns the video. Next: marketing.content\_videos.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "marketing.mark_posted"` |
| **CLI** | `summer marketing mark-posted` |
| **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 |
| - | - | - | - |
| `game` | string | Yes | The game's Content id, from marketing.list\_content\_games. |
| `videoId` | string | Yes | From marketing.content\_videos. Length 1 to 200. |
| `dryRun` | boolean | No | Check and describe the call without doing it: nothing changes, nothing is spent. |
| `idempotencyKey` | string | No | Retry key. Reuse it only to retry the identical request, so it never happens twice. Length 1 to 128. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "game": {
        "description": "The game's Content id, from marketing.list_content_games.",
        "type": "string",
        "pattern": "^[a-z0-9](?:[a-z0-9-]{0,38}[a-z0-9])?$"
      },
      "videoId": {
        "description": "From marketing.content_videos.",
        "type": "string",
        "minLength": 1,
        "maxLength": 200
      },
      "dryRun": {
        "description": "Check and describe the call without doing it: nothing changes, nothing is spent.",
        "type": "boolean"
      },
      "idempotencyKey": {
        "description": "Retry key. Reuse it only to retry the identical request, so it never happens twice.",
        "type": "string",
        "minLength": 1,
        "maxLength": 128
      }
    },
    "required": [
      "game",
      "videoId"
    ]
  }
  ```
</Accordion>

<Accordion title="Result JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "video": {
        "type": "object",
        "properties": {
          "videoId": {
            "type": "string"
          },
          "ideaId": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": [
              "running",
              "ready",
              "failed"
            ]
          },
          "createdAt": {
            "type": "string"
          },
          "videoUrl": {
            "type": "string"
          },
          "postVideoUrl": {
            "description": "The same video with the \"Play on summer.games\" line, for posting.",
            "type": "string"
          },
          "message": {
            "type": "string"
          },
          "postedAt": {
            "type": "string"
          }
        },
        "required": [
          "videoId",
          "ideaId",
          "status",
          "createdAt"
        ],
        "additionalProperties": false
      }
    },
    "required": [
      "video"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Example:** They posted it.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "marketing.mark_posted",
      "input": {
        "game": "dont-pray",
        "videoId": "gen_123"
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer marketing mark-posted --game dont-pray --video-id gen_123
  ```
</CodeGroup>

***

### save\_brand\_pack

`marketing.save_brand_pack`: **Save a brand pack**

Save a Content game's brand pack, or make a new Content game from a pack (no game). The whole pack is replaced; read it first with marketing.get\_brand\_pack. Returns the pack. Next: marketing.content\_feed.

| | |
| - | - |
| **MCP** | `summer_call` with `"op": "marketing.save_brand_pack"` |
| **CLI** | `summer marketing save-brand-pack` |
| **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 |
| - | - | - | - |
| `game` | string | No | The game to change; leave it out to make a new game from the pack's name. |
| `pack` | object | Yes | |
| `pack.gameName` | string | Yes | Length 1 to 80. |
| `pack.summerGamesSlug` | string \| null | No | The game's summer.games page slug, for the "Play on" line. |
| `pack.logo` | object \| null | No | |
| `pack.characters` | object\[] | No | Items 0 to 8. |
| `pack.characters[].name` | string | Yes | Length 1 to 60. |
| `pack.characters[].role` | string | No | Length 0 to 80. |
| `pack.characters[].description` | string | No | Length 0 to 600. |
| `pack.characters[].images` | string\[] | No | Items 0 to 4. |
| `pack.colors` | object\[] | No | Items 0 to 10. |
| `pack.colors[].name` | string | No | Length 0 to 40. |
| `pack.colors[].hex` | string | Yes | |
| `pack.style` | string | No | Length 0 to 1200. |
| `pack.rules` | object | No | |
| `pack.rules.do` | string\[] | No | Items 0 to 12. |
| `pack.rules.dont` | string\[] | No | Items 0 to 12. |
| `pack.niches` | "pvp" \| "fantasy" \| "action" \| "horror" \| "cozy" \| "casual" \| "shooter" \| "rpg" \| "multiplayer"\[] | No | Items 0 to 9. |
| `pack.rightsConfirmed` | boolean | No | The person says they own the character pictures; videos need it. Set it only when they said so. |
| `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": {
      "game": {
        "description": "The game to change; leave it out to make a new game from the pack's name.",
        "type": "string",
        "pattern": "^[a-z0-9](?:[a-z0-9-]{0,38}[a-z0-9])?$"
      },
      "pack": {
        "type": "object",
        "properties": {
          "gameName": {
            "type": "string",
            "minLength": 1,
            "maxLength": 80
          },
          "summerGamesSlug": {
            "description": "The game's summer.games page slug, for the \"Play on\" line.",
            "anyOf": [
              {
                "type": "string",
                "maxLength": 61
              },
              {
                "type": "null"
              }
            ]
          },
          "logo": {
            "anyOf": [
              {
                "type": "object",
                "properties": {
                  "url": {
                    "type": "string",
                    "maxLength": 2000,
                    "pattern": "^https:\\/\\/"
                  }
                },
                "required": [
                  "url"
                ]
              },
              {
                "type": "null"
              }
            ]
          },
          "characters": {
            "maxItems": 8,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 60
                },
                "role": {
                  "type": "string",
                  "maxLength": 80
                },
                "description": {
                  "type": "string",
                  "maxLength": 600
                },
                "images": {
                  "maxItems": 4,
                  "type": "array",
                  "items": {
                    "type": "string",
                    "maxLength": 2000,
                    "pattern": "^https:\\/\\/"
                  }
                }
              },
              "required": [
                "name"
              ]
            }
          },
          "colors": {
            "maxItems": 10,
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string",
                  "maxLength": 40
                },
                "hex": {
                  "type": "string",
                  "pattern": "^#[0-9a-fA-F]{6}$"
                }
              },
              "required": [
                "hex"
              ]
            }
          },
          "style": {
            "type": "string",
            "maxLength": 1200
          },
          "rules": {
            "type": "object",
            "properties": {
              "do": {
                "maxItems": 12,
                "type": "array",
                "items": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 160
                }
              },
              "dont": {
                "maxItems": 12,
                "type": "array",
                "items": {
                  "type": "string",
                  "minLength": 1,
                  "maxLength": 160
                }
              }
            }
          },
          "niches": {
            "maxItems": 9,
            "type": "array",
            "items": {
              "type": "string",
              "enum": [
                "pvp",
                "fantasy",
                "action",
                "horror",
                "cozy",
                "casual",
                "shooter",
                "rpg",
                "multiplayer"
              ]
            }
          },
          "rightsConfirmed": {
            "description": "The person says they own the character pictures; videos need it. Set it only when they said so.",
            "type": "boolean"
          }
        },
        "required": [
          "gameName"
        ]
      },
      "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": [
      "pack"
    ]
  }
  ```
</Accordion>

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

**Example:** A new Content game.

<CodeGroup>
  ```json MCP theme={null}
  {
    "name": "summer_call",
    "arguments": {
      "op": "marketing.save_brand_pack",
      "input": {
        "pack": {
          "gameName": "Frog Knight",
          "characters": [
            {
              "name": "Pip",
              "images": [
                "https://res.cloudinary.com/x/pip.png"
              ]
            }
          ],
          "niches": [
            "cozy"
          ]
        }
      }
    }
  }
  ```

  ```bash CLI theme={null}
  summer marketing save-brand-pack --input '{"pack":{"gameName":"Frog Knight","characters":[{"name":"Pip","images":["https://res.cloudinary.com/x/pip.png"]}],"niches":["cozy"]}}'
  ```
</CodeGroup>


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