get-screen-image returns its result twice: as structuredContent (validated against the tool’s published output schema) and as the same object serialized into a text block, { type: "text", text: "<json-string>" }, for clients that don’t read structured content. get-screen-image returns only an MCP image block: { type: "image", data: "<base64>", mimeType: "image/png" }.
On failure, isError: true is set and the text block contains a short error message. Errors you can act on — a name mismatch on delete, an invalid Figma link, invalid design guidelines, an attachment problem, or a generation timeout — explain what to fix. Other failures return a generic message such as Failed to list files.
Pricing: the three AI design tools —
ai-design-screens, ai-generate-screen-variant, and ai-edit-screen-variant — draw on the same message allowance as the Flowstep app. All other tools are free. See Usage limits.delete-file, delete-screen, delete-design-guidelines, replace-screen-jsx, ai-design-screens, and ai-edit-screen-variant are marked destructive because they remove or overwrite existing content.
File tools
list-files
List metadata for your Flowstep files. Call this first to check whether a relevant file already exists. It returns no screen content — use get-screen-image or get-screen-jsx for that.
Input
Output —
{ files }.
owner—trueif you created the file.shared_with_me—trueif the file was shared with you directly, not only through your organization.url— opens the file in the Flowstep editor.
get-file
Get metadata for a single file. File content is intentionally omitted — use get-screen-image or get-screen-jsx to inspect screens, and get-design-guidelines to retrieve attached guidelines. If you have a pending invite to the file, calling get-file accepts it.
Input
Output —
{ file, user_access_level }.
access_level—private,read, orwrite.visibility—private,member, orpublic.user_access_level— your access to the file:readorwrite.
create-file
Create a blank Flowstep file with no screens. To create a file and generate screens in one step, call ai-design-screens without a fileId instead. Use create-file for code-first workflows, followed by add-screen-jsx.
Input
Output —
{ file, user_access_level }, in the same shape as get-file. owner is always true and user_access_level is always write.
Use the returned file.id as fileId in subsequent tool calls.
update-file
Rename a file.
Input
Output —
{ file, user_access_level }, in the same shape as get-file.
delete-file
Permanently delete a file. The name you pass is checked against the file’s current display name before deletion — if it doesn’t match, the deletion is aborted. This prevents accidentally deleting the wrong file. Agents are instructed to confirm with you first.
Input
Output —
{ "deleted": true }
Screen tools
list-screens
List the screens in a file, in canvas order. Call this after list-files to see what’s already in a file. Use the returned screenId values with the other screen tools and the AI design tools.
Input
Output —
{ screens }.
prompt— the last generation prompt for the screen, or an empty string if it was never generated (for example, a screen added withadd-screen-jsx).fidelity—lofi,hifi, orui.
get-screen-image
Render a screen to PNG and return it as an inline image. Requires a client that supports image content blocks. Call it once for each screenId returned by an AI design tool, add-screen-jsx, replace-screen-jsx, or import-figma.
Input
Output — MCP image content block (
image/png). data is standard base64 of the PNG bytes, not a data URI. There’s no structuredContent for this tool.
get-screen-jsx
Get a screen as JSX, plus its metadata — so you can build from it in your codebase, or edit it and write it back with replace-screen-jsx. Use get-screen-image for a visual preview instead.
Input
Output —
{ fileId, screenId, name, prompt, fidelity, screenType, colorTheme, jsx, fragments }.
jsx— markup only.data-idattributes are included only whenincludeIdsistrue.prompt— the last generation prompt, or an empty string if the screen was never generated.fragments— shared chrome stored on the screen, such as a nav bar, header, or logo, as{ purpose, markup }objects. Empty when there are none. Pass them back toreplace-screen-jsxto keep or update them.
fidelity, screenType, and colorTheme values.
add-screen-jsx
Add a new screen to a file from JSX you’ve written. This is the code-first path and is free — use ai-design-screens when you want Flowstep’s AI to design the screen. add-screen-jsx always creates a new screen: to overwrite an existing one, use replace-screen-jsx.
To show an image you’ve uploaded, see Images in JSX.
When the new screen is based on an existing one, start from get-screen-jsx (without includeIds) for name, fidelity, screenType, colorTheme, and jsx, then change whatever should differ.
Input
Output —
{ fileId, screenId }. Call get-screen-image with screenId to view the result.
replace-screen-jsx
Overwrite an existing screen with JSX you’ve written. The screen keeps its screenId and its position on the canvas; nested elements get new ids. This is the code-first path and is free — use ai-design-screens or ai-edit-screen-variant for AI changes, and add-screen-jsx to create a new screen instead.
Start from get-screen-jsx (without includeIds), then change whatever should differ. To show an image you’ve uploaded, see Images in JSX.
Input
Output —
{ fileId, screenId }. Call get-screen-image with screenId to view the result.
rename-screen
Rename a screen’s canvas label — the name shown by list-screens and in the editor. This changes the label only, not the screen’s layout, size, or content — use ai-design-screens for those.
Input
Output —
{ screenId, name }.
delete-screen
Permanently delete a screen from a file. The name you pass is checked against the screen’s current display name — if it doesn’t match, the deletion is aborted. Agents are instructed to confirm with you first.
Input
Output —
{ "deleted": true }
Images in JSX
add-screen-jsx and replace-screen-jsx accept images in an img src, or as a background in className with bg-[url(...)]. Write alt text, and size each image for its purpose.
To place an image of your own:
- Upload it with
upload-attachmentin Mode A (mimeType+fileName) and run the returneduploadCommand. - If the response’s
typeis"image", paste itsassetUrlexactly as returned intoimg srcorbg-[url(assetUrl)].
get-screen-jsx returned it. Don’t put path, signedUrl, or uploadCommand in src.
Screen field values
get-screen-jsx returns, and add-screen-jsx and replace-screen-jsx accept, these values:
Design guidelines tools
Design guidelines areDESIGN.md text stored on a file. When set, they’re injected into every AI generation for that file. See Design guidelines.
get-design-guidelines
Get the design guidelines attached to a file.
Input
Output —
{ guidelines }.
guidelines is null if no guidelines have been set.
update-design-guidelines
Set or replace the design guidelines for a file. Pass the guidelines as a plain string in Google’s DESIGN.md format — not an object or JSON. If you’re reading from a file, pass that file’s text.
Input
Validation rules
- Frontmatter must be opened and closed correctly
- Frontmatter lines must be valid block-style YAML
- Markdown body must not contain duplicate
##section headings
Invalid design guidelines:.
Output — { updated, warnings? }.
warnings lists soft-validation issues (unknown keys, non-hex colors) that were accepted but may be ignored by the AI. It’s omitted when there are none. Surface these to the user.
delete-design-guidelines
Clear the design guidelines for a file. Deleting guidelines that don’t exist is a no-op.
Input
Output —
{ "deleted": true }
Chat tools
get-chat-history
Get the design conversation associated with a file — the file’s Flowstep chat, not your MCP client’s conversation. Use it to resume earlier work on the file.
Input
Output —
{ messages }. messages is empty when you have no design conversation on the file. Each message has a type ("request" or "response"), an author ("human" or "ai"), and a content_type. Response messages use "text", "summary", or "followup".
Attachment tools
upload-attachment
Upload a reference file to use as an attachment in ai-design-screens, or an image to place in your own JSX with add-screen-jsx or replace-screen-jsx. ai-generate-screen-variant and ai-edit-screen-variant don’t take attachments. File bytes never pass through the model, and the server never fetches URLs on your behalf. To reference a webpage, include its URL in the message of ai-design-screens instead.
There are two modes — use exactly one, and don’t combine them.
Mode A — files and images (mimeType + fileName)
A required three-step flow for any image, PDF, or larger text file:
-
Call
upload-attachmentwithmimeTypeandfileNameonly (for exampleimage/pnganddog.png). The response is a prepared upload, not a stored file: -
Replace
LOCAL_FILE_PATHinuploadCommandwith the absolute path to your file and run that exact command in your shell — it must exit 0. The token insignedUrlauthorizes only this single upload. Skipping this step leaves storage empty and the design tool fails its preflight check. -
Pass only
{ id, path, type }into theattachmentsarray ofai-design-screens— notsignedUrl,uploadCommand, ornextStep. To place an image in your own JSX instead, putassetUrlin theimg srcorbg-[url(...)]of the JSX you pass toadd-screen-jsxorreplace-screen-jsx. See Images in JSX.
curl), then follow the same three steps. Never pass a URL to upload-attachment.
Mode B — short text (
text + mimeType)
Upload text that’s already in context — no shell command needed. The response is ready to use directly:
Pass the resulting
{ id, path, type } into the attachments array of ai-design-screens.
Maximum file size is 3 MB across both modes, and PDFs are capped at 100 pages.
Output — { id, path, assetUrl, type, mimeType, signedUrl?, uploadCommand?, nextStep? }.
type—"image"for image files and"document"for PDFs and text files.assetUrl— the uploaded file’s URL, returned in both modes. Use it in JSX foradd-screen-jsxorreplace-screen-jsxonly whentypeis"image", and only after the Mode AuploadCommandhas run.signedUrl,uploadCommand,nextStep— set only in Mode A. Don’t pass them into design tools.
Figma tools
import-figma
Import a Figma frame into a Flowstep file as editable elements on its canvas. Each import adds a new screen — importing the same frame twice gives you two screens, so delete the old one with delete-screen if you meant to replace it. The file’s organization must have Figma connected in Flowstep settings.
Input
Output —
{ fileId, screenId, frameCount? }. screenId is the imported screen — pass it to get-screen-image to view the result. When a page URL imports multiple frames, screenId is null and frameCount is returned instead; call list-screens, then get-screen-image for each new screen.
Plan and billing tools
get-plan-details
Get your organization’s Flowstep plan, subscription status, usage, and remaining quota. Takes no input — the organization is resolved from the signed-in user. Use it to check your allowance before calling the AI design tools.
Output — { plan, subscription, limits, usage, remaining }.
Limits vary by plan — see Pricing and Usage limits.
AI design tools
These three tools design from a description or a preset — they never take or reuse JSX. Each call draws on the same message allowance as the Flowstep app, and blocks until generation completes or times out (180 seconds).
All three return
{ status, fileId, screenIds, designGuidelinesUpdated }. Call get-screen-image once for each screenId to see the result.
designGuidelinesUpdated— a short summary of the change when the file’sDESIGN.mdguidelines were updated automatically during this turn; otherwisenull.
ai-design-screens
Generate one or more new screens, change existing screens in place, or both in one call, from a text description — new flows, theming, copy, layout, or coordinated changes across several screens. This is the same design agent as the chat in the Flowstep editor: it decides from your message and elementIds what to build and what to change.
Omit fileId to start a new file; pass fileId to work in an existing one. If the request could apply to a file you already have, your agent should check list-files and list-screens first. For a next-step, error or empty state, or platform variant of one screen, use ai-generate-screen-variant. For a preset edit or redesign of one screen, use ai-edit-screen-variant. If you already have JSX, use add-screen-jsx or replace-screen-jsx instead.
Input
Example — edit one screen and add another in a single call:
{ status, fileId, screenIds, designGuidelinesUpdated, reply? }.
status—"generated"when screens were built or changed."chat"when Flowstep replied without building, in which casereplyholds its answer andscreenIdsis empty. If your brief is ambiguous, your agent should ask you to clarify and call the tool again.screenIds— every screen built or changed during the call, including screens edited in place. If the call times out after some screens are built, it returns those screens instead of an error.
ai-generate-screen-variant
Add a new screen derived from exactly one existing screen — the next step in the flow, an error or empty state, or a version for another platform. The original screen is left unchanged. To add a screen that isn’t a variant of an existing one (for example, a settings screen), use ai-design-screens with a fileId.
Input
Output —
{ status, fileId, screenIds, designGuidelinesUpdated }. status is always "generated".
ai-edit-screen-variant
Change exactly one existing screen in place using a preset — theme or polish it, try a different layout or visual style, or redesign it from scratch. For new screens, free-form instructions, or a precise edit to individual elements, use ai-design-screens.
Input
Output —
{ status, fileId, screenIds, designGuidelinesUpdated }. status is always "generated".
Renamed tools
Tool names changed in September and October 2026. If you have prompts, scripts, or agent instructions that use the old names, update them:
Inputs changed too: the AI design tools take
elementIds (or a single screenId for the variant tools) instead of targets, add-screen-jsx takes jsx and explicit metadata fields instead of jsxContent with a metadata comment, create-file takes name instead of title, and the design guidelines tools take fileId instead of resourceId and linkedTo.