Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.subframe.com/llms.txt

Use this file to discover all available pages before exploring further.

The Subframe MCP server gives AI coding assistants like Claude Code, Cursor, and Codex direct access to your Subframe projects. AI can read, design, and delete pages, components, and snippets as well as write design documents and edit the theme. A separate Subframe Docs MCP server gives AI access to Subframe documentation (this site).

Installation

1

Install the Subframe plugin

claude plugin marketplace add https://github.com/SubframeApp/subframe && claude plugin install subframe@subframe
The Subframe plugin for Claude Code sets up the MCP server and agent skills in one install.
2

Enable auto-update (recommended)

Keep the Subframe plugin up to date automatically:
  1. Run /plugin to open the plugin manager
  2. Select the Marketplaces tab
  3. Choose the subframe marketplace
  4. Select Enable auto-update
3

Verify installation

Run /mcp to check that the Subframe MCP server is connected, then try asking Claude Code to use Subframe.
4

Create your first design

Follow the Working with AI agents guide to design and implement your first page.

Using the MCP server

Once configured, your AI assistant can access Subframe automatically when you prompt or paste an MCP link to a page from the Code panel. You can get the MCP link for any design by either:
  • Copying the link from the browser address bar
  • Copying the link under Code > Inspect in Subframe
Copy MCP link from Subframe

Available tools

The Subframe MCP server exposes tools across several categories. Most read tools take a projectId. If omitted, the first project the user has access to is used.

Discovery

ToolDescriptionReturns
list_projectsLists all projects you have access toArray of projectId, name, teamId, teamName
generate_auth_tokenGenerates a CLI auth token for a teamauthToken
get_project_infoProject metadata plus all project-level design documentsid, name, docs (array of id, title, contents)

Pages

ToolDescriptionKey inputsReturns
list_pagesList all pages with the flow each belongs toprojectIdArray of id, name, url, flowId, flowName
get_page_infoGenerated React/Tailwind code for a pageid/name/url, projectIdid, name, files
design_pageGenerates 1-4 page variations as an asynchronous background job. Variations land as pages in a flow as they finishdescription, variations, flowName, projectId, codeContext?, additionalPages?flowId, flowUrl, jobId
edit_pageApply a targeted change to an existing page; applied immediatelyid/name/url, description, projectIdpageUrl
delete_pageDelete a page, removing it from its flow and stripping prototype actions referencing it. Refuses by default if referenced in other pages. Use force: true to delete anywayid/name/url, projectId, force?deletedId, deletedName, references

Components

ToolDescriptionKey inputsReturns
list_componentsList all componentsprojectIdArray of id, name, url
get_component_infoGenerated code plus attached design documentid/name/url, projectIdid, name, files, designDocuments
design_componentDesigns a new component as an asynchronous background jobdescription, name, projectIdcomponentId, componentUrl, jobId
edit_componentEdit an existing component as an asynchronous background job. Propagates to every page using the componentid/name/url, description, projectIdcomponentUrl, jobId
delete_componentDelete a component or page layout. Detaches instances or clears layouts. Refuses by default if in use. Use force: true to delete anywayid/name/url, projectId, force?deletedId, deletedName, references

Snippets

Snippets are small, standalone bits of UI typically embedded inside design documents as live examples (e.g. a “Button variants” snippet showing every Button state). They live within Subframe and do not sync out.
ToolDescriptionKey inputsReturns
list_snippetsList all snippetsprojectIdArray of id, name, url
get_snippet_infoGenerated code for a snippetid/name/url, projectIdid, name, files
design_snippetDesign a new snippetdescription, name?, projectId, codeContext?, references?snippetId, snippetUrl
edit_snippetEdit an existing snippetid/name/url, description, projectIdsnippetUrl
delete_snippetDelete a snippet. Any design document embeds are removed automaticallyid/name/url, projectIddeletedId, deletedName

Flows

A flow is a collection of related pages (e.g. “Onboarding”, “Checkout”).
ToolDescriptionKey inputsReturns
list_flowsList all flowsprojectIdArray of id, name, pageCount
get_flow_infoA flow with its name and ordered pagesid/name/url, projectIdid, name, pages
delete_flowDelete a flow. Refuses if it contains pages. Use deleteChildPages: true to delete the flow plus every page inside itid/name/url, projectId, deleteChildPages?deletedId, deletedName, deletedPageIds

Design documents

Design documents are markdown files that convey how to work within your design system — brand voice, design principles, component usage rules (“when to use Toggle vs. Checkbox”), accessibility requirements, do/don’t examples. AI automatically reads them when designing or implementing. Project-scoped docs (many per project) cover broad guidance; component-scoped docs (one per component, attached directly to it) cover specifics for that component.
ToolDescriptionKey inputsReturns
write_design_documentCreate or update a markdown design document. Project-scoped if no componentId; component-scoped otherwise. Snippet examples can be embedded like so <div data-type="component-example" data-component-id="..."></div>content, id?, componentId?, title?, projectId, mode? (replace/append)documentId, documentUrl
Read existing docs first via get_project_info (project-level) or get_component_info (component-level). When updating, always pass the existing id — components allow at most one design document, and creating a second is rejected.

Theme

ToolDescriptionKey inputsReturns
get_themeGenerate the Tailwind theme for the projectprojectId, cssType?theme config
edit_themeEdits the project’s visual theme (colors, fonts, corners, shadows, typography) from a natural-language prompt. Applies immediately to the whole project. Supports adding tokens, changing token values, renaming tokens, and deleting tokens (destructive — references in designs are replaced with the token’s concrete value at deletion time).description, projectIdthemeUrl

Async jobs

ToolDescriptionKey inputsReturns
wait_for_jobsWait for background AI jobs to finish. Each result is running, done (with optional summary), or not_found. Call in a loop until every job is donejobIds (1-10)Array of jobId, status (running/done/not_found), summary?
design_page, design_component, and edit_component return a jobId alongside their URL. The URL can be used immediately to view the real-time progress of the job in the editor. Pass the jobId(s) to wait_for_jobs before reading back the generated content with get_page_info, get_component_info, get_snippet_info, or get_flow_info — those reads return empty/stale state until the job is done. When prompting we recommend using the MCP link found in the Code Inspect panel for a page.
Implement the design at https://app.subframe.com/design/...
To get the latest version of components in your project, run npx @subframe/cli@latest sync to sync components.

Example prompts

Create a new page using the Subframe page at
https://app.subframe.com/PROJECT_ID/design/DESIGN_ID/edit as reference.

Wire up relevant app logic (API calls, hooks, routing) where applicable.
Keep it consistent with existing project conventions.
Update the existing page to match the Subframe design at
https://app.subframe.com/PROJECT_ID/design/DESIGN_ID/edit.

Preserve all existing functionality unless the new design requires a change.
Design a PrivacyToggle component in Subframe. It should have an on/off state,
a label, and a description below the label. Use the same toggle styling as
our existing Toggle component.
Write a design doc for the Toggle component covering when to use it,
accessibility considerations, and a snippet showing all variants.
List the components in my Subframe project and help me delete any that
aren't being used in any pages.
Review the Subframe design at
https://app.subframe.com/PROJECT_ID/design/DESIGN_ID/edit and add proper
accessibility attributes to the existing page.

Add ARIA labels, roles, and descriptions, and proper semantic HTML throughout.
Migrate the components on the existing page to use Subframe components instead
of the old components.

Get all components in my Subframe project and preserve all existing
functionality unless the new design requires a change.
Get the Button component from Subframe and use it in this file.
Show me all components in my Subframe project.
Get my Subframe theme configuration.

Troubleshooting

The Subframe MCP server uses OAuth. If you’re seeing authentication errors:
  • Try re-authenticating by reconnecting to the MCP server in your client
  • Check that you have the correct permissions for the project you’re trying to access
  • Make sure your browser session is active when authenticating
  • Confirm your client supports MCP OAuth — Subframe access tokens are not accepted by the MCP server
Make sure your AI tool:
  • Has MCP support enabled
  • Has the Subframe server in its MCP configuration
  • Has been restarted after adding the configuration
Check your tool’s logs for MCP-related errors.
Use list_components, list_pages, list_snippets, or list_flows to see what’s available.Verify:
  • The component/page/snippet exists in your Subframe project
  • The name or URL matches exactly
  • You have access to the project
design_page, design_component, and edit_component run as background jobs. Check wait_for_jobs with the jobId returned by the design tool — it reports running, done, or not_found. The URL is live throughout, so opening it in the editor shows real-time progress.If a job stays running longer than ~10 minutes, the server treats it as stalled (worker died, request timed out) and reports it as done to unblock polling. Open the URL to see whether anything was actually generated; the chat panel surfaces any errors from the AI agent.
If the MCP server is unreachable:
  • Check your internet connection
  • Verify the URL is https://mcp.subframe.com/mcp
  • Reach out to the Subframe team for support
Last modified on May 19, 2026