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).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.
Installation
Claude Code
Claude Desktop
Cursor
Codex- Other clients
Install the Subframe plugin
Enable auto-update (recommended)
- Run
/pluginto open the plugin manager - Select the Marketplaces tab
- Choose the subframe marketplace
- Select Enable auto-update
Verify installation
/mcp to check that the Subframe MCP server is connected, then try asking Claude Code to use Subframe.Create your first design
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

Available tools
The Subframe MCP server exposes tools across several categories. Most read tools take aprojectId. If omitted, the first project the user has access to is used.
Discovery
| Tool | Description | Returns |
|---|---|---|
list_projects | Lists all projects you have access to | Array of projectId, name, teamId, teamName |
generate_auth_token | Generates a CLI auth token for a team | authToken |
get_project_info | Project metadata plus all project-level design documents | id, name, docs (array of id, title, contents) |
Pages
| Tool | Description | Key inputs | Returns |
|---|---|---|---|
list_pages | List all pages with the flow each belongs to | projectId | Array of id, name, url, flowId, flowName |
get_page_info | Generated React/Tailwind code for a page | id/name/url, projectId | id, name, files |
design_page | Generates 1-4 page variations as an asynchronous background job. Variations land as pages in a flow as they finish | description, variations, flowName, projectId, codeContext?, additionalPages? | flowId, flowUrl, jobId |
edit_page | Apply a targeted change to an existing page; applied immediately | id/name/url, description, projectId | pageUrl |
delete_page | Delete 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 anyway | id/name/url, projectId, force? | deletedId, deletedName, references |
Components
| Tool | Description | Key inputs | Returns |
|---|---|---|---|
list_components | List all components | projectId | Array of id, name, url |
get_component_info | Generated code plus attached design document | id/name/url, projectId | id, name, files, designDocuments |
design_component | Designs a new component as an asynchronous background job | description, name, projectId | componentId, componentUrl, jobId |
edit_component | Edit an existing component as an asynchronous background job. Propagates to every page using the component | id/name/url, description, projectId | componentUrl, jobId |
delete_component | Delete a component or page layout. Detaches instances or clears layouts. Refuses by default if in use. Use force: true to delete anyway | id/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.| Tool | Description | Key inputs | Returns |
|---|---|---|---|
list_snippets | List all snippets | projectId | Array of id, name, url |
get_snippet_info | Generated code for a snippet | id/name/url, projectId | id, name, files |
design_snippet | Design a new snippet | description, name?, projectId, codeContext?, references? | snippetId, snippetUrl |
edit_snippet | Edit an existing snippet | id/name/url, description, projectId | snippetUrl |
delete_snippet | Delete a snippet. Any design document embeds are removed automatically | id/name/url, projectId | deletedId, deletedName |
Flows
A flow is a collection of related pages (e.g. “Onboarding”, “Checkout”).| Tool | Description | Key inputs | Returns |
|---|---|---|---|
list_flows | List all flows | projectId | Array of id, name, pageCount |
get_flow_info | A flow with its name and ordered pages | id/name/url, projectId | id, name, pages |
delete_flow | Delete a flow. Refuses if it contains pages. Use deleteChildPages: true to delete the flow plus every page inside it | id/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.| Tool | Description | Key inputs | Returns |
|---|---|---|---|
write_design_document | Create 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 |
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
| Tool | Description | Key inputs | Returns |
|---|---|---|---|
get_theme | Generate the Tailwind theme for the project | projectId, cssType? | theme config |
edit_theme | Edits 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, projectId | themeUrl |
Async jobs
| Tool | Description | Key inputs | Returns |
|---|---|---|---|
wait_for_jobs | Wait 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 done | jobIds (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.
Prompt with MCP link
When prompting we recommend using the MCP link found in the Code Inspect panel for a page.npx @subframe/cli@latest sync to sync
components.Example prompts
Implement a new page from a design
Implement a new page from a design
Update an existing page with a new design
Update an existing page with a new design
Design a new component
Design a new component
Write a design document
Write a design document
Delete unused components
Delete unused components
Add accessibility tags in code
Add accessibility tags in code
Migrate to Subframe's design system
Migrate to Subframe's design system
Fetch a component
Fetch a component
List available components
List available components
Get the theme
Get the theme
Troubleshooting
Authentication failed
Authentication failed
- 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
AI not calling the server
AI not calling the server
- Has MCP support enabled
- Has the Subframe server in its MCP configuration
- Has been restarted after adding the configuration
Component or page not found
Component or page not found
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
Background job seems stuck
Background job seems stuck
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.Connection errors
Connection errors
- Check your internet connection
- Verify the URL is
https://mcp.subframe.com/mcp - Reach out to the Subframe team for support

