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 sizeTool 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