App Store and Google Play screenshots MCP: your agent captures the app, you edit and export. Free.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Use this when you have designed art for an app yourself and the user should get it as an editable project: App Store listing art that loops as a video (a product page header, search result, or In-App Event card or page), or a still marketing image (an X, LinkedIn or Instagram post, a link preview, a Product Hunt image, a 16:9 image, Google Play's feature graphic). Takes 1 to 4 variants (directions for the user to choose from), each a background and layers: art you draw as SVG, library pieces, the app's icon, text, and phone frames showing the app (an iPhone, the iPhone Duo open from behind and from the front...), with moves and a loop on listing art. Checks everything and returns a preview image of each variant, warnings, a design_handle for update_design, and open_url, which opens the design in the appdesigns editor, where the user keeps a direction, tweaks any layer, saves it and exports it. Nothing is public and no account is needed. The design waits 72 hours to be opened and saved.
The directions, each a whole design. The first is the one you would pick.
The app's name. It becomes the project name in the user's appdesigns library.
Listing art: header (3840x1646), search_result (3840x2560), event_card (3840x2160) or event_page (2160x3840). Stills: x_post (1600x900), linkedin_post (1200x627), link_preview (1200x630), instagram_square (1080x1080), instagram_portrait (1080x1350), instagram_tall (1080x1440), product_hunt (1270x760), wide_image (1920x1080), play_feature_graphic (1024x500).
false for a still image (the user asked for one): the moves are kept with motion turned off, so the Motion toggle brings them back.
A project_id from list_projects (the user signed in): the new asset is saved into that saved project of theirs. Use it, not same_project_as, to add to something the user already saved.
The app's App Store link, if it is on the App Store: the editor's preview phone then shows its real name and icon, app_icon layers use its icon, and a phone layer can show one of its App Store screenshots.
The project_handle or design_handle of an earlier asset from this conversation (screenshots, a header...). The user's save then files this one in the same project, once they have saved that one.
The project_handle of a screenshot set you made with create_project in this conversation (finished, not yet saved): a phone layer's screenshot n then shows that set's n-th capture, instead of an App Store screenshot. No sign-in needed.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Use this when you have designed art for an app yourself and the user should get it as an editable project: App Store listing art that loops as a video (a product page header, search result, or In-App Event card or page), or a still marketing image (an X, LinkedIn or Instagram post, a link preview, a Product Hunt image, a 16:9 image, Google Play's feature graphic). Takes 1 to 4 variants (directions for the user to choose from), each a background and layers: art you draw as SVG, library pieces, the app's icon, text, and phone frames showing the app (an iPhone, the iPhone Duo open from behind and from the front...), with moves and a loop on listing art. Checks everything and returns a preview image of each variant, warnings, a design_handle for update_design, and open_url, which opens the design in the appdesigns editor, where the user keeps a direction, tweaks any layer, saves it and exports it. Nothing is public and no account is needed. The design waits 72 hours to be opened and saved.
| Argument | Type | Description |
|---|---|---|
| asset | string | Listing art: header (3840x1646), search_result (3840x2560), event_card (3840x2160) or event_page (2160x3840). Stills: x_post (1600x900), linkedin_post (1200x627), link_preview (1200x630), instagram_square (1080x1080), instagram_portrait (1080x1350), instagram_tall (1080x1440), product_hunt (1270x760), wide_image (1920x1080), play_feature_graphic (1024x500). |
| animated | boolean | false for a still image (the user asked for one): the moves are kept with motion turned off, so the Motion toggle brings them back. |
| variants* | array | The directions, each a whole design. The first is the one you would pick. |
| project_id | string | A project_id from list_projects (the user signed in): the new asset is saved into that saved project of theirs. Use it, not same_project_as, to add to something the user already saved. |
| project_name* | string | The app's name. It becomes the project name in the user's appdesigns library. |
| app_store_url | string | The app's App Store link, if it is on the App Store: the editor's preview phone then shows its real name and icon, app_icon layers use its icon, and a phone layer can show one of its App Store screenshots. |
| same_project_as | string | The project_handle or design_handle of an earlier asset from this conversation (screenshots, a header...). The user's save then files this one in the same project, once they have saved that one. |
| screenshots_from | string | The project_handle of a screenshot set you made with create_project in this conversation (finished, not yet saved): a phone layer's screenshot n then shows that set's n-th capture, instead of an App Store screenshot. No sign-in needed. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"project_name",
"variants"
],
"properties": {
"asset": {
"enum": [
"header",
"search_result",
"event_card",
"event_page",
"x_post",
"linkedin_post",
"link_preview",
"instagram_square",
"instagram_portrait",
"instagram_tall",
"product_hunt",
"wide_image",
"play_feature_graphic"
],
"type": "string",
"default": "header",
"description": "Listing art: header (3840x1646), search_result (3840x2560), event_card (3840x2160) or event_page (2160x3840). Stills: x_post (1600x900), linkedin_post (1200x627), link_preview (1200x630), instagram_square (1080x1080), instagram_portrait (1080x1350), instagram_tall (1080x1440), product_hunt (1270x760), wide_image (1920x1080), play_feature_graphic (1024x500)."
},
"animated": {
"type": "boolean",
"default": true,
"description": "false for a still image (the user asked for one): the moves are kept with motion turned off, so the Motion toggle brings them back."
},
"variants": {
"type": "array",
"items": {
"type": "object",
"required": [
"title",
"background",
"layers"
],
"properties": {
"loop": {
"type": "object",
"properties": {
"fps": {
"anyOf": [
{
"type": "number",
"const": 30
},
{
"type": "number",
"const": 60
}
],
"description": "Default 30."
},
"effects": {
"type": "array",
"items": {
"type": "object",
"required": [
"effect"
],
"properties": {
"color": {
"type": "string",
"pattern": "^#[0-9a-fA-F]{6}$",
"description": "Leave it out for a colour that shows on the background."
},
"layer": {
"enum": [
"front",
"back"
],
"type": "string",
"description": "front draws over everything, back just over the background. Default front."
},
"speed": {
"enum": [
"slow",
"medium",
"fast"
],
"type": "string"
},
"amount": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "0 to 1, how many. Default 0.5."
},
"effect": {
"enum": [
"sparkles",
"snow",
"confetti",
"bokeh"
],
"type": "string",
"description": "Particles over the whole canvas. Anyone can try them; exporting them needs appdesigns Pro."
}
}
},
"maxItems": 2
},
"seconds": {
"type": "integer",
"maximum": 30,
"minimum": 5,
"description": "Loop length: 5 to 30 for the header and search result (default 8), 15 to 30 for event art (default 15)."
},
"background": {
"enum": [
"still",
"flow",
"shift"
],
"type": "string",
"description": "flow sways a gradient, shift drifts the colours a little round the wheel. Default still."
}
}
},
"title": {
"type": "string",
"maxLength": 40,
"minLength": 1,
"description": "The direction's name in a few words (\"Heartbeat line\"). It names the screen in the editor."
},
"layers": {
"type": "array",
"items": {
"type": "object",
"required": [
"id",
"x",
"y"
],
"properties": {
"x": {
"type": "number",
"maximum": 2,
"minimum": -1,
"description": "Horizontal centre as a share of the canvas width (0 left edge, 1 right edge). For text: the centre of centred text, the left edge of left-aligned text, the right edge of right-aligned text."
},
"y": {
"type": "number",
"maximum": 2,
"minimum": -1,
"description": "Vertical centre as a share of the canvas height (0 top, 1 bottom). For text: the middle of the whole block."
},
"id": {
"type": "string",
"pattern": "^[a-z0-9][a-z0-9-]{0,31}$",
"description": "Unique within the variant, such as \"heart\" or \"headline\". update_design names layers by it."
},
"svg": {
"type": "string",
"maxLength": 60000,
"description": "Art you draw: one standalone <svg> with a viewBox and a transparent background, cropped tight to the drawing. Paths, shapes, gradients, clip paths, masks and filters only; no <text>, <image>, scripts, stroke-dasharray, feMorphology, CSS animation or outside files."
},
"flip": {
"type": "boolean",
"description": "svg only: mirror it left to right."
},
"fold": {
"type": "string",
"maxLength": 30,
"description": "phone, iPhone Duo: inner-open (Unfolded), outer-closed (Cover) or outer-open (Open back, the open phone from behind); the editor's names work too."
},
"font": {
"enum": [
"Inter",
"DM Sans",
"Poppins",
"Space Grotesk",
"Roboto",
"Lato",
"Playfair Display",
"Georgia",
"Pacifico",
"Caveat",
"Dancing Script",
"Great Vibes"
],
"type": "string",
"description": "text: default Inter."
},
"size": {
"type": "number",
"maximum": 600,
"minimum": 16,
"description": "text: font size in canvas pixels."
},
"text": {
"type": "string",
"maxLength": 120,
"description": "Words, stay editable in the editor. Break lines yourself with \\n (at most 4 lines); nothing wraps."
},
"tint": {
"type": "string",
"pattern": "^#[0-9a-fA-F]{6}$",
"description": "library only: recolour the piece in one flat colour (SF Symbols are white glyphs)."
},
"align": {
"enum": [
"left",
"center",
"right"
],
"type": "string",
"description": "text: default center."
},
"color": {
"type": "string",
"pattern": "^#[0-9a-fA-F]{6}$",
"description": "text: default #1C1917."
},
"phone": {
"type": "string",
"maxLength": 40,
"description": "A phone frame showing the app: a device id from list_devices (iphone-duo, iphone-17-pro-max...). Takes width or height, frame_color, fold, orientation and screenshot."
},
"width": {
"type": "number",
"maximum": 3,
"description": "svg, app_icon and library: width as a share of the canvas width; the height follows the art's own shape.",
"exclusiveMinimum": 0
},
"height": {
"type": "number",
"maximum": 3,
"description": "phone only: its height as a share of the canvas height, instead of width.",
"exclusiveMinimum": 0
},
"motion": {
"type": "object",
"required": [
"move"
],
"properties": {
"move": {
"enum": [
"float",
"drift",
"orbit",
"sway",
"spin",
"pulse",
"fade",
"pop",
"none"
],
"type": "string",
"description": "float bobs up and down, drift wanders in a figure of eight, orbit circles its spot, sway rocks side to side, spin turns all the way round, pulse grows and shrinks, fade fades in and out, pop is a quick bounce once a cycle. Text takes float, drift or sway only. none takes a move off."
},
"speed": {
"enum": [
"slow",
"medium",
"fast"
],
"type": "string",
"description": "slow (about 8 s a cycle, the default), medium (about 4 s) or fast (about 2.5 s). Rounded to whole cycles per loop, so the video loops without a seam."
},
"amount": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "0 to 1, subtle to bold. Default 0.5."
},
"offset": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "0 to 1: where in its cycle the layer starts, so layers sharing a move do not move in step. Default 0."
}
}
},
"weight": {
"type": "integer",
"maximum": 900,
"minimum": 100,
"description": "text: 100 to 900, default 700."
},
"library": {
"type": "string",
"maxLength": 200,
"description": "A piece from the appdesigns library by its path from search_library (\"3d/3d-cube-purple.png\"): SF Symbols, emoji, 3D shapes, glows, badges and more."
},
"opacity": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "svg, app_icon and library only. Default 1."
},
"app_icon": {
"type": "boolean",
"description": "true for the app's own App Store icon (needs app_store_url), drawn with iOS corners."
},
"rotation": {
"type": "number",
"maximum": 360,
"minimum": -360,
"description": "Degrees clockwise. Default 0."
},
"screenshot": {
"type": "integer",
"maximum": 10,
"minimum": 1,
"description": "phone: show screenshot n: the n-th screen of the set screenshots_from names (your own captures), else the app's n-th App Store screenshot (app_store_url). Leave it out for an empty screen, which replace_screenshots fills."
},
"frame_color": {
"type": "string",
"maxLength": 40,
"description": "phone: a colour id of the device from list_devices; default its first."
},
"line_height": {
"type": "number",
"maximum": 2,
"minimum": 0.8,
"description": "text: a multiple of the size, default 1.15."
},
"orientation": {
"enum": [
"portrait",
"landscape"
],
"type": "string",
"description": "phone: upright or on its side; default the way up of the screenshot it shows, else the canvas's (Open back is always on its side)."
}
}
},
"maxItems": 24,
"description": "Bottom first, at most 24."
},
"background": {
"type": "object",
"properties": {
"color": {
"type": "string",
"pattern": "^#[0-9a-fA-F]{6}$",
"description": "A plain colour."
},
"gradient": {
"type": "object",
"required": [
"type",
"colors"
],
"properties": {
"type": {
"enum": [
"linear",
"radial"
],
"type": "string"
},
"angle": {
"type": "number",
"maximum": 360,
"minimum": 0,
"description": "linear: 0 runs left to right, 90 top to bottom. Default 90."
},
"colors": {
"type": "array",
"items": {
"type": "string",
"pattern": "^#[0-9a-fA-F]{6}$"
},
"maxItems": 5,
"minItems": 2,
"description": "2 to 5 colours, evenly spread across the whole canvas."
}
},
"description": "A gradient instead of a plain colour; radial runs from the centre out."
}
}
}
}
},
"maxItems": 4,
"minItems": 1,
"description": "The directions, each a whole design. The first is the one you would pick."
},
"project_id": {
"type": "string",
"pattern": "^[0-9a-f-]{36}$",
"description": "A project_id from list_projects (the user signed in): the new asset is saved into that saved project of theirs. Use it, not same_project_as, to add to something the user already saved."
},
"project_name": {
"type": "string",
"maxLength": 60,
"minLength": 1,
"description": "The app's name. It becomes the project name in the user's appdesigns library."
},
"app_store_url": {
"type": "string",
"maxLength": 300,
"description": "The app's App Store link, if it is on the App Store: the editor's preview phone then shows its real name and icon, app_icon layers use its icon, and a phone layer can show one of its App Store screenshots."
},
"same_project_as": {
"type": "string",
"maxLength": 100,
"minLength": 10,
"description": "The project_handle or design_handle of an earlier asset from this conversation (screenshots, a header...). The user's save then files this one in the same project, once they have saved that one."
},
"screenshots_from": {
"type": "string",
"maxLength": 100,
"minLength": 10,
"description": "The project_handle of a screenshot set you made with create_project in this conversation (finished, not yet saved): a phone layer's screenshot n then shows that set's n-th capture, instead of an App Store screenshot. No sign-in needed."
}
}
}Use this when you can run shell commands on the user's machine and have their app's screenshots as local files (a coding agent). Not for a chat without a terminal, such as ChatGPT, where the upload command cannot run. Starts a screenshot set: 1 to 6 screenshots in store order, each with a screen name and a headline. Returns a project_handle and one upload command (bash and PowerShell forms) that sends every screenshot straight to storage; run it once, then call finish_project with the handle. Upload and call finish_project within 1 hour (an unfinished project lapses then); a finished one waits 72 hours to be opened. Nothing is public and no account is needed; the user saves the set to their account when they open the link finish_project returns.
| Argument | Type | Description |
|---|---|---|
| fold | string | iPhone Duo only: inner-open (Unfolded, the open inner display), outer-closed (Cover, the folded cover display) or outer-open (Open back, the open phone from behind, showing its cover display). The editor's names work too. Leave it out for the display the canvas is. |
| store | string | Which store the set is for. |
| device | string | A device id from list_devices. Defaults to iphone-17-pro-max for the App Store and pixel-11-pro for Google Play. |
| screens* | array | One entry per screenshot, in the order the store should show them. The first sells the app. |
| project_id | string | A project_id from list_projects (the user signed in): the new asset is saved into that saved project of theirs. Use it, not same_project_as, to add to something the user already saved. |
Use this to change something, after get_asset: one the user saved (asset_id) or a set or design you made in this conversation (handle). Rewrite or restyle text, move, resize or recolour layers, add art you draw as SVG, a library piece (search_library), a phone frame or new text, remove or reorder layers, move or resize the phone or change its model, colour and fold, change the background or the loop, turn the whole set landscape or portrait or give it another size of the same asset (set_canvas), rename, duplicate, reorder or remove screens. Send only what changes, with the revision get_asset returned; the asset changes at once (like an edit in the editor) and the reply has the new revision, previews of the changed screens and warnings. A set or design changed this way keeps changing here: update_project and update_design no longer apply to it. With asset_id (something the user saved) it needs the user signed in to appdesigns (in Claude Code type /mcp, pick appdesigns and choose Authenticate (or run `claude mcp login appdesigns` in a separate terminal), in Codex run `codex mcp login appdesigns`; other agents open the sign-in page themselves); with handle (a set or design you made in this conversation, not saved yet) it needs no sign-in.
| Argument | Type | Description |
|---|---|---|
| handle | string | Instead of asset_id: the project_handle create_project returned or the design_handle create_design returned, for something you made in this conversation that the user has not saved yet. Needs no sign-in. |
| changes* | array | Applied in order, all or none. Layer positions count from 0 at the bottom of the screen's layers list, the phone included. |
| asset_id | string | The asset_id list_projects returned. |
Use this when the user wants the finished files (to upload to App Store Connect or the Play Console, or to use elsewhere) of something they saved (asset_id) or something you made in this conversation (handle). The files are made by the appdesigns editor in the user's browser, the same pixels its Export saves: open_url opens it there and makes them (a PNG per screen, and an MP4 for a screen whose loop is on), then get_export with export_id gives a command that downloads them. With asset_id (something the user saved) it needs the user signed in to appdesigns (in Claude Code type /mcp, pick appdesigns and choose Authenticate (or run `claude mcp login appdesigns` in a separate terminal), in Codex run `codex mcp login appdesigns`; other agents open the sign-in page themselves); with handle (a set or design you made in this conversation, not saved yet) it needs no sign-in.
| Argument | Type | Description |
|---|---|---|
| format | string | auto: an MP4 for each screen whose loop is on (an animated listing asset), a PNG for every other screen. png: stills only. |
| handle | string | Instead of asset_id: the project_handle create_project returned or the design_handle create_design returned, for something you made in this conversation that the user has not saved yet. Needs no sign-in. |
| asset_id | string | The asset_id list_projects returned. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"format": {
"enum": [
"auto",
"png"
],
"type": "string",
"default": "auto",
"description": "auto: an MP4 for each screen whose loop is on (an animated listing asset), a PNG for every other screen. png: stills only."
},
"handle": {
"type": "string",
"maxLength": 100,
"minLength": 10,
"description": "Instead of asset_id: the project_handle create_project returned or the design_handle create_design returned, for something you made in this conversation that the user has not saved yet. Needs no sign-in."
},
"asset_id": {
"type": "string",
"pattern": "^[0-9a-f-]{36}$",
"description": "The asset_id list_projects returned."
}
}
}Use this when the user wants their app in the appdesigns gallery (appdesigns.click/apps): a screenshot set they saved (asset_id, from save_to_account or list_projects) is sent for review as a template other makers start from, listed with the app's icon, name and store link, so other makers get inspiration and the user gets seen. A person reviews it within 24 to 48 hours and the user gets an email when it is live. The set needs at least 3 screens, an App Store or Google Play link, and an icon: taken from the App Store link (Apple's public lookup), else the project's icon in appdesigns, else icon. Ask the user before calling it: the listing is public. Needs the user signed in to appdesigns; a call without it fails asking for sign-in, and then the user signs in (in Claude Code type /mcp, pick appdesigns and choose Authenticate (or run `claude mcp login appdesigns` in a separate terminal), in Codex run `codex mcp login appdesigns`; other agents open the sign-in page themselves).
| Argument | Type | Description |
|---|---|---|
| icon | string | An https URL of the app icon (square; on appdesigns.click, Supabase storage or Apple's image CDN). Leave it out: the icon comes from the App Store link, else the project's icon. |
| app_name* | string | The app's name as the store shows it. |
| asset_id* | string | The asset_id list_projects returned. |
| x_handle | string | The maker's X handle, if they want to be tagged when the listing is shared on X (a handle or a profile link). |
| description |
Checks that every screenshot of a project was uploaded and is a real PNG or JPEG, then returns the link that opens the set in the appdesigns editor, where the user saves it to their account and can edit and export it. Calling it again returns a fresh link and retires the previous one.
| Argument | Type | Description |
|---|---|---|
| project_handle* | string | The project_handle create_project returned. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"project_handle"
],
"properties": {
"project_handle": {
"type": "string",
"maxLength": 100,
"minLength": 10,
"description": "The project_handle create_project returned."
}
}
}Use this before changing an asset with edit_asset, or when the user asks what one looks like: one the user saved (asset_id) or a set or design you made in this conversation (handle). Returns its screens, each with its background, its layers bottom first (text, pictures and the phone, each with an id, a position as a share of the canvas and its style) and its loop if it is animated, plus warnings about what may look off, and a preview image of each screen. Also returns the revision edit_asset needs. With asset_id (something the user saved) it needs the user signed in to appdesigns (in Claude Code type /mcp, pick appdesigns and choose Authenticate (or run `claude mcp login appdesigns` in a separate terminal), in Codex run `codex mcp login appdesigns`; other agents open the sign-in page themselves); with handle (a set or design you made in this conversation, not saved yet) it needs no sign-in. Read-only.
| Argument | Type | Description |
|---|---|---|
| handle | string | Instead of asset_id: the project_handle create_project returned or the design_handle create_design returned, for something you made in this conversation that the user has not saved yet. Needs no sign-in. |
| asset_id | string | The asset_id list_projects returned. |
| previews | array | Which screens to preview, from 1. Default: all of them. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"handle": {
"type": "string",
"maxLength": 100,
"minLength": 10,
"description": "Instead of asset_id: the project_handle create_project returned or the design_handle create_design returned, for something you made in this conversation that the user has not saved yet. Needs no sign-in."
},
"asset_id": {
"type": "string",
"pattern": "^[0-9a-f-]{36}$",
"description": "The asset_id list_projects returned."
},
"previews": {
"type": "array",
"items": {
"type": "integer",
"maximum": 6,
"minimum": 1
},
"maxItems": 6,
"description": "Which screens to preview, from 1. Default: all of them."
}
}
}Use this when the user wants App Store listing art (an animated product page header, a search result, In-App Event art) or a marketing image (a launch post for X, LinkedIn or Instagram, a link preview, a Play feature graphic) designed for their app and you will draw it yourself. Returns the appdesigns recipe for that asset as markdown: its size and what crops or covers it, the layer format create_design takes (phone frames included), the moves, the quality bar and the hand-off to the user. Read-only; changes nothing.
| Argument | Type | Description |
|---|---|---|
| asset | string | The asset, as create_design names it: header, search_result, event_card, event_page, x_post, linkedin_post, link_preview, instagram_square, instagram_portrait, instagram_tall, product_hunt, wide_image or play_feature_graphic. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"asset": {
"enum": [
"header",
"search_result",
"event_card",
"event_page",
"x_post",
"linkedin_post",
"link_preview",
"instagram_square",
"instagram_portrait",
"instagram_tall",
"product_hunt",
"wide_image",
"play_feature_graphic"
],
"type": "string",
"default": "header",
"description": "The asset, as create_design names it: header, search_result, event_card, event_page, x_post, linkedin_post, link_preview, instagram_square, instagram_portrait, instagram_tall, product_hunt, wide_image or play_feature_graphic."
}
}
}Use this after export_asset, once the user has the editor open: says whether the files are made, and when they are, returns them with a command that downloads them into a folder (bash and PowerShell) and where they go next in App Store Connect or the Play Console. The command's links work until the export expires (24 hours after export_asset); each call with the files ready makes new links and retires the earlier ones, so run the command from the latest call. Pass the handle too when you exported something you made in this conversation; then it needs no sign-in, else it needs the user signed in (in Claude Code type /mcp, pick appdesigns and choose Authenticate (or run `claude mcp login appdesigns` in a separate terminal), in Codex run `codex mcp login appdesigns`; other agents open the sign-in page themselves).
| Argument | Type | Description |
|---|---|---|
| handle | string | Instead of asset_id: the project_handle create_project returned or the design_handle create_design returned, for something you made in this conversation that the user has not saved yet. Needs no sign-in. |
| export_id* | string | The export_id export_asset returned. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"export_id"
],
"properties": {
"handle": {
"type": "string",
"maxLength": 100,
"minLength": 10,
"description": "Instead of asset_id: the project_handle create_project returned or the design_handle create_design returned, for something you made in this conversation that the user has not saved yet. Needs no sign-in."
},
"export_id": {
"type": "string",
"pattern": "^[0-9a-f-]{36}$",
"description": "The export_id export_asset returned."
}
}
}Use this when you are working in an app's code and can run commands (a coding agent) and the user wants App Store or Google Play screenshots of that app. Returns the full appdesigns recipe for one platform and store, as markdown: how to pick the screens, how to check and populate demo data with the user's consent, the exact capture commands (simulator or emulator, status bar, deep links), the caption rules, and the upload and hand-off steps. Not for a chat without a terminal, where the screenshots come as attachments instead. Read-only; changes nothing.
| Argument | Type | Description |
|---|---|---|
| store | string | Which store the screenshots are for. |
| platform* | string | How the app is built: ios (Swift or Objective-C), android (Kotlin or Java), expo, react-native, flutter, or web (a web app or PWA). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"platform"
],
"properties": {
"store": {
"enum": [
"app_store",
"play"
],
"type": "string",
"default": "app_store",
"description": "Which store the screenshots are for."
},
"platform": {
"enum": [
"ios",
"android",
"expo",
"react-native",
"flutter",
"web"
],
"type": "string",
"description": "How the app is built: ios (Swift or Objective-C), android (Kotlin or Java), expo, react-native, flutter, or web (a web app or PWA)."
}
}
}Use this when the user asks which devices, frame colours or canvas sizes appdesigns offers, or before choosing a non-default device for a screenshot set. Lists them for one store, with the defaults used when you leave them out. The App Store gets Apple devices only; Google Play gets Android phones. Read-only.
| Argument | Type | Description |
|---|---|---|
| store | string | Which store the screenshots are for. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"store": {
"enum": [
"app_store",
"play"
],
"type": "string",
"default": "app_store",
"description": "Which store the screenshots are for."
}
}
}Use this when the user wants to work on something they already made in appdesigns: change a screenshot set, a header or event art they saved, add to a project, or see what a project still lacks. Lists their projects (one per app) with every saved asset in each (asset_id, kind, canvas size, last edit) and what each project still needs. Needs the user signed in to appdesigns; a call without it fails asking for sign-in, and then the user signs in (in Claude Code type /mcp, pick appdesigns and choose Authenticate (or run `claude mcp login appdesigns` in a separate terminal), in Codex run `codex mcp login appdesigns`; other agents open the sign-in page themselves). Read-only.
| Argument | Type | Description |
|---|---|---|
| query | string | Only projects or assets whose name contains this, ignoring case. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"query": {
"type": "string",
"maxLength": 80,
"description": "Only projects or assets whose name contains this, ignoring case."
}
}
}Use this when the user has attached screenshots of their own app in this conversation and wants App Store or Google Play screenshots made from them: store listing images, framed screenshots or app mockups for the App Store or Play Store. Each screenshot is put in a real device frame on a background with the screen name and headline you write, at the store's exact size, and open_url opens the set as an editable project in the appdesigns editor. Takes 1 to 6 screenshots (PNG, JPEG, WebP or GIF, at most 20 MB each, all the same way up; landscape ones make a landscape App Store set) in store order, with one screens entry per screenshot in the same order. Each must be a raw capture of the app as the device shows it. Do not use it for images that already have a device frame, a background or marketing text (the user needs to attach the raw screenshots instead), to invent app screens that do not exist, or when nothing is attached (the user needs to attach screenshots first). The screenshots are stored privately so open_url can load them; it works for 72 hours or until the user saves the set to their account. Nothing is public and no account is needed to make the set.
| Argument | Type | Description |
|---|---|---|
| store | string | Which store the set is for: app_store for iPhone or iPad screenshots, play for Android. |
| device | string | A device id from list_devices. Defaults to iphone-17-pro-max for the App Store and pixel-11-pro for Google Play. |
| screens* | array | One entry per attached screenshot, in the same order as screenshots. The first sells the app. |
| canvas_size | string | A canvas size from list_devices, as WIDTHxHEIGHT. Leave it out for the store default, or the store size the screenshots are; landscape screenshots make a landscape App Store set. |
Use this when a set needs new screenshots in its phones: a recapture, a fixed screen, or a phone frame layer to fill (get_asset shows those as "phone frame: ..."), in a set the user saved (asset_id) or a set or design you made in this conversation (handle). Two calls. First with asset_id or handle and screens (each a screen number, the local file and, for a phone frame layer, its id): it returns one upload command (bash and PowerShell) that sends the files straight to storage. Run it, then call again with the same asset_id or handle, replace_handle and the revision get_asset returned: the files are checked (PNG or JPEG, the shape of the phone's screen) and swapped in, and the reply has the new revision and previews. With asset_id (something the user saved) it needs the user signed in to appdesigns (in Claude Code type /mcp, pick appdesigns and choose Authenticate (or run `claude mcp login appdesigns` in a separate terminal), in Codex run `codex mcp login appdesigns`; other agents open the sign-in page themselves); with handle (a set or design you made in this conversation, not saved yet) it needs no sign-in.
| Argument | Type | Description |
|---|---|---|
| handle | string | Instead of asset_id: the project_handle create_project returned or the design_handle create_design returned, for something you made in this conversation that the user has not saved yet. Needs no sign-in. |
| screens | array | First call: what goes where, at most 6 files a call. |
| asset_id | string | The asset_id list_projects returned. |
| revision | string | Second call: the revision get_asset (or the last edit) returned. |
Use this when the user is signed in and a set you made is ready: after finish_project (and any update_project), or create_design (and any update_design), once the previews look right. Saves it straight into their appdesigns library, into the project you named with project_id or same_project_as (else a new project named after it), with no link to open and nothing for them to press. Returns the saved asset_id and revision for edit_asset, and open_url, which opens the saved set in the editor. The draft's own link then opens the saved set. Needs the user signed in to appdesigns; a call without it fails asking for sign-in, and then the user signs in (in Claude Code type /mcp, pick appdesigns and choose Authenticate (or run `claude mcp login appdesigns` in a separate terminal), in Codex run `codex mcp login appdesigns`; other agents open the sign-in page themselves).
| Argument | Type | Description |
|---|---|---|
| handle* | string | The project_handle create_project returned, or the design_handle create_design returned. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"handle"
],
"properties": {
"handle": {
"type": "string",
"maxLength": 100,
"minLength": 10,
"description": "The project_handle create_project returned, or the design_handle create_design returned."
}
}
}Use this when a design or a saved asset needs a ready-made piece rather than art you draw: SF Symbols, emoji, 3D shapes, glows and blobs, seasonal art, store badges, ratings, payment and social marks and more (a few thousand pieces). Returns the best matches with their path, which a library layer takes (create_design and edit_asset), and one image showing them in order, left to right then down. With no match it lists the categories. Read-only.
| Argument | Type | Description |
|---|---|---|
| limit | integer | How many to return, best first. |
| query* | string | Words for what the piece shows, such as "heart", "sparkle", "3d cube", "apple pay", "christmas". |
| category | string | Keep one category, such as sf-symbols, emoji, 3d, decorative, seasonal, badges or shapes. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"query"
],
"properties": {
"limit": {
"type": "integer",
"default": 12,
"maximum": 24,
"minimum": 1,
"description": "How many to return, best first."
},
"query": {
"type": "string",
"maxLength": 80,
"minLength": 1,
"description": "Words for what the piece shows, such as \"heart\", \"sparkle\", \"3d cube\", \"apple pay\", \"christmas\"."
},
"category": {
"type": "string",
"maxLength": 40,
"description": "Keep one category, such as sf-symbols, emoji, 3d, decorative, seasonal, badges or shapes."
}
}
}Use this when the user wants a screenshot set or listing asset in another language (a localization for the App Store or Google Play): one they saved (asset_id), or one you made in this conversation (handle). You translate every text layer yourself (get_asset lists them, with their ids); this makes a copy in that language, its images copied and the original untouched, wrapping a long translation and moving the captions under it down as the editor's own Translate set does. A saved set's copy is saved into the same project (asset_id back); a copy of yours is a new set with its own handle and link, which joins the original's project when the user saves them. Returns a preview of every screen (check the line breaks) and warnings; fix any line with edit_asset. One call per language. With asset_id (something the user saved) it needs the user signed in to appdesigns (in Claude Code type /mcp, pick appdesigns and choose Authenticate (or run `claude mcp login appdesigns` in a separate terminal), in Codex run `codex mcp login appdesigns`; other agents open the sign-in page themselves); with handle (a set or design you made in this conversation, not saved yet) it needs no sign-in.
| Argument | Type | Description |
|---|---|---|
| texts* | array | Every text layer that has words, translated. Keep names and brands as written; match the source's tone and length where the language allows. |
| handle | string | Instead of asset_id: the project_handle create_project returned or the design_handle create_design returned, for something you made in this conversation that the user has not saved yet. Needs no sign-in. |
| asset_id | string | The asset_id list_projects returned. |
| language* | string | App Store Connect's code for the language, such as de-DE, fr-FR, ja, es-MX or pt-BR. |
Changes a design create_design made, before the user saves it: set fields of a layer by id, add, remove or reorder layers, or replace a variant's background, loop or title, or add or remove a variant. Send only what changes. Returns new preview images and warnings, like create_design; the open_url create_design gave then opens the new version. A design changed with edit_asset keeps changing there, and one the user already saved changes in the editor (or with edit_asset by asset_id once they sign you in).
| Argument | Type | Description |
|---|---|---|
| changes* | array | Applied in order. Positions count from 0 at the bottom. |
| design_handle* | string | The design_handle create_design returned. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"design_handle",
"changes"
],
"properties": {
"changes": {
"type": "array",
"items": {
"type": "object",
"required": [
"op"
],
"properties": {
"id": {
"type": "string",
"maxLength": 32,
"description": "The layer, for set_layer, remove_layer and move_layer."
},
"op": {
"enum": [
"set_layer",
"add_layer",
"remove_layer",
"move_layer",
"set_background",
"set_loop",
"set_title",
"add_variant",
"remove_variant"
],
"type": "string",
"description": "set_layer changes the fields you give of layer id; add_layer adds layer (on top, or at position to); remove_layer and move_layer (to a position, 0 is the bottom) take id; set_background, set_loop and set_title replace those of the variant; add_variant adds new_variant; remove_variant removes the variant."
},
"to": {
"type": "integer",
"maximum": 24,
"minimum": 0,
"description": "move_layer and add_layer: the position, 0 is the bottom."
},
"loop": {
"type": "object",
"properties": {
"fps": {
"anyOf": [
{
"type": "number",
"const": 30
},
{
"type": "number",
"const": 60
}
],
"description": "Default 30."
},
"effects": {
"type": "array",
"items": {
"type": "object",
"required": [
"effect"
],
"properties": {
"color": {
"type": "string",
"pattern": "^#[0-9a-fA-F]{6}$",
"description": "Leave it out for a colour that shows on the background."
},
"layer": {
"enum": [
"front",
"back"
],
"type": "string",
"description": "front draws over everything, back just over the background. Default front."
},
"speed": {
"enum": [
"slow",
"medium",
"fast"
],
"type": "string"
},
"amount": {
"type": "number",
"maximum": 1,
"minimum": 0,
"description": "0 to 1, how many. Default 0.5."
},
"effect": {
"enum": [
"sparkles",
"snow",
"confetti",
"bokeh"
],
"type": "string",
"description": "Particles over the whole canvas. Anyone can try them; exporting them needs appdesigns Pro."
}
}
},
"maxItems": 2
},
"seconds": {
"type": "integer",
"maximum": 30,
"minimum": 5,
"description": "Loop length: 5 to 30 for the header and search result (default 8), 15 to 30 for event art (default 15)."
},
"background": {
"enum": [
"still",
"flow",
"shift"
],
"type": "string",
"description": "flow sways a gradient, shift drifts the colours a little round the wheel. Default still."
}
}
},
"layer": {
"type": "object",
"properties": {},
"description": "A layer with create_design's fields. set_layer: only the fields to change (motion {\"move\":\"none\"} stops it). add_layer: the whole new layer.",
"additionalProperties": {}
},
"title": {
"type": "string",
"maxLength": 40
},
"variant": {
"type": "integer",
"maximum": 4,
"minimum": 1,
"description": "Which variant, from 1. Every op but add_variant needs it."
},
"background": {
"type": "object",
"properties": {
"color": {
"type": "string",
"pattern": "^#[0-9a-fA-F]{6}$",
"description": "A plain colour."
},
"gradient": {
"type": "object",
"required": [
"type",
"colors"
],
"properties": {
"type": {
"enum": [
"linear",
"radial"
],
"type": "string"
},
"angle": {
"type": "number",
"maximum": 360,
"minimum": 0,
"description": "linear: 0 runs left to right, 90 top to bottom. Default 90."
},
"colors": {
"type": "array",
"items": {
"type": "string",
"pattern": "^#[0-9a-fA-F]{6}$"
},
"maxItems": 5,
"minItems": 2,
"description": "2 to 5 colours, evenly spread across the whole canvas."
}
},
"description": "A gradient instead of a plain colour; radial runs from the centre out."
}
}
},
"new_variant": {
"type": "object",
"properties": {},
"description": "add_variant: a whole variant, as in create_design.",
"additionalProperties": {}
}
}
},
"maxItems": 60,
"minItems": 1,
"description": "Applied in order. Positions count from 0 at the bottom."
},
"design_handle": {
"type": "string",
"maxLength": 100,
"minLength": 10,
"description": "The design_handle create_design returned."
}
}
}Changes a screenshot set create_project made, before the user saves it: rewrite any screen's screen name or headline, or change the background colour, the frame colour or the device. The uploaded screenshots stay as they are. Returns new previews and warnings; the open_url finish_project gave then opens the new version. For anything more (the phone's place, size or fold, text styles, pieces, another canvas), use edit_asset with this project_handle as handle, no sign-in needed; once it has changed the set, keep using edit_asset. A set the user already saved changes with edit_asset by asset_id.
| Argument | Type | Description |
|---|---|---|
| device | string | A device id from list_devices that suits the set's canvas. |
| screens | array | Only the screens and captions that change. |
| frame_color | string | A colour id of the device from list_devices. |
| project_handle* | string | The project_handle create_project returned. |
| background_color | string | #RRGGBB. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"project_handle"
],
"properties": {
"device": {
"type": "string",
"maxLength": 40,
"description": "A device id from list_devices that suits the set's canvas."
},
"screens": {
"type": "array",
"items": {
"type": "object",
"required": [
"screen"
],
"properties": {
"screen": {
"type": "integer",
"maximum": 6,
"minimum": 1,
"description": "Which screen, from 1."
},
"headline": {
"type": "string",
"maxLength": 40,
"minLength": 1,
"description": "The big line: the benefit this screen shows, 2 to 6 words, 32 characters or fewer (40 at most; longer is set smaller). Sentence case, no trailing period. Example: \"See where every dollar goes\"."
},
"screen_name": {
"type": "string",
"maxLength": 24,
"minLength": 1,
"description": "The screen or feature name, shown as the small line: 1 to 3 words, at most 24 characters. Example: \"Weekly stats\"."
}
}
},
"maxItems": 6,
"description": "Only the screens and captions that change."
},
"frame_color": {
"type": "string",
"maxLength": 40,
"description": "A colour id of the device from list_devices."
},
"project_handle": {
"type": "string",
"maxLength": 100,
"minLength": 10,
"description": "The project_handle create_project returned."
},
"background_color": {
"type": "string",
"pattern": "^#[0-9a-fA-F]{6}$",
"description": "#RRGGBB."
}
}
}| canvas_size | string | A canvas size from list_devices, as WIDTHxHEIGHT, portrait or landscape (2868x1320 for a landscape iPhone set). Leave it out and finish_project takes the store size the screenshots are (a landscape capture makes a landscape set), else the store default (1320x2868 for iPhone, 2048x2732 for iPad, 2007x2853 for iPhone Duo, 1080x1920 for Play). |
| frame_color | string | A colour id of that device from list_devices. Leave it out to pick one that stands out from the background. |
| orientation | string | Which way up the set is, when canvas_size does not say: landscape for an app that runs in landscape (most games), and the phone is drawn on its side. Leave it out to follow the screenshots. |
| project_name* | string | The app's name. It becomes the project name in the user's appdesigns library. |
| same_project_as | string | The project_handle or design_handle of an earlier asset from this conversation (screenshots, a header...). The user's save then files this one in the same project, once they have saved that one. |
| background_color | string | #RRGGBB. Use the app's brand or accent colour if you can find it in the code. Leave it out for a neutral light background. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"project_name",
"screens"
],
"properties": {
"fold": {
"type": "string",
"maxLength": 30,
"description": "iPhone Duo only: inner-open (Unfolded, the open inner display), outer-closed (Cover, the folded cover display) or outer-open (Open back, the open phone from behind, showing its cover display). The editor's names work too. Leave it out for the display the canvas is."
},
"store": {
"enum": [
"app_store",
"play"
],
"type": "string",
"default": "app_store",
"description": "Which store the set is for."
},
"device": {
"type": "string",
"maxLength": 40,
"description": "A device id from list_devices. Defaults to iphone-17-pro-max for the App Store and pixel-11-pro for Google Play."
},
"screens": {
"type": "array",
"items": {
"type": "object",
"required": [
"screen_name",
"headline",
"file_path"
],
"properties": {
"headline": {
"type": "string",
"maxLength": 40,
"minLength": 1,
"description": "The big line: the benefit this screen shows, 2 to 6 words, 32 characters or fewer (40 at most; longer is set smaller). Sentence case, no trailing period. Example: \"See where every dollar goes\"."
},
"file_path": {
"type": "string",
"maxLength": 500,
"minLength": 1,
"description": "Absolute path to the PNG or JPEG screenshot (no ~ or $VARIABLES; they are not expanded). Not read by the server; it goes into the upload command."
},
"screen_name": {
"type": "string",
"maxLength": 24,
"minLength": 1,
"description": "The screen or feature name, shown as the small line: 1 to 3 words, at most 24 characters. Example: \"Weekly stats\"."
}
}
},
"maxItems": 6,
"minItems": 1,
"description": "One entry per screenshot, in the order the store should show them. The first sells the app."
},
"project_id": {
"type": "string",
"pattern": "^[0-9a-f-]{36}$",
"description": "A project_id from list_projects (the user signed in): the new asset is saved into that saved project of theirs. Use it, not same_project_as, to add to something the user already saved."
},
"canvas_size": {
"type": "string",
"maxLength": 12,
"description": "A canvas size from list_devices, as WIDTHxHEIGHT, portrait or landscape (2868x1320 for a landscape iPhone set). Leave it out and finish_project takes the store size the screenshots are (a landscape capture makes a landscape set), else the store default (1320x2868 for iPhone, 2048x2732 for iPad, 2007x2853 for iPhone Duo, 1080x1920 for Play)."
},
"frame_color": {
"type": "string",
"maxLength": 40,
"description": "A colour id of that device from list_devices. Leave it out to pick one that stands out from the background."
},
"orientation": {
"enum": [
"portrait",
"landscape"
],
"type": "string",
"description": "Which way up the set is, when canvas_size does not say: landscape for an app that runs in landscape (most games), and the phone is drawn on its side. Leave it out to follow the screenshots."
},
"project_name": {
"type": "string",
"maxLength": 60,
"minLength": 1,
"description": "The app's name. It becomes the project name in the user's appdesigns library."
},
"same_project_as": {
"type": "string",
"maxLength": 100,
"minLength": 10,
"description": "The project_handle or design_handle of an earlier asset from this conversation (screenshots, a header...). The user's save then files this one in the same project, once they have saved that one."
},
"background_color": {
"type": "string",
"pattern": "^#[0-9a-fA-F]{6}$",
"description": "#RRGGBB. Use the app's brand or accent colour if you can find it in the code. Leave it out for a neutral light background."
}
}
}| revision* |
| string |
| The revision get_asset (or the last edit_asset) returned. If the asset changed since, nothing changes and you read it again. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"revision",
"changes"
],
"properties": {
"handle": {
"type": "string",
"maxLength": 100,
"minLength": 10,
"description": "Instead of asset_id: the project_handle create_project returned or the design_handle create_design returned, for something you made in this conversation that the user has not saved yet. Needs no sign-in."
},
"changes": {
"type": "array",
"items": {
"type": "object",
"required": [
"op"
],
"properties": {
"id": {
"type": "string",
"maxLength": 64,
"minLength": 1,
"description": "The layer, for set_layer, remove_layer and move_layer."
},
"op": {
"enum": [
"set_layer",
"add_layer",
"remove_layer",
"move_layer",
"set_background",
"set_loop",
"set_title",
"duplicate_screen",
"remove_screen",
"move_screen",
"set_canvas"
],
"type": "string",
"description": "set_layer changes the fields you give of layer id (\"device\" is the phone); add_layer adds layer (on top, or at position to); remove_layer and move_layer (to a position in the screen's layer list, 0 is the bottom) take id; set_background, set_loop and set_title change the screen's; duplicate_screen copies the screen (to the screen number to, default right after it); remove_screen removes it; move_screen moves it to screen number to; set_canvas changes the canvas of every screen (canvas), as the editor's size chip and orientation toggle do."
},
"to": {
"type": "integer",
"maximum": 60,
"minimum": 0
},
"loop": {
"type": "object",
"properties": {},
"description": "set_loop, listing assets only: on, seconds, fps, background (still, flow, shift or zoom) and effects, as in create_design.",
"additionalProperties": {}
},
"layer": {
"type": "object",
"properties": {},
"description": "set_layer: only the fields to change; fields get_asset shows that only describe a layer (id, kind, box, what, frame, model_name, screenshot, locked) are ignored. Text: text, x, y, size, font, weight, color, align, line_height, wrap_width, rotation, motion (float, drift or sway). Picture: x, y, width or height, rotation, opacity, flip, tint (library pieces), svg or library (new art), motion. Phone frame layer: phone (a device id), color, fold, orientation, x, y, width or height, rotation, opacity, flip, motion. The screen's phone (\"device\"): shown, model, color, fold (inner-open/Unfolded, outer-closed/Cover, outer-open/Open back), x, y, height or width, rotation (-15 to 15), motion (listing assets). motion {\"move\":\"none\"} stops a move. add_layer: a whole new text (id, text, x, y, size), svg (id, svg, x, y, width), library (id, library, x, y, width) or phone frame (id, phone, x, y, height or width, and color, fold, orientation; screenshot \"screen\" shows the screen's own screenshot, else fill it with replace_screenshots) layer, with create_design's fields.",
"additionalProperties": {}
},
"title": {
"type": "string",
"maxLength": 40
},
"canvas": {
"type": "object",
"properties": {
"size": {
"type": "string",
"maxLength": 12,
"description": "WIDTHxHEIGHT of the same asset: another iPhone display or the twin turned the other way, the Duo's other display, another marketing size (320 to 4096 a side)."
},
"orientation": {
"enum": [
"portrait",
"landscape"
],
"type": "string",
"description": "Turns the set, and the phone with it (the editor's orientation toggle). A size alone keeps the phone's stance, as the size chip does."
}
},
"description": "set_canvas: the new canvas. Text keeps its place and size, as in the editor, so check the previews and move what needs it."
},
"screen": {
"type": "integer",
"maximum": 6,
"minimum": 1,
"description": "Which screen, from 1, as numbered after the changes before this one. Every op but set_canvas, which changes them all."
},
"background": {
"type": "object",
"properties": {
"color": {
"type": "string",
"pattern": "^#[0-9a-fA-F]{6}$",
"description": "A plain colour."
},
"gradient": {
"type": "object",
"required": [
"type",
"colors"
],
"properties": {
"type": {
"enum": [
"linear",
"radial"
],
"type": "string"
},
"angle": {
"type": "number",
"maximum": 360,
"minimum": 0,
"description": "linear: 0 runs left to right, 90 top to bottom. Default 90."
},
"colors": {
"type": "array",
"items": {
"type": "string",
"pattern": "^#[0-9a-fA-F]{6}$"
},
"maxItems": 5,
"minItems": 2,
"description": "2 to 5 colours, evenly spread across the whole canvas."
}
},
"description": "A gradient instead of a plain colour; radial runs from the centre out."
}
}
}
}
},
"maxItems": 60,
"minItems": 1,
"description": "Applied in order, all or none. Layer positions count from 0 at the bottom of the screen's layers list, the phone included."
},
"asset_id": {
"type": "string",
"pattern": "^[0-9a-f-]{36}$",
"description": "The asset_id list_projects returned."
},
"revision": {
"type": "string",
"maxLength": 40,
"minLength": 10,
"description": "The revision get_asset (or the last edit_asset) returned. If the asset changed since, nothing changes and you read it again."
}
}
}| string |
| One line about the app, shown on its gallery page. |
| app_store_url | string | The app's App Store page, https://apps.apple.com/... (this or play_store_url, or both). |
| play_store_url | string | The app's Google Play page, https://play.google.com/... |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"asset_id",
"app_name"
],
"properties": {
"icon": {
"type": "string",
"maxLength": 2048,
"description": "An https URL of the app icon (square; on appdesigns.click, Supabase storage or Apple's image CDN). Leave it out: the icon comes from the App Store link, else the project's icon."
},
"app_name": {
"type": "string",
"maxLength": 60,
"minLength": 1,
"description": "The app's name as the store shows it."
},
"asset_id": {
"type": "string",
"pattern": "^[0-9a-f-]{36}$",
"description": "The asset_id list_projects returned."
},
"x_handle": {
"type": "string",
"maxLength": 100,
"description": "The maker's X handle, if they want to be tagged when the listing is shared on X (a handle or a profile link)."
},
"description": {
"type": "string",
"maxLength": 160,
"description": "One line about the app, shown on its gallery page."
},
"app_store_url": {
"type": "string",
"maxLength": 500,
"description": "The app's App Store page, https://apps.apple.com/... (this or play_store_url, or both)."
},
"play_store_url": {
"type": "string",
"maxLength": 500,
"description": "The app's Google Play page, https://play.google.com/..."
}
}
}| frame_color | string | A colour id of that device from list_devices. Leave it out to pick one that stands out from the background. |
| orientation | string | Which way up the set is, when canvas_size does not say: landscape for an app that runs in landscape (most games), and the phone is drawn on its side. Leave it out to follow the screenshots. |
| screenshots* | array | The screenshots the user attached, in store order, one per screens entry. |
| project_name* | string | The app's name. It becomes the project name in the user's appdesigns library. |
| background_color | string | #RRGGBB, for example the app's brand colour as seen in the screenshots. Leave it out for a neutral light background. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"project_name",
"screens",
"screenshots"
],
"properties": {
"store": {
"enum": [
"app_store",
"play"
],
"type": "string",
"default": "app_store",
"description": "Which store the set is for: app_store for iPhone or iPad screenshots, play for Android."
},
"device": {
"type": "string",
"maxLength": 40,
"description": "A device id from list_devices. Defaults to iphone-17-pro-max for the App Store and pixel-11-pro for Google Play."
},
"screens": {
"type": "array",
"items": {
"type": "object",
"required": [
"screen_name",
"headline"
],
"properties": {
"headline": {
"type": "string",
"maxLength": 40,
"minLength": 1,
"description": "The big line: the benefit this screen shows, 2 to 6 words, 32 characters or fewer (40 at most; longer is set smaller). Sentence case, no trailing period. Example: \"See where every dollar goes\"."
},
"screen_name": {
"type": "string",
"maxLength": 24,
"minLength": 1,
"description": "The screen or feature name, shown as the small line: 1 to 3 words, at most 24 characters. Example: \"Weekly stats\"."
}
}
},
"maxItems": 6,
"minItems": 1,
"description": "One entry per attached screenshot, in the same order as screenshots. The first sells the app."
},
"canvas_size": {
"type": "string",
"maxLength": 12,
"description": "A canvas size from list_devices, as WIDTHxHEIGHT. Leave it out for the store default, or the store size the screenshots are; landscape screenshots make a landscape App Store set."
},
"frame_color": {
"type": "string",
"maxLength": 40,
"description": "A colour id of that device from list_devices. Leave it out to pick one that stands out from the background."
},
"orientation": {
"enum": [
"portrait",
"landscape"
],
"type": "string",
"description": "Which way up the set is, when canvas_size does not say: landscape for an app that runs in landscape (most games), and the phone is drawn on its side. Leave it out to follow the screenshots."
},
"screenshots": {
"type": "array",
"items": {
"type": "object",
"required": [
"download_url",
"file_id"
],
"properties": {
"file_id": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "ChatGPT's id for the attached file."
},
"file_name": {
"type": "string",
"maxLength": 300,
"description": "The file's name, when ChatGPT gives it."
},
"mime_type": {
"type": "string",
"maxLength": 100,
"description": "The file's type, when ChatGPT gives it."
},
"download_url": {
"type": "string",
"maxLength": 4000,
"minLength": 1,
"description": "The temporary download link ChatGPT gives for the attached file."
}
},
"additionalProperties": {}
},
"maxItems": 6,
"minItems": 1,
"description": "The screenshots the user attached, in store order, one per screens entry."
},
"project_name": {
"type": "string",
"maxLength": 60,
"minLength": 1,
"description": "The app's name. It becomes the project name in the user's appdesigns library."
},
"background_color": {
"type": "string",
"pattern": "^#[0-9a-fA-F]{6}$",
"description": "#RRGGBB, for example the app's brand colour as seen in the screenshots. Leave it out for a neutral light background."
}
}
}| replace_handle | string | Second call: the replace_handle the first call returned, once the upload command has run. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"handle": {
"type": "string",
"maxLength": 100,
"minLength": 10,
"description": "Instead of asset_id: the project_handle create_project returned or the design_handle create_design returned, for something you made in this conversation that the user has not saved yet. Needs no sign-in."
},
"screens": {
"type": "array",
"items": {
"type": "object",
"required": [
"screen",
"file_path"
],
"properties": {
"layer": {
"type": "string",
"maxLength": 64,
"minLength": 1,
"description": "A phone frame layer's id from get_asset; leave it out for the screen's own phone."
},
"screen": {
"type": "integer",
"maximum": 6,
"minimum": 1,
"description": "The screen, from 1."
},
"file_path": {
"type": "string",
"maxLength": 500,
"minLength": 1,
"description": "Absolute path to the PNG or JPEG (no ~ or $VARIABLES). Not read by the server; it goes into the upload command."
}
}
},
"maxItems": 6,
"minItems": 1,
"description": "First call: what goes where, at most 6 files a call."
},
"asset_id": {
"type": "string",
"pattern": "^[0-9a-f-]{36}$",
"description": "The asset_id list_projects returned."
},
"revision": {
"type": "string",
"maxLength": 40,
"minLength": 10,
"description": "Second call: the revision get_asset (or the last edit) returned."
},
"replace_handle": {
"type": "string",
"maxLength": 100,
"minLength": 10,
"description": "Second call: the replace_handle the first call returned, once the upload command has run."
}
}
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"language",
"texts"
],
"properties": {
"texts": {
"type": "array",
"items": {
"type": "object",
"required": [
"screen",
"id",
"text"
],
"properties": {
"id": {
"type": "string",
"maxLength": 64,
"minLength": 1,
"description": "The text layer's id from get_asset."
},
"text": {
"type": "string",
"maxLength": 400,
"minLength": 1,
"description": "The text in the new language; \\n breaks a line."
},
"screen": {
"type": "integer",
"maximum": 6,
"minimum": 1,
"description": "The screen, from 1."
}
}
},
"maxItems": 60,
"minItems": 1,
"description": "Every text layer that has words, translated. Keep names and brands as written; match the source's tone and length where the language allows."
},
"handle": {
"type": "string",
"maxLength": 100,
"minLength": 10,
"description": "Instead of asset_id: the project_handle create_project returned or the design_handle create_design returned, for something you made in this conversation that the user has not saved yet. Needs no sign-in."
},
"asset_id": {
"type": "string",
"pattern": "^[0-9a-f-]{36}$",
"description": "The asset_id list_projects returned."
},
"language": {
"enum": [
"ar-SA",
"ca",
"zh-Hans",
"zh-Hant",
"hr",
"cs",
"da",
"nl-NL",
"en-AU",
"en-CA",
"en-GB",
"en-US",
"fi",
"fr-FR",
"fr-CA",
"de-DE",
"el",
"he",
"hi",
"hu",
"id",
"it",
"ja",
"ko",
"ms",
"no",
"pl",
"pt-BR",
"pt-PT",
"ro",
"ru",
"sk",
"es-MX",
"es-ES",
"sv",
"th",
"tr",
"uk",
"vi"
],
"type": "string",
"description": "App Store Connect's code for the language, such as de-DE, fr-FR, ja, es-MX or pt-BR."
}
}
}