Showoff.dev – AI Mockup Generator
Server Details
Create 3D device mockups, App Store screenshot sets and launch videos from your AI. Showoff.dev puts your screenshots on real iPhones, Pixels, iPads and MacBooks, sets camera and background, and exports App Store and Google Play sizes. Works with Claude, ChatGPT, Cursor, Codex and any MCP client.
- Status
- Healthy
- Uptime
- 98.8% over 21 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-06-18
- URL
TDQS
Scored across 23 tools
Most tools have clearly distinct purposes, and descriptions explicitly distinguish overlapping pairs such as create_project vs. create_launch_video and edit_scene vs. update_launch_video. However, the create/update/duplicate/get family still requires careful reading to avoid misselection, especially for new users.
Names consistently use lower snake_case and mostly follow a verb_noun pattern (create_project, edit_scene, list_templates, update_launch_video). The generic one-word tool 'finish' is a minor deviation from the otherwise predictable convention.
With 23 tools, the surface is on the heavy side for a mockup/video server. While each tool addresses a real operation, several specialized read/list/review helpers could likely be consolidated, making navigation harder for an agent.
The set covers the core lifecycle well: create, edit, duplicate, delete, list, inspect, render, review, export, upload, versions, templates, palettes, compositions, and devices. Minor gaps remain, such as no direct media deletion or folder creation tool, but most workflows are complete.
Available Tools
23 toolscreate_launch_videoCreate a launch videoAInspect
Creates a cinematic, music-synced launch video for an app or web product in the style of the Showoff trailer: a 9:16 Reel (1080×1920, about 30–45 s), a 16:9 film for websites (format), or a 12–30 s teaser of one to three blocks without an end block. Use it whenever the user wants a launch video, Reel or teaser; use create_project for still images, App Store sets or a free-form animated film, and update_launch_video to change an existing video. Write the story first, then compose blocks in order (every block type is explained in blocks): a video always opens with a device, every move lands on the beat of the song, and the hero lands on the drop unless another block has on_drop. Transitions never cut or dissolve; leave them out for the natural ones. Lines are 2–4 words, written natively in the language of the video; the end card is the brand name slamming into its web address (merge_into). Without blocks you get the standard film from lines and tagline. Read the guide section "Launch videos" first. Screenshots go into named slots: pass URLs, or run the returned curl commands for files on disk. Returns the render page, where the video renders in the user's browser, and what is still missing.
| Name | Required | Description | Default |
|---|---|---|---|
| look | No | "dark" (default): the trailer, devices out of the dark, light in the accent color. "light": friendly and bright, a light gradient background that opens up on the drop, dark text. | |
| loop | No | true: no end card — after the last block everything glides back into the very first frame (camera, the hero phone, its first screen, the background), so the video loops seamlessly from the start, the way Reels and TikToks replay; it ends on a full phrase of the song. Leave out the `end` block; the last block must still show the device of the hero (continue on it with navigate, or let a duo or trio fly in around it). Best with a hero style whose first frame is a moment of its own — zoom, fall, slide, wake. false goes back to an ending. | |
| name | Yes | The app name. | |
| lines | No | Only without `blocks` (the standard film): two or four lines — every block takes two or none, so one or three are rejected —, at most 24 characters each, one row each. Lines 1 and 2 are the hero — the first quiet in the intro, the second on the drop; lines 3 and 4 go over the next screen of the same phone, which comes in the way the app changes screens (navigate). The two phones after it stand without text. | |
| story | Yes | Required when creating: the ONE story this video tells, in two to four short sentences a stranger remembers after one watch — the hook, how the product gets there, what you end up with. The Showoff trailer: "Your screenshots, shot like products. Right in your browser — or just ask your AI. Ready to launch." Write it first; then every block tells the next part of it in its two lines, in order. A row of unrelated claims is not a story. Speak to the people the app is for (who they are, what they get now) and claim only what is true — never "every model" or "all colors" unless it literally is so. | |
| accent | No | #rrggbb brand color for glow and light. Default: the accent color of the first screenshot. | |
| blocks | No | The composition, in order — see the guide ("Launch videos"). Leave it out for the standard film built from `lines` and `tagline`. | |
| device | No | The device of every block without its own `device` (default iphone-17-pro). Phones only for real apps — and always an iPhone unless the user explicitly asks for another model, also for Android screenshots (the phone redraws its own status bar). For a web product take a MacBook ("macbook-pro-16") or "browser". | |
| folder | No | Only when the user names a folder: the folder in their Showoff projects to put this in, e.g. "Launch videos" or a subfolder "Showoff/Trailer" (two levels at most). Folders are found by name and created when missing. "" moves it back to the top level. | |
| format | No | "9:16" (default): a Reel for Instagram, TikTok and Shorts — phones and apps. "16:9": landscape for videos that are mostly a MacBook, a website or browser windows (YouTube, a landing page, X): the whole screen fits, pages are never cut off in a close-up. | |
| tagline | No | Only without `blocks`: a small line under the name on the end card of the standard film. Best left out — the review flags it (end-card-claim): a line under the name makes the end slow and small. For the name slamming into the web address, compose `blocks` with an `end` block and `merge_into`. | |
| variant | No | Finish of the video's device (list_devices). | |
| music_url | No | Public URL of the song (MP3, M4A, WAV, OGG, FLAC; up to 25 MB). | |
| background | No | light look: the gradient, top to bottom, as #rrggbb colors, e.g. ["#b0aff1", "#f7c6de"] (lavender to pink). Default: two pastel tones from the accent. Pass [] to go back to the default. | |
| music_drop | No | Exact second of the drop the hero lands on (snapped to the nearest beat) — when the detected drops miss the moment the chorus kicks in. Overrides music_start. A drop only a few seconds into the song is fine: the entrance before it is shortened to fit (the report says so). | |
| status_bar | No | Every phone already draws its own clean status bar (9:41, full signal, full battery) over its screenshot. true also puts one over tablet screenshots. | |
| music_start | No | Second in the song around which the video should start — it snaps to the nearest detected drop. Default: the strongest drop with enough music after it. | |
| screenshots | No | Screenshots by public URL (or tiny base64), each into a slot of the blocks. Without `slot` they fill the slots in the order of the film. Files on disk: leave this out and run the returned curl commands. | |
| music_impact | No | Only with an `end` block that has `merge_into` (a teaser without an end card ignores it): second in the song where the end card slams its title into merge_into — e.g. the next drop after the hero, or the last hit of a chorus (snapped to the nearest beat). Every block without its own `beats` stretches or shrinks to land it exactly. Pick it from `music.structure` (get_launch_video). Can be set before the song is uploaded; null removes it. | |
| project_name | No | What the user finds this video by in their projects, next to their other videos: "<product> · <what it shows>", e.g. "Tempo · Launch video, drag and drop" or "Showoff · Reel, before and after". Default: "<name> – Launch" — give it whenever the user has or makes more than one video of the product. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnly=false, destructive=false, openWorld=false; the description adds real behavior beyond that: the render happens in the user's browser, the call returns a render page plus what is still missing, screenshots can be passed as URLs or via returned curl commands for disk files, and omitting `blocks` falls back to a standard film. It does not discuss authentication or limits, but for a creative-generation tool the disclosure is well above the annotation floor.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded correctly: purpose, formats, then routing to siblings, then composition rules, then return value. It is dense and long, and a few clauses (e.g. the drop/beat rules) duplicate things the schema also explains, but nearly every sentence carries actionable instruction rather than filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 20-parameter, deeply nested creative tool with no output schema, the description covers the workflow (story first, blocks in order), the fallback path, the return value, and where to read more. What it delegates to the guide and to the 100%-covered schema is reasonable, though the guide reference means the description alone is not fully self-contained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine cross-parameter semantics the schema cannot: `story` is written before `blocks`, `blocks` elements must narrate the story in order, lines are 2-4 words per language, the end card is brand name slamming into `merge_into`, and `on_drop` belongs to exactly one block. That is more than the schema conveys field-by-field.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb and resource ('Creates a cinematic, music-synced launch video for an app or web product') and immediately enumerates the three concrete output shapes (9:16 Reel, 16:9 film, short teaser). It explicitly names the sibling tools it is not (create_project, update_launch_video), so an agent can route without opening another schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States when to use it ('whenever the user wants a launch video, Reel or teaser') and when not to, with named alternatives: create_project for stills/App Store sets/animated film, update_launch_video for edits. It also prescribes the ordering of work ('Write the story first, then compose blocks in order') and points at the guide section to read first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_projectCreate a mockup projectAInspect
Creates a new still-image or film mockup project in one call: devices arranged by a composition, reference shot or template, screenshots from URLs placed on their screens, a background palette derived from the screenshots, optional texts and extra edit_scene ops. Use it to start any image, App Store set or animated film; use create_launch_video for a music-synced launch video, duplicate_project for a variant of an existing project, and edit_scene to change a project that already exists. The result is reviewed before it is saved: if it has errors, nothing is created and you get the findings with fixes. Screenshots that are files on disk: create the project first, then run the returned curl commands. Returns project_id, editor_url, the media, the scene, the review and a preview sketch.
| Name | Required | Description | Default |
|---|---|---|---|
| ops | No | Extra edit_scene ops applied at the end, in the same format as the `ops` of edit_scene. | |
| kind | No | Still image or animated film. Fixed after creation. export_image renders a film as a still (its preview moment); the video of a film is exported by the user in the editor — there is no video export here. For a video made with you, use create_launch_video. | image |
| name | Yes | What the user finds the project by in their overview: "<app or product> · <what it shows>", in the user's language, e.g. "Tempo · App Store set, 5 images" or "Wetter · Das Wetter auf einen Blick". Never "Mockup", "Untitled" or "Test". Rename it later with edit_scene {op:"rename"} when the content changes. | |
| texts | No | Up to three texts, laid out automatically, e.g. a headline and a subline. In a store set add titles with the add_text op and its `image` instead. | |
| folder | No | Only when the user names a folder: the folder in their Showoff projects to put this in, e.g. "Launch videos" or a subfolder "Showoff/Trailer" (two levels at most). Folders are found by name and created when missing. "" moves it back to the top level. | |
| format | No | Preset (quer, klassisch, quadrat, feed, hoch, appstore, banner, vierdrei, hochkant) or {width,height}. | quer |
| devices | No | The devices on stage, in order, at most 6. Leave it out when starting from a template to keep its devices. | |
| palette | No | Palette id; default: the best-rated suggestion for the screenshots. | |
| reference | No | Measured reference shot id (list_compositions) — copies its camera, format and device placement exactly. Overrides composition and format. | |
| composition | No | Composition id; default is chosen from the devices. | |
| screenshots | No | Screenshots by public URL (or tiny base64), each shown on the device at `device_index`. Files on disk: leave this out and run the curl commands the result returns. | |
| template_id | No | Start from a template (list_templates) instead of an empty stage. Its devices, camera, background and motion come along; without `devices`, `device_index` of a screenshot counts the template's devices in order. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnly=false, destructive=false and openWorld=true, so the description carries most of the behavioral burden and does well: it discloses the pre-save review ('if it has errors, nothing is created and you get the findings with fixes'), the disk-file/curl workflow, and the return payload. It stops short of stating auth/permission requirements or rate/limit behavior, leaving a small gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the one-call creation scope, then routing, then the review behavior, then the disk-file caveat and the return shape. Dense but every clause is functional; the long compound first sentence is the only minor cost to scanability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers the creation scope, sibling routing, the destructive-failure review behavior, the disk-file path and the return fields, which is strong for a 12-parameter, mutation, no-output-schema tool. Missing only permission/auth notes and pagination-like limits, which are minor for this operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description nonetheless adds cross-parameter semantics beyond the schema: how reference overrides composition/format, that device default is iPhone unless asked otherwise, and the template_id interaction with devices and screenshot device_index.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource ('Creates a new still-image or film mockup project in one call') and enumerates the constituent parts it composes (devices, composition, screenshots, palette, texts, ops). It explicitly distinguishes itself from siblings by naming create_launch_video, duplicate_project and edit_scene with the conditions that select them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: 'use create_launch_video for a music-synced launch video, duplicate_project for a variant of an existing project, and edit_scene to change a project that already exists.' It also gives a within-tool branch (files on disk → create first, then run curl commands), covering both when-to-use and when-not.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_projectDelete a projectADestructiveIdempotentInspect
Deletes ONE project for good — with its history; it cannot be restored. Use it only when the user explicitly asks to delete this very project, never to tidy up on your own and never for several at once. confirm_name must be the project's exact current name (list_projects); otherwise nothing is deleted.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Project id (from create_project or list_projects). | |
| confirm_name | Yes | The exact current name of the project, as list_projects shows it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the safety profile is covered. The description still adds real value beyond them: the history is destroyed and cannot be restored, and it explains the confirm_name guard's failure mode ('otherwise nothing is deleted').
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tightly packed clauses with the irreversible scope constraint front-loaded, followed by the when-to-use restriction and the guard parameter. No filler sentences; every clause carries operative information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a destructive, two-parameter tool with an output schema absent and annotations covering the safety hints, nothing an agent needs to invoke it correctly is missing: scope, irreversibility, precondition, and the confirm_name contract are all present.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description goes further by clarifying that confirm_name must be the exact current name sourced from list_projects and that a mismatch silently aborts the deletion, adding meaning not present in the schema's terse property descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Deletes) and resource (project) with precise scope: ONE, permanently, including its history. An agent can distinguish this from create_project, duplicate_project, and restore_version without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly limits use to the case where the user asks to delete this very project, and explicitly excludes autonomous cleanup ('never to tidy up on your own') and bulk deletion ('never for several at once'). It also routes the agent to list_projects for obtaining the exact name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
duplicate_projectDuplicate a projectAInspect
Copies a project (an image, a film or a launch video) into a new one next to it in the same folder, with everything in it: devices, screenshots, song, blocks. Use it for a variant the user wants beside the original, such as the same launch video to another song, another color, another language or a shorter cut; use create_project or create_launch_video for something new. The original stays untouched. Then change the copy with edit_scene or update_launch_video. Returns the new project_id and its editor or render link; pass that id to the next calls.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The name of the copy, saying what differs: "Showoff · Launch video, Billions", "Tempo · App Store set, dark". | |
| folder | No | Only when the user names one: another folder for the copy, e.g. "Showoff/Trailer" (created when missing; "" = top level). Default: the folder of the original. | |
| project_id | Yes | Project id (from create_project or list_projects). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a non-read-only, non-destructive write, and the description adds genuinely new behavioral context: the original stays untouched, the copy is placed adjacent in the same folder, it returns the new project_id plus an editor/render link, and that id should be threaded into subsequent calls. That is a full workflow contract beyond what the annotations encode.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four sentences that are front-loaded with the core action and scope, then usage, then side effects, then return value and next step. Every sentence carries distinct information with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, and the description compensates by stating exactly what is returned (project_id, editor/render link). Combined with the folder default and the original-untouched guarantee, an agent has everything needed to invoke and chain this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so name, folder, and project_id are already documented with their defaults and formats. The description reinforces the folder behavior ('next to it in the same folder') and naming intent, but adds little syntax or meaning beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Copies) and resource (a project), enumerates what the resource can be (image, film, launch video), and spells out what is carried over (devices, screenshots, song, blocks) plus where the copy lands (next to it in the same folder). An agent can distinguish this from create_project without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the intended case (a variant the user wants beside the original, with concrete examples like another song/color/language) and the alternative (create_project or create_launch_video for something new). It even routes the agent to the follow-up tools (edit_scene, update_launch_video) for modifying the copy.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edit_sceneEdit a sceneAInspect
Changes a still or film project with a batch of ops: add, move or remove devices, put screenshots on screens, texts, background, camera, motion, highlights, store sets, rename. The batch is atomic: later ops see earlier ones, and either all apply or none. Use it for every change to an existing image or film project; use update_launch_video for a launch video and create_project to start a new one. Before saving, the result is reviewed: if an op introduces an error nothing is saved and you get the findings with ready-to-send fixes (dry_run only reviews). Someone with the project open sees the change live, and every save becomes a version (list_versions). After geometry changes the camera is re-framed and texts re-laid out unless keep_camera is true. Returns the review and a preview sketch. The full op catalog is in the description of ops.
| Name | Required | Description | Default |
|---|---|---|---|
| ops | No | Ops (all in one atomic batch; later ops see earlier ones; objects created in this batch can be referenced as "$<ref>"): - {op:"add_device", device, variant?, name?, ref?, x?, z?, float?, turn?, lean?, roll?, lid?, browser?, dock?, appearance?, image?, layout?} — without x/z it is placed next to the group, then use apply_composition. In a store set give image and layout instead: image 2 = image 2, image 2.5 = across the seam of images 2 and 3. layout ("phones-fanned-close"|"phone-corner-close"|"two-phones-crossed-portrait"|"three-phones-fanned"|"three-phones-staggered"|"phone-stack"|"two-phones-leaning"|"two-phones-offset"|"three-phones-floating"|"phone-cropped-front"|"two-ipads-fanned"|"macbook-front"|"macbook-from-above"|"hero"|"tilt"|"tilt-left"|"top"|"full"|"duo"|"panorama"|"panorama-close") places and sizes the device the way a store image needs it (see the guide, "App Store sets"): one device per image in our own layouts, and once in the set a highlight: one of our templates, best on a seam (image 1.5) so it lies across both images; a template takes several devices (add one per place with the same image and layout, the first stands in front). Without it a device gets a layout for one device. The review rejects a second highlight, a second device in an image and anything cut at a seam. turn, lean and roll then change the pose of our own layouts. layout "none", or any of x, y, z, scale, places the device by hand - {op:"update_device", id, image?, layout?, x?, z?, float?, turn?, lean?, roll?, lid?, variant?, device? (swap model), status_bar? (false when the screenshot already shows its own status/menu bar), browser? ("safari"|"chrome"|"arc"|"none" — MacBook/Studio Display only: puts a plain web page capture into a browser window below the menu bar), dock? (true: the macOS Dock below it), appearance? ("light"|"dark" for window, Dock and desktop), fit? ("auto"|"cover"|"contain" — how the screenshot sits on the screen)} - {op:"remove", id} - {op:"apply_composition", composition, text_space?, azimuth?, elevation?} — re-arranges ALL devices (see list_compositions) - {op:"apply_reference", reference, with_background?} — places the devices, camera and format like a measured reference shot. Fewer devices than the reference are fine: they take the places nearest the center and the camera re-frames (5 phones from a 7-phone grid). Kinds must match (phone on a phone place). - {op:"set_screen", device_id, media_id | media_ids[], fit?: "auto"|"cover"|"contain"} - {op:"add_text", text, role?: "headline"|"subline"|"caption", region?: "top"|"bottom"|"left"|"right"|"auto", color?: "#hex"|"auto", weight?, font?: "sans"|"mono"|"serif", ref?, image?, translations?} — in a store set: image (1…n) is required and every image takes one title only (role headline, two to six words, set in two lines; no subline or caption), translations: {"de": "…", "fr": "…"} for the other languages of the set - {op:"update_text", id, text?, language?, translations?, image?, role?, region?, color?, weight?, font?} — with language, text is that language's version (store sets) - {op:"place_text", id?, region?, image?} — re-layout text - {op:"set_background", palette: id, accent?: "#hex"} | {preset} | {solid: "#hex"} | {gradient: {angle, stops: ["#hex", …]}} | {transparent: true} - {op:"match_image", width, height, world?: "floating"|"lying"|"standing", devices: [{id?, corners: [[x,y],[x,y],[x,y],[x,y]], edge?: "display"|"glas"|"gehaeuse"}]} — rebuild the exact layout of a picture the user gave you: for every device the four pixel corners of its SCREEN in that picture (top-left, top-right, bottom-right, bottom-left as seen from the device, top = camera / Dynamic Island side; corners outside the frame are fine). The server solves camera, perspective, lens and every pose from them — do not guess angles yourself. One entry per device, in the order of the scene's devices (or with id). Returns fit_error_px; above ~2 % of the width the corners were misread. - {op:"frame_camera", azimuth?, elevation?, fov?, margin?} — re-frames; omitted values keep the current camera (also a reference camera). azimuth −180…180, elevation −20…89, margin 1 = edge to edge, 1.15 default, below 1 crops boldly - {op:"set_format", format} — preset name or {width, height} (ends a store set) - {op:"set_store_set", store?: "iphone"|"ipad"|"mac"|"play", images?: 1–10, languages?: ["en","de",…], camera?: "reset"} — turns the image project into a row of store screenshots side by side (iphone 1320×2868 each, ipad 2064×2752, mac 2880×1800, play 1080×1920). The stage becomes as wide as all images; export_image cuts it into one PNG per image and language, in one ZIP. The first language is the one the texts are written in. Changing images keeps everything in its image. Sets its own frontal camera and has no floor: devices are placed by layout, not by float. - {op:"remove_store_set", format?} — back to one image - {op:"set_shadow", opacity?, blur?} - {op:"set_depth_of_field", strength?, focus?} — depth of field like a real lens (stills and films): one plane stays sharp, devices in front of or behind it get softer with their distance to it. strength 0–1 (0 = off, 0.2–0.5 subtle, 1 strong); focus: "auto" (the frontmost device in frame, the default) or a device id. Text always stays sharp. - {op:"set_motion", id, entrance?, loop?, amount?, exit?} (film only; quick way: entrance: einfliegen|einfedern|auftauchen|hereindrehen|hereinrollen; loop: schweben|treiben|kreisen|wiegen|kippen|schaukeln|hand|pulsieren|drehen — or an array of them, loops add up (["schweben", "schaukeln"] floats and rocks); amount only with a single loop; exit: true/false or its own kind hinausfliegen|hinausfedern|verschwinden|hinausdrehen|hinausrollen; entrances and exits always run on Extended ease keyframes — soft start, long landing) - {op:"set_effects", id, effects: [{type, from?, to?, amount?, side?, once?, cycle?, from_angle?, to_angle?}, …]} (film only; full control, replaces all motion of that object; type: any entrance, exit or loop above, or "lid" for a laptop lid (from_angle/to_angle 0–130°, several lid effects in a row = open, then close); from/to in seconds — stagger devices by giving each its own times; side: "left"|"right" for rollen; once: true for a single turn of drehen; cycle: seconds per loop) - {op:"set_camera_move", shots: [{from, to, travel?, orbit?, raise?, distance?, zoom?, name?} | {from, to, travel?, focus: {device, x?, y?, w?, h?}, zoom?}, …], outro?, style?} (film only; the camera glides from the project view to each shot in turn and back during `outro` seconds. orbit/raise: degrees around/above the target relative to the project camera (set that first with frame_camera); distance: share of the current distance (0.8 = 20 % closer); zoom: lens factor (1 = as is); focus: frame a rectangle on a device screen (fractions 0–1, top-left origin). travel: seconds to glide there (default 2, slow drifts 3–5 s); shots must not overlap; leave room after the last shot for the outro in a loop. shots: [] removes the camera move) - {op:"set_duration", seconds, loop?} (film only; 6–10 s keeps motion calm — entrances and exits take a share of it) - {op:"set_highlight", device, kind: "lift"|"loupe"|"redact", rect: {x, y, w, h}, snap?, radius?, lens?: {x, y, size, zoom?}, screen?, id?} — point at one spot of a screen. rect: the spot in fractions of the screen (0–1, top-left origin, like camera focus); a rough rect around the element is enough. snap (default true): the server looks at the screenshot and moves each side of the rect onto the edge of the element you mean (a card, a widget, a row, a button — at most 6 % of the screen width, inward first) and measures its corner radius, so a lifted card is exactly that element and takes no background with it. The result names what the rect became (`rect`, `radius`, `snapped`); a side without a clear edge stays where you put it, and screen recordings are not snapped. snap: false keeps your rect as given. radius: corner radius as a share of the screen width (0 = sharp corners), only to overrule the measured one. lift: the spot floats off the display as its own card with a soft shadow while the rest of the screen dims (one row, one card, one button). loupe: a round glass lens floats over the screen and shows the spot enlarged, sharp in the middle and bent at the rim like real glass; lens: its center (fractions), its diameter (share of the screen width, 0.3–0.7) and zoom (1.2–4). By default it sits right over the spot, sized so the spot fills its clear middle at about 2×. redact: the spot is pixelated beyond reading, in every render — for names, emails, numbers; it only snaps outward, never uncovering what you marked. screen: index of the device's screen it belongs to (films with several screens), omitted = always. id: change an existing highlight instead of adding one. At most 8 per device. - {op:"remove_highlight", device, id?} — without id removes all highlights of that device - {op:"auto_cut", device, screen?, follow?} (film only) — cuts the idle stretches out of a screen recording on that device (the first uncut one, or the one at position `screen`): the screen then plays the pieces of the same file back to back, and a film as long as the recording gets shorter. follow: true also lets the camera follow the action (closer where someone taps or types, wide while the whole screen changes); it replaces the camera move. - {op:"rename", name} Units: cm and degrees. The camera is re-framed and text re-laid-out automatically after geometry changes unless keep_camera is true (never in a store set: its camera stays where the images are). | |
| folder | No | Only when the user asks to file it: move the project into this folder of their projects, e.g. "Store sets" or "Showoff/Trailer" (created when missing; "" = top level). Without ops it only files the project. Launch videos: update_launch_video. | |
| dry_run | No | Review and preview without saving. | |
| preview | No | Attach a preview sketch of the result (default true). false is faster when you only need the review. | |
| project_id | Yes | Project id (from create_project or list_projects). | |
| keep_camera | No | Do not re-frame the camera automatically. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare only the safety profile (readOnly false, destructive false, openWorld false). The description goes well beyond: batch atomicity ('either all apply or none', later ops see earlier ones), the reject-and-return-findings behavior on error, live visibility to other viewers, version creation on every save, and automatic camera re-framing/text re-layout after geometry changes unless keep_camera is true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The prose is dense but mostly earns its place; the ops enumeration in the first sentence is somewhat redundant with the schema's full catalog. Front-loading atomicity and sibling routing is good, but the run-on sentences mix several concerns without separation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 6-parameter, 60-op mutation tool with no output schema, the description covers atomicity, error handling, preview/version side effects, and prerequisite conventions. It even names what the call returns ('the review and a preview sketch'), which is needed since there is no output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already 100% and the ops catalog is verbose in-schema, yet the description adds routing value: it points to `ops` for the full catalog and explains that keep_camera suppresses the automatic re-frame, and that folder without ops only files the project. It adds semantic framing rather than duplicating parameter definitions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (changes/edits) and resource (a still or film project) and enumerates the op families it covers (add/move/remove devices, screens, texts, background, camera, motion, highlights, store sets, rename). It explicitly distinguishes itself from siblings update_launch_video and create_project, so an agent can route without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: 'Use it for every change to an existing image or film project; use update_launch_video for a launch video and create_project to start a new one.' It also states the dry_run-only review path, so the agent knows when to review vs commit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_imageExport the final imageAInspect
Renders the finished mockup on the server with the real 3D renderer — models, materials, light, screens, background: exactly what the editor exports, no sketch lines. Returns the image to look at and a download URL (valid 7 days) you can hand on or process further. Takes 5–30 seconds. If the renderer is busy, it says so right away and nothing is charged; call it again after the time it names. Use render_preview for quick checks while building, this for the result. A store set (set_store_set) exports every image in every language as PNG in one ZIP, one folder per store and language (a few minutes; the whole set counts as one export). A set for phones exports both stores, App Store and Google Play. Width and format do not apply there.
| Name | Required | Description | Default |
|---|---|---|---|
| play | No | Old name for `stores`: false leaves Google Play out. | |
| width | No | Output width in pixels; default: the 720p size (longest edge 1280 px), which every plan exports without limit. Above that (longest edge over 1280 px) an export counts toward the organization's monthly full-quality exports (Free: 1, Pro: 15, then a small charge each). Only pass a larger width when the user wants full quality. | |
| format | No | File type: "png" (default) or "jpeg" for a smaller file. Store sets are always PNG. | png |
| stores | No | Store sets for phones only (store "iphone" or "play"): which stores to export. Default both, App Store (1320×2868) and Google Play (1080×1920). The second store keeps the width of every image and shows a little less or more of its height, on the side away from the headline. | |
| folders | No | Store sets only: how the ZIP is laid out. "plain": "App Store/<language>/01.png" and "Google Play/<language>/01.png", for uploading by hand. "fastlane": the folders fastlane deliver and supply upload from — only when the user uploads with fastlane. | plain |
| languages | No | Store sets only: export just these languages of the set (default all). | |
| project_id | Yes | Project id (from create_project or list_projects). | |
| accept_charge | No | Only after the user agreed to it: confirms the extra charge for a full-quality export beyond the monthly allowance (the tool names the amount first). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false and destructiveHint=false, so the description carries the real behavioral load: render time of 5–30 seconds, a busy renderer that charges nothing and names a retry delay, a 7-day URL expiry, and metered full-quality exports with per-plan allowances. That is exactly the cost/retry context an agent needs before calling.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and result, then handles alternatives and cost. It is long but nearly every sentence carries distinct information; the store-set and width/format asides could arguably be compressed.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still describes the return (viewable image plus downloadable URL and its 7-day validity), the cost model, the busy path, and the store-set deviation. Nothing material for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so 3 is the floor, but the description adds cross-parameter semantics the schema does not: width and format 'do not apply' to store sets, play is an obsolete alias for stores, and the charge only follows rendered previews rather than upfront. Slightly short of 5 because individual formats/bounds are left to the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('renders the finished mockup on the server with the real 3D renderer') plus what comes back (image to look at and a 7-day download URL). It explicitly separates itself from render_preview and set_store_set, so an agent can route without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when/when-not: 'Use render_preview for quick checks while building, this for the result', names set_store_set as the tool for bulk store exports, and ties full-quality width to a user request. The busy-renderer retry path and accept_charge precondition are spelled out.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
finishFinal checkARead-onlyInspect
Runs the strict final check before you hand the work to the user and tells you the next step. It passes only without errors; empty screens count as errors. Use it once at the end, after review_scene and render_preview look right; while building use review_scene. Read-only. When it passes: for an image or store set, call export_image next for the real render and a download link; for a film it returns the editor link, where the user exports the video (export_image only gives a still); for a launch video it returns the render page, where the video renders in the user's browser. When it fails, it lists the errors with fixes.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Project id (from create_project or list_projects). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint, destructiveHint=false, openWorldHint=false), and the description adds genuinely new behavior: pass/fail semantics, that empty screens count as errors, that it returns errors with fixes, and what the success return differs by project type. This is well beyond what the structured fields disclose.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action, then timing, then outcome routing in short clauses with no filler. Length is justified by the multi-branch next-step guidance, and each sentence carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by describing both failure returns (error list with fixes) and success returns per project type (editor link, render page, export_image follow-up). For a one-parameter read-only check tool, nothing an agent needs is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single project_id parameter, so the schema already documents it fully (including its source: create_project or list_projects). The description adds no parameter-level detail, which is the expected baseline when the schema does the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Runs the strict final check') plus its scope ('before you hand the work to the user') and explicitly distinguishes itself from review_scene. An agent can tell it apart from review_scene and render_preview without opening schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit timing ('once at the end, after review_scene and render_preview look right') and names the alternative for the other phase ('while building use review_scene'). It also routes the agent to the correct follow-up tool per project type (export_image vs editor link vs render page).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_launch_videoLook at a launch videoARead-onlyInspect
Reads the state of a launch video: its render page, the song with tempo, detected drops and the chosen section, every block numbered from 1 with its type, times and lines, and what is still missing. Use it before update_launch_video to get block indexes and slot names, and to replace screenshots; use render_preview to see frames, and get_scene only for still or film projects. Read-only. Returns render_url, the blocks, the music, ready, and a ready curl command for every screenshot slot and the song, including slots already filled (replace_commands): run those to swap a screenshot.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Project id (from create_project or list_projects). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, openWorldHint=false, and the description's 'Read-only' simply restates that. However it adds real behavioral context beyond annotations: the return payload includes ready-made curl commands (replace_commands) covering filled slots, and running them causes a side-effect (swapping a screenshot) despite this call being read-only. That is a meaningful disclosure. Gaps remain around pagination/limits and whether the curl commands mutate state server-side beyond screenshots.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense paragraph front-loads the returned state and then routes to alternatives, with no filler sentences. It is tightly packed but readable; the run-on construction with multiple semicolons slightly reduces scannability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the full burden of describing returns and does so explicitly (render_url, blocks, music, ready, replace_commands), plus what is missing. For a one-parameter read tool this is complete enough to call correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter exists and schema description coverage is 100%, so the schema already documents project_id fully under its own baseline. The 'block indexes and slot names' mentioned in the description refer to outputs, not inputs, so it adds no extra meaning to the parameter itself.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource (reads the state of a launch video) and enumerates exactly what state is exposed: render page, song with tempo, drops, chosen section, numbered blocks, and what is still missing. It is clearly distinguishable from siblings get_scene and render_preview without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It states both when to use it ('before update_launch_video to get block indexes and slot names, and to replace screenshots') and which siblings to prefer instead ('render_preview to see frames, get_scene only for still or film projects'). Alternatives and selection conditions are explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sceneRead a project sceneARead-onlyInspect
Reads the current scene of a still or film project: every object with its id, position and angles (cm and degrees), where it lands in the image (%), overlaps, the media on each screen, who changed it last, and the current art-direction review. Use it before edit_scene to get object ids and current values, or to see what a person changed in the editor; use render_preview to see the scene, review_scene for the full review, and get_launch_video for a launch video. Read-only. Returns scene, review, editor_url, open_in_editor and upload commands for empty screens.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Project id (from create_project or list_projects). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true/destructiveHint=false, but the description still adds real behavioral context: the exact returned payload fields, the fact that empty screens come with upload commands, and an editor_url/open_in_editor. Repeating 'Read-only' is redundant with annotations, which caps this at 4 rather than 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action and the return contents before the routing sentence. Dense but almost every clause earns its place; the enumeration is slightly long, but each field listed is meaningful for downstream edit_scene calls.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description carries the return-value burden and does so thoroughly (scene, review, editor_url, open_in_editor, upload commands). Combined with explicit sibling routing for a read-only tool, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Single project_id parameter with 100% schema description coverage, so the schema already explains the id and its source. The description adds no extra syntax or format detail for the parameter; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Reads the current scene of a still or film project') and then enumerates exactly what the scene contains (object ids, positions, angles, screen media, last editor, review). An agent can distinguish it from render_preview, review_scene and get_launch_video without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the primary use case ('before edit_scene to get object ids and current values') and the secondary one ('see what a person changed'), then routes to three alternatives with their distinct purposes — render_preview, review_scene, get_launch_video. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_templateLook at a templateARead-onlyInspect
Shows one template up close before you use it: what it shows, its public page, the full scene (devices with their angles, camera, background, overlaps), its review and a preview sketch with object ids. Use it after list_templates to check that a template fits the user's screenshots, then start a project from it with create_project (template_id). Read-only; it never creates or changes a project. Returns template, scene and review, plus the sketch unless preview is false.
| Name | Required | Description | Default |
|---|---|---|---|
| preview | No | Attach a preview sketch with object ids (default true). false returns text and data only, which is faster. | |
| template_id | Yes | The template id exactly as list_templates returns it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so 'Read-only; it never creates or changes a project' largely reinforces structured data. However, the description adds genuinely new behavioral context: the return shape (`template`, `scene`, `review`) and that the sketch is omitted when preview is false. This goes beyond what annotations and schema provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The content is front-loaded with the purpose, then ordered as workflow, safety note, and return values. It is dense but every clause adds information; the main cost is a long first sentence that mixes purpose with an enumeration of return contents.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, but the description names the returned keys (`template`, `scene`, `review`, plus the optional sketch), so an agent knows what to expect. Combined with the workflow guidance and read-only assurance, nothing essential for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description nonetheless adds meaning beyond the schema by explaining that the preview sketch is included 'unless preview is false' and framing preview as a speed tradeoff ('false returns text and data only, which is faster'), reinforcing the parameter's effect.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Shows one template up close') and enumerates exactly what it reveals: what it shows, its public page, the full scene, its review, and a preview sketch. It distinguishes itself from siblings by name, positioning it between list_templates and create_project.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit workflow placement: 'Use it after list_templates to check that a template fits the user's screenshots, then start a project from it with create_project (template_id).' Both the preceding and following tools are named with the condition that selects them, leaving nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_upload_linkGet an upload link for local filesARead-onlyInspect
For screenshots, screen recordings (MP4 or WebM, up to 25 MB and 120 s) and music that are files on your disk: returns a signed upload URL for this project (valid 30 minutes, no token needed) and the ready curl command. Run one command per file — in parallel — with ?assign_to=<device id> to put it on a screen at once. Much faster than base64.
| Name | Required | Description | Default |
|---|---|---|---|
| assign_to | No | Optional device id; the uploaded file goes onto its screen. | |
| project_id | Yes | Project id (from create_project or list_projects). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond the readOnlyHint annotation to disclose the URL's validity window (30 min), that no token is required, that the response includes a ready curl command, and size/duration limits (25 MB / 120 s). Missing only what happens on expiry or failure modes, but the key operational traits are covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the eligibility envelope and benefit, then operational instructions. Slightly dense but every clause (limits, URL validity, parallel guidance, assign_to) earns its place. No filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 2-param read-only tool with no output schema, the description covers purpose, constraints, response shape (URL + curl), and usage pattern. It omits URL expiry behavior and any auth context, but the annotations already declare readOnly/no-destruction.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameter names are documented. The description adds value beyond the schema by explaining the assign_to effect ('put it on a screen at once') and implying how project_id scopes the URL. This is more than the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('returns a signed upload URL') and enumerates exactly which file types are eligible (screenshots, MP4/WebM screen recordings, music). It distinguishes itself from upload_media by making clear this is for disk-based files and from base64 paths.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit when-to-use ('files on your disk'), a direct comparison ('much faster than base64'), and operational guidance ('run one command per file — in parallel'). The '?assign_to=<device id>' hint tells the agent exactly how to route the upload.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_compositionsList compositions, palettes and formatsARead-onlyInspect
Lists the building blocks for laying out a still or film scene: compositions (device arrangements derived from curated reference shots, with their device count and best formats), measured reference shots, background palettes, format presets, text roles and text regions. Use it before create_project or edit_scene to choose a composition, reference, palette or format; use list_templates instead when the user wants a finished, named scene, and suggest_palette for palettes matched to their screenshots. Read-only, no parameters. Returns a readable list plus compositions, references, palettes, formats, text_roles and text_regions.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/destructiveHint=false, but the description adds that it takes no parameters and discloses the return shape ('a readable list plus compositions, references, palettes, formats, text_roles and text_regions'), which is valuable since there is no output schema. It does not mention caching, ordering, or size limits, so it stops short of a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the resource list, then usage, then alternatives, then return shape in three dense sentences with no filler. The parenthetical describing compositions is slightly long but earns its place by clarifying what a 'composition' is.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully enumerates the return keys and the follow-up tools. A count of how many items typically return or whether the list is filtered is not stated, but for a read-only enumeration tool the coverage is adequate.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Zero parameters, so there is no parameter semantics to document; the description correctly confirms 'no parameters'. Baseline 4 applies for a parameterless tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb ('Lists') and enumerates the exact resource set: compositions, measured reference shots, palettes, format presets, text roles and text regions. An agent can tell precisely what it returns without opening anything else.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use it ('before create_project or edit_scene to choose a composition, reference, palette or format') and names two alternatives with their selecting conditions (list_templates for finished named scenes, suggest_palette for screenshot-matched palettes). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_devicesList devicesARead-onlyInspect
Lists every device model Showoff renders (phones, tablets, laptops, displays, browser windows) with its id, size in cm, screen resolution and aspect, color variants and the screenshot size that fits its screen. Use it to pick a device id or variant for create_project, edit_scene (add_device, update_device) or create_launch_video, or to tell the user what size their screenshots should be. Read-only, no parameters. Returns one line per device and devices [{id, label, category, size_cm, screen_px, screen_aspect, recommended_screenshot_px, variants, browser_and_dock}].
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so 'Read-only, no parameters' is largely redundant. However, the description adds genuinely useful behavioral context unavailable elsewhere: the shape of the result (one line per device, plus a `devices` array with named fields), which matters because there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core purpose and scope, then usage routing, then return shape. The sentences are dense but each carries distinct information; only the 'Read-only' clause duplicates the annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description takes on the burden of describing the return value and does so by naming the per-device fields (id, label, category, size_cm, screen_px, screen_aspect, recommended_screenshot_px, variants, browser_and_dock). Nothing an agent needs to call it or consume the result is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters and the schema is an empty object, so there is nothing to disambiguate. The description correctly reinforces 'no parameters', which sets the right expectation for the caller.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Lists) and resource (every device model Showoff renders), then enumerates the categories covered (phones, tablets, laptops, displays, browser windows) and the fields returned per device. An agent can distinguish this from sibling list_* tools and from get_scene/create_project without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the downstream tools that consume its output (create_project, edit_scene's add_device/update_device, create_launch_video) and the purpose of the lookup (picking a device id or variant, or advising on screenshot dimensions). This is a clear when-to-use statement with the alternatives named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_foldersList foldersARead-onlyInspect
Lists the folders of the user's Showoff projects as paths ("Showoff", "Showoff/Trailer"), each with its number of projects with and without subfolders, plus how many projects sit at the top level. Use it before filtering list_projects by folder, or before filing a project with the folder parameter of create_project, edit_scene, create_launch_video or update_launch_video, so you reuse an existing folder instead of inventing a new one. Read-only, no parameters. Returns folders [{path, projects, projects_with_subfolders}] and top_level_projects.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, non-destructive and closed-world, so safety is covered; the description's 'Read-only, no parameters' largely repeats that. It does add genuinely useful context the annotations cannot, namely the exact return payload (folders with projects/projects_with_subfolders counts and top_level_projects), which matters since there is no output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with what the tool returns, then a dense but purposeful when-to-use clause enumerating the affected siblings. The sibling list makes the second sentence long, but every clause earns its place; no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, no-output-schema listing tool, the description supplies purpose, trigger conditions, the exact return structure, and the intended downstream workflow. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4. The description correctly confirms 'no parameters' and the empty schema with additionalProperties:false leaves no ambiguity, though there is nothing further to explain.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Lists the folders of the user's Showoff projects') plus the concrete output shape (paths such as 'Showoff/Trailer'). This is easily distinguishable from siblings like list_projects or list_templates without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the downstream tools that consume the folder value (list_projects, create_project, edit_scene, create_launch_video, update_launch_video) and states the condition to call it: reuse an existing folder rather than inventing a new one. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_projectsList projectsARead-onlyInspect
Lists the projects of the user's organization, most recently changed first, each with id, name, kind, devices, folder and its editor or render link. Use it to find the project_id the other tools need or to see what the user already made; use list_folders for the folder tree, and get_scene or get_launch_video to look inside one project. Filter by query, folder or kind; page with limit and offset. Read-only. Returns projects, the total number of matches and the offset, and says how to fetch the next page.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Only images (store sets included), films or launch videos. | |
| limit | No | At most this many projects per page, 1 to 100 (default 20). | |
| query | No | Only projects whose name contains this, ignoring case, e.g. "Tempo". | |
| folder | No | Only projects in this folder, e.g. "Showoff" (with its subfolders) or "Showoff/Trailer". "" lists only the projects at the top level. | |
| offset | No | Skip this many matches — for the next page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, destructiveHint and openWorldHint, so safety is covered; the description confirms 'Read-only' consistently. It adds ordering (most recently changed first), pagination mechanics and the shape of the response beyond what annotations provide, though it does not discuss rate limits or auth.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then usage, then filtering, then return behavior — a logical order. It is dense and slightly run-on in the middle, but each sentence carries operational value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description carries the burden of describing returns and does so ('projects', 'total', 'offset', and how to fetch the next page), plus ordering and filtering. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all five parameters are fully documented in the schema with enums, ranges and examples. The description only restates the filter and paging groups ('Filter by query, folder or kind; page with limit and offset') without adding syntax or meaning beyond the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource with scope ('Lists the projects of the user's organization, most recently changed first') and enumerates the returned fields. It explicitly distinguishes itself from list_folders, get_scene and get_launch_video, so an agent can route correctly without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete use case ('find the project_id the other tools need or to see what the user already made') and names the alternatives with their conditions (list_folders for the folder tree, get_scene/get_launch_video to look inside a project). When-to-use and when-not-to-use are both explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_templatesList templatesARead-onlyInspect
Lists Showoff's template catalog: finished, named scenes (stills and animations) such as "Low Hero" or "Desk Duo", each with a public page. Use it when the user wants ideas or a fast start: suggest two or three fitting templates by name with their page_url, then start one with create_project (template_id). Use get_template to inspect one first, and list_compositions to build a layout from scratch instead. Read-only. Returns templates [{id, name, kind, duration, width, height, devices, categories, description, page_url}].
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Only stills ("image") or only animations ("film"). Leave it out for both. | |
| limit | No | At most this many templates, 1 to 100 (default 60). | |
| category | No | Only templates of this kind, e.g. iphone, macbook or animated. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=false and destructiveHint=false, so the safety profile is covered and the description's 'Read-only' line is largely redundant. It does add useful behavioral context: no output schema exists, yet it discloses the exact return fields (templates with id, name, kind, duration, width, height, devices, categories, description, page_url) and how template_id feeds create_project.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and examples before the workflow and alternatives, and each sentence earns its place (examples, trigger, follow-up, alternatives, return shape). It is slightly dense across four sentences but not padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by enumerating the returned fields, and it covers the full lifecycle context (suggest -> inspect with get_template -> start with create_project, or build from scratch with list_compositions). Nothing an agent needs to select or call this tool is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and both enums are self-documented ('image'/'film', the seven categories), so the schema already carries the parameter meaning. The description mentions kind only implicitly via 'stills and animations' and adds no syntax, defaults, or filtering nuance beyond what the schema provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Lists Showoff's template catalog') plus concrete scope ('finished, named scenes ... such as "Low Hero" or "Desk Duo"'). It names what it is not (get_template to inspect one, list_compositions to build from scratch), so an agent can differentiate it from siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit trigger ('when the user wants ideas or a fast start'), a concrete follow-up workflow (suggest two or three by name with page_url, then create_project with template_id), and names the alternatives (get_template, list_compositions) with the conditions that select them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_versionsList versionsARead-onlyInspect
The version history of a project, newest first: who changed it (a person in the editor, an AI, a restore) and when, and what changed. The same history the editor shows. Bring an earlier version back with restore_version.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | How many versions (default 10). | |
| project_id | Yes | Project id (from create_project or list_projects). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds real behavioral context beyond that: the sort order (newest first), the fields returned per entry, and that it mirrors the editor's history view.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact clauses, front-loaded with the resource and ordering, then the return content, then the sibling pointer. No filler sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description usefully characterizes what each history entry contains and the ordering, which is what an agent needs. It omits any note on result-size behavior tied to the limit parameter, a minor gap for a read-only listing tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both project_id and limit (including default and 1-100 range) are fully documented in the schema. The description adds nothing about these parameters, which is acceptable but leaves it at the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (version history of a project) and enriches it with scope details: newest-first ordering and the content of each entry (who changed it, when, what changed). It also distinguishes itself from restore_version by naming it as the sibling for the write-side action.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly implies the use case (inspecting history, matching what the editor shows) and routes the agent to restore_version for bringing a version back. It does not state explicit when-not conditions or other alternatives, but the context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
render_previewRender a preview sketchARead-onlyInspect
Renders a fast schematic sketch of a project so you can check your work: exact perspective, geometry, screenshot placement, text and colors, without lighting or materials, optionally with object ids and review findings outlined. Use it after every create_project or edit_scene and inspect the image critically against the checklist in the guide (cut-off screen content, doubled status or menu bars, notch blocks, wrong orientation, collisions, text), then fix what you find; use export_image only for the final rendered image. Films: a contact sheet of frames (frames) or one frame at time. Launch videos: frames of the video itself, by default the key moment of every block, with its lines, a chat and the end card. Store sets: all images side by side, texts in language. Read-only; it never counts as an export. Returns the sketch image and a short summary.
| Name | Required | Description | Default |
|---|---|---|---|
| time | No | Films and launch videos: one frame at this second. | |
| width | No | Width of the sketch in pixels, 320 to 1600 (default 1024; a store set gets 360 per image). | |
| frames | No | Films and launch videos: this many frames, evenly spaced, on one sheet. | |
| labels | No | Outline object ids and review findings on the sketch (default true). false shows the clean picture. | |
| language | No | Store sets: show the texts in this language of the set (default the first). | |
| project_id | Yes | Project id (from create_project or list_projects). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true and destructiveHint=false, and the description reinforces this while adding genuinely new context: what is rendered versus omitted (no lighting/materials), optional label overlays, per-project-type framing behavior, and that it 'never counts as an export'. This is behavior an agent could not infer from the annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded in the first clause, and the workflow/alternative guidance follows. The prose is dense and mostly earns its place, though the checklist enumeration and per-type rules make it longer than strictly necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description states what comes back ('the sketch image and a short summary'), covers the workflow and the sibling alternative, and explains the non-obvious framing semantics for films, launch videos, and store sets. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description nonetheless adds meaning beyond the schema by tying parameters to project types: `frames`/`time` apply to films and launch videos, launch videos default to the key moment of every block, and store sets use `language` and lay images side by side.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('renders a fast schematic sketch of a project') and immediately scopes it against siblings by contrasting with export_image. An agent can distinguish it from export_image without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly prescribes when to use it ('after every create_project or edit_scene'), what to do with the result ('inspect the image critically against the checklist... then fix what you find'), and names the alternative with its condition ('use export_image only for the final rendered image').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
restore_versionRestore a versionAInspect
Brings an earlier version of a project back (version_id from list_versions) — as a NEW current state, like Restore in the editor's history: nothing is lost, the state before stays in the history and can be restored in turn. The name stays as it is now. Someone with the project open sees it change live. Only when the user asks for an earlier version.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | Project id (from create_project or list_projects). | |
| version_id | Yes | From list_versions. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint=false and destructiveHint=false; the description goes well beyond that by explaining that nothing is lost, the pre-restore state remains in history and is itself restorable, the project name is unchanged, and open collaborators see the change live. This is exactly the behavioral context an agent needs before mutating shared state.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single dense sentence that front-loads the core action and then layers the important semantic caveats. It is slightly clause-heavy, but every clause (new state, history preserved, name unchanged, live update) carries distinct information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter mutation with no output schema, the description covers the semantics that matter: reversibility, scope of change, and visibility. It does not indicate what the call returns (new version id, updated project, etc.), which is the only notable gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented in the schema (project_id from create_project/list_projects, version_id from list_versions). The description restates the version_id source but adds no format, constraint, or edge-case detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('brings ... back') and resource ('an earlier version of a project'), and immediately clarifies that the result is a NEW current state rather than a historical rewind. It also names the sibling that supplies the input (list_versions), so the agent can distinguish this from retrieval tools without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives an explicit guardrail: 'Only when the user asks for an earlier version,' which tells the agent when not to reach for it. It also routes the agent to list_versions for the version_id. What's missing is a named alternative for the adjacent case (e.g., what to use if the user wants to view a past version instead of restore it).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
review_sceneReview a sceneARead-onlyInspect
Runs the full art-direction review of a project: collisions (frame by frame for films), angles, floating versus resting devices, text overlap, cropping and contrast, composition and color. Use it while building to see every finding, including warnings edit_scene saves anyway; use finish once at the end for the final check, and render_preview to look at the result. Read-only. Every finding has a severity and a fix with ready-to-send edit_scene ops. Returns the findings, errors first, and whether the scene passes.
| Name | Required | Description | Default |
|---|---|---|---|
| strict | No | Final-check mode, as in finish: empty screens and other unfinished parts become errors. Default false. | |
| project_id | Yes | Project id (from create_project or list_projects). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint=true, and the description reinforces 'Read-only.' Beyond that, it discloses non-obvious behavior: it surfaces warnings that edit_scene saves anyway, every finding has a severity and a fix with ready-to-send edit_scene ops, and results are ordered errors first with a pass/fail verdict. These are substantive behavioral facts not derivable from annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core purpose and scope, then routes to alternatives, then states return shape. Dense but every sentence carries information. Slightly long due to the breadth of checks listed, but none of it is padding.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a read-only tool with no output schema and 2 params at 100% schema coverage, the description supplies everything an agent needs: purpose, alternatives (finish, render_preview, edit_scene), strict-mode semantics, and return structure (findings, errors first, pass/fail). Nothing material is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented. The description nonetheless ties `strict` to the finish tool's semantics and explains that unfinished parts become errors — reinforcing the schema's own description. It does not add new parameter meaning beyond what the schema provides, but it's a helpful cross-reference. Baseline for 100% coverage is 3; the cross-tool contextualization earns a 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('runs the full art-direction review') and resource (project/scene), and enumerates the exact checks performed: collisions, angles, floating vs resting devices, text overlap, cropping, contrast, composition, color. Clearly differentiated from siblings like render_preview and finish by naming them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when/when-not guidance: 'Use it while building to see every finding, including warnings edit_scene saves anyway; use finish once at the end for the final check, and render_preview to look at the result.' The `strict` parameter's role (final-check mode as in finish) is also explained. This is textbook alternative-routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
suggest_paletteSuggest backgroundsARead-onlyInspect
Suggests background palettes for a still or film project, derived from the accent color of its screenshots (or accent) and each already reviewed against this scene for contrast with the devices and texts. Use it once the screenshots are on the screens and before adding texts; list_compositions has the full fixed palette list. Read-only: apply one with edit_scene {op:"set_background", palette:""}. Returns the accent and palettes, best first, each with id, name, gradient, its review result and the ready-to-send op.
| Name | Required | Description | Default |
|---|---|---|---|
| accent | No | Override the accent color (#hex), e.g. the brand color. | |
| project_id | Yes | Project id (from create_project or list_projects). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=true, destructiveHint=false, openWorldHint=false), and the description adds real substance: palettes are pre-reviewed for contrast against devices/texts, results are best-first, and it hands back a ready-to-send edit_scene op. It doesn't state cost/latency or whether the suggestion is cached, so not quite a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then timing, then the apply path and return shape. It runs a bit dense in the middle sentence, but every sentence carries information an agent needs; nothing is redundant filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by naming the returned fields (accent, palettes with id, name, gradient, review result, ready-to-send op) and the ordering. Combined with annotations and full schema coverage, an agent has everything needed to call and consume the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented in the schema. The description reinforces that `accent` is an override for the derived accent color, but adds no syntax or constraint beyond the schema's '#hex' example. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('suggests background palettes for a still or film project') plus the derivation source (accent color of screenshots). It also distinguishes itself from list_compositions, which 'has the full fixed palette list,' so an agent can route correctly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit ordering rule ('once the screenshots are on the screens and before adding texts') and names the alternative source of palettes (list_compositions). The follow-up path (apply via edit_scene) is spelled out too.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_launch_videoChange a launch videoAInspect
Changes an existing launch video. Use it for every edit to a launch video: replace the whole composition (blocks), change one block (block: { index, ...fields }, index from 1 as get_launch_video numbers the blocks), change the name, accent color, device, look, background or folder, add screenshots to slots by URL, or pick another part of the song (music_start, or music_drop for the exact drop) or a new song (music_url). Use get_launch_video first for block indexes and slots, create_launch_video for a new video and duplicate_project for a variant beside the original. lines/tagline without blocks rebuild the standard film. Another device re-checks the blocks: transitions that no longer fit fall back to the natural ones. Screenshots from disk: run the curl commands from get_launch_video (launch_screen=). Returns the updated video with its render page and what is still missing.
| Name | Required | Description | Default |
|---|---|---|---|
| look | No | "dark" (default): the trailer, devices out of the dark, light in the accent color. "light": friendly and bright, a light gradient background that opens up on the drop, dark text. | |
| loop | No | true: no end card — after the last block everything glides back into the very first frame (camera, the hero phone, its first screen, the background), so the video loops seamlessly from the start, the way Reels and TikToks replay; it ends on a full phrase of the song. Leave out the `end` block; the last block must still show the device of the hero (continue on it with navigate, or let a duo or trio fly in around it). Best with a hero style whose first frame is a moment of its own — zoom, fall, slide, wake. false goes back to an ending. | |
| name | No | The app name. | |
| block | No | Change ONE block instead of resending `blocks`: its `index` (from 1, as get_launch_video numbers the blocks) and only the fields that change, e.g. { "index": 2, "lines": ["Every split,", "at a glance."] } or { "index": 3, "screenshot": "stats" }. The fields are merged into that block; null removes a field; another `type` starts the block afresh from the fields given. The whole composition is checked again as with `blocks`. Not together with `blocks` or `lines`. | |
| lines | No | Only without `blocks` (the standard film): two or four lines — every block takes two or none, so one or three are rejected —, at most 24 characters each, one row each. Lines 1 and 2 are the hero — the first quiet in the intro, the second on the drop; lines 3 and 4 go over the next screen of the same phone, which comes in the way the app changes screens (navigate). The two phones after it stand without text. | |
| story | No | Required when creating: the ONE story this video tells, in two to four short sentences a stranger remembers after one watch — the hook, how the product gets there, what you end up with. The Showoff trailer: "Your screenshots, shot like products. Right in your browser — or just ask your AI. Ready to launch." Write it first; then every block tells the next part of it in its two lines, in order. A row of unrelated claims is not a story. Speak to the people the app is for (who they are, what they get now) and claim only what is true — never "every model" or "all colors" unless it literally is so. | |
| accent | No | #rrggbb brand color for glow and light. Default: the accent color of the first screenshot. | |
| blocks | No | The composition, in order — see the guide ("Launch videos"). Leave it out for the standard film built from `lines` and `tagline`. | |
| device | No | The device of every block without its own `device` (default iphone-17-pro). Phones only for real apps — and always an iPhone unless the user explicitly asks for another model, also for Android screenshots (the phone redraws its own status bar). For a web product take a MacBook ("macbook-pro-16") or "browser". | |
| folder | No | Only when the user names a folder: the folder in their Showoff projects to put this in, e.g. "Launch videos" or a subfolder "Showoff/Trailer" (two levels at most). Folders are found by name and created when missing. "" moves it back to the top level. | |
| format | No | "9:16" (default): a Reel for Instagram, TikTok and Shorts — phones and apps. "16:9": landscape for videos that are mostly a MacBook, a website or browser windows (YouTube, a landing page, X): the whole screen fits, pages are never cut off in a close-up. | |
| tagline | No | Only without `blocks`: a small line under the name on the end card of the standard film. Best left out — the review flags it (end-card-claim): a line under the name makes the end slow and small. For the name slamming into the web address, compose `blocks` with an `end` block and `merge_into`. | |
| variant | No | Finish of the video's device (list_devices). | |
| music_url | No | Public URL of the song (MP3, M4A, WAV, OGG, FLAC; up to 25 MB). | |
| background | No | light look: the gradient, top to bottom, as #rrggbb colors, e.g. ["#b0aff1", "#f7c6de"] (lavender to pink). Default: two pastel tones from the accent. Pass [] to go back to the default. | |
| music_drop | No | Exact second of the drop the hero lands on (snapped to the nearest beat) — when the detected drops miss the moment the chorus kicks in. Overrides music_start. A drop only a few seconds into the song is fine: the entrance before it is shortened to fit (the report says so). | |
| project_id | Yes | Project id (from create_project or list_projects). | |
| status_bar | No | Every phone already draws its own clean status bar (9:41, full signal, full battery) over its screenshot. true also puts one over tablet screenshots. | |
| music_start | No | Second in the song around which the video should start — it snaps to the nearest detected drop. Default: the strongest drop with enough music after it. | |
| screenshots | No | Screenshots by public URL (or tiny base64), each into a slot of the blocks. Without `slot` they fill the slots in the order of the film. Files on disk: leave this out and run the returned curl commands. | |
| music_impact | No | Only with an `end` block that has `merge_into` (a teaser without an end card ignores it): second in the song where the end card slams its title into merge_into — e.g. the next drop after the hero, or the last hit of a chorus (snapped to the nearest beat). Every block without its own `beats` stretches or shrinks to land it exactly. Pick it from `music.structure` (get_launch_video). Can be set before the song is uploaded; null removes it. | |
| project_name | No | What the user finds this video by in their projects, next to their other videos: "<product> · <what it shows>", e.g. "Tempo · Launch video, drag and drop" or "Showoff · Reel, before and after". Default: "<name> – Launch" — give it whenever the user has or makes more than one video of the product. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare it is a non-read-only, non-destructive mutation, so the safety profile is covered. The description adds real behavior beyond that: merge semantics for block edits (null removes a field, another type restarts the block), that a new device re-checks blocks and unfit transitions fall back to natural ones, and that it returns the updated video with its render page and what is still missing. It does not discuss permissions or rate limits, keeping it at 4.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the purpose and the when-to-use routing before the long enumeration of editable fields and edge cases. The middle run-on sentence packing all edit modes is dense but earns its place given 22 parameters; nothing is padding, though it could be split for readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a very complex mutation tool with no output schema, the description covers purpose, alternatives, merge/fallback behavior, and the return payload. The inclusion of the sibling routing and the disk-screenshot curl fallback make it adequate; minor gaps remain around error/validation behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all 22 parameters in depth; baseline is 3. The description adds a little semantic routing (which fields are update modes, the 1-based block index from get_launch_video, the curl flow for disk screenshots) but largely restates schema-level facts.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Changes an existing launch video') and immediately enumerates the mutation modes (blocks, block edit, name, accent, device, look, background, folder, screenshots, music). It distinguishes itself from siblings by naming create_launch_video and duplicate_project as the tools for new/variant videos.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use it for every edit to a launch video' and routes the agent: 'Use get_launch_video first for block indexes and slots', create_launch_video for a new video, duplicate_project for a variant. It also states the constraint that lines/tagline without blocks rebuild the standard film, so the agent knows which combination to pick.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_mediaUpload a screenshot or songAInspect
Adds an image from a public URL (or small base64) to the project's media library, analyzes its colors and aspect, and optionally puts it on a device screen. A song (MP3, M4A, WAV …) is analyzed for tempo and drops; in a launch video it becomes the music. For files on your own disk use get_upload_link instead — never pipe base64 through a shell into this tool, it is slow and gets cut off.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Public http(s) URL of a PNG/JPEG/WebP/AVIF image. | |
| name | No | Optional file name for the media library, e.g. "home.png". | |
| assign_to | No | Device id whose screen should show it. | |
| project_id | Yes | Project id (from create_project or list_projects). | |
| data_base64 | No | Only for tiny images or clients without a shell. A screenshot is ~100 000 base64 characters and takes minutes to write — for files on disk use the curl commands from create_project / get_upload_link. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare write (readOnlyHint=false), openWorldHint=true, destructiveHint=false, so the safety profile is mostly covered. The description still adds real behavioral context the annotations don't: analysis side effects, the optional device-screen assignment, that base64 writes are minutes-slow and get truncated, and that songs become music in a launch video.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with the primary behavior and ending with the routing warning. It is on the dense side and repeats some base64 warnings already in the schema, but every sentence carries actionable information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with no output schema, the description covers what gets created and what analysis happens, but says nothing about the return value (e.g. a media id to reference later) or whether re-uploading the same URL deduplicates. These are minor gaps against an otherwise complete definition.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds meaning the schema lacks: the url parameter is documented for images only in the schema, yet the description clarifies it also accepts audio (MP3, M4A, WAV) and explains the url-vs-data_base64 tradeoff (small base64 only, minutes-slow, truncated). That is genuine added semantic value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (adds image/audio to the project's media library) and enumerates the resulting behaviors (color/aspect analysis, tempo/drop analysis, optional device assignment). It also explicitly distinguishes itself from the sibling get_upload_link, so an agent can tell them apart without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing: use this tool for public URLs or tiny base64, use get_upload_link for files on your own disk, and never pipe base64 through a shell. The when-to-use and when-not-to-use conditions are both spelled out with the alternative named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
23 tool updates
- First observed
create_launch_video - First observed
create_project - First observed
delete_project - First observed
duplicate_project - First observed
edit_scene - First observed
export_image - First observed
finish - First observed
get_launch_video - First observed
get_scene - First observed
get_template - First observed
get_upload_link - First observed
list_compositions - First observed
list_devices - First observed
list_folders - First observed
list_projects - First observed
list_templates - First observed
list_versions - First observed
render_preview - First observed
restore_version - First observed
review_scene - First observed
suggest_palette - First observed
update_launch_video - First observed
upload_media
Publisher details
- Operator
- Ryvelia UG (haftugnsbeschränkt) · Publisher source
- Operator website
- https://showoff.dev · Publisher source
- Vendor relationship
- Unknown
- Documentation
- https://docs.showoff.dev · Publisher source
- Trust center
- Unknown
- Restrictions
- A Showoff account (free sign-up at showoff.dev with email, Google or GitHub). The MCP tools are part of Showoff Pro and include a 3-day free trial, so a new account can use every tool right away. The user signs in through OAuth when connecting. · Publisher source
Related MCP Connectors
Create app-store screenshots, social graphics, promo videos, and animated device mockups.
AI-designed App Store screenshot sets from your app's screens, uploaded to App Store Connect.
Create and edit app store screenshot projects with AI, then export in the web editor.
Design App Store and Google Play screenshots with your AI agent in the AppScreenStudio editor.
Related MCP Servers
- AlicenseAqualityCmaintenanceTurn raw app screenshots into App Store & Google Play marketing screenshots from Cursor, Claude, or any MCP client.8635 npmMIT
- FlicenseAqualityCmaintenanceGenerates beautiful App Store and Play Store screenshots by inserting app images into iPhone/iPad mockup frames with customizable text overlays and gradient backgrounds. Supports multiple device types and batch generation with both free and pro subscription tiers.8-
- AlicenseNot gradedqualityCmaintenanceEnables agents to design App Store and Google Play screenshot sets from templates or simulator captures, translate captions into 41 languages with automatic text fitting, render the pixels, and publish straight to App Store Connect or Google Play.MIT

AIOProductOS Studioofficial
AlicenseAqualityCmaintenanceTurns your AI host into a product videographer — scripted screen recordings of your own web app with a gliding cursor, camera zooms, highlight callouts, captions, and branded transitions, plus marketing-grade screenshots. Automatic dark-frame cleanup and MP4/GIF export. Free, MIT, 100% local — no account, no API keys.1433 npm3MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.