Skip to main content
On success, every tool except 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.
Each tool also publishes MCP annotations so your client knows what it does. 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 — true if you created the file.
  • shared_with_me — true if 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, or write.
  • visibility — private, member, or public.
  • user_access_level — your access to the file: read or write.

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 }
This is irreversible. All screens in the file are deleted.

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 with add-screen-jsx).
  • fidelity — lofi, hifi, or ui.

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-id attributes are included only when includeIds is true.
  • 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 to replace-screen-jsx to keep or update them.
See Screen field values for the 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.
This replaces the screen’s content in place.

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:
  1. Upload it with upload-attachment in Mode A (mimeType + fileName) and run the returned uploadCommand.
  2. If the response’s type is "image", paste its assetUrl exactly as returned into img src or bg-[url(assetUrl)].
Leave every other image URL exactly as 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 are DESIGN.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
If validation fails, the call returns an error that starts with 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:
  1. Call upload-attachment with mimeType and fileName only (for example image/png and dog.png). The response is a prepared upload, not a stored file:
  2. Replace LOCAL_FILE_PATH in uploadCommand with the absolute path to your file and run that exact command in your shell — it must exit 0. The token in signedUrl authorizes only this single upload. Skipping this step leaves storage empty and the design tool fails its preflight check.
  3. Pass only { id, path, type } into the attachments array of ai-design-screens — not signedUrl, uploadCommand, or nextStep. To place an image in your own JSX instead, put assetUrl in the img src or bg-[url(...)] of the JSX you pass to add-screen-jsx or replace-screen-jsx. See Images in JSX.
To attach a remote file, download it to a local path yourself first (for example with 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 for add-screen-jsx or replace-screen-jsx only when type is "image", and only after the Mode A uploadCommand has 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’s DESIGN.md guidelines were updated automatically during this turn; otherwise null.

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:
Output — { status, fileId, screenIds, designGuidelinesUpdated, reply? }.
  • status — "generated" when screens were built or changed. "chat" when Flowstep replied without building, in which case reply holds its answer and screenIds is 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.
Screens you ask it to edit are overwritten in place.

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".
This overwrites the screen’s content in place.

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.