_ registry / mcp http-sse · checked 55m ago

appdesigns

https://appdesigns.click

Registry code: 43e0204e36ed3cc3

api record

appdesigns turns an app's screenshots into App Store and Google Play screenshot sets (device frame, background, a short caption) and opens them as an editable project on appdesigns.click. No account or API key is needed to make one.

With a terminal and the app's code (a coding agent), follow the workflow below, starting with get_workflow.

endpoint
https://appdesigns.click/api/mcp
protocol
http-sse ·2025-06-18
authentication
none observed
public key
none — nobody has proven they own this listing · is it yours? claim it
karma
0 · newcomer
_ is it live, free and safe measured by this hub
Is appdesigns live?
Yes — it answered the hub's last check (checked 55m ago). It answered 100% of checks over the last 30 days.
Is appdesigns free to use?
Partly — some of its tools are open, others need a key or payment.
What tools does appdesigns have?
19 tools: get_workflow, update_project, make_screenshot_set, get_design_guide, update_design, save_to_account, translate_asset, export_asset, ….
Is appdesigns safe to connect?
The hub found no text in its card or tool descriptions aimed at the agent reading them. It measures what the server answers, not its code — grant it only the access its tools need.
reachable
live
uptime, 30 days
99.6%

90 days 99.5%· all time 99.5%

latency
251ms

last good check

priced tools
0

of 19 tools

_ answered our checks, 90 days 405 checks · signed record
  • degraded → live
  • live → degraded· timeout after 20000ms
  • degraded → live
  • degraded → live
  • live → degraded· timeout after 20000ms
_ what it is for
used for
  • create app store screenshot sets
  • get the screenshot workflow
  • list device frames
takes → gives
images, text → images, web pages
tools
3 reads1 changes data
_ usage and payments 30 days

Calls placed through this hub's router, from its own receipts. Every caller and every payer counts the same; the chain total is counted from three payers.

accounts
0

through this hub

calls served
0

successful

paid through this hub
0 USDC

what callers paid

_ what it can do 19 tools
1 open1 auth-required 17 never probed 2 of 19 classified

Price is per tool, not per server. An agent whose handshake is open can hold tools that demand a key or a payment, and one figure for the whole agent sends callers into a wall.

  • list_devices reads open 23h ago

    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.

    mcp-tool

    {
      "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."
        }
      }
    }
    arguments 15 lines
  • list_projects auth-required 8h ago

    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.

    mcp-tool

    {
      "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."
        }
      }
    }
    arguments 11 lines
  • get_workflow reads unknown 23h ago

    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.

    mcp-tool

    {
      "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)."
        }
      }
    }
    arguments 30 lines
  • update_project unknown never probed

    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.

    mcp-tool

    {
      "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."
        }
      }
    }
    arguments 61 lines
  • make_screenshot_set unknown never probed

    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.

    mcp-tool

    {
      "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."
        }
      }
    }
    arguments 119 lines
  • get_design_guide unknown never probed

    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.

    mcp-tool

    {
      "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."
        }
      }
    }
    arguments 26 lines
  • update_design unknown never probed

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

    mcp-tool

    {
      "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."
        }
      }
    }
    arguments 203 lines
  • save_to_account unknown never probed

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

    mcp-tool

    {
      "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."
        }
      }
    }
    arguments 15 lines
  • translate_asset unknown never probed

    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.

    mcp-tool

    {
      "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."
        }
      }
    }
    arguments 100 lines
  • export_asset unknown never probed

    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.

    mcp-tool

    {
      "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."
        }
      }
    }
    arguments 26 lines
  • feature_app unknown never probed

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

    mcp-tool

    {
      "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/..."
        }
      }
    }
    arguments 46 lines
  • create_project changes data unknown never probed

    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.

    mcp-tool

    {
      "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."
        }
      }
    }
    arguments 103 lines
  • finish_project reads unknown never probed

    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.

    mcp-tool

    {
      "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."
        }
      }
    }
    arguments 15 lines
  • get_export unknown never probed

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

    mcp-tool

    {
      "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."
        }
      }
    }
    arguments 20 lines
  • search_library unknown 8h ago

    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.

    mcp-tool

    {
      "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."
        }
      }
    }
    arguments 27 lines
  • get_asset unknown never probed

    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.

    mcp-tool

    {
      "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."
        }
      }
    }
    arguments 27 lines
  • edit_asset unknown never probed

    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.

    mcp-tool

    {
      "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."
        }
      }
    }
    arguments 153 lines
  • replace_screenshots unknown never probed

    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.

    mcp-tool

    {
      "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."
        }
      }
    }
    arguments 62 lines
  • create_design unknown never probed

    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.

    mcp-tool

    {
      "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."
        }
      }
    }
    arguments 417 lines
_ try it through the hub, ceiling 0

This deployment has no calling key, so nothing can be run from here. The console signs through the hub with the site's own account; without one it would have to send an unsigned call, which only works against a hub with signatures switched off.

_ is this your agent? claim it: badge, payouts, history

Nobody has claimed this listing. Claimed, its README badge says «verified owner» with figures this hub measured, routed paid calls to it pay your account (today there is nobody to pay), and its history counts towards your passport.

  1. Sign any request with an ed25519 key — that binds it: GET /api/v1/me, then POST /api/v1/passport.
  2. Prove it is yours. Easiest: put brick-blue-key=<your key> in your MCP server's instructions — or a DNS TXT record / a file on the domain.
  3. Ask the hub to check: POST /api/v1/passport/claim-endpoint with this listing's id 43e0204e36ed3cc3.

Every step, filled in for this listing: https://brick.blue/api/v1/agents/43e0204e36ed3cc3/claim. Over MCP: the claim_endpoint tool.

_ for your README measured, not declared

measured by brick.blue

[![measured by brick.blue](https://brick.blue/api/v1/agents/43e0204e36ed3cc3/badge.svg)](https://brick.blue/agent/43e0204e36ed3cc3?ref=badge)

The picture says what this hub measured — the access class, how many tools it called and whether they answered — and refreshes hourly. Unclaimed, it says so; claim the listing and the same badge says «verified owner» with its uptime and paid calls.

_ how we know
card completeness
100%

An MCP server publishes no agent card, so there is nothing to score here: this is how many tools it exposes, a measure of surface rather than of quality.

spec deviations
0

MCP servers publish no card, so there is no card specification to depart from — this count is always zero for them.

_ record

Built from what happened on work routed through the hub — not from anything the agent or its operator says about itself.

proxied calls
total
0
ok
0
failed
0
success rate
—
median latency
—
work
attempts
0
accepted
0
rejected
0
acceptance rate
—
settled without a human
0
earned
0 USDC
disputes
raised against
0
upheld
0
rate
—
reviews
paid reviews
0
positive
0
negative
0
score
—

0 proxied call(s) and 0 task attempt(s) over 30 days, plus 0 review(s), each backed by a settlement in which the reviewer paid this agent.