Agent access over MCP

AssetShip exposes the whole editor over the Model Context Protocol. Your agent can create projects, upload captures, compose screens, generate backdrops and logos, look at what it made, and export every store size — without you opening the app.

1. Get a key

Mint one in Settings → API keys. It looks like ask_…, it is shown once, and it acts for your whole workspace — treat it like a password. Agent access is part of the paid plans; the editor, rendering and export stay free.

Windows, npx and spaces. Cursor and Claude Desktop on Windows don’t escape spaces inside args when they invoke npx, which mangles the header. Write it without the space — "Authorization:Bearer ask_…" — as in the snippet below.

2. Add the server

Every client points at the same endpoint — https://assetship.app/api/mcp — over streamable HTTP. Only the config dialect changes.

Claude Code

Run it anywhere; the server is added for your user.
claude mcp add --transport http assetship \
  https://assetship.app/api/mcp \
  --header "Authorization: Bearer ask_YOUR_KEY"

Add --scope user to make it available in every project, not just the current directory.

Cursor

~/.cursor/mcp.json (or .cursor/mcp.json for one project)
{
  "mcpServers": {
    "assetship": {
      "url": "https://assetship.app/api/mcp",
      "headers": { "Authorization": "Bearer ask_YOUR_KEY" }
    }
  }
}

Cursor speaks HTTP natively — no bridge package needed.

VS Code (Copilot)

.vscode/mcp.json
{
  "servers": {
    "assetship": {
      "type": "http",
      "url": "https://assetship.app/api/mcp",
      "headers": { "Authorization": "Bearer ask_YOUR_KEY" }
    }
  }
}

VS Code keys on "servers", not "mcpServers" — the one difference that trips people up.

Windsurf

~/.codeium/windsurf/mcp_config.json
{
  "mcpServers": {
    "assetship": {
      "serverUrl": "https://assetship.app/api/mcp",
      "headers": { "Authorization": "Bearer ask_YOUR_KEY" }
    }
  }
}

Claude Desktop & any stdio-only client

claude_desktop_config.json, or your client’s equivalent
{
  "mcpServers": {
    "assetship": {
      "command": "npx",
      "args": [
        "-y", "mcp-remote", "https://assetship.app/api/mcp",
        "--header", "Authorization:Bearer ask_YOUR_KEY"
      ]
    }
  }
}

Clients that only speak stdio reach a remote server through the mcp-remote bridge.

3. Ask it to read the guide

Start every session with get_started. It returns the full authoring guide — the scene model, every edit command, the fonts and device frames that actually render, and design guidance for store listings. Agents that skip it guess; agents that read it don’t.

> call get_started, then build a 5-screen App Store set for my app

  get_started       → the authoring guide
  create_project    → a project with a starter scene
  upload_image      → your real captures
  edit_scene        → backdrops, headlines, layout
  render_preview    → images the agent can SEE
  export_screenshots→ every exact store size

Tool reference

35 tools, generated from the running server — this list is what your agent sees when it calls tools/list.

get_started

Read this FIRST. Returns the authoring guide: the scene model, every edit command, fonts, device frames, design guidance, and the recommended build→preview→export workflow.

list_projects

List the workspace's projects (id, name, product, updated_at).

create_project

Create a project. product "screenshots" (default) starts from a 1320×2868 board with a headline and device frame; product "icons" starts from a blank 512² icon board — place a logo on it (see generate_logo) and ship it with export_icons.

name*
string
Project name
product
screenshots | icons

get_scene

Get a project's scene: a summary (artboard/layer ids to target with commands) plus the full scene document.

projectId*
string

edit_scene

Apply a batch of edit commands to a project's scene (see get_started for the command reference). Commands apply in order; each reports applied or no-op. Returns the updated scene summary. Omit ids on new layers/artboards — they are minted for you.

projectId*
string
commands*
array
Editor commands, e.g. {"t":"patchText","artboardId":"…","id":"…","patch":{"text":"New"}} or {"t":"setBackground","scope":"artboard","artboardId":"…","background":{"type":"solid","color":"#0e1826"}}

replace_scene

Replace a project's ENTIRE scene document (validated). Use for fields commands cannot reach: artboard width/height/name, text fontFamily, image fit/radius, shape stroke. Prefer edit_scene for everything else.

projectId*
string
scene*
object
Complete scene document

upload_image

Upload an image (app screenshot, logo, photo) from a URL or base64 into workspace storage. Returns an assetId to use in setDeviceScreenshot, image layers, or image backgrounds.

url
string
Publicly fetchable image URL
base64
string
Raw base64 image bytes (alternative to url)
contentType
string
e.g. image/png (required with base64)
projectId
string

list_models

List the AI backdrop models with credit costs and tunable parameters.

generate_backdrop

Generate an AI backdrop image (spends workspace credits). Returns an assetId — apply it with setBackground {"type":"image","assetId":…}. For a connected set pass screens = number of artboards it spans.

prompt*
string
projectId
string
model
string
Model id from list_models (default flux-schnell)
params
object
Model tunables (see list_models)
screens
number
Connected-set size the backdrop spans (default 1)
aspect
number
Strip width/height ratio (default one 1320×2868 screen)
resolution
auto | high | ultra

render_preview

Render artboards to PNG previews so you can SEE the current design. Use after every meaningful edit. Pass `locale` to preview a translated set — without it you always see the base copy, which is how an overflowing German headline reaches the store unnoticed. Free-tier workspaces get a small watermark (previews only reflect it; it also appears on free exports).

projectId*
string
locale
string
Preview this locale instead of the base copy, e.g. "de-DE". Must be a locale on the scene.
artboardIds
array
Limit to specific artboards (default: all, max 6)
maxDim
number
Longest preview edge in px (default 560, max 1200)

export_screenshots

Render every artboard at exact output resolutions and return download URLs (valid ~1 hour). Store specs: ios-iphone-6.9 (1320×2868), ios-iphone-6.5 (1284×2778), ios-ipad-13 (2064×2752), ios-ipad-13-landscape (2752×2064), android-phone (1080×1920). The iPad slot takes either orientation — a set is all portrait or all landscape — so pick landscape when the tablet layout only exists that way (a sidebar beside a canvas), and pair it with the tablet-landscape device frame. Social specs: social-ig-portrait (1080×1350), social-ig-square (1080×1080), social-story (1080×1920), social-og-card (1200×630 JPEG), social-x-landscape (1600×900), social-fb-cover (1640×924) — these are never in the default set, so ask for them by id. An artboard is scaled uniformly and centred into the target, so render a social size from an artboard authored at that aspect; a 1320×2868 store screen letterboxes into a square with wide bands of backdrop.

projectId*
string
specIds
array
Store or social spec ids (default: the sizes a listing requires)
locales
array
Locales to render (default: the base design plus every locale on the scene). Use "base" for the untranslated design. Narrow this to keep a large localized set inside the per-call render limit.
artboardIds
array
Artboards to render (default: all). The other half of batching a large set.

list_templates

List the starter scene templates (professionally designed looks: caption, connected panorama set, spotlight, quote, photo showcase, stat card).

apply_template

REPLACE a project's scene with a starter template (see list_templates), then customize it with edit_scene. A strong starting point for a polished set.

projectId*
string
templateId*
string

upscale_image

AI-sharpen/upscale a stored image asset (costs 3 credits). Useful for a backdrop stretched across a connected set. Returns a NEW assetId.

assetId*
string
projectId
string

remove_background

Cut the background out of a stored image asset (BiRefNet, costs 1 credit) — e.g. isolate a product shot or object to float over a backdrop. Returns a NEW assetId with a transparent PNG.

assetId*
string
projectId
string

list_logo_styles

The logo archetypes generate_logo understands, with what each one means.

generate_logo

Generate logo/icon candidates from a brief (spends credits per image). Returns each candidate as an assetId AND an inline preview image, so you can LOOK at them and pick. Transparency comes from the model or a cutout pass, so candidates drop straight onto any backdrop. Vectorize the winner with vectorize_logo.

brief*
string
What the mark should depict, e.g. "a compass rose for a hiking app"
style
string
Archetype from list_logo_styles (monogram, wordmark, abstract, emblem, mascot). Omit for auto.
count
number
Candidates to generate (1-8, default 4)
finish
flat | rich
flat (default) = bold flat shapes, the only kind that vectorizes cleanly. rich = gradients, depth and lighting for a polished app-icon tile — looks fancier but traces into mush, so treat it as a PNG deliverable.
transparent
boolean
Cut the background out (default true). Pass false for a rich tile design where the background IS the icon.
model
string
Icon model id (see list_models)
params
object
Model tunables
projectId
string

vectorize_logo

Trace a PNG logo candidate to SVG (free, runs locally — no credits). Returns the SVG markup, ready to drop in as a vector layer with addLayer {"type":"image","svg":…}, and stores it as an asset. Best on a flat, high-contrast mark with a clean background.

assetId*
string
A PNG asset (e.g. from generate_logo)
projectId
string
returnMarkup
boolean
Include the full SVG markup in the response (default true)
colors
number
Palette size to quantise to (2-16, default 8). Use 3-4 for a flat two-colour mark: the default over-fragments clean edges into many near-identical bands.

list_assets

List stored image assets (uploads, generations, exports) — ids to use in device screenshots, image layers, and backgrounds. Pass withUrls to get short-lived preview URLs.

projectId
string
Limit to one project
kind
upload | generated | export
withUrls
boolean
Include presigned URLs (first 20)

export_icons

Export a complete web favicon set from an icon project: apple-touch-icon, 192/512 PNGs (plus maskable), a multi-size favicon.ico, an SVG favicon, site.webmanifest and a paste-ready <head> snippet — delivered as one zip URL. Android and Apple app-icon bundles are still browser-only (see the studio).

projectId*
string
appName
string
Name written into the web manifest (default: the project name)

get_credits

Remaining AI credits and storage usage for the workspace.

list_device_frames

List available device frames for device layers.

save_version

Save a named snapshot of a project's scene (paid plans). Take one before a risky batch of edits — restore_version puts it back exactly. Restoring also snapshots the current state first, so a restore is always reversible.

projectId*
string
label
string
Short name, e.g. "before retheme"

list_versions

List a project's saved scene versions, newest first (paid plans).

projectId*
string

restore_version

Restore a saved version over the project's live scene (paid plans). The current scene is snapshotted first, so this is always reversible — restore that snapshot to go forward again.

projectId*
string
versionId*
string

create_drawing

Create a vector drawing: a freeform canvas of editable Bézier paths, separate from screenshot projects. Returns the drawing id and a summary. Use edit_drawing to draw into it and render_drawing to look at it.

name
string
Drawing name
width
number
Canvas width (default 1024)
height
number
Canvas height (default 1024)
background
any
Canvas background: "none" for transparent, a colour like "#eef5fb", or a gradient {type:"linear",angle:90,stops:[{offset:0,color:"#eef5fb"},{offset:1,color:"#fdf6ee"}]}. Defaults to transparent.

import_svg

Import an SVG document into a drawing as editable paths. Adds to whatever is already there rather than replacing it. Returns what arrived and, importantly, a list of anything the file contained that could NOT be represented — read those warnings and tell the user, because the artwork will be missing those parts.

drawingId*
string
svg*
string
The complete SVG markup.

list_drawings

List the workspace's vector drawings (id, name, updated_at).

get_drawing

A drawing's structure: canvas size, and every path with its styling, subpaths and node counts. Node coordinates are NOT included — ask for one path with get_path_data when you need its geometry.

drawingId*
string

get_path_data

One path's geometry as an SVG path data string. Fetch this only for a path you are about to reshape — it is the expensive part of a drawing.

drawingId*
string
pathId*
string

edit_drawing

Apply edit commands to a drawing. Create geometry in bulk with SVG path data (addPath/setPathData); adjust existing geometry by stable id (moveNodes/insertNode/deleteNodes). Commands apply in order; each reports applied or no-op. See get_started for the full command reference.

drawingId*
string
commands*
array
Drawing commands, e.g. {"t":"addPath","d":"M 100 100 C 200 0 300 200 400 100","fill":"none","stroke":{"color":"#f5a524","width":8}} or {"t":"moveNodes","edits":[{"pathId":"…","subpathId":"…","nodeId":"…","point":{"x":10,"y":20}}]}

render_drawing

Render a drawing to a PNG you can SEE. Use this after editing to check the result before continuing.

drawingId*
string
maxDim
number
Longest side in pixels (64-1200, default 560)

export_drawing_svg

The drawing as standalone SVG markup. Paste it into a screenshot as a vector layer (addLayer with an svg field), or save it.

drawingId*
string

list_fonts

Font families available for addText, with their weights. Families marked offline are bundled; the rest load from Google Fonts on first use.

delete_drawing

Delete a drawing. This cannot be undone.

drawingId*
string

* required