> ## 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.

# MCP tools: create assets

> Create assets tools of the Summer Engine MCP. Generate and find images, 3D models, audio, video and motion, then import them into the project. For each tool: what it does, what it needs, inputs, output and an example.

Generate and find images, 3D models, audio, video and motion, then import them into the project. 43 tools. What each column means, and how to connect: [MCP tools reference](/mcp/tools-reference).

<Note>
  Generated from the tools' own definitions: the `summer-engine` npm package `3.3.0` (its MCP server's `tools/list`, `library/tools/*/resource.yaml` and `registry/generated/index.json` in [SummerEngine/summer](https://github.com/SummerEngine/summer)) and the hosted Summer Engine MCP (`src/lib/mcp/hosted` at commit `8c4351ee30`). If something here is wrong, the tool definition is wrong.
</Note>

| Tool | Needs | What it does |
| - | - | - |
| [`summer_check_job`](#summer_check_job) | Signed in | Check the status of an async generation job. |
| [`summer_fabricate_3d`](#summer_fabricate_3d) | Engine | Fabricate a 3D mesh asset by running a Blender Python (bpy) script in the USER'S OWN installed Blender — headless, supervised by the engine — then import the exported .glb into the project and optionally instantiate it… |
| [`summer_generate_3d`](#summer_generate_3d) | Signed in | Generate a 3D model via Summer Engine Studio. |
| [`summer_generate_audio`](#summer_generate_audio) | Signed in | Generate audio using AI providers via Summer Engine Studio. |
| [`summer_generate_image`](#summer_generate_image) | Signed in | Generate an image using AI models via Summer Engine Studio. |
| [`summer_generate_motion`](#summer_generate_motion) | Signed in | Generate animation clips for a rigged 3D model via Summer Engine Studio. |
| [`summer_generate_video`](#summer_generate_video) | Signed in | Generate a video using AI models via Summer Engine Studio. |
| [`summer_get_asset`](#summer_get_asset) | Signed in | Fetch one asset by exact Summer asset ID. |
| [`summer_get_asset_download_url`](#summer_get_asset_download_url) | Signed in | Get a downloadable URL for a specific asset file. |
| [`summer_get_studio_workflow`](#summer_get_studio_workflow) | Nothing | Discover the same Guided workflow recipes shown in Summer Engine Studio. |
| [`summer_import_asset`](#summer_import_asset) | Engine + Signed in | Search the asset library and import the best match into the project in one step. |
| [`summer_import_asset_by_id`](#summer_import_asset_by_id) | Engine + Signed in | Import an exact Summer asset ID into the current project. |
| [`summer_import_from_url`](#summer_import_from_url) | Engine | Download a file from a URL and import it into the project. |
| [`summer_import_from_url_batch`](#summer_import_from_url_batch) | Engine | Download multiple files from URLs in one operation. |
| [`summer_import_hdri`](#summer_import_hdri) | Engine | Search Poly Haven's CC0 HDRI library and import one as environment lighting. |
| [`summer_list_my_assets`](#summer_list_my_assets) | Signed in | List or search the signed-in user's generated and uploaded assets. |
| [`summer_remove_background`](#summer_remove_background) | Summer account | Remove the background from up to eight of the user's image assets (asset ids from summer\_generate\_image, summer\_list\_my\_assets or the Summer library upload). |
| [`summer_search_assets`](#summer_search_assets) | Signed in | Search for game assets in the Summer Engine ecosystem. |
| [`summer_slice_asset_sheet`](#summer_slice_asset_sheet) | Signed in | Detect and crop every distinct game asset from an existing image asset sheet. |
| [`summer_tool_bankai_motion`](#summer_tool_bankai_motion) | Summer account | Any clip's moves, performed by your character. |
| [`summer_tool_bankai_swap`](#summer_tool_bankai_swap) | Summer account | Swap the person, product, outfit or background. |
| [`summer_tool_bankai_ultra`](#summer_tool_bankai_ultra) | Summer account | Rebuild any shot around your references on Seedance 2.5. |
| [`summer_tool_camera_moves`](#summer_tool_camera_moves) | Summer account | Photo to a cinematic dolly, jib or focus pull. |
| [`summer_tool_capsule_kit`](#summer_tool_capsule_kit) | Summer account | Store-ready capsule art from one screenshot. |
| [`summer_tool_character_turnaround`](#summer_tool_character_turnaround) | Summer account | Front, side and back model sheet from one image. |
| [`summer_tool_cinematic_shot`](#summer_tool_cinematic_shot) | Summer account | One image in, a cinematic shot with sound out, on Seedance 2.5. |
| [`summer_tool_game_ad_maker`](#summer_tool_game_ad_maker) | Summer account | A 10 second vertical game ad from one screenshot. |
| [`summer_tool_game_score`](#summer_tool_game_score) | Summer account | Game music from a mood, in seconds. |
| [`summer_tool_lipsync_anything`](#summer_tool_lipsync_anything) | Summer account | New words in an existing clip, lips matched. |
| [`summer_tool_npc_voice`](#summer_tool_npc_voice) | Summer account | Type a line, get a voiced NPC in seconds. |
| [`summer_tool_pixel_forge`](#summer_tool_pixel_forge) | Summer account | Any character or image to clean, game-ready pixel art. |
| [`summer_tool_product_ad`](#summer_tool_product_ad) | Summer account | Product photo in, an 8 second video ad with sound out. |
| [`summer_tool_sfx_maker`](#summer_tool_sfx_maker) | Summer account | Any sound effect in seconds. |
| [`summer_tool_sprite_sheet_forge`](#summer_tool_sprite_sheet_forge) | Summer account | One character image in, an animated sprite sheet out. |
| [`summer_tool_style_frame`](#summer_tool_style_frame) | Summer account | Your screenshot redrawn in another game art style, for look-dev. |
| [`summer_tool_style_swap`](#summer_tool_style_swap) | Summer account | Restyle gameplay or any clip into anime, claymation, PSX, comic or pixel art. |
| [`summer_tool_talking_character`](#summer_tool_talking_character) | Summer account | Make any picture talk: NPCs, mascots, avatars. |
| [`summer_tool_texture_forge`](#summer_tool_texture_forge) | Summer account | A photo into a seamless, tileable game texture. |
| [`summer_tool_thumbnail_maker`](#summer_tool_thumbnail_maker) | Summer account | Click-worthy YouTube thumbnails from your frame. |
| [`summer_tool_trailer_forge`](#summer_tool_trailer_forge) | Summer account | A game trailer with music from your screenshots. |
| [`summer_tool_transition_morph`](#summer_tool_transition_morph) | Summer account | Two images, one smooth morph between them. |
| [`summer_upload_image_begin`](#summer_upload_image_begin) | Summer account | Start uploading a PNG, JPEG or WebP image from your disk (at most 32 MB) into the user's Summer assets, e.g. |
| [`summer_upload_image_complete`](#summer_upload_image_complete) | Summer account | Finish an image upload from summer\_upload\_image\_begin: checks it is the upload Summer signed for this user, reads the image and saves it to the user's assets (private). |

### summer\_check\_job

On the local MCP (`summer-engine` npm) and the hosted MCP.

<Tabs>
  <Tab title="Local MCP">
    Check the status of an async generation job.

    Use this when you called [`summer_generate_3d`](/mcp/tools/create-assets#summer_generate_3d) with wait=false, or need to re-check
    a job that timed out. Most of the time you won't need this — [`summer_generate_3d`](/mcp/tools/create-assets#summer_generate_3d)
    waits automatically.

    Status values: waiting, active, completed, failed, delayed, unknown.

    Cloud tool — runs on Summer's servers and works WITHOUT the Summer Engine app open.
    Requires authentication: run 'npx -y summer-engine\@latest login' first.

    | | |
    | - | - |
    | **Needs** | Signed in: `summer login` |
    | **Effects** | uses the network |
    | **CLI** | `summer tool check-job --args '<json>'` |

    **Use when:**

    * a generation ran without waiting, or timed out, and needs re-checking
    * "is my 3D model / video done yet?"
    * a generate\_\* call returned a job id instead of a finished asset

    **Do not use when:**

    * the generation returned the asset directly — there is nothing to poll

    **Inputs:**

    | Input | Type | Required | Description |
    | - | - | - | - |
    | `jobId` | string | Yes | The job ID returned by an async generation tool |

    <Accordion title="Input JSON schema">
      ```json theme={null}
      {
        "type": "object",
        "properties": {
          "jobId": {
            "type": "string",
            "description": "The job ID returned by an async generation tool"
          }
        },
        "required": [
          "jobId"
        ],
        "additionalProperties": false
      }
      ```
    </Accordion>

    **Output:** MCP text content holding JSON; errors set `isError`.

    ```json Example call theme={null}
    {
      "name": "summer_check_job",
      "arguments": {
        "jobId": "<jobId>"
      }
    }
    ```
  </Tab>

  <Tab title="Hosted MCP">
    Check an async generation job (3D, motion). Status: waiting, active, completed, failed, delayed, unknown. Completed results include asset ids and file URLs.

    | | |
    | - | - |
    | **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |
    | **Hints** | `readOnlyHint` |

    **Inputs:**

    | Input | Type | Required | Description |
    | - | - | - | - |
    | `jobId` | string | Yes | Length 1 to …. |

    <Accordion title="Input JSON schema">
      ```json theme={null}
      {
        "type": "object",
        "properties": {
          "jobId": {
            "type": "string",
            "minLength": 1
          }
        },
        "required": [
          "jobId"
        ]
      }
      ```
    </Accordion>

    **Output:** MCP text content holding JSON; errors set `isError`.

    ```json Example call theme={null}
    {
      "name": "summer_check_job",
      "arguments": {
        "jobId": "<jobId>"
      }
    }
    ```
  </Tab>
</Tabs>

***

### summer\_fabricate\_3d

On the local MCP (`summer-engine` npm).

Fabricate a 3D mesh asset by running a Blender Python (bpy) script in the USER'S OWN installed Blender — headless, supervised by the engine — then import the exported .glb into the project and optionally instantiate it into the open scene. Blender is a dependency the user installs; Summer never bundles, downloads, or brands it.

WHEN — the three asset classes neither generation nor the free library serve well:

* modular kits with exact dimensions and snapping (walls, pipes, fences, rails: array + boolean + bevel, one shared material) — generation cannot hold size and style across 30 pieces;
* VFX meshes (shatter pieces, curve sweeps, trails, LOD chains) — one-liners in bpy, absent in the engine;
* post-processing a generated model (decimate -> UV unwrap -> bake) before it goes into the scene.
  WHEN NOT: a generic prop (barrel, crate, chair) -> [`summer_search_assets`](/mcp/tools/create-assets#summer_search_assets) / [`summer_import_asset`](/mcp/tools/create-assets#summer_import_asset) first, then [`summer_generate_3d`](/mcp/tools/create-assets#summer_generate_3d); a character or any organic shape -> [`summer_generate_3d`](/mcp/tools/create-assets#summer_generate_3d) (scripted organic modelling is the documented failure mode); a blockout or placeholder -> [`summer_run_script`](/mcp/tools/build#summer_run_script) primitives/CSG, instant and in-scene. Route with the asset-strategy skill; the fabricating-assets skill carries the bpy rules and recipes.

SCRIPT CONTRACT: 'source' is plain bpy code. Pre-bound names: bpy, bmesh, mathutils, math, Vector, Matrix, Euler. The script must CREATE mesh objects and leave them linked in the scene — do NOT export and do NOT quit (the engine's bootstrap exports for you: modifiers applied at export, Geometry Nodes realized, +Y-up conversion, materials carried as Principled BSDF only, a procedural Base Color baked to a 2K texture; procedural Metallic/Roughness/Normal/Emission are NOT baked and come back in 'warnings'). Objects hidden or render-disabled are treated as helpers (boolean cutters, guides) and are not exported — they are listed in 'skipped'. Model in metres. MESH/CURVE/SURFACE/META/FONT export as meshes, EMPTY/ARMATURE keep hierarchy, cameras and lights are dropped. Name your objects — they become node names.

REQUIRES BLENDER on the user's machine (4.2 LTS or newer). Resolution order: 'blender\_path' -> SUMMER\_BLENDER\_BIN in the editor's environment -> Editor Settings filesystem/import/blender/blender\_path (shared with .blend import) -> PATH, well-known install dirs, \~/.summer/tools/blender-\*. Not found -> failure\_reason blender\_not\_found with the exact fix and every path that was checked; relay it to the user as a one-line decision, never guess a path and never install anything on their behalf.

ONE fabrication runs at a time per editor (failure\_reason busy — wait for the result, never fire two in parallel). Budget max\_seconds 15-600 (default 120) covers Blender boot + script + bakes + export; the client waits max\_seconds + 60 s. Blind until import: there is no viewport feedback while the script runs, so keep scripts deterministic (fixed seeds) and verify afterwards.

Returns \{ok, ran, blender\_version, blender\_path, out\_path, objects\[\{name,type,vertices,faces,triangles,materials,modifiers}], object\_count, dimensions\{x,y,z} (+Y up, source scale), warnings\[], baked\[], skipped\[], output\[], errors\[], exit\_code, duration\_ms, checkpoint} plus imported\_node\_path / scale\_applied / instance\_dimensions with import\_to\_scene, and no\_rewind\_point:true when no checkpoint exists. Failures carry failure\_reason: blender\_not\_found | blender\_launch\_failed | script\_error (traceback\_tail + script\_line — fix the bpy against the reported blender\_version and re-run; bpy APIs change across majors) | timeout (raise max\_seconds or split the job) | export\_empty (no exportable object — check hide/render flags and collection links) | export\_failed | export\_missing | import\_failed / instantiate\_failed (the .glb IS at out\_path — [`summer_instantiate_scene`](/mcp/tools/build#summer_instantiate_scene) it yourself; the importer's message is in [`summer_get_console`](/mcp/tools/run-and-test#summer_get_console)) | busy | cancelled.

THE LOOP: [`summer_world_snapshot`](/mcp/tools/run-and-test#summer_world_snapshot) BEFORE (keep snapshot\_id) -> [`summer_fabricate_3d`](/mcp/tools/create-assets#summer_fabricate_3d) with import\_to\_scene (+ target\_size for real-world scale) -> read dimensions/warnings/skipped -> [`summer_snapshot_diff`](/mcp/tools/run-and-test#summer_snapshot_diff) + [`summer_screenshot`](/mcp/tools/run-and-test#summer_screenshot) -> iterate. Never claim a visual result without the screenshot. If this engine build predates FabricateMesh, the result is a structured engine\_lacks\_op failure (nothing is sent): use [`summer_generate_3d`](/mcp/tools/create-assets#summer_generate_3d) / [`summer_search_assets`](/mcp/tools/create-assets#summer_search_assets), or update Summer Engine.

| | |
| - | - |
| **Needs** | Summer Engine open with your project |
| **Effects** | writes files, changes the open project |
| **CLI** | `summer tool fabricate-3d --args '<json>'` |

**Use when:**

* a modular kit with exact dimensions and snapping — walls, pipes, fences, rails — where generation cannot hold size and style across many pieces
* VFX meshes — shatter pieces, curve sweeps, trails, LOD chains — that are one-liners in bpy and absent from the engine
* post-processing a generated model (decimate, UV unwrap, bake) before it goes into the scene
* "write a Blender script that builds ..." / "fabricate a parametric ... with booleans and bevels"

**Do not use when:**

* a generic prop (barrel, crate, chair) — [`summer_search_assets`](/mcp/tools/create-assets#summer_search_assets) / [`summer_import_asset`](/mcp/tools/create-assets#summer_import_asset) first, then [`summer_generate_3d`](/mcp/tools/create-assets#summer_generate_3d)
* a character or any organic shape — [`summer_generate_3d`](/mcp/tools/create-assets#summer_generate_3d) (scripted organic modelling is the documented failure mode)
* a blockout or placeholder — [`summer_run_script`](/mcp/tools/build#summer_run_script) primitives/CSG are instant and in-scene
* the user has no Blender install and does not want one — this tool never installs, downloads, or bundles Blender
* requires an engine build with FabricateMesh (Summer Engine 0.5.66 or newer); older engines return engine\_lacks\_op

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `source` | string | Yes | Blender Python (bpy) code that CREATES mesh objects and leaves them linked in the scene. Do not export — the engine exports the .glb for you. Pre-bound names: bpy, bmesh, mathutils, math, Vector, Matrix, Euler. Length 1 to …. |
| `name` | string | Yes | Asset name — used for the default out\_path (res\://assets/fabricated/\<name>.glb) and for the instantiated node. Sanitized by the engine to \[A-Za-z0-9\_-]. Length 1 to …. |
| `out_path` | string | No | Destination res\:// path ending in .glb (default res\://assets/fabricated/\<name>.glb). An existing file is overwritten; '..' and hidden directories are refused. |
| `target_size` | number | No | Largest world-AABB dimension in units after instantiation — uniform scale, same rule as summer\_instantiate\_scene target\_size (chair 1.0, car 4.5). Only used together with import\_to\_scene. |
| `import_to_scene` | object | No | Instantiate the imported .glb into the currently open scene after import (one undo action). Omit to only write and import the file. |
| `import_to_scene.parent` | string | Yes | Parent node path in the CURRENTLY OPEN scene, e.g. '/' (scene root) or './World'. |
| `import_to_scene.position` | string | No | Optional local position as the engine variant string 'Vector3(x, y, z)'. |
| `max_seconds` | number | No | Child budget in seconds (default 120, clamped 15-600): Blender boot + script + procedural-colour bakes + export. Raise it for heavy booleans or bakes; the client waits max\_seconds + 60 s. |
| `checkpoint` | boolean | No | Take a SummerGit checkpoint before the child runs (default false). The result confesses (no\_rewind\_point) when none could be taken. |
| `blender_path` | string | No | Explicit Blender executable. Pass only when the user named one; otherwise the engine resolves SUMMER\_BLENDER\_BIN, the editor setting filesystem/import/blender/blender\_path, then PATH and well-known install locations. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "source": {
        "type": "string",
        "minLength": 1,
        "description": "Blender Python (bpy) code that CREATES mesh objects and leaves them linked in the scene. Do not export — the engine exports the .glb for you. Pre-bound names: bpy, bmesh, mathutils, math, Vector, Matrix, Euler."
      },
      "name": {
        "type": "string",
        "minLength": 1,
        "description": "Asset name — used for the default out_path (res://assets/fabricated/<name>.glb) and for the instantiated node. Sanitized by the engine to [A-Za-z0-9_-]."
      },
      "out_path": {
        "type": "string",
        "description": "Destination res:// path ending in .glb (default res://assets/fabricated/<name>.glb). An existing file is overwritten; '..' and hidden directories are refused."
      },
      "target_size": {
        "type": "number",
        "exclusiveMinimum": 0,
        "description": "Largest world-AABB dimension in units after instantiation — uniform scale, same rule as summer_instantiate_scene target_size (chair 1.0, car 4.5). Only used together with import_to_scene."
      },
      "import_to_scene": {
        "type": "object",
        "properties": {
          "parent": {
            "type": "string",
            "description": "Parent node path in the CURRENTLY OPEN scene, e.g. '/' (scene root) or './World'."
          },
          "position": {
            "type": "string",
            "pattern": "^Vector3\\(\\s*[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?\\s*,\\s*[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?\\s*,\\s*[-+]?(?:\\d+\\.?\\d*|\\.\\d+)(?:[eE][-+]?\\d+)?\\s*\\)$",
            "description": "Optional local position as the engine variant string 'Vector3(x, y, z)'."
          }
        },
        "required": [
          "parent"
        ],
        "additionalProperties": false,
        "description": "Instantiate the imported .glb into the currently open scene after import (one undo action). Omit to only write and import the file."
      },
      "max_seconds": {
        "type": "number",
        "description": "Child budget in seconds (default 120, clamped 15-600): Blender boot + script + procedural-colour bakes + export. Raise it for heavy booleans or bakes; the client waits max_seconds + 60 s."
      },
      "checkpoint": {
        "type": "boolean",
        "description": "Take a SummerGit checkpoint before the child runs (default false). The result confesses (no_rewind_point) when none could be taken."
      },
      "blender_path": {
        "type": "string",
        "description": "Explicit Blender executable. Pass only when the user named one; otherwise the engine resolves SUMMER_BLENDER_BIN, the editor setting filesystem/import/blender/blender_path, then PATH and well-known install locations."
      }
    },
    "required": [
      "source",
      "name"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Output:** MCP text content holding JSON; errors set `isError`. From the tool's own description: Returns \{ok, ran, blender\_version, blender\_path, out\_path, objects\[\{name,type,vertices,faces,triangles,materials,modifiers}], object\_count, dimensions\{x,y,z} (+Y up, source scale), warnings\[], baked\[], skipped\[], output\[], errors\[], exit\_code, duration\_ms, checkpoint} plus imported\_node\_path / scale\_applied / instance\_dimensions with import\_to\_scene, and no\_rewind\_point:true when no checkpoint exists.

```json Example call theme={null}
{
  "name": "summer_fabricate_3d",
  "arguments": {
    "source": "<source>",
    "name": "<name>"
  }
}
```

***

### summer\_generate\_3d

On the local MCP (`summer-engine` npm) and the hosted MCP.

<Tabs>
  <Tab title="Local MCP">
    Generate a 3D model via Summer Engine Studio.

    Available models:

    * "hunyuan" (default) — Hunyuan 3D v3.1 Pro, high quality
    * "trellis" — Trellis 2, fast and detailed
    * "meshy" — Meshy, legacy option

    Model ids are an ALLOWLIST, not a passthrough. An unrecognised id is rejected
    with 400 listing the accepted ids.

    Available kinds:

    * "text-to-3d" (default) — From text description. Requires 'prompt'.
      Internally generates a 3D-optimized reference image first, then converts to 3D.
    * "image-to-3d" — From your own image. Requires 'imageUrl'.
    * "texture" — Generate textures for a model. Requires 'imageUrl'.

    Optional rig pass (image-to-3d only):
    Set options.rig = true to add an auto-rig pass via Meshy v6. The result
    job (poll via [`summer_check_job`](/mcp/tools/create-assets#summer_check_job)) will include rigAssetId — the asset ID
    of the rigged glb. Use that rigAssetId with [`summer_generate_motion`](/mcp/tools/create-assets#summer_generate_motion) to
    add animation clips.

    Example:
    [`summer_generate_3d`](/mcp/tools/create-assets#summer_generate_3d)(\{
    kind: "image-to-3d",
    imageUrl: "https\://...",
    options: \{ rig: true }
    })
    // Returns jobId; poll until result includes \{ assetId, rigAssetId }.

    Single-image generation automatically assesses whether the source is suitable
    for 3D. If needed, Summer prepares an isolated object view or rig-safe character
    pose before conversion. Set referencePreparation="always" or "never" only when
    you intentionally want to override that shared Studio behavior.

    For a complete animated humanoid package, pass rig=true plus animationNames or
    actionIds. This routes through the shared character pipeline instead of a
    one-off mesh job.

    By default, waits for completion (up to 10 min) and returns the result directly.
    Set wait=false to get the jobId immediately and poll manually with [`summer_check_job`](/mcp/tools/create-assets#summer_check_job).

    Cloud tool — runs on Summer's servers and works WITHOUT the Summer Engine app open.
    Requires authentication: run 'npx -y summer-engine\@latest login' first.

    | | |
    | - | - |
    | **Needs** | Signed in: `summer login` |
    | **Effects** | uses the network |
    | **CLI** | `summer tool generate-3d --args '<json>'` |

    **Use when:**

    * creating a 3D asset or character from a prompt or reference image
    * "make me a low-poly tree / a sci-fi crate / a goblin for my game"
    * turning a concept image into a 3D model

    **Do not use when:**

    * a 2D sprite, icon, or texture — [`summer_generate_image`](/mcp/tools/create-assets#summer_generate_image)
    * the model file already exists at a URL — [`summer_import_from_url`](/mcp/tools/create-assets#summer_import_from_url)

    **Inputs:**

    | Input | Type | Required | Description |
    | - | - | - | - |
    | `prompt` | string | No | Description of the 3D model, e.g. 'a low-poly treasure chest' |
    | `kind` | string | No | Generation type: text-to-3d, image-to-3d, texture Default `"text-to-3d"`. |
    | `model` | string | No | Model: hunyuan (default), trellis, meshy, or any fal-ai model ID Default `"hunyuan"`. |
    | `imageUrl` | string | No | Source image URL for image-to-3d or texture |
    | `imageUrls` | string\[] | No | Up to four views for multi-image-to-3d Items 0 to 4. |
    | `title` | string | No | Asset or character title |
    | `idempotencyKey` | string | No | Stable retry key so the same logical request is not billed or queued twice |
    | `assetIntent` | "character" \| "object" | No | Controls whether hidden reference preparation targets a rig-safe character pose or isolated object view |
    | `referencePreparation` | "auto" \| "always" \| "never" | No | Shared Studio reference-preparation policy; auto is recommended Default `"auto"`. |
    | `rig` | boolean | No | Auto-rig the generated model Default `false`. |
    | `animationNames` | string\[] | No | Animation names for the shared animated-character pipeline, e.g. Idle, Walk, Run, Jump |
    | `actionIds` | integer\[] | No | Exact Meshy action ids for the shared animated-character pipeline |
    | `riggingHeightMeters` | number | No | Character height used by auto-rigging Range … to 10. |
    | `wait` | boolean | No | Wait for completion (default true, up to 10 min). Set false to get jobId immediately. Default `true`. |
    | `options` | object | No | Provider-specific params (target\_polycount, topology, art\_style, etc.) |

    <Accordion title="Input JSON schema">
      ```json theme={null}
      {
        "type": "object",
        "properties": {
          "prompt": {
            "type": "string",
            "description": "Description of the 3D model, e.g. 'a low-poly treasure chest'"
          },
          "kind": {
            "type": "string",
            "default": "text-to-3d",
            "description": "Generation type: text-to-3d, image-to-3d, texture"
          },
          "model": {
            "type": "string",
            "default": "hunyuan",
            "description": "Model: hunyuan (default), trellis, meshy, or any fal-ai model ID"
          },
          "imageUrl": {
            "type": "string",
            "description": "Source image URL for image-to-3d or texture"
          },
          "imageUrls": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "maxItems": 4,
            "description": "Up to four views for multi-image-to-3d"
          },
          "title": {
            "type": "string",
            "description": "Asset or character title"
          },
          "idempotencyKey": {
            "type": "string",
            "description": "Stable retry key so the same logical request is not billed or queued twice"
          },
          "assetIntent": {
            "type": "string",
            "enum": [
              "character",
              "object"
            ],
            "description": "Controls whether hidden reference preparation targets a rig-safe character pose or isolated object view"
          },
          "referencePreparation": {
            "type": "string",
            "enum": [
              "auto",
              "always",
              "never"
            ],
            "default": "auto",
            "description": "Shared Studio reference-preparation policy; auto is recommended"
          },
          "rig": {
            "type": "boolean",
            "default": false,
            "description": "Auto-rig the generated model"
          },
          "animationNames": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Animation names for the shared animated-character pipeline, e.g. Idle, Walk, Run, Jump"
          },
          "actionIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "minimum": 0,
              "maximum": 696
            },
            "description": "Exact Meshy action ids for the shared animated-character pipeline"
          },
          "riggingHeightMeters": {
            "type": "number",
            "exclusiveMinimum": 0,
            "maximum": 10,
            "description": "Character height used by auto-rigging"
          },
          "wait": {
            "type": "boolean",
            "default": true,
            "description": "Wait for completion (default true, up to 10 min). Set false to get jobId immediately."
          },
          "options": {
            "type": "object",
            "additionalProperties": {},
            "description": "Provider-specific params (target_polycount, topology, art_style, etc.)"
          }
        },
        "additionalProperties": false
      }
      ```
    </Accordion>

    **Output:** MCP text content holding JSON; errors set `isError`. From the tool's own description: The result job (poll via summer\_check\_job) will include rigAssetId — the asset ID of the rigged glb.

    ```json Example call theme={null}
    {
      "name": "summer_generate_3d",
      "arguments": {}
    }
    ```
  </Tab>

  <Tab title="Hosted MCP">
    Start a 3D model job. kind: text-to-3d (prompt), image-to-3d (imageUrl or up to four imageUrls), texture (imageUrl). Models: hunyuan (default), hunyuan-rapid, trellis, meshy, meshy-7.1, tripo-p2, hi3d-v3 (image only), rodin-2.5-fast. rig=true auto-rigs (Meshy); add animationNames or actionIds for an animated humanoid. Returns a jobId immediately: poll [`summer_check_job`](/mcp/tools/create-assets#summer_check_job). Confirm cost with the user. Runs on Summer servers; the asset lands in the user's Summer library, where the local engine can import it with [`summer_import_asset_by_id`](/mcp/tools/create-assets#summer_import_asset_by_id).

    | | |
    | - | - |
    | **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |
    | **Hints** | `openWorldHint` |

    **Inputs:**

    | Input | Type | Required | Description |
    | - | - | - | - |
    | `prompt` | string | No | |
    | `kind` | "text-to-3d" \| "image-to-3d" \| "texture" | No | Default `"text-to-3d"`. |
    | `model` | string | No | Default `"hunyuan"`. |
    | `imageUrl` | string | No | |
    | `imageUrls` | string\[] | No | Items 0 to 4. |
    | `title` | string | No | Length 0 to 200. |
    | `assetIntent` | "character" \| "object" | No | |
    | `referencePreparation` | "auto" \| "always" \| "never" | No | Default `"auto"`. |
    | `rig` | boolean | No | Default `false`. |
    | `animationNames` | string\[] | No | |
    | `actionIds` | integer\[] | No | |
    | `riggingHeightMeters` | number | No | Range … to 10. |
    | `options` | object | No | Provider-specific parameters. |
    | `idempotencyKey` | string | No | Stable retry key. Reuse it only when retrying the identical request so it is never billed twice. Length 1 to 128. |

    <Accordion title="Input JSON schema">
      ```json theme={null}
      {
        "type": "object",
        "properties": {
          "prompt": {
            "type": "string"
          },
          "kind": {
            "default": "text-to-3d",
            "type": "string",
            "enum": [
              "text-to-3d",
              "image-to-3d",
              "texture"
            ]
          },
          "model": {
            "default": "hunyuan",
            "type": "string"
          },
          "imageUrl": {
            "type": "string",
            "format": "uri"
          },
          "imageUrls": {
            "maxItems": 4,
            "type": "array",
            "items": {
              "type": "string",
              "format": "uri"
            }
          },
          "title": {
            "type": "string",
            "maxLength": 200
          },
          "assetIntent": {
            "type": "string",
            "enum": [
              "character",
              "object"
            ]
          },
          "referencePreparation": {
            "default": "auto",
            "type": "string",
            "enum": [
              "auto",
              "always",
              "never"
            ]
          },
          "rig": {
            "default": false,
            "type": "boolean"
          },
          "animationNames": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "actionIds": {
            "type": "array",
            "items": {
              "type": "integer",
              "minimum": 0,
              "maximum": 696
            }
          },
          "riggingHeightMeters": {
            "type": "number",
            "exclusiveMinimum": 0,
            "maximum": 10
          },
          "options": {
            "description": "Provider-specific parameters.",
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {}
          },
          "idempotencyKey": {
            "description": "Stable retry key. Reuse it only when retrying the identical request so it is never billed twice.",
            "type": "string",
            "minLength": 1,
            "maxLength": 128
          }
        }
      }
      ```
    </Accordion>

    **Output:** MCP text content holding JSON; errors set `isError`. From the tool's own description: Returns a jobId immediately: poll summer\_check\_job.

    ```json Example call theme={null}
    {
      "name": "summer_generate_3d",
      "arguments": {}
    }
    ```
  </Tab>
</Tabs>

***

### summer\_generate\_audio

On the local MCP (`summer-engine` npm) and the hosted MCP.

<Tabs>
  <Tab title="Local MCP">
    Generate audio using AI providers via Summer Engine Studio.

    Capabilities:

    * "text\_to\_speech" — Convert text to spoken audio. Requires 'text'. Optional 'voiceId'.
    * "sound\_effects" — Generate sound effects from description. Requires 'text'. Optional 'durationSeconds'.
    * "music" — Generate background music. Requires 'prompt'. Optional 'durationSeconds'.
    * "text\_to\_dialogue" — Multi-voice dialogue. Requires 'inputs' array of \{text, voiceId} objects.

    The 'options' object is spread into the ElevenLabs SDK call at the TOP level, so
    only keys the SDK accepts there have any effect. Voice tuning is NOT top-level and
    is NOT snake\_case: pass it as options.voiceSettings with camelCase keys —
    \{ voiceSettings: \{ stability, similarityBoost, style, speed, useSpeakerBoost } }.
    Flat snake\_case keys are accepted by the schema, silently dropped by the SDK, and
    return a normal 200 with the setting ignored.

    Returns the generated audio URL and asset metadata.
    Cloud tool — runs on Summer's servers and works WITHOUT the Summer Engine app open.
    Requires authentication: run 'npx -y summer-engine\@latest login' first.

    | | |
    | - | - |
    | **Needs** | Signed in: `summer login` |
    | **Effects** | uses the network |
    | **CLI** | `summer tool generate-audio --args '<json>'` |

    **Use when:**

    * creating sound effects, music beds, or spoken lines for the game
    * "I need a jump sound / a sword swing / a coin pickup"
    * "read this dialogue line in a gruff voice" or "background music for the menu"

    **Do not use when:**

    * a .wav/.ogg already exists online — [`summer_import_from_url`](/mcp/tools/create-assets#summer_import_from_url)

    **Inputs:**

    | Input | Type | Required | Description |
    | - | - | - | - |
    | `capability` | string | Yes | Type of audio: text\_to\_speech, sound\_effects, music, text\_to\_dialogue |
    | `text` | string | No | Text for TTS, or description for sound effects |
    | `prompt` | string | No | Music description (for 'music' capability) |
    | `voiceId` | string | No | ElevenLabs voice ID for TTS |
    | `modelId` | string | No | ElevenLabs model ID (e.g. 'eleven\_multilingual\_v2') |
    | `durationSeconds` | number | No | Duration in seconds for SFX or music |
    | `inputs` | object\[] | No | Dialogue lines for text\_to\_dialogue |
    | `inputs[].text` | string | Yes | |
    | `inputs[].voiceId` | string | Yes | |
    | `options` | object | No | Provider params, spread at the SDK's top level. Voice tuning goes in options.voiceSettings with camelCase keys (stability, similarityBoost, style, speed, useSpeakerBoost); flat snake\_case is silently ignored. |

    <Accordion title="Input JSON schema">
      ```json theme={null}
      {
        "type": "object",
        "properties": {
          "capability": {
            "type": "string",
            "description": "Type of audio: text_to_speech, sound_effects, music, text_to_dialogue"
          },
          "text": {
            "type": "string",
            "description": "Text for TTS, or description for sound effects"
          },
          "prompt": {
            "type": "string",
            "description": "Music description (for 'music' capability)"
          },
          "voiceId": {
            "type": "string",
            "description": "ElevenLabs voice ID for TTS"
          },
          "modelId": {
            "type": "string",
            "description": "ElevenLabs model ID (e.g. 'eleven_multilingual_v2')"
          },
          "durationSeconds": {
            "type": "number",
            "description": "Duration in seconds for SFX or music"
          },
          "inputs": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "text": {
                  "type": "string"
                },
                "voiceId": {
                  "type": "string"
                }
              },
              "required": [
                "text",
                "voiceId"
              ],
              "additionalProperties": false
            },
            "description": "Dialogue lines for text_to_dialogue"
          },
          "options": {
            "type": "object",
            "additionalProperties": {},
            "description": "Provider params, spread at the SDK's top level. Voice tuning goes in options.voiceSettings with camelCase keys (stability, similarityBoost, style, speed, useSpeakerBoost); flat snake_case is silently ignored."
          }
        },
        "required": [
          "capability"
        ],
        "additionalProperties": false
      }
      ```
    </Accordion>

    **Output:** MCP text content holding JSON; errors set `isError`. From the tool's own description: Returns the generated audio URL and asset metadata.

    ```json Example call theme={null}
    {
      "name": "summer_generate_audio",
      "arguments": {
        "capability": "<capability>"
      }
    }
    ```
  </Tab>

  <Tab title="Hosted MCP">
    Generate audio. capability: text\_to\_speech (text, optional voiceId), sound\_effects (text, optional durationSeconds), music (prompt, optional durationSeconds), text\_to\_dialogue (inputs of \{text, voiceId}). Voice tuning goes in options.voiceSettings with camelCase keys. Runs on Summer servers; the asset lands in the user's Summer library, where the local engine can import it with [`summer_import_asset_by_id`](/mcp/tools/create-assets#summer_import_asset_by_id).

    | | |
    | - | - |
    | **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |
    | **Hints** | `openWorldHint` |

    **Inputs:**

    | Input | Type | Required | Description |
    | - | - | - | - |
    | `capability` | "text\_to\_speech" \| "sound\_effects" \| "music" \| "text\_to\_dialogue" | Yes | |
    | `text` | string | No | |
    | `prompt` | string | No | |
    | `voiceId` | string | No | |
    | `modelId` | string | No | |
    | `durationSeconds` | number | No | Length in seconds for sound\_effects (0.5 to 30, defaults to 5 s) or music (3 to 600, defaults to 30 s) |
    | `inputs` | object\[] | No | |
    | `inputs[].text` | string | Yes | |
    | `inputs[].voiceId` | string | Yes | |
    | `options` | object | No | Provider-specific parameters. |
    | `idempotencyKey` | string | No | Stable retry key. Reuse it only when retrying the identical request so it is never billed twice. Length 1 to 128. |

    <Accordion title="Input JSON schema">
      ```json theme={null}
      {
        "type": "object",
        "properties": {
          "capability": {
            "type": "string",
            "enum": [
              "text_to_speech",
              "sound_effects",
              "music",
              "text_to_dialogue"
            ]
          },
          "text": {
            "type": "string"
          },
          "prompt": {
            "type": "string"
          },
          "voiceId": {
            "type": "string"
          },
          "modelId": {
            "type": "string"
          },
          "durationSeconds": {
            "description": "Length in seconds for sound_effects (0.5 to 30, defaults to 5 s) or music (3 to 600, defaults to 30 s)",
            "type": "number",
            "exclusiveMinimum": 0
          },
          "inputs": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "text": {
                  "type": "string"
                },
                "voiceId": {
                  "type": "string"
                }
              },
              "required": [
                "text",
                "voiceId"
              ]
            }
          },
          "options": {
            "description": "Provider-specific parameters.",
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {}
          },
          "idempotencyKey": {
            "description": "Stable retry key. Reuse it only when retrying the identical request so it is never billed twice.",
            "type": "string",
            "minLength": 1,
            "maxLength": 128
          }
        },
        "required": [
          "capability"
        ]
      }
      ```
    </Accordion>

    **Output:** MCP text content holding JSON; errors set `isError`.

    ```json Example call theme={null}
    {
      "name": "summer_generate_audio",
      "arguments": {
        "capability": "text_to_speech"
      }
    }
    ```
  </Tab>
</Tabs>

***

### summer\_generate\_image

On the local MCP (`summer-engine` npm) and the hosted MCP.

<Tabs>
  <Tab title="Local MCP">
    Generate an image using AI models via Summer Engine Studio.

    Known models:

    * "nano-banana-2" (default) — High quality, supports txt2img and img2img
    * "gemini-flash" — Google Gemini 2.5 Flash, fast
    * "flux-2" — FLUX.2, good for specific styles

    Model ids are an ALLOWLIST, not a passthrough. An unrecognised id is rejected
    with 400 and the response lists every accepted id — it is not silently swapped.

    Two modes:

    * txt2img (default): just pass prompt
    * img2img (edit): pass prompt + referenceImageUrl to edit/transform an existing image

    Style presets: "realistic" (default), "cartoon", "anime", "none"

    For an alpha PNG, set removeBackground: true. Prompt wording alone does not
    guarantee transparency; background removal runs server-side after generation.

    The 'options' object is passed directly to the AI provider for full control.

    Returns the asset with fileUrl (hosted) and localPath (temp file on disk).
    Use the Read tool on localPath to show the image to the user for approval.

    Cloud tool — runs on Summer's servers and works WITHOUT the Summer Engine app open.
    Requires authentication: run 'npx -y summer-engine\@latest login' first.

    | | |
    | - | - |
    | **Needs** | Signed in: `summer login` |
    | **Effects** | writes files, uses the network |
    | **CLI** | `summer tool generate-image --args '<json>'` |

    **Use when:**

    * creating concept art, textures, or sprites from a prompt
    * transforming an existing image given a reference URL

    **Inputs:**

    | Input | Type | Required | Description |
    | - | - | - | - |
    | `prompt` | string | Yes | Description of the image to generate |
    | `model` | string | No | Model name or full provider ID Default `"nano-banana-2"`. |
    | `style` | string | No | Style preset: realistic, cartoon, anime, or 'none' to skip Default `"realistic"`. |
    | `referenceImageUrl` | string | No | Source image URL for img2img / edit mode. The prompt describes how to transform this image. |
    | `removeBackground` | boolean | No | Remove the background server-side and return an alpha PNG for sprites, icons, or isolated objects. |
    | `options` | object | No | Provider-specific params (guidance\_scale, seed, image\_size, negative\_prompt, etc.) |

    <Accordion title="Input JSON schema">
      ```json theme={null}
      {
        "type": "object",
        "properties": {
          "prompt": {
            "type": "string",
            "description": "Description of the image to generate"
          },
          "model": {
            "type": "string",
            "default": "nano-banana-2",
            "description": "Model name or full provider ID"
          },
          "style": {
            "type": "string",
            "default": "realistic",
            "description": "Style preset: realistic, cartoon, anime, or 'none' to skip"
          },
          "referenceImageUrl": {
            "type": "string",
            "description": "Source image URL for img2img / edit mode. The prompt describes how to transform this image."
          },
          "removeBackground": {
            "type": "boolean",
            "description": "Remove the background server-side and return an alpha PNG for sprites, icons, or isolated objects."
          },
          "options": {
            "type": "object",
            "additionalProperties": {},
            "description": "Provider-specific params (guidance_scale, seed, image_size, negative_prompt, etc.)"
          }
        },
        "required": [
          "prompt"
        ],
        "additionalProperties": false
      }
      ```
    </Accordion>

    **Output:** MCP text content holding JSON; errors set `isError`. From the tool's own description: Returns the asset with fileUrl (hosted) and localPath (temp file on disk).

    ```json Example call theme={null}
    {
      "name": "summer_generate_image",
      "arguments": {
        "prompt": "<prompt>"
      }
    }
    ```
  </Tab>

  <Tab title="Hosted MCP">
    Generate or edit an image. Models are an allowlist (default "nano-banana-2"); an unknown id returns the accepted ids. Pass referenceImageUrl (public URL) to edit an image. Set removeBackground for an alpha PNG. Runs on Summer servers; the asset lands in the user's Summer library, where the local engine can import it with [`summer_import_asset_by_id`](/mcp/tools/create-assets#summer_import_asset_by_id).

    | | |
    | - | - |
    | **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |
    | **Hints** | `openWorldHint` |

    **Inputs:**

    | Input | Type | Required | Description |
    | - | - | - | - |
    | `prompt` | string | Yes | Description of the image, or how to transform the reference image. Length 1 to …. |
    | `model` | string | No | Image model id, e.g. nano-banana-2, gemini-flash, flux-2. |
    | `style` | string | No | Style preset: realistic (default), cartoon, anime, none. |
    | `aspectRatio` | string | No | Aspect ratio, e.g. 1:1 (default), 16:9, 9:16. |
    | `numImages` | integer | No | Range 1 to 4. |
    | `referenceImageUrl` | string | No | Public image URL for edit mode. |
    | `removeBackground` | boolean | No | |
    | `title` | string | No | Length 0 to 200. |
    | `options` | object | No | Provider-specific parameters. |
    | `idempotencyKey` | string | No | Stable retry key. Reuse it only when retrying the identical request so it is never billed twice. Length 1 to 128. |

    <Accordion title="Input JSON schema">
      ```json theme={null}
      {
        "type": "object",
        "properties": {
          "prompt": {
            "description": "Description of the image, or how to transform the reference image.",
            "type": "string",
            "minLength": 1
          },
          "model": {
            "description": "Image model id, e.g. nano-banana-2, gemini-flash, flux-2.",
            "type": "string"
          },
          "style": {
            "description": "Style preset: realistic (default), cartoon, anime, none.",
            "type": "string"
          },
          "aspectRatio": {
            "description": "Aspect ratio, e.g. 1:1 (default), 16:9, 9:16.",
            "type": "string"
          },
          "numImages": {
            "type": "integer",
            "minimum": 1,
            "maximum": 4
          },
          "referenceImageUrl": {
            "description": "Public image URL for edit mode.",
            "type": "string",
            "format": "uri"
          },
          "removeBackground": {
            "type": "boolean"
          },
          "title": {
            "type": "string",
            "maxLength": 200
          },
          "options": {
            "description": "Provider-specific parameters.",
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {}
          },
          "idempotencyKey": {
            "description": "Stable retry key. Reuse it only when retrying the identical request so it is never billed twice.",
            "type": "string",
            "minLength": 1,
            "maxLength": 128
          }
        },
        "required": [
          "prompt"
        ]
      }
      ```
    </Accordion>

    **Output:** MCP text content holding JSON; errors set `isError`.

    ```json Example call theme={null}
    {
      "name": "summer_generate_image",
      "arguments": {
        "prompt": "<prompt>"
      }
    }
    ```
  </Tab>
</Tabs>

***

### summer\_generate\_motion

On the local MCP (`summer-engine` npm) and the hosted MCP.

<Tabs>
  <Tab title="Local MCP">
    Generate animation clips for a rigged 3D model via Summer Engine Studio.

    Backends (pick one):

    * "meshy-library" (default) — a curated mocap clip by motionName on a
      Summer-rigged humanoid (rigAssetId from [`summer_generate_3d`](/mcp/tools/create-assets#summer_generate_3d) with
      options.rig=true). Fast (\~30s), cheap, real mocap quality.
      Names that always work: idle, walk, run, jump, attack; anything else must
      be an exact library name.
    * "text-to-motion" — custom 2-second clips (60 frames) from text prompts on
      ANY of your own rigged models: humanoid, animal, creature, cartoon plant,
      prop (GLB/FBX 3d\_model, one skinned armature, 5-70 bones). Use it for
      actions the library lacks (nod, bow, shrug, wave with the right arm) and
      for non-humanoid rigs. Pass prompt or prompts (1-8), optional takes (1-4),
      cfgScale (1.5-8, default 3; 5 for clearer gestures), and lockJoints for
      rooted characters (e.g. \["Hips","Spine"] on a plant; never on characters
      that walk). Human-style bone names (Hips, Spine, LeftArm...) animate far
      better, even on non-humans. Jobs take \~1-2 min; result.assets lists one
      animation asset per prompt x take.

    Each clip (meshy: each motion; text-to-motion: each prompt x take) is billed.
    State the clip list and estimated cost and confirm with the user before
    spending.

    By default, waits for completion (up to 10 min) and returns the result directly.
    Set wait=false to get the jobId immediately and poll with [`summer_check_job`](/mcp/tools/create-assets#summer_check_job).
    Import finished clips with [`summer_import_asset_by_id`](/mcp/tools/create-assets#summer_import_asset_by_id).

    Errors: backend\_unavailable means text-to-motion is not enabled on this server
    yet — use meshy-library for humanoids and do not retry. Job failures starting
    "text\_motion:" (no skinned armature, too many/few joints, unknown joint) are
    input problems and are refunded; fix the rig or request instead of retrying.

    Cloud tool — runs on Summer's servers and works WITHOUT the Summer Engine app open.
    Requires authentication: run 'npx -y summer-engine\@latest login' first.

    | | |
    | - | - |
    | **Needs** | Signed in: `summer login` |
    | **Effects** | uses the network |
    | **CLI** | `summer tool generate-motion --args '<json>'` |

    **Use when:**

    * adding idle, walk, run, or combat clips to a rigged character
    * "make my character walk / run / swing a sword"
    * "I need an idle animation for the rigged NPC"
    * a custom action the curated library lacks — nod, bow, shrug, wave with the right arm
    * animating a non-humanoid rig — a talking flower, animal, creature, turret or prop

    **Do not use when:**

    * the target model is not rigged — rig it first
    * the motion is mechanical (doors, vehicles, cameras) — animate with a script or AnimationPlayer

    **Inputs:**

    | Input | Type | Required | Description |
    | - | - | - | - |
    | `rigAssetId` | string | Yes | Asset ID of the rigged 3d\_model. meshy-library: a Summer-rigged humanoid (summer\_generate\_3d with options.rig=true). text-to-motion: any of your own rigged GLB/FBX models |
    | `backend` | "meshy-library" \| "text-to-motion" | No | meshy-library (default): curated humanoid mocap clip by motionName. text-to-motion: custom clips from text prompts on any of your own rigs (humanoid, animal, creature, plant, prop) Default `"meshy-library"`. |
    | `motionName` | string | No | meshy-library only (required there): curated motion name — idle, walk, run, jump, attack, or an exact library name |
    | `prompt` | string | No | text-to-motion: one action as a verb phrase, e.g. 'waves hello with the right arm' (1-300 chars). Shorthand for prompts: \[prompt] Length 1 to 300. |
    | `prompts` | any\[] | No | text-to-motion: 1-8 actions, one clip each (each 1-300 chars) Items 1 to 8. |
    | `takes` | integer | No | text-to-motion: variations per prompt, 1-4 (default 1). Every take is a billed clip Range 1 to 4. |
    | `lockJoints` | string\[] | No | text-to-motion: bone names held still, e.g. \['Hips','Spine'] for a rooted plant. Never on characters that walk or jump |
    | `cfgScale` | number | No | text-to-motion: prompt adherence 1.5-8 (default 3); 5 for bigger, clearer gestures on stylized rigs Range 1.5 to 8. |
    | `idempotencyKey` | string | No | Stable retry key so the same logical request is not billed or queued twice |
    | `wait` | boolean | No | Wait for completion (default true, up to 10 min). Set false to get jobId immediately. Default `true`. |
    | `options` | object | No | Backend-specific passthrough |

    <Accordion title="Input JSON schema">
      ```json theme={null}
      {
        "type": "object",
        "properties": {
          "rigAssetId": {
            "type": "string",
            "description": "Asset ID of the rigged 3d_model. meshy-library: a Summer-rigged humanoid (summer_generate_3d with options.rig=true). text-to-motion: any of your own rigged GLB/FBX models"
          },
          "backend": {
            "type": "string",
            "enum": [
              "meshy-library",
              "text-to-motion"
            ],
            "default": "meshy-library",
            "description": "meshy-library (default): curated humanoid mocap clip by motionName. text-to-motion: custom clips from text prompts on any of your own rigs (humanoid, animal, creature, plant, prop)"
          },
          "motionName": {
            "type": "string",
            "description": "meshy-library only (required there): curated motion name — idle, walk, run, jump, attack, or an exact library name"
          },
          "prompt": {
            "type": "string",
            "minLength": 1,
            "maxLength": 300,
            "description": "text-to-motion: one action as a verb phrase, e.g. 'waves hello with the right arm' (1-300 chars). Shorthand for prompts: [prompt]"
          },
          "prompts": {
            "type": "array",
            "items": {
              "$ref": "#/properties/prompt"
            },
            "minItems": 1,
            "maxItems": 8,
            "description": "text-to-motion: 1-8 actions, one clip each (each 1-300 chars)"
          },
          "takes": {
            "type": "integer",
            "minimum": 1,
            "maximum": 4,
            "description": "text-to-motion: variations per prompt, 1-4 (default 1). Every take is a billed clip"
          },
          "lockJoints": {
            "type": "array",
            "items": {
              "type": "string",
              "minLength": 1
            },
            "description": "text-to-motion: bone names held still, e.g. ['Hips','Spine'] for a rooted plant. Never on characters that walk or jump"
          },
          "cfgScale": {
            "type": "number",
            "minimum": 1.5,
            "maximum": 8,
            "description": "text-to-motion: prompt adherence 1.5-8 (default 3); 5 for bigger, clearer gestures on stylized rigs"
          },
          "idempotencyKey": {
            "type": "string",
            "description": "Stable retry key so the same logical request is not billed or queued twice"
          },
          "wait": {
            "type": "boolean",
            "default": true,
            "description": "Wait for completion (default true, up to 10 min). Set false to get jobId immediately."
          },
          "options": {
            "type": "object",
            "additionalProperties": {},
            "description": "Backend-specific passthrough"
          }
        },
        "required": [
          "rigAssetId"
        ],
        "additionalProperties": false
      }
      ```
    </Accordion>

    **Output:** MCP text content holding JSON; errors set `isError`.

    ```json Example call theme={null}
    {
      "name": "summer_generate_motion",
      "arguments": {
        "rigAssetId": "<rigAssetId>"
      }
    }
    ```
  </Tab>

  <Tab title="Hosted MCP">
    Start an animation clip job for a Meshy-rigged humanoid (rigAssetId from [`summer_generate_3d`](/mcp/tools/create-assets#summer_generate_3d) with rig=true). motionName from the curated set: idle, walk, run, sprint, jump, attack\_sword, attack\_punch, block, dodge\_left, hit\_react, death, wave, dance and more. Returns a jobId: poll [`summer_check_job`](/mcp/tools/create-assets#summer_check_job). Runs on Summer servers; the asset lands in the user's Summer library, where the local engine can import it with [`summer_import_asset_by_id`](/mcp/tools/create-assets#summer_import_asset_by_id).

    | | |
    | - | - |
    | **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |
    | **Hints** | `openWorldHint` |

    **Inputs:**

    | Input | Type | Required | Description |
    | - | - | - | - |
    | `rigAssetId` | string | Yes | Length 1 to …. |
    | `backend` | "meshy-library" | No | Default `"meshy-library"`. |
    | `motionName` | string | Yes | Length 1 to …. |
    | `options` | object | No | Provider-specific parameters. |
    | `idempotencyKey` | string | No | Stable retry key. Reuse it only when retrying the identical request so it is never billed twice. Length 1 to 128. |

    <Accordion title="Input JSON schema">
      ```json theme={null}
      {
        "type": "object",
        "properties": {
          "rigAssetId": {
            "type": "string",
            "minLength": 1
          },
          "backend": {
            "default": "meshy-library",
            "type": "string",
            "enum": [
              "meshy-library"
            ]
          },
          "motionName": {
            "type": "string",
            "minLength": 1
          },
          "options": {
            "description": "Provider-specific parameters.",
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {}
          },
          "idempotencyKey": {
            "description": "Stable retry key. Reuse it only when retrying the identical request so it is never billed twice.",
            "type": "string",
            "minLength": 1,
            "maxLength": 128
          }
        },
        "required": [
          "rigAssetId",
          "motionName"
        ]
      }
      ```
    </Accordion>

    **Output:** MCP text content holding JSON; errors set `isError`. From the tool's own description: Returns a jobId: poll summer\_check\_job.

    ```json Example call theme={null}
    {
      "name": "summer_generate_motion",
      "arguments": {
        "rigAssetId": "<rigAssetId>",
        "motionName": "<motionName>"
      }
    }
    ```
  </Tab>
</Tabs>

***

### summer\_generate\_video

On the local MCP (`summer-engine` npm) and the hosted MCP.

<Tabs>
  <Tab title="Local MCP">
    Generate a video using AI models via Summer Engine Studio.

    Known models (text-to-video):

    * "ltx" (default) — LTX Video, fast
    * "kling" — Kling 2 Master, high quality
    * "kling-turbo" — Kling 2.5 Turbo Pro
    * "minimax" — MiniMax
    * "veo3" — Google Veo 3, premium

    Known models (image-to-video, when imageUrl provided):

    * "ltx" (default), "kling", "minimax"

    If imageUrl is provided, switches to image-to-video mode.
    Pass provider-specific params in 'options' (negative\_prompt, num\_frames, etc.).

    Returns the generated video URL and asset metadata.
    Cloud tool — runs on Summer's servers and works WITHOUT the Summer Engine app open.
    Requires authentication: run 'npx -y summer-engine\@latest login' first.

    | | |
    | - | - |
    | **Needs** | Signed in: `summer login` |
    | **Effects** | uses the network |
    | **CLI** | `summer tool generate-video --args '<json>'` |

    **Use when:**

    * creating cutscene, trailer, or reference footage from a prompt
    * "make a short intro cinematic from this concept art"
    * "a 5-second clip of the castle at sunset for the trailer"

    **Do not use when:**

    * a looping in-game animation or sprite frames — [`summer_generate_image`](/mcp/tools/create-assets#summer_generate_image) / skill/sprite-sheet

    **Inputs:**

    | Input | Type | Required | Description |
    | - | - | - | - |
    | `prompt` | string | Yes | Description of the video content |
    | `model` | string | No | Model name: ltx, kling, kling-turbo, minimax, veo3 (or any new model) Default `"ltx"`. |
    | `imageUrl` | string | No | Source image URL — if provided, uses image-to-video mode |
    | `duration` | number | No | Duration in seconds (5 or 10) Default `5`. |
    | `aspectRatio` | string | No | Aspect ratio: 16:9, 9:16, 1:1, 4:3 Default `"16:9"`. |
    | `options` | object | No | Provider-specific params (negative\_prompt, num\_frames, guidance\_scale, etc.) |

    <Accordion title="Input JSON schema">
      ```json theme={null}
      {
        "type": "object",
        "properties": {
          "prompt": {
            "type": "string",
            "description": "Description of the video content"
          },
          "model": {
            "type": "string",
            "default": "ltx",
            "description": "Model name: ltx, kling, kling-turbo, minimax, veo3 (or any new model)"
          },
          "imageUrl": {
            "type": "string",
            "description": "Source image URL — if provided, uses image-to-video mode"
          },
          "duration": {
            "type": "number",
            "default": 5,
            "description": "Duration in seconds (5 or 10)"
          },
          "aspectRatio": {
            "type": "string",
            "default": "16:9",
            "description": "Aspect ratio: 16:9, 9:16, 1:1, 4:3"
          },
          "options": {
            "type": "object",
            "additionalProperties": {},
            "description": "Provider-specific params (negative_prompt, num_frames, guidance_scale, etc.)"
          }
        },
        "required": [
          "prompt"
        ],
        "additionalProperties": false
      }
      ```
    </Accordion>

    **Output:** MCP text content holding JSON; errors set `isError`. From the tool's own description: Returns the generated video URL and asset metadata.

    ```json Example call theme={null}
    {
      "name": "summer_generate_video",
      "arguments": {
        "prompt": "<prompt>"
      }
    }
    ```
  </Tab>

  <Tab title="Hosted MCP">
    Generate a video from text, or from a public image URL (image-to-video). Models: ltx (default), kling, kling-turbo, minimax, veo3. Costs more than images; confirm with the user. Runs on Summer servers; the asset lands in the user's Summer library, where the local engine can import it with [`summer_import_asset_by_id`](/mcp/tools/create-assets#summer_import_asset_by_id).

    | | |
    | - | - |
    | **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |
    | **Hints** | `openWorldHint` |

    **Inputs:**

    | Input | Type | Required | Description |
    | - | - | - | - |
    | `prompt` | string | Yes | Description of the video content. Length 1 to …. |
    | `model` | string | No | |
    | `imageUrl` | string | No | Public source image URL; switches to image-to-video. |
    | `duration` | 5 \| 10 | No | Seconds: 5 (default) or 10. |
    | `aspectRatio` | string | No | 16:9 (default), 9:16, 1:1, 4:3. |
    | `options` | object | No | Provider-specific parameters. |
    | `idempotencyKey` | string | No | Stable retry key. Reuse it only when retrying the identical request so it is never billed twice. Length 1 to 128. |

    <Accordion title="Input JSON schema">
      ```json theme={null}
      {
        "type": "object",
        "properties": {
          "prompt": {
            "description": "Description of the video content.",
            "type": "string",
            "minLength": 1
          },
          "model": {
            "type": "string"
          },
          "imageUrl": {
            "description": "Public source image URL; switches to image-to-video.",
            "type": "string",
            "format": "uri"
          },
          "duration": {
            "description": "Seconds: 5 (default) or 10.",
            "anyOf": [
              {
                "type": "number",
                "const": 5
              },
              {
                "type": "number",
                "const": 10
              }
            ]
          },
          "aspectRatio": {
            "description": "16:9 (default), 9:16, 1:1, 4:3.",
            "type": "string"
          },
          "options": {
            "description": "Provider-specific parameters.",
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {}
          },
          "idempotencyKey": {
            "description": "Stable retry key. Reuse it only when retrying the identical request so it is never billed twice.",
            "type": "string",
            "minLength": 1,
            "maxLength": 128
          }
        },
        "required": [
          "prompt"
        ]
      }
      ```
    </Accordion>

    **Output:** MCP text content holding JSON; errors set `isError`.

    ```json Example call theme={null}
    {
      "name": "summer_generate_video",
      "arguments": {
        "prompt": "<prompt>"
      }
    }
    ```
  </Tab>
</Tabs>

***

### summer\_get\_asset

On the local MCP (`summer-engine` npm) and the hosted MCP.

<Tabs>
  <Tab title="Local MCP">
    Fetch one asset by exact Summer asset ID.

    Use this after a generation job returns assetId/rigAssetId/animationAssetId, or
    after [`summer_list_my_assets`](/mcp/tools/create-assets#summer_list_my_assets)/search results when you need the stable file URL,
    download URL, viewer URL, metadata, license, visibility, parent chain, or
    provider details.

    Cloud tool — works WITHOUT the Summer Engine app open.

    | | |
    | - | - |
    | **Needs** | Signed in: `summer login` |
    | **Effects** | uses the network |
    | **CLI** | `summer tool get-asset --args '<json>'` |

    **Use when:**

    * a generation job returned an asset id and you need its file URL or metadata
    * confirming license or visibility before reuse

    **Inputs:**

    | Input | Type | Required | Description |
    | - | - | - | - |
    | `assetId` | string | Yes | Summer ArtAssets id |

    <Accordion title="Input JSON schema">
      ```json theme={null}
      {
        "type": "object",
        "properties": {
          "assetId": {
            "type": "string",
            "description": "Summer ArtAssets id"
          }
        },
        "required": [
          "assetId"
        ],
        "additionalProperties": false
      }
      ```
    </Accordion>

    **Output:** MCP text content holding JSON; errors set `isError`.

    ```json Example call theme={null}
    {
      "name": "summer_get_asset",
      "arguments": {
        "assetId": "<assetId>"
      }
    }
    ```
  </Tab>

  <Tab title="Hosted MCP">
    Fetch one asset by exact Summer asset id: file and viewer URLs, metadata, license, visibility, parent chain.

    | | |
    | - | - |
    | **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |
    | **Hints** | `readOnlyHint` |

    **Inputs:**

    | Input | Type | Required | Description |
    | - | - | - | - |
    | `assetId` | string | Yes | Length 1 to …. |

    <Accordion title="Input JSON schema">
      ```json theme={null}
      {
        "type": "object",
        "properties": {
          "assetId": {
            "type": "string",
            "minLength": 1
          }
        },
        "required": [
          "assetId"
        ]
      }
      ```
    </Accordion>

    **Output:** MCP text content holding JSON; errors set `isError`.

    ```json Example call theme={null}
    {
      "name": "summer_get_asset",
      "arguments": {
        "assetId": "<assetId>"
      }
    }
    ```
  </Tab>
</Tabs>

***

### summer\_get\_asset\_download\_url

On the local MCP (`summer-engine` npm) and the hosted MCP.

<Tabs>
  <Tab title="Local MCP">
    Get a downloadable URL for a specific asset file.

    Today this usually returns the Cloudinary URL plus Summer's download proxy.
    The response shape is future-proofed for signed URLs, so prefer this tool over
    handing users raw fileUrl when they explicitly ask to download.

    Cloud tool — works WITHOUT the Summer Engine app open.

    | | |
    | - | - |
    | **Needs** | Signed in: `summer login` |
    | **Effects** | uses the network |
    | **CLI** | `summer tool get-asset-download-url --args '<json>'` |

    **Use when:**

    * the user explicitly asks to download an asset file
    * "give me a link to the model file / the thumbnail"
    * handing a file to something outside the engine (a viewer, a Blender import)

    **Do not use when:**

    * importing into the project (import by asset id instead)

    **Inputs:**

    | Input | Type | Required | Description |
    | - | - | - | - |
    | `assetId` | string | Yes | Summer ArtAssets id |
    | `role` | "primary" \| "thumbnail" | No | Which file to download Default `"primary"`. |

    <Accordion title="Input JSON schema">
      ```json theme={null}
      {
        "type": "object",
        "properties": {
          "assetId": {
            "type": "string",
            "description": "Summer ArtAssets id"
          },
          "role": {
            "type": "string",
            "enum": [
              "primary",
              "thumbnail"
            ],
            "default": "primary",
            "description": "Which file to download"
          }
        },
        "required": [
          "assetId"
        ],
        "additionalProperties": false
      }
      ```
    </Accordion>

    **Output:** MCP text content holding JSON; errors set `isError`. From the tool's own description: The response shape is future-proofed for signed URLs, so prefer this tool over handing users raw fileUrl when they explicitly ask to download.

    ```json Example call theme={null}
    {
      "name": "summer_get_asset_download_url",
      "arguments": {
        "assetId": "<assetId>"
      }
    }
    ```
  </Tab>

  <Tab title="Hosted MCP">
    Get a downloadable URL for an asset file (primary file or thumbnail).

    | | |
    | - | - |
    | **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |
    | **Hints** | `readOnlyHint` |

    **Inputs:**

    | Input | Type | Required | Description |
    | - | - | - | - |
    | `assetId` | string | Yes | Length 1 to …. |
    | `role` | "primary" \| "thumbnail" | No | Default `"primary"`. |

    <Accordion title="Input JSON schema">
      ```json theme={null}
      {
        "type": "object",
        "properties": {
          "assetId": {
            "type": "string",
            "minLength": 1
          },
          "role": {
            "default": "primary",
            "type": "string",
            "enum": [
              "primary",
              "thumbnail"
            ]
          }
        },
        "required": [
          "assetId"
        ]
      }
      ```
    </Accordion>

    **Output:** MCP text content holding JSON; errors set `isError`.

    ```json Example call theme={null}
    {
      "name": "summer_get_asset_download_url",
      "arguments": {
        "assetId": "<assetId>"
      }
    }
    ```
  </Tab>
</Tabs>

***

### summer\_get\_studio\_workflow

On the local MCP (`summer-engine` npm) and the hosted MCP.

<Tabs>
  <Tab title="Local MCP">
    Discover the same Guided workflow recipes shown in Summer Engine Studio.

    Call without workflowId to list every workflow and its support level. Call with
    an id to get the exact starter prompt, ordered steps, required MCP tools, and
    honest limitations. A "manual" support level means Studio still has a visual
    handoff that MCP cannot perform automatically; do not pretend that stage ran.

    | | |
    | - | - |
    | **Needs** | No open editor and no sign-in. Uses your `summer login` sign-in when you have one |
    | **Effects** | uses the network |
    | **CLI** | `summer tool get-studio-workflow --args '<json>'` |

    **Use when:**

    * planning a multi-step asset workflow like sprite sheets or character packs
    * "what is the recommended sequence for a full character with animations?"
    * "which tools do I need for a tileset pack?"

    **Do not use when:**

    * you already know the exact tool to call — call it

    **Inputs:**

    | Input | Type | Required | Description |
    | - | - | - | - |
    | `workflowId` | string | No | Guided workflow id, e.g. sprite-sheet, character-pack, asset-pack, or component-compiler |

    <Accordion title="Input JSON schema">
      ```json theme={null}
      {
        "type": "object",
        "properties": {
          "workflowId": {
            "type": "string",
            "description": "Guided workflow id, e.g. sprite-sheet, character-pack, asset-pack, or component-compiler"
          }
        },
        "additionalProperties": false
      }
      ```
    </Accordion>

    **Output:** MCP text content holding JSON; errors set `isError`.

    ```json Example call theme={null}
    {
      "name": "summer_get_studio_workflow",
      "arguments": {}
    }
    ```
  </Tab>

  <Tab title="Hosted MCP">
    List Summer Studio guided workflows, or get one by id (starter prompt, ordered steps, required tools, limitations). A "manual" stage needs the Studio UI; do not pretend it ran.

    | | |
    | - | - |
    | **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |
    | **Hints** | `readOnlyHint` |

    **Inputs:**

    | Input | Type | Required | Description |
    | - | - | - | - |
    | `workflowId` | string | No | |

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

    **Output:** MCP text content holding JSON; errors set `isError`.

    ```json Example call theme={null}
    {
      "name": "summer_get_studio_workflow",
      "arguments": {}
    }
    ```
  </Tab>
</Tabs>

***

### summer\_import\_asset

On the local MCP (`summer-engine` npm).

Search the asset library and import the best match into the project in one step.

Use when the user wants a specific type of asset added: "Add a tree to the scene", "Import a wooden barrel".
Searches, picks the top result, downloads and imports it, then optionally adds it to the scene.

Requires authentication. If the user gets an auth error, they need to run 'npx -y summer-engine\@latest login' in their terminal first. Summer Engine must be running.

| | |
| - | - |
| **Needs** | Summer Engine open with your project<br />Signed in: `summer login` |
| **Effects** | writes files, changes the open project, uses the network |
| **CLI** | `summer tool import-asset --args '<json>'` |

**Use when:**

* the user asks to add a kind of asset, like 'add a tree to the scene'
* "put a rock / a barrel / a torch in the scene from the library"
* "find me a free chest model and drop it in"

**Do not use when:**

* you already know the exact asset id (import by id instead)
* the asset is at a URL, not in the Summer library — [`summer_import_from_url`](/mcp/tools/create-assets#summer_import_from_url)

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `query` | string | Yes | What to find, e.g. 'low-poly tree', 'wooden crate' |
| `parent` | string | No | Parent node path to add the asset under, e.g. './World'. If omitted, only imports (no scene placement) |
| `scenePath` | string | No | Required with parent. Exact res\:// target scene path. |
| `assetType` | "2d\_image" \| "animation" \| "3d\_model" \| "audio" \| "music" \| "all" | No | Preferred asset type Default `"3d_model"`. |
| `source` | "library" \| "my\_assets" \| "all" | No | Where to search before importing Default `"all"`. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "query": {
        "type": "string",
        "description": "What to find, e.g. 'low-poly tree', 'wooden crate'"
      },
      "parent": {
        "type": "string",
        "description": "Parent node path to add the asset under, e.g. './World'. If omitted, only imports (no scene placement)"
      },
      "scenePath": {
        "type": "string",
        "description": "Required with parent. Exact res:// target scene path."
      },
      "assetType": {
        "type": "string",
        "enum": [
          "2d_image",
          "animation",
          "3d_model",
          "audio",
          "music",
          "all"
        ],
        "default": "3d_model",
        "description": "Preferred asset type"
      },
      "source": {
        "type": "string",
        "enum": [
          "library",
          "my_assets",
          "all"
        ],
        "default": "all",
        "description": "Where to search before importing"
      }
    },
    "required": [
      "query"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Output:** MCP text content holding JSON; errors set `isError`.

```json Example call theme={null}
{
  "name": "summer_import_asset",
  "arguments": {
    "query": "low-poly tree"
  }
}
```

***

### summer\_import\_asset\_by\_id

On the local MCP (`summer-engine` npm).

Import an exact Summer asset ID into the current project.

Use this when the asset was just generated, selected from my assets, or returned
by search. Unlike [`summer_import_asset`](/mcp/tools/create-assets#summer_import_asset), this does not search or guess: it fetches
the asset by ID, downloads it through Summer Engine, and runs Godot's import
pipeline. For 3D models, pass parent and scenePath to instantiate it in that
exact scene; it does not need to be the active editor tab.

Requires the Summer Engine app to be open with the project loaded (generation
itself does not — only this import step does).

| | |
| - | - |
| **Needs** | Summer Engine open with your project<br />Signed in: `summer login` |
| **Effects** | writes files, changes the open project, uses the network |
| **CLI** | `summer tool import-asset-by-id --args '<json>'` |

**Use when:**

* importing a just-generated or searched asset without guessing
* placing a 3D model into an exact scene by parent path

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `assetId` | string | Yes | Summer ArtAssets id |
| `path` | string | No | Optional target res\:// path. If omitted, a path is inferred from asset type and filename. |
| `parent` | string | No | Optional parent node path. For 3D models only; imports and instantiates under this node. |
| `scenePath` | string | No | Required with parent. Exact res\:// scene that receives the 3D model. |
| `name` | string | No | Optional scene node name when parent is provided. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "assetId": {
        "type": "string",
        "description": "Summer ArtAssets id"
      },
      "path": {
        "type": "string",
        "description": "Optional target res:// path. If omitted, a path is inferred from asset type and filename."
      },
      "parent": {
        "type": "string",
        "description": "Optional parent node path. For 3D models only; imports and instantiates under this node."
      },
      "scenePath": {
        "type": "string",
        "description": "Required with parent. Exact res:// scene that receives the 3D model."
      },
      "name": {
        "type": "string",
        "description": "Optional scene node name when parent is provided."
      }
    },
    "required": [
      "assetId"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Output:** MCP text content holding JSON; errors set `isError`.

```json Example call theme={null}
{
  "name": "summer_import_asset_by_id",
  "arguments": {
    "assetId": "<assetId>"
  }
}
```

***

### summer\_import\_from\_url

On the local MCP (`summer-engine` npm).

Download a file from a URL and import it into the project. Triggers Godot's full import pipeline — generates .import files, extracts textures from .glb models, creates materials.

Use this for:

* 3D models (.glb, .gltf, .obj)
* Textures (.png, .jpg, .webp)
* Audio (.ogg, .wav, .mp3)

The path is auto-inferred from the URL filename if not specified. After import, the asset is immediately usable in scenes.

| | |
| - | - |
| **Needs** | Summer Engine open with your project |
| **Effects** | writes files, uses the network |
| **CLI** | `summer tool import-from-url --args '<json>'` |

**Use when:**

* importing a model, texture, or audio file from an external URL
* "grab this .glb from the link and add it to my project"
* "download this texture from the web into res\://"

**Do not use when:**

* several files at once — [`summer_import_from_url_batch`](/mcp/tools/create-assets#summer_import_from_url_batch)
* searching the Summer library instead of a known URL — [`summer_import_asset`](/mcp/tools/create-assets#summer_import_asset)

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `url` | string | Yes | HTTP(S) URL to download from |
| `path` | string | No | Target path in project, e.g. 'res\://assets/player.glb'. Auto-inferred from URL if omitted. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "url": {
        "type": "string",
        "description": "HTTP(S) URL to download from"
      },
      "path": {
        "type": "string",
        "description": "Target path in project, e.g. 'res://assets/player.glb'. Auto-inferred from URL if omitted."
      }
    },
    "required": [
      "url"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Output:** MCP text content holding JSON; errors set `isError`.

```json Example call theme={null}
{
  "name": "summer_import_from_url",
  "arguments": {
    "url": "<url>"
  }
}
```

***

### summer\_import\_from\_url\_batch

On the local MCP (`summer-engine` npm).

Download multiple files from URLs in one operation. Performs a single filesystem scan after all downloads, which is faster than importing one at a time.

| | |
| - | - |
| **Needs** | Summer Engine open with your project |
| **Effects** | writes files, uses the network |
| **CLI** | `summer tool import-from-url-batch --args '<json>'` |

**Use when:**

* importing several related files, like a model plus its textures
* "download the model plus its three textures together"
* "pull all these sound files into the project"

**Do not use when:**

* one file — [`summer_import_from_url`](/mcp/tools/create-assets#summer_import_from_url)

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `imports` | object\[] | Yes | Array of \{url, path} objects |
| `imports[].url` | string | Yes | URL to download |
| `imports[].path` | string | Yes | Target path in project |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "imports": {
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "url": {
              "type": "string",
              "description": "URL to download"
            },
            "path": {
              "type": "string",
              "description": "Target path in project"
            }
          },
          "required": [
            "url",
            "path"
          ],
          "additionalProperties": false
        },
        "description": "Array of {url, path} objects"
      }
    },
    "required": [
      "imports"
    ],
    "additionalProperties": false
  }
  ```
</Accordion>

**Output:** MCP text content holding JSON; errors set `isError`.

```json Example call theme={null}
{
  "name": "summer_import_from_url_batch",
  "arguments": {
    "imports": [
      {
        "url": "<url>",
        "path": "<path>"
      }
    ]
  }
}
```

***

### summer\_import\_hdri

On the local MCP (`summer-engine` npm).

Search Poly Haven's CC0 HDRI library and import one as environment lighting.

The single cheapest visual-quality upgrade for a 3D scene: a real HDRI sky lights
and reflects the whole world. Searches \~1,000 CC0 HDRIs on Poly Haven's public API
(no account, no key), downloads the .hdr/.exr through the engine's import pipeline
into res\://sky/, and returns a ready-to-run [`summer_run_script`](/mcp/tools/build#summer_run_script) snippet that wires it
into the WorldEnvironment (PanoramaSkyMaterial + sky ambient/reflections).

Pass query ("sunset beach", "night city", "studio") to search, or assetId for an
exact Poly Haven id. resolution 2k is right for most games; 4k for hero skies.
All results are CC0 — no attribution required.

Requires the Summer Engine app to be open with the project loaded (the download
runs through the engine). No Summer login needed.

| | |
| - | - |
| **Needs** | Summer Engine open with your project |
| **Effects** | writes files, uses the network |
| **CLI** | `summer tool import-hdri --args '<json>'` |

**Use when:**

* a 3D scene needs real environment lighting and reflections — the cheapest whole-scene visual upgrade
* "give this scene realistic sky lighting" / "add a sunset sky"
* "the 3D scene looks flat and grey"

**Do not use when:**

* the project already has a sky/HDRI to reuse
* a 2D project — HDRIs are 3D environment lighting

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `query` | string | No | What kind of sky/environment, e.g. 'sunset beach', 'overcast field', 'studio'. Omit when assetId is given. |
| `assetId` | string | No | Exact Poly Haven asset id (lowercase slug, e.g. 'kloppenheim\_02'). Skips the search. |
| `resolution` | "1k" \| "2k" \| "4k" | No | HDRI resolution. 2k (default) is right for most games; 4k for hero skies; 1k for quick blockouts. Default `"2k"`. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "query": {
        "type": "string",
        "description": "What kind of sky/environment, e.g. 'sunset beach', 'overcast field', 'studio'. Omit when assetId is given."
      },
      "assetId": {
        "type": "string",
        "description": "Exact Poly Haven asset id (lowercase slug, e.g. 'kloppenheim_02'). Skips the search."
      },
      "resolution": {
        "type": "string",
        "enum": [
          "1k",
          "2k",
          "4k"
        ],
        "default": "2k",
        "description": "HDRI resolution. 2k (default) is right for most games; 4k for hero skies; 1k for quick blockouts."
      }
    },
    "additionalProperties": false
  }
  ```
</Accordion>

**Output:** MCP text content holding JSON; errors set `isError`.

```json Example call theme={null}
{
  "name": "summer_import_hdri",
  "arguments": {}
}
```

***

### summer\_list\_my\_assets

On the local MCP (`summer-engine` npm) and the hosted MCP.

<Tabs>
  <Tab title="Local MCP">
    List or search the signed-in user's generated and uploaded assets.

    Use this after generation jobs complete, when the user says "the model I made",
    "my last character", or when you need to retrieve an asset before importing it
    into the local project.

    Returns exact asset IDs plus file/import URLs. Use [`summer_get_asset`](/mcp/tools/create-assets#summer_get_asset) for full
    metadata or [`summer_import_asset_by_id`](/mcp/tools/create-assets#summer_import_asset_by_id) to import a specific result.

    Cloud tool — works WITHOUT the Summer Engine app open.

    | | |
    | - | - |
    | **Needs** | Signed in: `summer login` |
    | **Effects** | uses the network |
    | **CLI** | `summer tool list-my-assets --args '<json>'` |

    **Use when:**

    * retrieving an asset the user just generated before importing it
    * resolving phrases like 'the model I made' to an exact asset id

    **Inputs:**

    | Input | Type | Required | Description |
    | - | - | - | - |
    | `query` | string | No | Optional search term. Empty string lists recent assets. Default `""`. |
    | `assetType` | "2d\_image" \| "animation" \| "3d\_model" \| "audio" \| "music" \| "all" | No | Filter by asset type Default `"all"`. |
    | `limit` | number | No | Max results (1-20) Default `10`. |

    <Accordion title="Input JSON schema">
      ```json theme={null}
      {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "default": "",
            "description": "Optional search term. Empty string lists recent assets."
          },
          "assetType": {
            "type": "string",
            "enum": [
              "2d_image",
              "animation",
              "3d_model",
              "audio",
              "music",
              "all"
            ],
            "default": "all",
            "description": "Filter by asset type"
          },
          "limit": {
            "type": "number",
            "default": 10,
            "description": "Max results (1-20)"
          }
        },
        "additionalProperties": false
      }
      ```
    </Accordion>

    **Output:** MCP text content holding JSON; errors set `isError`. From the tool's own description: Returns exact asset IDs plus file/import URLs.

    ```json Example call theme={null}
    {
      "name": "summer_list_my_assets",
      "arguments": {}
    }
    ```
  </Tab>

  <Tab title="Hosted MCP">
    List or search the user's own generated and uploaded assets (empty query lists recent). Returns exact asset ids and file URLs.

    | | |
    | - | - |
    | **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |
    | **Hints** | `readOnlyHint` |

    **Inputs:**

    | Input | Type | Required | Description |
    | - | - | - | - |
    | `query` | string | No | Default `""`. |
    | `assetType` | "2d\_image" \| "animation" \| "3d\_model" \| "audio" \| "music" \| "all" | No | Default `"all"`. |
    | `limit` | integer | No | Default `10`. Range 1 to 20. |

    <Accordion title="Input JSON schema">
      ```json theme={null}
      {
        "type": "object",
        "properties": {
          "query": {
            "default": "",
            "type": "string"
          },
          "assetType": {
            "default": "all",
            "type": "string",
            "enum": [
              "2d_image",
              "animation",
              "3d_model",
              "audio",
              "music",
              "all"
            ]
          },
          "limit": {
            "default": 10,
            "type": "integer",
            "minimum": 1,
            "maximum": 20
          }
        }
      }
      ```
    </Accordion>

    **Output:** MCP text content holding JSON; errors set `isError`. From the tool's own description: Returns exact asset ids and file URLs.

    ```json Example call theme={null}
    {
      "name": "summer_list_my_assets",
      "arguments": {}
    }
    ```
  </Tab>
</Tabs>

***

### summer\_remove\_background

On the hosted MCP.

Remove the background from up to eight of the user's image assets (asset ids from [`summer_generate_image`](/mcp/tools/create-assets#summer_generate_image), [`summer_list_my_assets`](/mcp/tools/create-assets#summer_list_my_assets) or the Summer library upload). Returns new alpha PNG assets; the originals are kept. Runs on Summer servers; the asset lands in the user's Summer library, where the local engine can import it with [`summer_import_asset_by_id`](/mcp/tools/create-assets#summer_import_asset_by_id).

| | |
| - | - |
| **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |
| **Hints** | `openWorldHint` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `assetIds` | string\[] | Yes | Items 1 to 8. |
| `idempotencyKey` | string | No | Stable retry key. Reuse it only when retrying the identical request so it is never billed twice. Length 1 to 128. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "assetIds": {
        "minItems": 1,
        "maxItems": 8,
        "type": "array",
        "items": {
          "type": "string",
          "minLength": 1
        }
      },
      "idempotencyKey": {
        "description": "Stable retry key. Reuse it only when retrying the identical request so it is never billed twice.",
        "type": "string",
        "minLength": 1,
        "maxLength": 128
      }
    },
    "required": [
      "assetIds"
    ]
  }
  ```
</Accordion>

**Output:** MCP text content holding JSON; errors set `isError`. From the tool's own description: Returns new alpha PNG assets; the originals are kept.

```json Example call theme={null}
{
  "name": "summer_remove_background",
  "arguments": {
    "assetIds": [
      "<assetId>"
    ]
  }
}
```

***

### summer\_search\_assets

On the local MCP (`summer-engine` npm) and the hosted MCP.

<Tabs>
  <Tab title="Local MCP">
    Search for game assets in the Summer Engine ecosystem. \*\*Free for all users\*\* with rate limits.

    Sources:

    * "library" (default) — Public asset library (25k+ community assets). Free.
    * "my\_assets" — Your own generated/uploaded assets. Free. Query is optional.
    * "all" — Search both library and your assets.

    Uses hybrid search: keywords + semantic similarity. Finds assets by name AND by meaning.
    Returns asset names, types, each asset's art style, preview URLs, and import-ready file URLs.
    Keep a game in ONE art direction: pass style (the game's chosen family) so clashing styles are
    left out, and set preview to see the first results as one numbered picture before importing.
    Curated, open-source and Summer packs come first; people's own public generations only with includeCommunity.

    Cloud tool — works WITHOUT the Summer Engine app open.
    Requires authentication (so we can attribute usage and apply per-user rate limits): run 'npx -y summer-engine\@latest login' first.

    | | |
    | - | - |
    | **Needs** | Signed in: `summer login` |
    | **Effects** | uses the network |
    | **CLI** | `summer tool search-assets --args '<json>'` |

    **Use when:**

    * finding an existing asset in the public library before generating a new one
    * locating a user's generated or uploaded asset by description

    **Do not use when:**

    * you already have the exact asset id (fetch it directly instead)

    **Inputs:**

    | Input | Type | Required | Description |
    | - | - | - | - |
    | `query` | string | Yes | Natural language search, e.g. 'low-poly tree', 'sci-fi weapon'. For my\_assets, can be empty to list recent. |
    | `assetType` | "2d\_image" \| "animation" \| "3d\_model" \| "audio" \| "music" \| "all" | No | Filter by asset type Default `"all"`. |
    | `limit` | number | No | Max results (1-20) Default `10`. |
    | `source` | "library" \| "my\_assets" \| "all" | No | Where to search: library (public 25k+), my\_assets (your generated assets), all Default `"library"`. |
    | `style` | "realistic" \| "stylized-lowpoly" \| "toon" \| "pixel" \| "hand-painted" \| "voxel" | No | The game's one art direction: clashing styles are left out, matches come first |
    | `preview` | boolean | No | Also return one picture of the first 9 results, numbered in order, to see them before importing Default `false`. |
    | `includeCommunity` | boolean | No | Also include people's own public AI generations Default `false`. |

    <Accordion title="Input JSON schema">
      ```json theme={null}
      {
        "type": "object",
        "properties": {
          "query": {
            "type": "string",
            "description": "Natural language search, e.g. 'low-poly tree', 'sci-fi weapon'. For my_assets, can be empty to list recent."
          },
          "assetType": {
            "type": "string",
            "enum": [
              "2d_image",
              "animation",
              "3d_model",
              "audio",
              "music",
              "all"
            ],
            "default": "all",
            "description": "Filter by asset type"
          },
          "limit": {
            "type": "number",
            "default": 10,
            "description": "Max results (1-20)"
          },
          "source": {
            "type": "string",
            "enum": [
              "library",
              "my_assets",
              "all"
            ],
            "default": "library",
            "description": "Where to search: library (public 25k+), my_assets (your generated assets), all"
          },
          "style": {
            "type": "string",
            "enum": [
              "realistic",
              "stylized-lowpoly",
              "toon",
              "pixel",
              "hand-painted",
              "voxel"
            ],
            "description": "The game's one art direction: clashing styles are left out, matches come first"
          },
          "preview": {
            "type": "boolean",
            "default": false,
            "description": "Also return one picture of the first 9 results, numbered in order, to see them before importing"
          },
          "includeCommunity": {
            "type": "boolean",
            "default": false,
            "description": "Also include people's own public AI generations"
          }
        },
        "required": [
          "query"
        ],
        "additionalProperties": false
      }
      ```
    </Accordion>

    **Output:** MCP text content holding JSON; errors set `isError`. From the tool's own description: Returns asset names, types, each asset's art style, preview URLs, and import-ready file URLs.

    ```json Example call theme={null}
    {
      "name": "summer_search_assets",
      "arguments": {
        "query": "low-poly tree"
      }
    }
    ```
  </Tab>

  <Tab title="Hosted MCP">
    Search game assets: the public Summer library (default, 25k+ community assets), the user's own assets, or both. Hybrid keyword + semantic search. Free, rate limited.

    | | |
    | - | - |
    | **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |
    | **Hints** | `readOnlyHint` |

    **Inputs:**

    | Input | Type | Required | Description |
    | - | - | - | - |
    | `query` | string | Yes | Natural language search, e.g. "low-poly tree". May be empty for my\_assets. |
    | `assetType` | "2d\_image" \| "animation" \| "3d\_model" \| "audio" \| "music" \| "all" | No | Default `"all"`. |
    | `limit` | integer | No | Default `10`. Range 1 to 20. |
    | `source` | "library" \| "my\_assets" \| "all" | No | Default `"library"`. |
    | `preview` | boolean | No | Also return one picture of the first 9 results, numbered in order, to see them before importing. Default `false`. |
    | `style` | "realistic" \| "stylized-lowpoly" \| "toon" \| "pixel" \| "hand-painted" \| "voxel" | No | Keep one art direction: clashing styles are left out, matches first. Use the style the game was given. |
    | `includeCommunity` | boolean | No | Also return people's own public AI generations (curated and open-source packs come first otherwise). Default `false`. |

    <Accordion title="Input JSON schema">
      ```json theme={null}
      {
        "type": "object",
        "properties": {
          "query": {
            "description": "Natural language search, e.g. \"low-poly tree\". May be empty for my_assets.",
            "type": "string"
          },
          "assetType": {
            "default": "all",
            "type": "string",
            "enum": [
              "2d_image",
              "animation",
              "3d_model",
              "audio",
              "music",
              "all"
            ]
          },
          "limit": {
            "default": 10,
            "type": "integer",
            "minimum": 1,
            "maximum": 20
          },
          "source": {
            "default": "library",
            "type": "string",
            "enum": [
              "library",
              "my_assets",
              "all"
            ]
          },
          "preview": {
            "description": "Also return one picture of the first 9 results, numbered in order, to see them before importing.",
            "default": false,
            "type": "boolean"
          },
          "style": {
            "description": "Keep one art direction: clashing styles are left out, matches first. Use the style the game was given.",
            "type": "string",
            "enum": [
              "realistic",
              "stylized-lowpoly",
              "toon",
              "pixel",
              "hand-painted",
              "voxel"
            ]
          },
          "includeCommunity": {
            "description": "Also return people's own public AI generations (curated and open-source packs come first otherwise).",
            "default": false,
            "type": "boolean"
          }
        },
        "required": [
          "query"
        ]
      }
      ```
    </Accordion>

    **Output:** MCP text content holding JSON; errors set `isError`.

    ```json Example call theme={null}
    {
      "name": "summer_search_assets",
      "arguments": {
        "query": "low-poly tree"
      }
    }
    ```
  </Tab>
</Tabs>

***

### summer\_slice\_asset\_sheet

On the local MCP (`summer-engine` npm) and the hosted MCP.

<Tabs>
  <Tab title="Local MCP">
    Detect and crop every distinct game asset from an existing image asset sheet.

    Use the assetId returned by [`summer_generate_image`](/mcp/tools/create-assets#summer_generate_image) (or another Summer image asset).
    The same guided workflow used in Studio removes the sheet background when needed,
    detects named/category-aware bounding boxes, crops each item, and uploads the slices.

    Returns source dimensions plus the generated slice URLs, names, categories, bounding
    boxes, and widget metadata when the sheet contains UI controls.

    Cloud tool — runs on Summer's servers and works WITHOUT the Summer Engine app open.
    Requires authentication: run 'npx -y summer-engine\@latest login' first.

    | | |
    | - | - |
    | **Needs** | Signed in: `summer login` |
    | **Effects** | uses the network |
    | **CLI** | `summer tool slice-asset-sheet --args '<json>'` |

    **Use when:**

    * splitting a generated asset or UI sheet into individually usable assets
    * "cut the generated icon sheet into separate PNGs"
    * "I have one image with 12 props on it, make them individual assets"

    **Do not use when:**

    * a regular animation grid — set hframes/vframes on the Sprite2D instead

    **Inputs:**

    | Input | Type | Required | Description |
    | - | - | - | - |
    | `assetId` | string | Yes | Summer image asset ID to slice, usually returned by summer\_generate\_image |

    <Accordion title="Input JSON schema">
      ```json theme={null}
      {
        "type": "object",
        "properties": {
          "assetId": {
            "type": "string",
            "description": "Summer image asset ID to slice, usually returned by summer_generate_image"
          }
        },
        "required": [
          "assetId"
        ],
        "additionalProperties": false
      }
      ```
    </Accordion>

    **Output:** MCP text content holding JSON; errors set `isError`. From the tool's own description: Returns source dimensions plus the generated slice URLs, names, categories, bounding boxes, and widget metadata when the sheet contains UI controls.

    ```json Example call theme={null}
    {
      "name": "summer_slice_asset_sheet",
      "arguments": {
        "assetId": "<assetId>"
      }
    }
    ```
  </Tab>

  <Tab title="Hosted MCP">
    Detect and crop every distinct asset from an image asset sheet (assetId from [`summer_generate_image`](/mcp/tools/create-assets#summer_generate_image) or the user's library). Returns slice URLs, names, categories and bounding boxes. Runs on Summer servers; the asset lands in the user's Summer library, where the local engine can import it with [`summer_import_asset_by_id`](/mcp/tools/create-assets#summer_import_asset_by_id).

    | | |
    | - | - |
    | **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |
    | **Hints** | `openWorldHint` |

    **Inputs:**

    | Input | Type | Required | Description |
    | - | - | - | - |
    | `assetId` | string | Yes | Length 1 to …. |

    <Accordion title="Input JSON schema">
      ```json theme={null}
      {
        "type": "object",
        "properties": {
          "assetId": {
            "type": "string",
            "minLength": 1
          }
        },
        "required": [
          "assetId"
        ]
      }
      ```
    </Accordion>

    **Output:** MCP text content holding JSON; errors set `isError`. From the tool's own description: Returns slice URLs, names, categories and bounding boxes.

    ```json Example call theme={null}
    {
      "name": "summer_slice_asset_sheet",
      "arguments": {
        "assetId": "<assetId>"
      }
    }
    ```
  </Tab>
</Tabs>

***

### summer\_tool\_bankai\_motion

On the hosted MCP.

Any clip's moves, performed by your character. Upload a character image and a motion clip. Your character performs the exact moves from the clip, with the look taken from your image. Use it for dance clips, fight choreography, game character showcases or animation reference. Requires consent: true (the user owns the media or has consent from every real person in it). Runs on Summer servers; the asset lands in the user's Summer library, where the local engine can import it with [`summer_import_asset_by_id`](/mcp/tools/create-assets#summer_import_asset_by_id).

| | |
| - | - |
| **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |
| **Hints** | `openWorldHint` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `characterImage` | string | Yes | Character image. The character and the scene both come from this image. Full or upper body visible, no occlusion, the character fills at least 5% of the frame. Public https image URL. |
| `motionVideo` | string | Yes | Motion clip. One realistic human performer works best. Public https video URL, 3-30 seconds, at least 340 px on each side. |
| `orientation` | "video" \| "image" | No | Facing Default `"video"`. |
| `tier` | "standard" \| "pro" | No | Quality Default `"standard"`. |
| `keepAudio` | boolean | No | Keep the clip audio Default `true`. |
| `consent` | true | Yes | I own this image and clip or have permission to use them, and every real person shown has agreed. No public figures, no minors.. Must be true: the user attests they own the media or have the consent of every real person in it. |
| `idempotencyKey` | string | No | Stable retry key. Reuse it only when retrying the identical request so it is never billed twice. Length 1 to 128. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "characterImage": {
        "type": "string",
        "format": "uri",
        "description": "Character image. The character and the scene both come from this image. Full or upper body visible, no occlusion, the character fills at least 5% of the frame. Public https image URL."
      },
      "motionVideo": {
        "type": "string",
        "format": "uri",
        "description": "Motion clip. One realistic human performer works best. Public https video URL, 3-30 seconds, at least 340 px on each side."
      },
      "orientation": {
        "type": "string",
        "enum": [
          "video",
          "image"
        ],
        "default": "video",
        "description": "Facing"
      },
      "tier": {
        "type": "string",
        "enum": [
          "standard",
          "pro"
        ],
        "default": "standard",
        "description": "Quality"
      },
      "keepAudio": {
        "type": "boolean",
        "default": true,
        "description": "Keep the clip audio"
      },
      "consent": {
        "type": "boolean",
        "const": true,
        "description": "I own this image and clip or have permission to use them, and every real person shown has agreed. No public figures, no minors.. Must be true: the user attests they own the media or have the consent of every real person in it."
      },
      "idempotencyKey": {
        "type": "string",
        "minLength": 1,
        "maxLength": 128,
        "description": "Stable retry key. Reuse it only when retrying the identical request so it is never billed twice."
      }
    },
    "required": [
      "characterImage",
      "motionVideo",
      "consent"
    ]
  }
  ```
</Accordion>

**Output:** MCP text content holding JSON; errors set `isError`.

```json Example call theme={null}
{
  "name": "summer_tool_bankai_motion",
  "arguments": {
    "characterImage": "<characterImage>",
    "motionVideo": "<motionVideo>",
    "consent": true
  }
}
```

***

### summer\_tool\_bankai\_swap

On the hosted MCP.

Swap the person, product, outfit or background. Keep the shot. Upload a clip, say what to replace and add a reference image. Bankai Swap puts your character, product, outfit or setting into the shot while keeping the motion, camera and timing. Clips over 10 seconds are split into equal parts, swapped part by part and joined back together. Requires consent: true (the user owns the media or has consent from every real person in it). Runs on Summer servers; the asset lands in the user's Summer library, where the local engine can import it with [`summer_import_asset_by_id`](/mcp/tools/create-assets#summer_import_asset_by_id).

| | |
| - | - |
| **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |
| **Hints** | `openWorldHint` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `sourceVideo` | string | Yes | Source clip. mp4 or mov, at least 720 px on each side. Public https video URL, 3-30 seconds, at least 720 px on each side. |
| `subject` | "character" \| "product" \| "outfit" \| "object" \| "background" | No | What are you swapping in? Default `"character"`. |
| `target` | string | Yes | What to replace Length 0 to 200. |
| `referenceImage` | string | Yes | Reference image. A clean, front-facing view of what should appear in the shot. Public https image URL. |
| `referenceImage2` | string | No | Second reference image. Another angle of the same subject. Public https image URL. |
| `tier` | "pro" | No | Quality Default `"pro"`. |
| `keepAudio` | boolean | No | Keep the clip audio Default `true`. |
| `prompt` | string | No | Extra direction Length 0 to 600. |
| `consent` | true | Yes | I own this clip and these images or have permission to use them, and every real person shown has agreed. No public figures, no minors.. Must be true: the user attests they own the media or have the consent of every real person in it. |
| `idempotencyKey` | string | No | Stable retry key. Reuse it only when retrying the identical request so it is never billed twice. Length 1 to 128. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "sourceVideo": {
        "type": "string",
        "format": "uri",
        "description": "Source clip. mp4 or mov, at least 720 px on each side. Public https video URL, 3-30 seconds, at least 720 px on each side."
      },
      "subject": {
        "type": "string",
        "enum": [
          "character",
          "product",
          "outfit",
          "object",
          "background"
        ],
        "default": "character",
        "description": "What are you swapping in?"
      },
      "target": {
        "type": "string",
        "maxLength": 200,
        "description": "What to replace"
      },
      "referenceImage": {
        "type": "string",
        "format": "uri",
        "description": "Reference image. A clean, front-facing view of what should appear in the shot. Public https image URL."
      },
      "referenceImage2": {
        "type": "string",
        "format": "uri",
        "description": "Second reference image. Another angle of the same subject. Public https image URL."
      },
      "tier": {
        "type": "string",
        "enum": [
          "pro"
        ],
        "default": "pro",
        "description": "Quality"
      },
      "keepAudio": {
        "type": "boolean",
        "default": true,
        "description": "Keep the clip audio"
      },
      "prompt": {
        "type": "string",
        "maxLength": 600,
        "description": "Extra direction"
      },
      "consent": {
        "type": "boolean",
        "const": true,
        "description": "I own this clip and these images or have permission to use them, and every real person shown has agreed. No public figures, no minors.. Must be true: the user attests they own the media or have the consent of every real person in it."
      },
      "idempotencyKey": {
        "type": "string",
        "minLength": 1,
        "maxLength": 128,
        "description": "Stable retry key. Reuse it only when retrying the identical request so it is never billed twice."
      }
    },
    "required": [
      "sourceVideo",
      "target",
      "referenceImage",
      "consent"
    ]
  }
  ```
</Accordion>

**Output:** MCP text content holding JSON; errors set `isError`.

```json Example call theme={null}
{
  "name": "summer_tool_bankai_swap",
  "arguments": {
    "sourceVideo": "<sourceVideo>",
    "target": "<target>",
    "referenceImage": "<referenceImage>",
    "consent": true
  }
}
```

***

### summer\_tool\_bankai\_ultra

On the hosted MCP.

Rebuild any shot around your references on Seedance 2.5. Upload a clip and up to two reference images and describe the change: swap the character, restyle the world or replace the product. Seedance 2.5 editing keeps the timing and camera of your clip at 720p. Clips from 4 to 15 seconds. Requires consent: true (the user owns the media or has consent from every real person in it). Runs on Summer servers; the asset lands in the user's Summer library, where the local engine can import it with [`summer_import_asset_by_id`](/mcp/tools/create-assets#summer_import_asset_by_id).

| | |
| - | - |
| **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |
| **Hints** | `openWorldHint` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `sourceVideo` | string | Yes | Source clip. mp4 or mov. Public https video URL, 4-15 seconds. |
| `instruction` | string | Yes | What should change Length 0 to 1500. |
| `referenceImage` | string | Yes | Reference image. Refer to it as @Image1 in your instruction. Public https image URL. |
| `referenceImage2` | string | No | Second reference image. Refer to it as @Image2. Public https image URL. |
| `consent` | true | Yes | I own this media or have permission to use it, and every real person shown has agreed. No public figures, no minors.. Must be true: the user attests they own the media or have the consent of every real person in it. |
| `idempotencyKey` | string | No | Stable retry key. Reuse it only when retrying the identical request so it is never billed twice. Length 1 to 128. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "sourceVideo": {
        "type": "string",
        "format": "uri",
        "description": "Source clip. mp4 or mov. Public https video URL, 4-15 seconds."
      },
      "instruction": {
        "type": "string",
        "maxLength": 1500,
        "description": "What should change"
      },
      "referenceImage": {
        "type": "string",
        "format": "uri",
        "description": "Reference image. Refer to it as @Image1 in your instruction. Public https image URL."
      },
      "referenceImage2": {
        "type": "string",
        "format": "uri",
        "description": "Second reference image. Refer to it as @Image2. Public https image URL."
      },
      "consent": {
        "type": "boolean",
        "const": true,
        "description": "I own this media or have permission to use it, and every real person shown has agreed. No public figures, no minors.. Must be true: the user attests they own the media or have the consent of every real person in it."
      },
      "idempotencyKey": {
        "type": "string",
        "minLength": 1,
        "maxLength": 128,
        "description": "Stable retry key. Reuse it only when retrying the identical request so it is never billed twice."
      }
    },
    "required": [
      "sourceVideo",
      "instruction",
      "referenceImage",
      "consent"
    ]
  }
  ```
</Accordion>

**Output:** MCP text content holding JSON; errors set `isError`.

```json Example call theme={null}
{
  "name": "summer_tool_bankai_ultra",
  "arguments": {
    "sourceVideo": "<sourceVideo>",
    "instruction": "<instruction>",
    "referenceImage": "<referenceImage>",
    "consent": true
  }
}
```

***

### summer\_tool\_camera\_moves

On the hosted MCP.

Photo to a cinematic dolly, jib or focus pull. Pick a camera move and turn any still into a 1080p shot: dolly in or out, track left or right, jib up or down, or a focus shift. Great for key art, screenshots and product shots. Runs on Summer servers; the asset lands in the user's Summer library, where the local engine can import it with [`summer_import_asset_by_id`](/mcp/tools/create-assets#summer_import_asset_by_id).

| | |
| - | - |
| **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |
| **Hints** | `openWorldHint` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `image` | string | Yes | Still image. Public https image URL. |
| `move` | "dolly\_in" \| "dolly\_out" \| "dolly\_left" \| "dolly\_right" \| "jib\_up" \| "jib\_down" \| "focus\_shift" \| "static" | No | Camera move Default `"dolly_in"`. |
| `prompt` | string | No | Scene notes Length 0 to 800. |
| `duration` | "6" \| "8" \| "10" | No | Length Default `"6"`. |
| `idempotencyKey` | string | No | Stable retry key. Reuse it only when retrying the identical request so it is never billed twice. Length 1 to 128. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "image": {
        "type": "string",
        "format": "uri",
        "description": "Still image. Public https image URL."
      },
      "move": {
        "type": "string",
        "enum": [
          "dolly_in",
          "dolly_out",
          "dolly_left",
          "dolly_right",
          "jib_up",
          "jib_down",
          "focus_shift",
          "static"
        ],
        "default": "dolly_in",
        "description": "Camera move"
      },
      "prompt": {
        "type": "string",
        "maxLength": 800,
        "description": "Scene notes"
      },
      "duration": {
        "type": "string",
        "enum": [
          "6",
          "8",
          "10"
        ],
        "default": "6",
        "description": "Length"
      },
      "idempotencyKey": {
        "type": "string",
        "minLength": 1,
        "maxLength": 128,
        "description": "Stable retry key. Reuse it only when retrying the identical request so it is never billed twice."
      }
    },
    "required": [
      "image"
    ]
  }
  ```
</Accordion>

**Output:** MCP text content holding JSON; errors set `isError`.

```json Example call theme={null}
{
  "name": "summer_tool_camera_moves",
  "arguments": {
    "image": "<image>"
  }
}
```

***

### summer\_tool\_capsule\_kit

On the hosted MCP.

Store-ready capsule art from one screenshot. Upload a screenshot or key art and your title. Get 16:9 capsule key art with a clean title logo, plus header, small, main and library hero crops sized for your Steam page, and a YouTube thumbnail crop. Runs on Summer servers; the asset lands in the user's Summer library, where the local engine can import it with [`summer_import_asset_by_id`](/mcp/tools/create-assets#summer_import_asset_by_id).

| | |
| - | - |
| **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |
| **Hints** | `openWorldHint` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `screenshot` | string | Yes | Screenshot or key art. Shows your characters, world and art style. Public https image URL. |
| `title` | string | Yes | Game title Length 0 to 60. |
| `mood` | string | No | Genre and mood Length 0 to 120. |
| `style` | "match" \| "painterly" \| "graphic" | No | Look Default `"match"`. |
| `idempotencyKey` | string | No | Stable retry key. Reuse it only when retrying the identical request so it is never billed twice. Length 1 to 128. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "screenshot": {
        "type": "string",
        "format": "uri",
        "description": "Screenshot or key art. Shows your characters, world and art style. Public https image URL."
      },
      "title": {
        "type": "string",
        "maxLength": 60,
        "description": "Game title"
      },
      "mood": {
        "type": "string",
        "maxLength": 120,
        "description": "Genre and mood"
      },
      "style": {
        "type": "string",
        "enum": [
          "match",
          "painterly",
          "graphic"
        ],
        "default": "match",
        "description": "Look"
      },
      "idempotencyKey": {
        "type": "string",
        "minLength": 1,
        "maxLength": 128,
        "description": "Stable retry key. Reuse it only when retrying the identical request so it is never billed twice."
      }
    },
    "required": [
      "screenshot",
      "title"
    ]
  }
  ```
</Accordion>

**Output:** MCP text content holding JSON; errors set `isError`.

```json Example call theme={null}
{
  "name": "summer_tool_capsule_kit",
  "arguments": {
    "screenshot": "<screenshot>",
    "title": "<title>"
  }
}
```

***

### summer\_tool\_character\_turnaround

On the hosted MCP.

Front, side and back model sheet from one image. Upload one image of your character. Get a clean turnaround sheet with front, three-quarter, side and back views on a plain background, ready for modeling, rigging or a consistent sprite set. Runs on Summer servers; the asset lands in the user's Summer library, where the local engine can import it with [`summer_import_asset_by_id`](/mcp/tools/create-assets#summer_import_asset_by_id).

| | |
| - | - |
| **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |
| **Hints** | `openWorldHint` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `character` | string | Yes | Character image. One clear view of the character. Public https image URL. |
| `style` | "color" \| "lineart" | No | Sheet style Default `"color"`. |
| `idempotencyKey` | string | No | Stable retry key. Reuse it only when retrying the identical request so it is never billed twice. Length 1 to 128. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "character": {
        "type": "string",
        "format": "uri",
        "description": "Character image. One clear view of the character. Public https image URL."
      },
      "style": {
        "type": "string",
        "enum": [
          "color",
          "lineart"
        ],
        "default": "color",
        "description": "Sheet style"
      },
      "idempotencyKey": {
        "type": "string",
        "minLength": 1,
        "maxLength": 128,
        "description": "Stable retry key. Reuse it only when retrying the identical request so it is never billed twice."
      }
    },
    "required": [
      "character"
    ]
  }
  ```
</Accordion>

**Output:** MCP text content holding JSON; errors set `isError`.

```json Example call theme={null}
{
  "name": "summer_tool_character_turnaround",
  "arguments": {
    "character": "<character>"
  }
}
```

***

### summer\_tool\_cinematic\_shot

On the hosted MCP.

One image in, a cinematic shot with sound out, on Seedance 2.5. Upload a still, key art or screenshot and describe the action. Seedance 2.5, ByteDance's newest video model, animates it into a 720p shot with native sound effects and ambience. Runs on Summer servers; the asset lands in the user's Summer library, where the local engine can import it with [`summer_import_asset_by_id`](/mcp/tools/create-assets#summer_import_asset_by_id).

| | |
| - | - |
| **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |
| **Hints** | `openWorldHint` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `image` | string | Yes | Start image. The first frame of the shot. Public https image URL. |
| `prompt` | string | Yes | What happens Length 0 to 1500. |
| `duration` | "5" \| "8" \| "10" | No | Length Default `"5"`. |
| `idempotencyKey` | string | No | Stable retry key. Reuse it only when retrying the identical request so it is never billed twice. Length 1 to 128. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "image": {
        "type": "string",
        "format": "uri",
        "description": "Start image. The first frame of the shot. Public https image URL."
      },
      "prompt": {
        "type": "string",
        "maxLength": 1500,
        "description": "What happens"
      },
      "duration": {
        "type": "string",
        "enum": [
          "5",
          "8",
          "10"
        ],
        "default": "5",
        "description": "Length"
      },
      "idempotencyKey": {
        "type": "string",
        "minLength": 1,
        "maxLength": 128,
        "description": "Stable retry key. Reuse it only when retrying the identical request so it is never billed twice."
      }
    },
    "required": [
      "image",
      "prompt"
    ]
  }
  ```
</Accordion>

**Output:** MCP text content holding JSON; errors set `isError`.

```json Example call theme={null}
{
  "name": "summer_tool_cinematic_shot",
  "arguments": {
    "image": "<image>",
    "prompt": "<prompt>"
  }
}
```

***

### summer\_tool\_game\_ad\_maker

On the hosted MCP.

A 10 second vertical game ad from one screenshot. Upload a screenshot, name your game and write the hook. Summer builds an ad keyframe true to your game's style, then Seedance 2.5 turns it into a 10 second 720p ad with sound, ready for TikTok, Reels and Shorts. Runs on Summer servers; the asset lands in the user's Summer library, where the local engine can import it with [`summer_import_asset_by_id`](/mcp/tools/create-assets#summer_import_asset_by_id).

| | |
| - | - |
| **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |
| **Hints** | `openWorldHint` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `screenshot` | string | Yes | Screenshot or key art. Shows your characters, world and art style. Public https image URL. |
| `title` | string | Yes | Game title Length 0 to 60. |
| `hook` | string | Yes | Hook Length 0 to 200. |
| `mood` | string | No | Genre and mood Length 0 to 120. |
| `aspect` | "9:16" \| "16:9" | No | Format Default `"9:16"`. |
| `idempotencyKey` | string | No | Stable retry key. Reuse it only when retrying the identical request so it is never billed twice. Length 1 to 128. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "screenshot": {
        "type": "string",
        "format": "uri",
        "description": "Screenshot or key art. Shows your characters, world and art style. Public https image URL."
      },
      "title": {
        "type": "string",
        "maxLength": 60,
        "description": "Game title"
      },
      "hook": {
        "type": "string",
        "maxLength": 200,
        "description": "Hook"
      },
      "mood": {
        "type": "string",
        "maxLength": 120,
        "description": "Genre and mood"
      },
      "aspect": {
        "type": "string",
        "enum": [
          "9:16",
          "16:9"
        ],
        "default": "9:16",
        "description": "Format"
      },
      "idempotencyKey": {
        "type": "string",
        "minLength": 1,
        "maxLength": 128,
        "description": "Stable retry key. Reuse it only when retrying the identical request so it is never billed twice."
      }
    },
    "required": [
      "screenshot",
      "title",
      "hook"
    ]
  }
  ```
</Accordion>

**Output:** MCP text content holding JSON; errors set `isError`.

```json Example call theme={null}
{
  "name": "summer_tool_game_ad_maker",
  "arguments": {
    "screenshot": "<screenshot>",
    "title": "<title>",
    "hook": "<hook>"
  }
}
```

***

### summer\_tool\_game\_score

On the hosted MCP.

Game music from a mood, in seconds. Describe the genre and mood and get an instrumental track for your menu, level or trailer. Add a screenshot and the music takes its cue from your game's look. Runs on Summer servers; the asset lands in the user's Summer library, where the local engine can import it with [`summer_import_asset_by_id`](/mcp/tools/create-assets#summer_import_asset_by_id).

| | |
| - | - |
| **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |
| **Hints** | `openWorldHint` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `prompt` | string | Yes | Genre and mood Length 0 to 400. |
| `inspiration` | string | No | Screenshot for inspiration. Public https image URL. |
| `idempotencyKey` | string | No | Stable retry key. Reuse it only when retrying the identical request so it is never billed twice. Length 1 to 128. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "prompt": {
        "type": "string",
        "maxLength": 400,
        "description": "Genre and mood"
      },
      "inspiration": {
        "type": "string",
        "format": "uri",
        "description": "Screenshot for inspiration. Public https image URL."
      },
      "idempotencyKey": {
        "type": "string",
        "minLength": 1,
        "maxLength": 128,
        "description": "Stable retry key. Reuse it only when retrying the identical request so it is never billed twice."
      }
    },
    "required": [
      "prompt"
    ]
  }
  ```
</Accordion>

**Output:** MCP text content holding JSON; errors set `isError`.

```json Example call theme={null}
{
  "name": "summer_tool_game_score",
  "arguments": {
    "prompt": "<prompt>"
  }
}
```

***

### summer\_tool\_lipsync\_anything

On the hosted MCP.

New words in an existing clip, lips matched. Upload a video of someone or something talking and a new audio track. The mouth is re-animated to match the new line: dubs, fixes, jokes and localized trailers. Requires consent: true (the user owns the media or has consent from every real person in it). Runs on Summer servers; the asset lands in the user's Summer library, where the local engine can import it with [`summer_import_asset_by_id`](/mcp/tools/create-assets#summer_import_asset_by_id).

| | |
| - | - |
| **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |
| **Hints** | `openWorldHint` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `video` | string | Yes | Video. A face visible for most of the clip. Public https video URL, 2-60 seconds. |
| `audio` | string | Yes | New audio. Public https audio URL, 2-60 seconds. |
| `consent` | true | Yes | I own this media or have permission to use it, and every real person shown has agreed. No public figures, no minors.. Must be true: the user attests they own the media or have the consent of every real person in it. |
| `idempotencyKey` | string | No | Stable retry key. Reuse it only when retrying the identical request so it is never billed twice. Length 1 to 128. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "video": {
        "type": "string",
        "format": "uri",
        "description": "Video. A face visible for most of the clip. Public https video URL, 2-60 seconds."
      },
      "audio": {
        "type": "string",
        "format": "uri",
        "description": "New audio. Public https audio URL, 2-60 seconds."
      },
      "consent": {
        "type": "boolean",
        "const": true,
        "description": "I own this media or have permission to use it, and every real person shown has agreed. No public figures, no minors.. Must be true: the user attests they own the media or have the consent of every real person in it."
      },
      "idempotencyKey": {
        "type": "string",
        "minLength": 1,
        "maxLength": 128,
        "description": "Stable retry key. Reuse it only when retrying the identical request so it is never billed twice."
      }
    },
    "required": [
      "video",
      "audio",
      "consent"
    ]
  }
  ```
</Accordion>

**Output:** MCP text content holding JSON; errors set `isError`.

```json Example call theme={null}
{
  "name": "summer_tool_lipsync_anything",
  "arguments": {
    "video": "<video>",
    "audio": "<audio>",
    "consent": true
  }
}
```

***

### summer\_tool\_npc\_voice

On the hosted MCP.

Type a line, get a voiced NPC in seconds. Write the line, pick a voice and a delivery. Get expressive voice acting for NPCs, narrators and trailers. Audio tags like \[whispers] or \[laughs] steer the performance. Runs on Summer servers; the asset lands in the user's Summer library, where the local engine can import it with [`summer_import_asset_by_id`](/mcp/tools/create-assets#summer_import_asset_by_id).

| | |
| - | - |
| **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |
| **Hints** | `openWorldHint` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `text` | string | Yes | Line. Audio tags such as \[whispers], \[laughs] or \[shouting] change the delivery Length 0 to 2000. |
| `voice` | "Rachel" \| "Aria" \| "Roger" \| "Sarah" \| "Laura" \| "Charlie" \| "George" \| "Callum" \| "River" \| "Liam" \| "Charlotte" \| "Alice" \| "Matilda" \| "Will" \| "Jessica" \| "Eric" \| "Chris" \| "Brian" \| "Daniel" \| "Lily" \| "Bill" | No | Voice Default `"George"`. |
| `delivery` | "creative" \| "natural" \| "robust" | No | Delivery Default `"natural"`. |
| `idempotencyKey` | string | No | Stable retry key. Reuse it only when retrying the identical request so it is never billed twice. Length 1 to 128. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "text": {
        "type": "string",
        "maxLength": 2000,
        "description": "Line. Audio tags such as [whispers], [laughs] or [shouting] change the delivery"
      },
      "voice": {
        "type": "string",
        "enum": [
          "Rachel",
          "Aria",
          "Roger",
          "Sarah",
          "Laura",
          "Charlie",
          "George",
          "Callum",
          "River",
          "Liam",
          "Charlotte",
          "Alice",
          "Matilda",
          "Will",
          "Jessica",
          "Eric",
          "Chris",
          "Brian",
          "Daniel",
          "Lily",
          "Bill"
        ],
        "default": "George",
        "description": "Voice"
      },
      "delivery": {
        "type": "string",
        "enum": [
          "creative",
          "natural",
          "robust"
        ],
        "default": "natural",
        "description": "Delivery"
      },
      "idempotencyKey": {
        "type": "string",
        "minLength": 1,
        "maxLength": 128,
        "description": "Stable retry key. Reuse it only when retrying the identical request so it is never billed twice."
      }
    },
    "required": [
      "text"
    ]
  }
  ```
</Accordion>

**Output:** MCP text content holding JSON; errors set `isError`.

```json Example call theme={null}
{
  "name": "summer_tool_npc_voice",
  "arguments": {
    "text": "<text>"
  }
}
```

***

### summer\_tool\_pixel\_forge

On the hosted MCP.

Any character or image to clean, game-ready pixel art. Upload a character or object. Summer first redraws it as a pixel art sprite at the size you pick, then snaps it to a true pixel grid with a locked palette and a transparent background, so it drops straight into your game. Runs on Summer servers; the asset lands in the user's Summer library, where the local engine can import it with [`summer_import_asset_by_id`](/mcp/tools/create-assets#summer_import_asset_by_id).

| | |
| - | - |
| **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |
| **Hints** | `openWorldHint` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `image` | string | Yes | Character or object. One subject, clearly visible. Public https image URL. |
| `size` | "32" \| "64" \| "128" | No | Sprite size Default `"64"`. |
| `palette` | "16" \| "32" \| "64" | No | Colors Default `"32"`. |
| `idempotencyKey` | string | No | Stable retry key. Reuse it only when retrying the identical request so it is never billed twice. Length 1 to 128. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "image": {
        "type": "string",
        "format": "uri",
        "description": "Character or object. One subject, clearly visible. Public https image URL."
      },
      "size": {
        "type": "string",
        "enum": [
          "32",
          "64",
          "128"
        ],
        "default": "64",
        "description": "Sprite size"
      },
      "palette": {
        "type": "string",
        "enum": [
          "16",
          "32",
          "64"
        ],
        "default": "32",
        "description": "Colors"
      },
      "idempotencyKey": {
        "type": "string",
        "minLength": 1,
        "maxLength": 128,
        "description": "Stable retry key. Reuse it only when retrying the identical request so it is never billed twice."
      }
    },
    "required": [
      "image"
    ]
  }
  ```
</Accordion>

**Output:** MCP text content holding JSON; errors set `isError`.

```json Example call theme={null}
{
  "name": "summer_tool_pixel_forge",
  "arguments": {
    "image": "<image>"
  }
}
```

***

### summer\_tool\_product\_ad

On the hosted MCP.

Product photo in, an 8 second video ad with sound out. Upload a product photo and your hook. Summer builds a studio hero shot of the product, then animates it into an 8 second 720p ad on Seedance 2.5 with native sound. Runs on Summer servers; the asset lands in the user's Summer library, where the local engine can import it with [`summer_import_asset_by_id`](/mcp/tools/create-assets#summer_import_asset_by_id).

| | |
| - | - |
| **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |
| **Hints** | `openWorldHint` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `product` | string | Yes | Product photo. The product clearly visible; any background. Public https image URL. |
| `productName` | string | Yes | Product name Length 0 to 60. |
| `hook` | string | No | Hook or scene Length 0 to 300. |
| `aspect` | "9:16" \| "16:9" \| "1:1" | No | Format Default `"9:16"`. |
| `idempotencyKey` | string | No | Stable retry key. Reuse it only when retrying the identical request so it is never billed twice. Length 1 to 128. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "product": {
        "type": "string",
        "format": "uri",
        "description": "Product photo. The product clearly visible; any background. Public https image URL."
      },
      "productName": {
        "type": "string",
        "maxLength": 60,
        "description": "Product name"
      },
      "hook": {
        "type": "string",
        "maxLength": 300,
        "description": "Hook or scene"
      },
      "aspect": {
        "type": "string",
        "enum": [
          "9:16",
          "16:9",
          "1:1"
        ],
        "default": "9:16",
        "description": "Format"
      },
      "idempotencyKey": {
        "type": "string",
        "minLength": 1,
        "maxLength": 128,
        "description": "Stable retry key. Reuse it only when retrying the identical request so it is never billed twice."
      }
    },
    "required": [
      "product",
      "productName"
    ]
  }
  ```
</Accordion>

**Output:** MCP text content holding JSON; errors set `isError`.

```json Example call theme={null}
{
  "name": "summer_tool_product_ad",
  "arguments": {
    "product": "<product>",
    "productName": "<productName>"
  }
}
```

***

### summer\_tool\_sfx\_maker

On the hosted MCP.

Any sound effect in seconds. Describe a sound: a sword unsheathing, a coin pickup, rain on a tin roof, a dragon roar. Get a clean sound effect up to 20 seconds, optionally seamless for loops. Runs on Summer servers; the asset lands in the user's Summer library, where the local engine can import it with [`summer_import_asset_by_id`](/mcp/tools/create-assets#summer_import_asset_by_id).

| | |
| - | - |
| **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |
| **Hints** | `openWorldHint` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `prompt` | string | Yes | Sound Length 0 to 300. |
| `duration` | "2" \| "5" \| "10" \| "20" | No | Length Default `"2"`. |
| `loop` | boolean | No | Seamless loop Default `false`. |
| `idempotencyKey` | string | No | Stable retry key. Reuse it only when retrying the identical request so it is never billed twice. Length 1 to 128. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "prompt": {
        "type": "string",
        "maxLength": 300,
        "description": "Sound"
      },
      "duration": {
        "type": "string",
        "enum": [
          "2",
          "5",
          "10",
          "20"
        ],
        "default": "2",
        "description": "Length"
      },
      "loop": {
        "type": "boolean",
        "default": false,
        "description": "Seamless loop"
      },
      "idempotencyKey": {
        "type": "string",
        "minLength": 1,
        "maxLength": 128,
        "description": "Stable retry key. Reuse it only when retrying the identical request so it is never billed twice."
      }
    },
    "required": [
      "prompt"
    ]
  }
  ```
</Accordion>

**Output:** MCP text content holding JSON; errors set `isError`.

```json Example call theme={null}
{
  "name": "summer_tool_sfx_maker",
  "arguments": {
    "prompt": "<prompt>"
  }
}
```

***

### summer\_tool\_sprite\_sheet\_forge

On the hosted MCP.

One character image in, an animated sprite sheet out. Upload your character and pick an action. Summer animates that exact character, pulls evenly spaced frames, cuts each one out on a transparent background and lays them out as a sprite sheet ready to slice in Summer Engine or any engine. Optional pixel-art downscaling. Runs on Summer servers; the asset lands in the user's Summer library, where the local engine can import it with [`summer_import_asset_by_id`](/mcp/tools/create-assets#summer_import_asset_by_id).

| | |
| - | - |
| **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |
| **Hints** | `openWorldHint` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `characterImage` | string | Yes | Character image. One clear, full-body view of the character on a plain background. Public https image URL. |
| `action` | "idle" \| "walk" \| "run" \| "jump" \| "attack" \| "hurt" | No | Action Default `"walk"`. |
| `frames` | "4" \| "6" \| "8" \| "12" \| "16" | No | Frames Default `"8"`. |
| `view` | "side" \| "three-quarter" \| "front" | No | View Default `"side"`. |
| `pixel` | "off" \| "128" \| "64" \| "32" | No | Pixel art Default `"off"`. |
| `idempotencyKey` | string | No | Stable retry key. Reuse it only when retrying the identical request so it is never billed twice. Length 1 to 128. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "characterImage": {
        "type": "string",
        "format": "uri",
        "description": "Character image. One clear, full-body view of the character on a plain background. Public https image URL."
      },
      "action": {
        "type": "string",
        "enum": [
          "idle",
          "walk",
          "run",
          "jump",
          "attack",
          "hurt"
        ],
        "default": "walk",
        "description": "Action"
      },
      "frames": {
        "type": "string",
        "enum": [
          "4",
          "6",
          "8",
          "12",
          "16"
        ],
        "default": "8",
        "description": "Frames"
      },
      "view": {
        "type": "string",
        "enum": [
          "side",
          "three-quarter",
          "front"
        ],
        "default": "side",
        "description": "View"
      },
      "pixel": {
        "type": "string",
        "enum": [
          "off",
          "128",
          "64",
          "32"
        ],
        "default": "off",
        "description": "Pixel art"
      },
      "idempotencyKey": {
        "type": "string",
        "minLength": 1,
        "maxLength": 128,
        "description": "Stable retry key. Reuse it only when retrying the identical request so it is never billed twice."
      }
    },
    "required": [
      "characterImage"
    ]
  }
  ```
</Accordion>

**Output:** MCP text content holding JSON; errors set `isError`.

```json Example call theme={null}
{
  "name": "summer_tool_sprite_sheet_forge",
  "arguments": {
    "characterImage": "<characterImage>"
  }
}
```

***

### summer\_tool\_style\_frame

On the hosted MCP.

Your screenshot redrawn in another game art style, for look-dev. Upload a screenshot or a concept and pick an art style. The same scene comes back redrawn in pixel art, low poly, cel shading, painterly, PS1 era or voxel, with the layout kept, so you can compare looks before you commit. Runs on Summer servers; the asset lands in the user's Summer library, where the local engine can import it with [`summer_import_asset_by_id`](/mcp/tools/create-assets#summer_import_asset_by_id).

| | |
| - | - |
| **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |
| **Hints** | `openWorldHint` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `screenshot` | string | Yes | Screenshot or concept. A scene from your game or a piece of concept art. Public https image URL. |
| `style` | "pixel" \| "low-poly" \| "cel" \| "painterly" \| "psx" \| "voxel" | No | Art style Default `"cel"`. |
| `idempotencyKey` | string | No | Stable retry key. Reuse it only when retrying the identical request so it is never billed twice. Length 1 to 128. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "screenshot": {
        "type": "string",
        "format": "uri",
        "description": "Screenshot or concept. A scene from your game or a piece of concept art. Public https image URL."
      },
      "style": {
        "type": "string",
        "enum": [
          "pixel",
          "low-poly",
          "cel",
          "painterly",
          "psx",
          "voxel"
        ],
        "default": "cel",
        "description": "Art style"
      },
      "idempotencyKey": {
        "type": "string",
        "minLength": 1,
        "maxLength": 128,
        "description": "Stable retry key. Reuse it only when retrying the identical request so it is never billed twice."
      }
    },
    "required": [
      "screenshot"
    ]
  }
  ```
</Accordion>

**Output:** MCP text content holding JSON; errors set `isError`.

```json Example call theme={null}
{
  "name": "summer_tool_style_frame",
  "arguments": {
    "screenshot": "<screenshot>"
  }
}
```

***

### summer\_tool\_style\_swap

On the hosted MCP.

Restyle gameplay or any clip into anime, claymation, PSX, comic or pixel art. Turn a gameplay capture, trailer shot or phone clip into anime, retro cel animation, claymation, PS1-era low poly, comic book, pixel art or a cel-shaded game. Motion, camera and timing stay exactly the same. Runs on Summer servers; the asset lands in the user's Summer library, where the local engine can import it with [`summer_import_asset_by_id`](/mcp/tools/create-assets#summer_import_asset_by_id).

| | |
| - | - |
| **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |
| **Hints** | `openWorldHint` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `sourceVideo` | string | Yes | Source clip. Public https video URL, 1-30 seconds. |
| `style` | "anime" \| "retro-anime" \| "clay" \| "psx" \| "comic" \| "pixel" \| "cel-shaded" | No | Style Default `"anime"`. |
| `prompt` | string | No | Extra direction Length 0 to 400. |
| `idempotencyKey` | string | No | Stable retry key. Reuse it only when retrying the identical request so it is never billed twice. Length 1 to 128. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "sourceVideo": {
        "type": "string",
        "format": "uri",
        "description": "Source clip. Public https video URL, 1-30 seconds."
      },
      "style": {
        "type": "string",
        "enum": [
          "anime",
          "retro-anime",
          "clay",
          "psx",
          "comic",
          "pixel",
          "cel-shaded"
        ],
        "default": "anime",
        "description": "Style"
      },
      "prompt": {
        "type": "string",
        "maxLength": 400,
        "description": "Extra direction"
      },
      "idempotencyKey": {
        "type": "string",
        "minLength": 1,
        "maxLength": 128,
        "description": "Stable retry key. Reuse it only when retrying the identical request so it is never billed twice."
      }
    },
    "required": [
      "sourceVideo"
    ]
  }
  ```
</Accordion>

**Output:** MCP text content holding JSON; errors set `isError`.

```json Example call theme={null}
{
  "name": "summer_tool_style_swap",
  "arguments": {
    "sourceVideo": "<sourceVideo>"
  }
}
```

***

### summer\_tool\_talking\_character

On the hosted MCP.

Make any picture talk: NPCs, mascots, avatars. Upload a character image and a voice line. The character speaks it with matching lips, face and head motion, in any art style from pixel to photoreal. Pair it with NPC Voice to write the line. Requires consent: true (the user owns the media or has consent from every real person in it). Runs on Summer servers; the asset lands in the user's Summer library, where the local engine can import it with [`summer_import_asset_by_id`](/mcp/tools/create-assets#summer_import_asset_by_id).

| | |
| - | - |
| **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |
| **Hints** | `openWorldHint` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `image` | string | Yes | Character image. Face clearly visible, looking roughly at the camera. Public https image URL. |
| `audio` | string | Yes | Voice line. mp3, wav or m4a. Public https audio URL, 2-60 seconds. |
| `consent` | true | Yes | I own this media or have permission to use it, and every real person shown has agreed. No public figures, no minors.. Must be true: the user attests they own the media or have the consent of every real person in it. |
| `idempotencyKey` | string | No | Stable retry key. Reuse it only when retrying the identical request so it is never billed twice. Length 1 to 128. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "image": {
        "type": "string",
        "format": "uri",
        "description": "Character image. Face clearly visible, looking roughly at the camera. Public https image URL."
      },
      "audio": {
        "type": "string",
        "format": "uri",
        "description": "Voice line. mp3, wav or m4a. Public https audio URL, 2-60 seconds."
      },
      "consent": {
        "type": "boolean",
        "const": true,
        "description": "I own this media or have permission to use it, and every real person shown has agreed. No public figures, no minors.. Must be true: the user attests they own the media or have the consent of every real person in it."
      },
      "idempotencyKey": {
        "type": "string",
        "minLength": 1,
        "maxLength": 128,
        "description": "Stable retry key. Reuse it only when retrying the identical request so it is never billed twice."
      }
    },
    "required": [
      "image",
      "audio",
      "consent"
    ]
  }
  ```
</Accordion>

**Output:** MCP text content holding JSON; errors set `isError`.

```json Example call theme={null}
{
  "name": "summer_tool_talking_character",
  "arguments": {
    "image": "<image>",
    "audio": "<audio>",
    "consent": true
  }
}
```

***

### summer\_tool\_texture\_forge

On the hosted MCP.

A photo into a seamless, tileable game texture. Upload a photo of a surface and pick the material and look. You get a flat, evenly lit texture that tiles on all four edges, ready for floors, walls and terrain. Runs on Summer servers; the asset lands in the user's Summer library, where the local engine can import it with [`summer_import_asset_by_id`](/mcp/tools/create-assets#summer_import_asset_by_id).

| | |
| - | - |
| **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |
| **Hints** | `openWorldHint` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `photo` | string | Yes | Surface photo. Stone, wood, grass, metal, fabric, anything with a surface. Public https image URL. |
| `material` | "stone" \| "wood" \| "ground" \| "metal" \| "fabric" \| "scifi" | No | Material Default `"stone"`. |
| `look` | "realistic" \| "painted" \| "toon" \| "pixel" | No | Look Default `"painted"`. |
| `idempotencyKey` | string | No | Stable retry key. Reuse it only when retrying the identical request so it is never billed twice. Length 1 to 128. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "photo": {
        "type": "string",
        "format": "uri",
        "description": "Surface photo. Stone, wood, grass, metal, fabric, anything with a surface. Public https image URL."
      },
      "material": {
        "type": "string",
        "enum": [
          "stone",
          "wood",
          "ground",
          "metal",
          "fabric",
          "scifi"
        ],
        "default": "stone",
        "description": "Material"
      },
      "look": {
        "type": "string",
        "enum": [
          "realistic",
          "painted",
          "toon",
          "pixel"
        ],
        "default": "painted",
        "description": "Look"
      },
      "idempotencyKey": {
        "type": "string",
        "minLength": 1,
        "maxLength": 128,
        "description": "Stable retry key. Reuse it only when retrying the identical request so it is never billed twice."
      }
    },
    "required": [
      "photo"
    ]
  }
  ```
</Accordion>

**Output:** MCP text content holding JSON; errors set `isError`.

```json Example call theme={null}
{
  "name": "summer_tool_texture_forge",
  "arguments": {
    "photo": "<photo>"
  }
}
```

***

### summer\_tool\_thumbnail\_maker

On the hosted MCP.

Click-worthy YouTube thumbnails from your frame. Upload a gameplay frame or photo and your title. Get a bold 1280 x 720 thumbnail with punchy lighting and readable title text, true to your footage. Runs on Summer servers; the asset lands in the user's Summer library, where the local engine can import it with [`summer_import_asset_by_id`](/mcp/tools/create-assets#summer_import_asset_by_id).

| | |
| - | - |
| **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |
| **Hints** | `openWorldHint` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `frame` | string | Yes | Frame or photo. Public https image URL. |
| `title` | string | Yes | Thumbnail text Length 0 to 40. |
| `style` | "gaming" \| "clean" \| "shocked" | No | Style Default `"gaming"`. |
| `idempotencyKey` | string | No | Stable retry key. Reuse it only when retrying the identical request so it is never billed twice. Length 1 to 128. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "frame": {
        "type": "string",
        "format": "uri",
        "description": "Frame or photo. Public https image URL."
      },
      "title": {
        "type": "string",
        "maxLength": 40,
        "description": "Thumbnail text"
      },
      "style": {
        "type": "string",
        "enum": [
          "gaming",
          "clean",
          "shocked"
        ],
        "default": "gaming",
        "description": "Style"
      },
      "idempotencyKey": {
        "type": "string",
        "minLength": 1,
        "maxLength": 128,
        "description": "Stable retry key. Reuse it only when retrying the identical request so it is never billed twice."
      }
    },
    "required": [
      "frame",
      "title"
    ]
  }
  ```
</Accordion>

**Output:** MCP text content holding JSON; errors set `isError`.

```json Example call theme={null}
{
  "name": "summer_tool_thumbnail_maker",
  "arguments": {
    "frame": "<frame>",
    "title": "<title>"
  }
}
```

***

### summer\_tool\_trailer\_forge

On the hosted MCP.

A game trailer with music from your screenshots. Upload two to four screenshots, name the game and set the mood. Summer turns each screenshot into a cinematic keyframe, animates every keyframe on Seedance 2.5, cuts the shots together and scores the trailer with generated music. Runs on Summer servers; the asset lands in the user's Summer library, where the local engine can import it with [`summer_import_asset_by_id`](/mcp/tools/create-assets#summer_import_asset_by_id).

| | |
| - | - |
| **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |
| **Hints** | `openWorldHint` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `shot1` | string | Yes | Screenshot 1. Public https image URL. |
| `shot2` | string | Yes | Screenshot 2. Public https image URL. |
| `shot3` | string | No | Screenshot 3. Public https image URL. |
| `shot4` | string | No | Screenshot 4. Public https image URL. |
| `title` | string | Yes | Game title Length 0 to 60. |
| `mood` | string | Yes | Genre and mood Length 0 to 160. |
| `idempotencyKey` | string | No | Stable retry key. Reuse it only when retrying the identical request so it is never billed twice. Length 1 to 128. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "shot1": {
        "type": "string",
        "format": "uri",
        "description": "Screenshot 1. Public https image URL."
      },
      "shot2": {
        "type": "string",
        "format": "uri",
        "description": "Screenshot 2. Public https image URL."
      },
      "shot3": {
        "type": "string",
        "format": "uri",
        "description": "Screenshot 3. Public https image URL."
      },
      "shot4": {
        "type": "string",
        "format": "uri",
        "description": "Screenshot 4. Public https image URL."
      },
      "title": {
        "type": "string",
        "maxLength": 60,
        "description": "Game title"
      },
      "mood": {
        "type": "string",
        "maxLength": 160,
        "description": "Genre and mood"
      },
      "idempotencyKey": {
        "type": "string",
        "minLength": 1,
        "maxLength": 128,
        "description": "Stable retry key. Reuse it only when retrying the identical request so it is never billed twice."
      }
    },
    "required": [
      "shot1",
      "shot2",
      "title",
      "mood"
    ]
  }
  ```
</Accordion>

**Output:** MCP text content holding JSON; errors set `isError`.

```json Example call theme={null}
{
  "name": "summer_tool_trailer_forge",
  "arguments": {
    "shot1": "<shot1>",
    "shot2": "<shot2>",
    "title": "<title>",
    "mood": "<mood>"
  }
}
```

***

### summer\_tool\_transition\_morph

On the hosted MCP.

Two images, one smooth morph between them. Upload a first and a last frame and get a smooth 720p transition between them: before and after, level one to level ten, sketch to final art. Optional anime, clay, comic, 3D or cyberpunk styling. Requires consent: true (the user owns the media or has consent from every real person in it). Runs on Summer servers; the asset lands in the user's Summer library, where the local engine can import it with [`summer_import_asset_by_id`](/mcp/tools/create-assets#summer_import_asset_by_id).

| | |
| - | - |
| **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |
| **Hints** | `openWorldHint` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `firstImage` | string | Yes | First frame. Public https image URL. |
| `lastImage` | string | Yes | Last frame. Public https image URL. |
| `prompt` | string | No | How it transforms Length 0 to 600. |
| `duration` | "5" \| "8" | No | Length Default `"5"`. |
| `consent` | true | Yes | This is my photo, or everyone in it has agreed. No public figures, no minors.. Must be true: the user attests they own the media or have the consent of every real person in it. |
| `idempotencyKey` | string | No | Stable retry key. Reuse it only when retrying the identical request so it is never billed twice. Length 1 to 128. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "firstImage": {
        "type": "string",
        "format": "uri",
        "description": "First frame. Public https image URL."
      },
      "lastImage": {
        "type": "string",
        "format": "uri",
        "description": "Last frame. Public https image URL."
      },
      "prompt": {
        "type": "string",
        "maxLength": 600,
        "description": "How it transforms"
      },
      "duration": {
        "type": "string",
        "enum": [
          "5",
          "8"
        ],
        "default": "5",
        "description": "Length"
      },
      "consent": {
        "type": "boolean",
        "const": true,
        "description": "This is my photo, or everyone in it has agreed. No public figures, no minors.. Must be true: the user attests they own the media or have the consent of every real person in it."
      },
      "idempotencyKey": {
        "type": "string",
        "minLength": 1,
        "maxLength": 128,
        "description": "Stable retry key. Reuse it only when retrying the identical request so it is never billed twice."
      }
    },
    "required": [
      "firstImage",
      "lastImage",
      "consent"
    ]
  }
  ```
</Accordion>

**Output:** MCP text content holding JSON; errors set `isError`.

```json Example call theme={null}
{
  "name": "summer_tool_transition_morph",
  "arguments": {
    "firstImage": "<firstImage>",
    "lastImage": "<lastImage>",
    "consent": true
  }
}
```

***

### summer\_upload\_image\_begin

On the hosted MCP.

Start uploading a PNG, JPEG or WebP image from your disk (at most 32 MB) into the user's Summer assets, e.g. store art you generated and cropped to a slot's size. Returns a signed upload: POST multipart/form-data to uploadUrl with every field in fields plus file=@\<path> (curl -F). Then pass public\_id, version, signature and format from Cloudinary's JSON answer to [`summer_upload_image_complete`](/mcp/tools/create-assets#summer_upload_image_complete). Free.

| | |
| - | - |
| **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |

**Inputs:**

No inputs.

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

**Output:** MCP text content holding JSON; errors set `isError`. From the tool's own description: Returns a signed upload: POST multipart/form-data to uploadUrl with every field in fields plus file=@\<path> (curl -F).

```json Example call theme={null}
{
  "name": "summer_upload_image_begin",
  "arguments": {}
}
```

***

### summer\_upload\_image\_complete

On the hosted MCP.

Finish an image upload from [`summer_upload_image_begin`](/mcp/tools/create-assets#summer_upload_image_begin): checks it is the upload Summer signed for this user, reads the image and saves it to the user's assets (private). Returns the assetId for [`summer_store_set_art`](/mcp/tools/publish#summer_store_set_art) or any other tool.

| | |
| - | - |
| **Needs** | Your Summer account (OAuth). In the npm MCP: `summer login --store` |

**Inputs:**

| Input | Type | Required | Description |
| - | - | - | - |
| `publicId` | string | Yes | public\_id from the upload answer. Length 1 to 300. |
| `version` | integer | Yes | Range … to 9007199254740991. |
| `signature` | string | Yes | Length 1 to 128. |
| `format` | "png" \| "jpg" \| "jpeg" \| "webp" | Yes | |
| `title` | string | No | Default `"Uploaded image"`. Length 1 to 200. |

<Accordion title="Input JSON schema">
  ```json theme={null}
  {
    "type": "object",
    "properties": {
      "publicId": {
        "description": "public_id from the upload answer.",
        "type": "string",
        "minLength": 1,
        "maxLength": 300
      },
      "version": {
        "type": "integer",
        "exclusiveMinimum": 0,
        "maximum": 9007199254740991
      },
      "signature": {
        "type": "string",
        "minLength": 1,
        "maxLength": 128
      },
      "format": {
        "type": "string",
        "enum": [
          "png",
          "jpg",
          "jpeg",
          "webp"
        ]
      },
      "title": {
        "default": "Uploaded image",
        "type": "string",
        "minLength": 1,
        "maxLength": 200
      }
    },
    "required": [
      "publicId",
      "version",
      "signature",
      "format"
    ]
  }
  ```
</Accordion>

**Output:** MCP text content holding JSON; errors set `isError`. From the tool's own description: Returns the assetId for summer\_store\_set\_art or any other tool.

```json Example call theme={null}
{
  "name": "summer_upload_image_complete",
  "arguments": {
    "publicId": "<publicId>",
    "version": 1,
    "signature": "<signature>",
    "format": "png"
  }
}
```

***


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