Sitewright Docs GitHub

Get started

Sitewright docs

Sitewright is an MCP server that lets AI agents — Claude Code, Cursor, Codex — build and edit Framer sites: design tokens and text styles, pages and sections, breakpoints, motion, components from your project and the Marketplace, images, CMS content and translations, and the checks before a site is handed over. It runs on your computer, works in the Framer project you have open, and records every change in a journal you can undo.

Unofficial. Sitewright is not affiliated with or endorsed by Framer. “Framer” is a trademark of Framer B.V. It is free and open source under the MIT license.

You need:

  • Node.js 24.11 or newer on macOS, Linux or Windows.
  • An MCP client: Claude Code, Cursor, Codex or any agent that speaks MCP.
  • A Framer project you can edit, and the Sitewright plugin in it.
  • Optionally, the project's Server API key. Without one, the plugin does the work; a key adds motion, variants, rich text, link styles, translations, screenshots and catalogs (see Working without a key).

Install

Run the setup wizard in a terminal:

npx -y sitewright@latest

It asks, step by step:

  1. which clients to connect: Claude Code, Cursor, Codex;
  2. the Server API keys of your projects, one per project (you can skip it and add them later);
  3. what the agent may do: custom code, code components;
  4. whether to add the Claude Code hooks that show the skills Claude uses in the journal;
  5. whether to add the Playwright MCP server, when a chosen client has no browser server yet: with it your agent checks the published site in a real browser (the phone menu, section links, hover and motion).

To set it up by hand instead, add the server to Claude Code:

claude mcp add sitewright -- npx -y sitewright@latest

For Cursor, Codex and other clients, add this to their MCP config:

{
  "mcpServers": {
    "sitewright": {
      "command": "npx",
      "args": ["-y", "sitewright@latest"]
    }
  }
}

npx -y sitewright@latest setup --print prints these commands and blocks, for scripts. After a Sitewright update, reconnect the server in your client (in Claude Code: /mcp → reconnect) so it sees the new tools.

Connect the plugin

  1. Add Sitewright from the Framer Marketplace, then open it in your project: Plugins → Sitewright.
  2. Click Connect. A small window opens: the journal. It carries the plugin's connection to Sitewright, so keep it open while you work.
  3. The plugin says Connected. Ask your agent to start with project_overview.

Sitewright works in the project the plugin is open in. Open the plugin in another project and the agent follows it; nothing runs while no plugin is connected, so a change never lands in a project you did not open.

Browsers do not let a published plugin talk to your computer directly, so the journal window relays for it. If the plugin keeps waiting, check that the window is open and that your agent is running with Sitewright connected.

Server API keys

A key gives Sitewright Framer's Server API for one project, including Framer's agent layer (its layout language). Create one in Framer: Site Settings → General → API Keys. Then save it:

npx -y sitewright@latest key          # add a project's key
npx -y sitewright@latest key list     # the projects with a key
npx -y sitewright@latest key remove   # remove one

You can also add it on the journal page: the gear → Server API key. Keys are checked when you save them and stay in ~/.sitewright/keys.json, readable only by you. Sitewright uses the key of the project the plugin is open in; to work on another saved project, name it to your agent (it calls framer_connect).

Guide

How calls reach Framer

Every call goes one of three ways, and the journal tags each entry with the one it took:

Path Needs Used for
Plugin API The plugin, connected Everything it can do, first: changes land live in the editor.
Server API The project's key Screenshots, catalogs, large uploads, reads the plugin cannot make.
Framer agent The project's key Framer's layout language: effects, variants, components, rich text, shadows.

The default mode, auto, needs the plugin connected. SITEWRIGHT_TRANSPORT=server-api is the mode for working without the editor open, on purpose: the agent then works on the saved project you name.

Working without a key

With the plugin alone, the agent can:

  • build pages from frames and text: layout (stacks, grids), sizes, positions, fills, borders, radius, links;
  • fill frames with a color, a token, a linear gradient or an image from a URL;
  • manage color tokens and text styles, including sizes per breakpoint;
  • add Tablet and Phone breakpoints and adapt their copies;
  • add SVG, upload images and files, set component controls;
  • insert components and sections from the Marketplace, and fill their controls with your own photos;
  • edit CMS collections, fields and items, and redirects;
  • run the checks before handover: search, links, images, accessibility, contrast;
  • write code files and custom code, when you allow it.

These need a key: effects and motion (hover, appear, scroll), variants and components, rich text, text color on a text node (put it on the text style instead), shadows, radial and conic gradients, link styles, translations and new locales, changing the site's settings, screenshots of pages and references, preview links, the icon, component and shader catalogs, and deleting a whole CMS collection. A batch that asks for one of them changes nothing and says what needs the key.

The journal and undo

Every call is an entry: what the agent read or changed, how it reached Framer, and what it touched — tokens, styles and layers you can click to select in the editor. Open the journal page with sitewright open, the plugin's Open journal, or ask the agent (activity_open). The window takes Framer's light or dark theme.

  • All · Changes · CMS · Reads · Skills pick what the list shows.
  • Undo takes back the newest change; Undo on an entry takes back that change and everything after it.
  • Redo puts back what the last undo took.
  • Mark sets a checkpoint, and Restore beside it undoes everything since, with a preview first.
  • Clear starts the journal on screen over, with or without the plugin in that project: the changes stay in Framer, but can no longer be undone from here.

What you undo on the page, the agent hears about with its next result, so it re-reads before building on it. Edits you made yourself after the agent are kept: undo skips them unless you choose to revert them too.

Not undoable yet: pages, CMS collections, fields and the order of items, translations and locales, component controls, detaching or making a component local, redirects, uploaded files and deleted code files. Those tools say so, and a deletion returns what it removed, so the agent can put it back.

What the agent may do

Switches on the journal page (the gear) or in the terminal (sitewright settings, sitewright settings customCode=on). Every agent session follows them.

Switch What it does
Plugin first While the plugin is connected, the agent works through it, so changes land live in the editor. Only what needs Framer's layout language, screenshots and catalogs go through the Server API. Off: the Server API does everything it can.
Custom code Lets the agent add HTML to every page: analytics, verification tags, embeds. Off: it tells you what needs code instead of writing it.
Code components Lets the agent write React code components and overrides for what the canvas cannot do. Off: it builds with canvas components, variants and effects only.
Support reminders At most once a week, after a change, the agent mentions how to support Sitewright. Off: never.

Framer guide, audit and checks

framer_guide tells the agent how Framer behaves: what its layout language does without saying so, how layout, breakpoints and motion work, Framer's Marketplace template checklist, what works without a key, and how to check the result. It gives no design advice: Sitewright carries out the design you and your agent decide on. The Claude Code skill (sitewright setup --skill) points the agent at it.

After every design_apply, Sitewright audits what the batch touched, and layout_audit checks a whole page with its breakpoints. The audit looks for what breaks on the published site: children on different edges, cards of uneven height, text links in the default blue, sections wider than the rest, fixed sizes that break on phones, grids too dense for a phone, missing headings, uneven spacing.

Before handover, the checks look at the whole site: search titles and descriptions, broken links and anchors, the same photo twice and missing alt text, contrast, copy left over from a template, and the published site itself (live_check).

Pages as XML

nodes_read returns a page or a layer as XML: one tag per layer with its attributes. design_apply takes the same XML back:

  • a tag with an id changes that layer, only in the attributes it gives;
  • a tag without one creates a layer, inside the tag around it or in the parent it names;
  • $delete="true" removes the layer;
  • a key names a new layer: its id comes back in the result, and a later tag's parent can use the key;
  • with a key, raw DSL works too (dsl: moves, duplicates, variants).
<FrameNode id="hero" gap="24px">
  <RichTextNode key="title">Build calm spaces</RichTextNode>
  <FrameNode id="old-banner" $delete="true" />
</FrameNode>

Skills in the journal

Claude Code loads skills itself, so Sitewright learns about them through Claude Code hooks. With them on, the journal shows which skills Claude used for a change.

npx -y sitewright@latest setup --hooks          # print the hooks to add
npx -y sitewright@latest setup --hooks --yes    # add them (a .bak copy of your settings is kept)

Restart Claude Code afterwards.

Commands

Command What
sitewrightIn a terminal: the setup wizard. For an MCP client: the server on stdio.
sitewright setupThe setup wizard; --print prints the commands and config blocks instead.
sitewright setup --hooksThe Claude Code hooks for skills in the journal; --yes adds them.
sitewright setup --skillAdds the Sitewright skill to Claude Code.
sitewright keyAdds a project's Server API key; key list, key remove.
sitewright settingsWhat the agent may do; --print, or set one: settings customCode=on.
sitewright openOpens the journal page of the running server.
sitewright logsFollows the logs of every running server on this machine.
sitewright --versionPrints the version.

Configuration

Set these in the environment of the MCP server, in your client's config.

Variable Default What
SITEWRIGHT_TRANSPORTautoauto (through the plugin, nothing without it), server-api or plugin.
SITEWRIGHT_HOME~/.sitewrightThe journal, keys, settings, logs and the bridge's port.
SITEWRIGHT_BRIDGE_PORT18710The journal page and the plugin's bridge.
SITEWRIGHT_PLUGIN_BRIDGEonoff: no bridge for the plugin.
SITEWRIGHT_PLUGIN_ORIGINSMore plugin origins the journal window relays for, comma-separated: a plugin build of your own.
SITEWRIGHT_HISTORYonoff: no journal, nothing to undo.
SITEWRIGHT_SUPPORT_REMINDERSonoff: the agent never mentions how to support the project.
SITEWRIGHT_CACHE_DIR~/.cache/sitewrightWhere Framer's DSL reference is cached.
LOG_LEVELinfoLogs go to stderr and to ~/.sitewright/logs/.

Files on your computer

Everything stays in ~/.sitewright; nothing goes anywhere but Framer. A few tools read public pages they name: Marketplace items you link, reference pages, and your published site.

  • keys.json — the Server API keys, one per project, readable only by you;
  • settings.json — the switches;
  • the journal of each project, which undo reads;
  • logs/ — the logs (sitewright logs);
  • bridge.json — the port the journal page and the plugin's bridge use.

There is no telemetry and no account. The full privacy policy.

Troubleshooting

“The Sitewright plugin is not connected”
Open the plugin in your project, click Connect, and keep the journal window open. Without the plugin nothing runs, unless you chose SITEWRIGHT_TRANSPORT=server-api.
The plugin keeps waiting
The journal window looks for the MCP server your agent runs. Start your agent with Sitewright connected (in Claude Code, /mcp); the window reconnects by itself.
Connect opens the window, but the plugin stays “Not connected”
Close the journal window and click Connect again: the window learns which plugins it may relay for when it opens, so one left open from before an update ignores the new plugin. Update Sitewright too, so the plugin and the server are the same release.
The agent does not see a new tool
Reconnect the server in your client after an update (in Claude Code: /mcp → reconnect).
A change needs a key
The result names what needs the Server API. Add the project's key with sitewright key or on the journal page, or ask the agent for the way that works without one.
Something else
sitewright logs follows what every running server does. Bugs, ideas and feedback: open an issue on GitHub; questions: Discussions.

Tools

All tools

Every tool as your agent sees it: what it does, its parameters, whether it only reads, and what it needs. You rarely call them yourself: you ask, and the agent picks them.

  • Reads never changes the project
  • Changes changes it, with undo unless the tool says otherwise
  • Destructive deletes or overwrites; the agent asks first
  • Plugin works without a key
  • Server API key needs the project's key

Project and connection 15

Where the agent starts: which project is open, how it is reached, and publishing when you ask.

framer_status

Reads Local

Framer connection status

Shows the active transport (Server API or the Framer plugin), whether each one is configured and connected, what to do if not, the projects with a saved Server API key (framer_connect { project } switches between them), and what the project's Framer plan allows. Call it when a Framer tool fails.

No parameters.

framer_connect

Changes Local

Choose Framer transport or project

Switches how tools reach Framer, which project they edit, or both. transport: "server-api" (API key, headless, DSL + screenshots), "plugin" (the Sitewright plugin open in the editor; Plugin API only) or "auto" (everything through the connected plugin, the DSL through the Server API of its project; nothing runs while the plugin is not connected). project: when the user names another project, switch to it here, by name from framer_status's projects (only those have a saved key); the plugin follows only if it is open in that project. Returns the new status.

ParameterTypeWhat
transport"auto" | "server-api" | "plugin"Leave out to keep the current one.
projectstring | nullA project with a saved Server API key, by name, id or editor link: the Server API switches to it, also without the plugin, until the plugin is opened in another project. null: follow the plugin's project again. Leave out to keep the current one.
reconnectbooleanReopen the Server API session first. It keeps the project as it was when it connected, so after people change things in the editor (vector sets, uploaded fonts, edits) reconnect to see them. default false

project_overview

Reads Plugin

Project overview

Summarizes the connected Framer project: web pages with paths, design pages, counts of color tokens, text styles, components and CMS collections, and what its Framer plan allows (capabilities). Start here.

No parameters.

selection_get

Reads Plugin only

Read the editor selection

Returns the layers the user selected in the Framer editor (ids and names). Call it when the user says "this", "the selected one" or "what I picked", then read those ids with nodes_read and change them with design_apply. Works through the Sitewright plugin only, open in this project.

No parameters.

selection_wait

Reads Plugin only

Wait for the user to pick layers

Waits (up to 25 s) for the user to select something new on the canvas and returns it: ask them to click the layer they mean, then call this. timedOut true means nothing new was picked in time; ask again or use selection_get. Works through the Sitewright plugin only, open in this project.

ParameterTypeWhat
secondsnumberHow long to wait for the user to select something new. default 20

nodes_select

Reads Plugin only

Select layers in the editor

Selects layers on the Framer canvas, to show the user what you changed or are about to change; [] clears the selection. Works through the Sitewright plugin only, open in this project.

ParameterTypeWhat
nodeIdsstring[]The layers to select on the canvas; [] clears the selection. required

node_show

Reads Plugin only

Show a layer in the editor

Scrolls the Framer editor to a layer, a page or a CMS item, selecting it and zooming to it unless told not to: the way to point the user at a spot. Works through the Sitewright plugin only, open in this project.

ParameterTypeWhat
nodeIdstringA layer, a page or a CMS item. required
selectbooleanSelect it after scrolling to it. default true
zoombooleanZoom and center the canvas on it. default true

nodes_zoom

Reads Plugin only

Zoom to layers

Zooms the Framer canvas so the layers fit on screen, without selecting them. Works through the Sitewright plugin only, open in this project.

ParameterTypeWhat
nodeIdsstring[]The layers to fit on screen, without selecting them. required

framer_user

Reads Plugin

Who is signed in

The Framer user the connection works as: name, initials and avatar.

No parameters.

plugin_data_get

Reads Plugin only

Read plugin data

Reads the small notes Sitewright keeps in the project or on a layer (plugin data): one key, or every key with its value. Only this plugin's own data. Works through the Sitewright plugin only, open in this project.

ParameterTypeWhat
nodeIdstringA layer; omit for the project itself.
keystringOne key; omit to list every key with its value.

plugin_data_set

Changes Plugin only

Write plugin data

Keeps a small note in the project or on a layer as plugin data (Framer allows 2 KB a key, 4 KB in all); null deletes the key. It never shows on the site: use it for state between sessions, e.g. when a sync last ran. Works through the Sitewright plugin only, open in this project.

ParameterTypeWhat
nodeIdstringA layer; omit for the project itself.
keystring required
valuestring | nullThe text to keep (Framer allows 2 KB a key, 4 KB in all); null deletes the key. required

publish_status

Reads Plugin

Publish status

Where the site is published (production and staging URLs, when) and which pages changed since the last publish. Publish with project_publish, only when the user asks.

No parameters.

deployments_list

Reads Plugin

List deployments

The site's newest deployments: when, by whom, and whether they went live or failed.

ParameterTypeWhat
limitnumber default 10

publish_preview

Reads Server API key

Preview a publish

Shows what publishing would do, without publishing: whether it is blocked, the blocking errors and the warnings (with the layer's id when Framer names one), the pages (with their paths), components and other parts changed since the last publish, where it would go (production, staging or a branch preview) and the site's URLs. Use it before the user publishes, to fix what blocks or warns first, and to find the live URL for reference_screenshot. It never publishes: the user does, or project_publish when they ask. Needs the project's Server API key.

No parameters.

project_publish

Changes Plugin

Publish the site

Publishes the site as it is in the editor: to staging when the project has staging on, otherwise live to visitors. Only when the user asks to publish; with the Server API key, check first with publish_preview. Returns the deployment's first status (optimization goes on after it) and the address; a failed status means Framer could not publish, tell the user.

No parameters.

Design system 13

Color tokens with light and dark values, and text styles with their sizes per breakpoint.

color_tokens_list

Reads Plugin

List color tokens

Lists Framer color styles (tokens) as { id, path, light, dark }. path uses "/" folders like "Brand/Primary".

ParameterTypeWhat
prefixstringOnly tokens inside this folder, e.g. "Brand".

color_tokens_upsert

Changes Plugin

Create or update color tokens

Creates or updates color tokens by path in one batch (idempotent: unchanged tokens are skipped). Accepts hex, rgb(), hsl(), oklch() or CSS names for light and optional dark. Reference a token elsewhere as var(--token-<id>).

ParameterTypeWhat
tokensobject[] required
  • path string — Token path with "/" folders, e.g. "Brand/Primary".
  • light string — Light-mode color: hex, rgb(), hsl(), oklch() or a CSS name.
  • dark string | null optional — Dark-mode color. null removes it; omit to keep the current value.
dryRunbooleanOnly return the plan, change nothing. default false
via"auto" | "dsl" | "plugin-api"How to write: "dsl" (framer.agent, Server API only), "plugin-api" (works on both transports), "auto" (dsl when available). default "auto"

color_tokens_delete

Destructive Plugin

Delete color tokens

Deletes color tokens by path (every token at a path, if several share it) and whole folders (folders: ["Brand"] deletes everything inside, and so the folder). Tokens Framer refuses to delete come back in failed with the reason; unknown paths and folders in notFound.

ParameterTypeWhat
pathsstring[]Style paths; every style at a path goes. default []
foldersstring[]Folders to empty, e.g. "mcp-test/live": every style inside goes, and the folder with them. default []
via"auto" | "dsl" | "plugin-api"How to write: "dsl" (framer.agent, Server API only), "plugin-api" (works on both transports), "auto" (dsl when available). default "auto"

color_token_swap

Changes Server API key

Replace a color token everywhere

Points every layer that uses one color token at another, across the whole site or one page: fills, text colors, borders and gradients, in pages, components, design pages and layouts. dryRun lists what would change. Texts whose own runs name the token and text styles colored with it are listed apart (rewrite them with design_apply xml and text_styles_upsert). Undo takes it back. Needs the project's Server API key.

ParameterTypeWhat
fromstringThe token to replace, by path ("Brand/Blue") or id. required
tostringThe token to use instead, by path or id. required
pagePathstringOne web page; omit for the whole site.
dryRunbooleanList what would change without changing it. default false

text_styles_list

Reads Plugin

List text styles

Lists Framer text styles (presets) with font, sizes, color (token path or raw value) and breakpoint slots: each slot's label and the width it starts at.

ParameterTypeWhat
prefixstring

text_styles_upsert

Changes Plugin

Create or update text styles

Creates or updates text styles by path in one batch. Font family must exist (use fonts_search); color binds a token with { token: "Brand/Text" }. Only provided attributes change on existing styles.

ParameterTypeWhat
stylesobject[] required
  • path string — Style path with "/" folders, e.g. "Heading/H1".
  • tag "h1" | "h2" | "h3" | "h4" | "h5" | "h6" | "p" optional — HTML tag. New styles default to p.
  • font object optional
  • fontSize string optional
  • lineHeight string optional
  • letterSpacing string optional
  • paragraphSpacing number optional
  • color object optional — { token: "Brand/Text" } binds a color token; { value: "#111111" } sets a raw color.
  • transform "none" | "capitalize" | "uppercase" | "lowercase" optional
  • alignment "start" | "center" | "end" | "left" | "right" | "justify" optional
  • decoration "none" | "underline" | "line-through" optional
  • balance boolean optional — Even out line lengths, so a headline never ends with one word alone. Turn it on for headings.
  • breakpoints object optional — Sizes for narrower screens, by slot. A style with 1 slot has medium; 2: medium, small; 3: medium, small, extraSmall; 4: large, medium, small, extraSmall. Slots start at the page breakpoints from the top, the narrowest at 0, so on a site of 1440/1280/810/390 medium alone covers everything below 1440. A skipped earlier slot is added with the base fontSize.
dryRunbooleanOnly return the plan, change nothing. default false
via"auto" | "dsl" | "plugin-api"How to write: "dsl" (framer.agent, Server API only), "plugin-api" (works on both transports), "auto" (dsl when available). default "auto"

text_styles_delete

Destructive Plugin

Delete text styles

Deletes text styles by path (every style at a path, if several share it) and whole folders (folders: ["mcp-test/live"] deletes everything inside, and so the folder). Styles Framer refuses to delete, e.g. still used by text, come back in failed with the reason; unknown paths and folders in notFound.

ParameterTypeWhat
pathsstring[]Style paths; every style at a path goes. default []
foldersstring[]Folders to empty, e.g. "mcp-test/live": every style inside goes, and the folder with them. default []
via"auto" | "dsl" | "plugin-api"How to write: "dsl" (framer.agent, Server API only), "plugin-api" (works on both transports), "auto" (dsl when available). default "auto"

styles_usage

Reads Server API key

Show where styles are used

Shows which color tokens, text styles and link styles the site uses: for each, how many layers use it (a layer counts once across breakpoints) and where (page paths, components, design pages, layouts); a token also lists the text and link styles that bind it. What nothing uses comes back in unused. Read the whole site (no pagePath) before deleting or swapping a style: with pagePath it reads one page, and unused means unused there. Code files are not searched.

ParameterTypeWhat
pagePathstringOne web page; omit to read the whole site: every page, component, design page and layout.

fonts_used

Reads Plugin

Fonts in use

Lists every font family the project uses, with its weights and styles, the text styles that set it and how many layers carry it inline (on each page's main breakpoint): what to check before a font swap or a license question.

ParameterTypeWhat
pagePathstringLook at one page's layers; omit for every web page.

Pages, layout and redirects 22

Create, duplicate and delete pages, read one as XML, find layers and replace text across pages, read and set the site's and pages' titles, descriptions, images and search settings, change pages and their motion, check what looks broken, adapt them to tablet and phone, look at them and at a reference, and redirect old paths.

page_create

Changes Plugin

Create a page

Creates an empty web page at a path ("/about") or a design page (a canvas for drafts) by name. Build its content with design_apply; add breakpoints with breakpoints_add. Undo does not remove pages.

ParameterTypeWhat
pathstringA web page by its path, e.g. "/about".
designPagestringA design page (a canvas for drafts) by its name.

page_delete

Destructive Plugin

Delete a page

Deletes a web page by path or a design page by name, with everything on it. Undo cannot bring it back: delete only pages the user asked to remove or you created yourself. The home page cannot be deleted.

ParameterTypeWhat
pathstringA web page by its path, e.g. "/about".
designPagestringA design page (a canvas for drafts) by its name.

page_duplicate

Changes Plugin

Duplicate a page

Copies a page with everything on it: a web page (path) to a new path (newPath, e.g. "/about-b"), keeping its breakpoints, their overrides and its settings; or a design page (designPage) under a new name (newName). Use it for a variant of a page (an A/B version, a landing page from an existing one) instead of rebuilding it with design_apply. The new path must be free. A web page copy is a draft by default, which publishing leaves out until the user turns the draft off; draft: false publishes it with the site. Works with or without the Server API key. Returns the copy's id, path or name, and whether it is a draft. Undo does not remove the copy: delete it with page_delete.

ParameterTypeWhat
pathstringThe web page to copy, by its path, e.g. "/about".
designPagestringThe design page to copy, by its name.
newPathstringThe web page copy's path, e.g. "/about-b"; no other page may have it.
newNamestringThe design page copy's name; Framer adds a number when another page has it.
draftbooleanKeep a web page copy off the published site until the user turns its draft off; false publishes it. default true

nodes_read

Reads Plugin · more with a key

Read nodes

Reads a node (or the page root, or up to 50 nodes at once with nodeIds) with its children to a given depth, as XML by default: tags are node types, attributes are ids, names and DSL attributes, $-attributes are read-only metadata. Blocks and runs of a rich text show no id: theirs follow from position (v:<text id>:<n>, then :<m>). Edit the XML and send it back with design_apply xml. format "json" returns raw serialize(). Keep depth low and filter attributes on big pages. Without a Server API key it reads through the Plugin API: the same XML with fewer attributes, and the plain text of a rich text instead of blocks and runs.

ParameterTypeWhat
nodeIdstringNode id. Omit to read the page root of pagePath.
nodeIdsstring[]Several nodes in one call instead of nodeId: their XML one after another; ids not found go to missing.
pagePathstringPage path, e.g. "/" or "/about". default "/"
depthnumberHow many child levels to include. default 2
attributesstring[]Only these attributes, e.g. ["fill", "layout", "$rect"]. [] returns structure only.
format"xml" | "json"xml: the tree as elements (compact, writable back with design_apply); json: raw serialize(). default "xml"

nodes_find

Reads Plugin

Find layers

Finds layers across the site's pages (or one page) by part of their name or text, and/or by type, on each page's main breakpoint. Returns their ids for nodes_read and design_apply.

ParameterTypeWhat
querystringPart of a layer's name or text, in any case.
typestringOnly layers of this type, e.g. "RichTextNode", "FrameNode", "ComponentInstanceNode".
pagePathstringOne page; omit to look through every web page.
limitnumber default 50

nodes_query

Reads Plugin

Query layers by attributes

Finds layers across the site's pages (or one page) whose DSL attributes meet every condition, e.g. all text smaller than 14px, every frame with an image fill, links with no link style: [{ attribute: "opacity", op: "lessThan", value: "1" }]. Operators: equals, contains, lessThan, greaterThan (numbers compare as numbers, 16px is 16), exists, notExists. Returns each layer with its page and the attributes the conditions name; change them with design_apply. Attributes are read as the Plugin API gives them, on each page's main breakpoint: units can differ from nodes_read, which reads through the Server API (a size in percent here, in px there).

ParameterTypeWhat
whereobject[]A layer must meet every condition. required
  • attribute string — A DSL attribute as nodes_read shows it, e.g. "opacity", "fill", "link", "textStylePreset".
  • op "equals" | "contains" | "lessThan" | "greaterThan" | "exists" | "notExists"
  • value string optional — What to compare with, not for exists and notExists. Numbers compare as numbers (16px is 16).
typestringOnly layers of this type, e.g. "FrameNode", "RichTextNode".
pagePathstringOne page; omit to look through every web page.
limitnumber default 50

nodes_lock

Changes Plugin

Lock or unlock layers

Locks layers in the Framer editor so they cannot be selected or moved by accident (a grain or grid overlay, a background video), or unlocks them with locked: false. design_apply cannot do it: Framer ignores locked in the DSL. Works with or without the Server API key. Returns the layers it changed, those already as asked, and ids it found no layer for. Find locked layers with nodes_query [{ attribute: "locked", op: "equals", value: "true" }]. Undo takes it back.

ParameterTypeWhat
nodeIdsstring[]The layers to lock or unlock, by id (from nodes_read, nodes_find, nodes_query or selection_get). required
lockedbooleantrue locks the layers, false unlocks them. default true

styles_copy

Changes Plugin

Copy a layer's styles

Copies the look of one layer to others in one batch: pick the groups (color, text, border, radius, shadow, layout, size); only the values the source has are written. The way to make a set of cards, buttons or labels match one that is right. Undo takes it back.

ParameterTypeWhat
sourceIdstringThe layer whose look to copy. required
targetIdsstring[]The layers that take it. required
categories"color" | "text" | "border" | "radius" | "shadow" | "layout" | "size"[]What to copy: color, text, border, radius, shadow, layout, size. default ["color","text","border","radius","shadow"]
pagePathstringThe page the layers are on. default "/"

node_clone

Changes Server API key

Copy a layer as standalone layers

Copies a layer with everything inside it under another parent, on this page or another, and by default replaces the copy's component instances with their layers, so the copy follows no component: a starting point to change freely without touching the original or its components. Needs the project's Server API key.

ParameterTypeWhat
nodeIdstringThe layer to copy, with everything inside it. required
parentIdstringWhere the copy goes: a frame or breakpoint, on this page or another. required
pagePathstringThe page of parentId. default "/"
detachbooleanReplace the copy's component instances with their layers, so it no longer follows any component. default true

design_apply

Destructive Plugin · more with a key

Apply design changes

Changes a page and returns Framer's diagnostics (errors, warnings, lint, renamedIds). Prefer xml; dsl (raw +Node/SET/DEL/MOVE/DUPE commands) runs after it, for moves and duplicates. Without a Server API key it runs through the Plugin API: xml only, frames and plain text with layout, size, position, fill, radius, border, link and textStylePreset (framer_guide dsl lists them), and overrides on breakpoint copies by compound id; anything else refuses the whole batch before a change. XML: tags are node types, attributes are DSL attributes (framer_docs), every value in quotes. An element without id is created: nested ones under their parent element, a top-level one under parent="<id>", at the end unless index="<n>" is given; key="hero" returns its real id in keys, and @hero in any value (scope, component, parent, var(--variable-@label), and the dsl part) points at it within the batch. An element with id gets a SET of only the attributes it lists; $delete="true" deletes it. Nesting existing nodes only addresses them: nothing moves and omitted children stay. Inside an existing rich text, blocks and runs without id are the ones at that position (as nodes_read prints them); give a new one a key. Text: plain text inside a RichTextNode, or <TextBlock tag="h1">…</TextBlock> blocks with <TextRun bold="true">…</TextRun> runs; write & and < as &amp; and &lt;. Nested attributes are dotted: hoverEffect.scale="1". With a key, color text with a token on the RichTextNode itself, textColor="var(--token-<id>)", not only through its text style: only then does the token show in Framer's Color field. Framer applies every command it can and skips the failed ones: send only the failed commands again, fixed, never the whole batch (it would create its nodes twice). Pass pagePath for a node that is not on the home page (nodes_find and selection_get give it). Read framer_guide dsl before the first batch.

ParameterTypeWhat
xmlstringNodes as XML, e.g. <FrameNode parent="<id>" key="hero" layout="stack"><RichTextNode>Hi</RichTextNode></FrameNode>. Without id: created (key names it in the answer); with id: SET of the attributes given; $delete="true" deletes.
dslstringFramer DSL commands, each ending with ";", applied after the XML. See framer_docs "Updating the Project".
pagePathstringPage the commands apply to. default "/"

effects_set

Changes Server API key

Set motion effects

Puts a motion preset on layers in one call: every value of the effect is written (Framer fills in its own otherwise: a hover scale of 1.1, a loop that spins, a scroll transform at half opacity), transitions are springs without bounce of the kind Framer keeps there, and delays grow along nodeIds. Prefer it to writing effect attributes with design_apply. Presets: fade-up (cards and blocks below the fold appear on scroll, one after another); hero-sequence (the first screen's heading, text and media appear on load, 0.1s apart); text-reveal (a heading appears word by word as it enters); hover-lift (a card or button rises 4px on hover); hover-fade (a link or image dims slightly on hover); press (a button gives way to 97% when pressed); float (a badge or illustration drifts up and down); pulse (a dot or badge breathes in scale); spin (a badge or mark turns slowly); scroll-grow (an image or section grows from 86% as it scrolls in); parallax (an image moves against the scroll inside a clipped frame (put it on the inner layer)); ticker (a stack of logos or words runs as a marquee, slower on hover); remove (removes the effects named in options.effects (all of them without it)). Hover and press go on a plain layer or a layer inside a component, never on a variant or breakpoint root (Framer refuses there). Effects never run on the canvas or in screenshots: say so and check them in Preview. Undo takes a preset back. Needs the project's Server API key.

ParameterTypeWhat
preset"fade-up" | "hero-sequence" | "text-reveal" | "hover-lift" | "hover-fade" | "press" | "float" | "pulse" | "spin" | "scroll-grow" | "parallax" | "ticker" | "remove"The effect to put on the layers. required
nodeIdsstring[]The layers, in the order they should move (delays grow along this list). required
pagePathstringThe page the layers are on. default "/"
optionsobject default {}
  • delay number optional — Seconds before the first layer starts.
  • stagger number optional — Seconds between layers in order.
  • distance number optional — Pixels of travel.
  • duration number optional — Seconds the spring takes.
  • effects "appearEffect" | "hoverEffect" | "tapEffect" | "loopEffect" | "styleTransformEffect" | "textEffect" | "tickerEffect" | "parallaxEffect" | "scrollVariantEffect"[] optional — For "remove": which effects to take off; all of them when omitted.

text_replace

Changes Plugin · more with a key

Replace text

Replaces text inside text layers across the site's pages (or one page), including breakpoint copies that hold their own text (a copy that follows the primary breakpoint changes with it); the journal can undo it. Run it with dryRun first and show the user what changes. Each change says what happens to the formatting inside the layer: kept (with the Server API key Framer replaces in place: bold, links and lists stay), partial (the match crosses differently formatted runs and takes the formatting of the run it starts in), plain (without a key the layer is rewritten as plain text through design_apply).

ParameterTypeWhat
findstringThe text to find inside text layers. required
replacestringWhat it becomes; an empty string removes it. required
pagePathstringOne page; omit for every web page.
matchCaseboolean default false
dryRunbooleanOnly list what would change. default false

site_settings_get

Reads Plugin · more with a key

Read site settings

Reads the site's settings and every page's in one place. The site: title, description, social image and favicons (light, dark, Apple touch icon), which every page inherits. Each page: its own title, description and social image (null inherits the site's), noIndex (hidden from search engines), noIndexSite (hidden from the site's own search), its layout template and whether it is a draft; plus the layout templates there are. Without a Server API key only the pages' paths and drafts are visible. Change them with site_settings_set.

ParameterTypeWhat
pagePathstringOne page; omit for every web page.

site_settings_set

Changes Server API key

Change site settings

Changes the site's and pages' settings in one call, so the fixes seo_audit suggests land together. The site: title, description, socialImage, favicon, faviconDark, appleTouchIcon (favicons exist only on the site). Pages by path, each with only what changes: title, description, socialImage, noIndex, noIndexSite, layoutTemplate, draft (noIndex exists only on pages). null clears a value, so a page inherits the site's again. noIndexSite follows noIndex unless given: Framer turns it on with noIndex and keeps it on after. Framer downloads each image URL itself; one it cannot download is left out and the call fails, but the rest is applied (the answer shows the settings as they are now). A page on a layout template takes its breakpoints' background, padding and gap from the template, so fill on them is refused. The journal can undo it; needs the Server API key.

ParameterTypeWhat
siteobjectThe site's defaults, which pages inherit; favicons live only here. null clears a value.
  • title string | null optional — The site's title: the default for every page.
  • description string | null optional — The site's description: the default for every page.
  • socialImage string | null optional — The link preview image, 1200×630.
  • favicon string | null optional — The browser tab icon, SVG or PNG.
  • faviconDark string | null optional — The tab icon for dark browser themes.
  • appleTouchIcon string | null optional — The home screen icon on iOS, a 180×180 PNG.
pagesobject[]Pages by path, each with only the settings to change. null clears a value.
  • path string — The page, e.g. "/about"; a CMS detail page as "/blog/:slug".
  • title string | null optional — The page's title; null inherits the site's. A CMS detail page takes variables: {{Title}}.
  • description string | null optional — The page's description; null inherits the site's.
  • socialImage string | null | string optional — The page's link preview image; null inherits the site's. A CMS detail page may use var(--variable-<id>).
  • noIndex boolean optional — Hide the page from search engines.
  • noIndexSite boolean optional — Hide the page from the site's own search; follows noIndex unless given.
  • layoutTemplate string | null optional — "default" (the home page's template), a layout template id from site_settings_get, or null for none.
  • draft boolean optional — A draft page is left out when the site is published.

layout_audit

Reads Plugin

Audit the layout

Checks a page (or one node and its children) for classes of layout defects that look broken on the published site, and returns each with the node and the fix: children of a stack lined up on different edges, cards of uneven height in grids and rows, text links in Framer's default link color, sections whose content width does not match the others, fixed widths and heights that break on narrower screens, what a tablet or phone breakpoint kept from desktop (grids with too many columns, columns side by side, wide side padding, display sizes without a phone size), gap ignored by space-between, nested corners that are not concentric, missing or skipped headings, uneven section spacing, and template habits (uppercase labels over every heading, numbered cards, a text-only page, Inter everywhere, headlines without balance). Run it after building a section and before calling a page done; fix every defect, then the likely ones. design_apply already returns the same findings for what it touched in audit.

ParameterTypeWhat
pagePathstringPage to audit, e.g. "/" or "/about". default "/"
nodeIdstringAudit only this node and its children; omit for the whole page with its breakpoints.

breakpoints_add

Changes Plugin

Add breakpoints

Adds breakpoints to a page (Tablet 810 and Phone 390 are the usual pair; a width the page has is left alone) and returns all of its breakpoints with ids. Each is a copy of the primary breakpoint: build and delete layers in the primary only, then adapt a breakpoint by overriding its copies with design_apply xml, by compound id <breakpoint id><node id>, e.g. <FrameNode id="<tablet id><grid id>" gridColumnCount="2" />. Works without a Server API key. Add breakpoints before giving text styles their breakpoint sizes: the sizes follow the site's breakpoints.

ParameterTypeWhat
pagePathstringPage to add them to, e.g. "/". default "/"
breakpointsobject[]E.g. [{ "name": "Tablet", "width": 810 }, { "name": "Phone", "width": 390 }]. required
  • name string — Shown on the frame, e.g. "Tablet" or "Phone".
  • width number — Window width in px where the breakpoint starts, e.g. 810 for tablets and 390 for phones.

breakpoints_suggest

Reads Plugin

Suggest breakpoints

Lists the breakpoints Framer suggests for a web page that it does not have yet (usually Tablet 810 and Phone 390), with their widths: check before breakpoints_add.

ParameterTypeWhat
pagePathstringThe web page, e.g. "/about". default "/"

node_screenshot

Reads Server API key

Screenshot a node

Renders a node (breakpoint, section, component variant) to PNG so you can verify the visual result. Needs the project's Server API key. Images longer than 2000 px on a side are refused: capture a region with clip, or use scale 0.5.

ParameterTypeWhat
nodeIdstringNode id from nodes_read or design_apply renamedIds. required
scale0.5 | 1 | 2Pixel density. default 1
clipobjectRegion of the node to capture, in CSS pixels before scale.
  • x number
  • y number
  • width number
  • height number

image_compare

Reads Server API key

Compare a node with a reference image

Captures a node like node_screenshot and compares it with a reference PNG (a Figma export, by absolute path or https URL): the y of every horizontal line or edge and the x of every vertical one, paired between the two. The answer lists edges that match, edges off by a few px (where each is, and by how much the node's is off: positive is lower or further right), edges of the reference the node lacks, and edges only the node has. Export the reference at the same scale and size as the capture (clip and scale work as in node_screenshot). Needs the project's Server API key.

ParameterTypeWhat
nodeIdstringNode id from nodes_read or design_apply renamedIds. required
scale0.5 | 1 | 2Pixel density. default 1
clipobjectRegion of the node to capture, in CSS pixels before scale.
  • x number
  • y number
  • width number
  • height number
referencestringThe reference image, a PNG: an absolute path on this computer (a Figma export) or an https URL. Export it at the same scale as `scale`, so both images have the same size. required

reference_screenshot

Reads Server API key

Screenshot a web page

Screenshots any public web page in Framer's browser: a reference site the user likes, a competitor's, or the published site (its URL is in publish_preview or publish_status). Use it to study a reference's layout, spacing, type and rhythm before designing, or to check the live site after a publish. The capture is the whole page at the window width given (390 for a phone, 810 for a tablet, default 1200), light or dark. A page longer than 2000 px comes scaled down to fit (a tall page gets narrow), and the text gives the full size and the full-size image's URL to open in a browser. Local, private and login-only pages cannot be captured: ask the user for a screenshot instead. Needs the project's Server API key. Returns the image and a line with its sizes and URL.

ParameterTypeWhat
urlstringA public http(s) page, e.g. "https://example.com/pricing". required
widthnumberBrowser width in px: 390 for a phone, 810 for a tablet. Default 1200.
heightnumberBrowser height in px, which sizes 100vh sections; the capture is the whole page anyway. Default 1080, 844 below 600 wide.
theme"light" | "dark"The color scheme the page is opened in. default "light"

redirects_list

Reads Plugin

List redirects

Lists the site's redirects: from which path, to which path or URL, and for every locale or not.

No parameters.

redirects_set

Destructive Plugin

Change redirects

Adds redirects (a from path that has one already changes it) and removes them by their from path. Redirects need a paid Framer plan. Undo does not restore redirects yet: the changed and removed ones are in the result.

ParameterTypeWhat
setobject[]Redirects to add; one whose from already has a redirect changes it. default []
  • from string — The old path, e.g. "/old-blog/*" or "/pricing-2024".
  • to string — Where it goes: a path like "/blog" or a full URL.
  • allLocales boolean optional — Also for every locale's version of the path.
removestring[]Redirects to remove, by their from path. default []

Checks before handover 10

What looks fine in the editor and still fails on the published site: search titles and descriptions, broken links and anchors, the same photo twice, missing alt text, text that does not stand out from its background, copy left over from a template, and the published site itself.

site_audit

Reads Server API key

Audit the whole site

Runs seo_audit, links_check, images_check, a11y_audit and (unless layout is false) layout_audit on every page in one call, and rolls them up: per check the defects, likely and taste findings and the three pages with the most, the rules hit most often, and every defect in full. The overview before handover; run a check on its own for its likely and taste findings. Needs the project's Server API key.

ParameterTypeWhat
layoutbooleanAlso run layout_audit on every page (slower on big sites). default true

seo_audit

Reads Plugin · more with a key

Check SEO

Checks what search engines and link previews get, page by page: a title of 30–60 characters and a description of 70–160 on every page (a page inherits the site's), no title used twice, exactly one h1, no page hidden from search but the 404, alt text on photos, and a social image and favicon for the site. Run it before handing a site over or listing a template. With a Server API key it reads every page's metadata; without one it checks the headings only and says so in note.

ParameterTypeWhat
pagePathstringOne page; omit for every web page.

images_check

Reads Plugin · more with a key

Check photos

Lists every photo on the site (image fills and image controls of component instances) and finds the same photo used on more than one layer, by its file, even at different sizes, so two cards never show the same people, and photo fills without alt text (with a Server API key, which reads altText). Use it after placing photos.

ParameterTypeWhat
pagePathstringOne page; omit for every web page.

a11y_audit

Reads Plugin

Check accessibility

Finds text that does not stand out from the solid color behind it (WCAG AA: 4.5:1, 3:1 for text of 24px and more), with tokens and text style colors resolved; links with no text inside for a screen reader; and photos without alt text. Text over photos and gradients is left out: no single color is behind it. Fix every low-contrast defect: change the text token, not the brand color.

ParameterTypeWhat
pagePathstringOne page; omit for every web page.

rich_text_audit

Reads Server API key

Audit inline text formatting

Finds text formatted outside the design system, down to the runs inside a rich text: type set inline (font, size, weight, tracking, line height) instead of through a text style, and text colored with a raw value instead of a token. Each finding names the layer and the fix. Needs the project's Server API key.

ParameterTypeWhat
pagePathstringOne page; omit for every web page.

performance_audit

Reads Plugin

Audit page weight

Measures each page's weight in the editor: layers on the main breakpoint, the deepest nesting and the photos; flags pages over 1,500 layers and layers nested more than 15 deep, with how to flatten them. For what visitors download (page size, broken images), use live_check on the published site.

ParameterTypeWhat
pagePathstringOne page; omit for every web page.

contrast_check

Reads Plugin

Check a color pair

Gives the WCAG contrast of a text color on a background — CSS colors or the project's tokens by path ("Text/Primary") — with AA, AA-large and AAA verdicts. Check every text/background pair of a palette before proposing it (white on a mid orange usually fails).

ParameterTypeWhat
foregroundstringText color: a CSS color ("#ffffff") or a token by path or id ("Text/Primary"). required
backgroundstringBackground color, the same way. required

template_audit

Reads Plugin · more with a key

Audit a Marketplace template

Audits a Marketplace template against Framer's template checklist, section by section, each finding with a severity and a fix: cms (posts, cases, team and testimonials in CMS collections rather than copied by hand; no empty collections, -copy slugs or default collection names), pages (a custom 404, every page on a layout template, legal pages when there is a form), responsive (Desktop, Tablet and Phone breakpoints, each adapted), layers (no "Frame 12"), text (no lorem ipsum or past copyright year, in pages and CMS), seo (titles, descriptions, favicon, social image, one h1, alt text), styles (text styles and color tokens, not written-out values), links, and copyright (no real companies' logos). manual lists what to check by hand. Run it before listing a template and fix every defect. Without a Server API key it skips layout templates, metadata, alt text, anchors and forms, and says so in note.

No parameters.

live_check

Reads Local

Check the published site

Reads the published site as visitors get it (the pages of its sitemap up to limit, each image and internal link once) and finds what the editor cannot show: values published as references, a literal var(--…) or {{…}} in text, alt text, titles or meta tags (a CMS field bound to alt text does this); images and internal links that answer 4xx/5xx; anchors without a target; a missing title, description, social image or canonical URL; other than one h1 at a screen width; heavy pages; http resources on an https page. Without url it checks the connected project's production site (staging when there is none) and says how many pages changed in the editor since that publish. Run it after a publish, before calling the work done. It only reads public URLs and never publishes.

ParameterTypeWhat
urlstringA published site to check, e.g. https://example.framer.app/ (any public site; its own sitemap is read). Omit for the connected project's site: production, else staging.
limitnumberMost pages to fetch: every top-level page first, then CMS pages taken evenly from each collection. default 20

Components and assets 13

Components and their controls, components from the Marketplace, icon sets, shaders, your own images, files and SVG.

components_read

Reads Server API key

Read components

Lists the project's components with their exact controls ($control__variant options, $control__<name> for each variable) before you place or change instances. Control names are the ones listed here, e.g. $control__showIcon; do not derive them from variable names. Code components are listed in codeComponents and Framer's own (Video, Google Maps, Embed, Slideshow, Carousel, Countdown, Cookie Banner, Search…) in framer: place any of them with +ComponentInstanceNode component="<id>", and pass its id in ids to read its controls first. Needs the project's Server API key (framer_status shows whether it is set).

ParameterTypeWhat
idsstring[]Component ids to read controls for. Omit for every canvas component of the project.

component_insert

Changes Plugin

Insert a component

Inserts a component by its module URL (framer.com/m/…): a free Marketplace component (marketplace_item gives its moduleUrl), or a URL the user copied from the Insert menu. design_apply cannot take a URL; Framer's own components (Video, YouTube, Google Maps, Embed, Slideshow, Carousel, Countdown…) it places by the ids components_read lists in framer. Then set its controls with design_apply ($control__…) or component_controls_set. Undo does not remove it.

ParameterTypeWhat
urlstringThe component's module URL, e.g. https://framer.com/m/Carousel-TC0BVf.js@NX0Ibe5BZmuZM0cYmZOE. required
parentIdstringLayer to put the instance into. Without it Framer puts it into the layer selected in the editor.
indexnumberPosition among parentId's children; last by default.

component_controls_set

Changes Plugin

Set component controls

Sets control values on a component instance, object controls included: a code component's arrows, dots or clipping, which design_apply refuses ("unsupported type object"). Names are the component's own ("Border"), as design_apply writes them ("border") or a variable id; an object merges with the instance's current value, so { arrows: { show: false } } keeps the other arrow settings. A border control takes "1px solid <color>" or, per side in CSS order, "0 0 1px 1px solid var(--token-<id>)", which design_apply cannot write (nodes_read shows such a border as one width). Simple controls (text, numbers, slots) still go through design_apply. Image URLs in image fields (image, images, photo, poster, logo… alone, in a list or in a list's entries) are uploaded first, since Framer keeps only uploaded images there: this is how a Marketplace carousel gets your photos ({ slides: [{ image: "<url>", caption: "…" }] }). The answer holds the controls as Framer kept them; notStored lists what it refused without an error (a transition object, a list of images): set those with design_apply $control__… or ask the user to set them in the editor. Undo does not restore controls set here.

ParameterTypeWhat
nodeIdstringThe component instance (ComponentInstanceNode) to set. required
controlsobjectControl values by the names the component declares (e.g. arrows, dots, Border) or by variable id. An object control merges with the instance's current value. A border control also takes "1px solid <color>" or, per side in CSS order, "0 0 1px 1px solid var(--token-<id>)". required

component_border_variable_add

Changes Server API key

Add a border variable to a component

Adds a border-type variable to a project component, which design_apply cannot create: the control its instances set their border with, per side too. The default is "1px solid <color>" or per side in CSS order "0 0 1px 0 solid <color>"; the color may be var(--token-<id>). Bind it with design_apply: SET <variant frame id> <bind from the answer>. The next call opens a fresh Server API session, so the DSL sees the new variable. Then set instances with component_controls_set or $control__<name>. Undo does not remove the variable. Needs the project's Server API key.

ParameterTypeWhat
componentIdstringThe component (ComponentNode) to add it to, from components_read. required
namestringThe control's name in the panel and on instances, e.g. "Border". required
defaultstringIts default: "1px solid <color>", or per side in CSS order "0 0 1px 0 solid <color>"; the color may be var(--token-<id>). default "1px solid rgb(0, 0, 0)"

component_make_local

Changes Server API key

Make a component local

Copies an external component (from the Marketplace or a shared library) into the project and points the instance at the copy, so you can restyle it with the site's color tokens and text styles. Choose it over component_controls_set when the controls cannot reach the colors or type you need. A component designed in Framer becomes a project component: edit its layers with design_apply. A code component becomes a code file of the project (codeFile in the answer): edit it with code_file_read and code_file_write; Framer refuses to copy some code components. Without replaceAll, Framer first answers status needs_confirmation and changes nothing: ask the user whether only this instance or every instance should use the copy, then call again with replaceAll false or true. To edit one placement as plain layers, call component_detach afterwards. Undo does not take it back. Needs the project's Server API key (framer_status shows whether it is set).

ParameterTypeWhat
nodeIdstringThe instance of an external component (ComponentInstanceNode) to make local, from nodes_read. required
replaceAllbooleanThe user's choice after a needs_confirmation answer: true points every instance of the component at the local copy, false only this one. Leave it out on the first call.

component_detach

Destructive Server API key

Detach an instance

Replaces a component instance with its layers, like Detach in the editor, and returns the id of the new root layer (nodeId); the root keeps the instance's place and size in its parent. Choose it for a one-off edit of a single placement: the layers stop following the component, so later changes to the component skip them. To restyle every placement, edit the component instead. It works on an instance of a project component designed in Framer: make a Marketplace or shared-library instance local first with component_make_local. A code component has no layers to detach. Undo does not bring the instance back. Needs the project's Server API key (framer_status shows whether it is set).

ParameterTypeWhat
nodeIdstringThe instance of a project component (ComponentInstanceNode) to replace with its layers. required

component_instances

Reads Plugin

Find a component's instances

Lists every instance of one component across the site's pages (or one page), each with its id, name and page: what a change to the component reaches, or which placements to tune with component_controls_set. Pass the component's id from components_read or its name ("Content/Card").

ParameterTypeWhat
componentstringThe component's id (components_read lists it) or its name, e.g. "Content/Card". required
pagePathstringOne page; omit to look through every web page.

marketplace_item

Changes Plugin · more with a key

Look at Marketplace items

Reads Marketplace item pages — links the user gives you ("add this one, does it suit us?") — and returns what each is: the author's description, author, price (null = free), preview, categories, when it was last updated, and for a free component the moduleUrl for component_insert. With inspect true, each free component is inserted on a temporary page, its controls are read with their defaults, types and the tool that writes each, and the page is deleted again. Judge the fit from that before inserting it: does it take your own content (a slot takes ids of layers on the page; a list of images or of { image, … } entries takes image URLs through component_controls_set, which uploads them), does it size to its container or measure its first slide once (then one instance per breakpoint width), can its colors and type match the tokens, does it use a tween (set a spring with component_controls_set), was it updated recently. Open previewUrl with your browser tools to see it move.

ParameterTypeWhat
linksstring[]Marketplace item pages: links the user gave (https://www.framer.com/marketplace/components/<slug>/), or component slugs. required
inspectbooleanInsert each free component on a temporary design page, read its controls and defaults, then delete the page. default false

shaders_read

Reads Server API key

List shaders

Lists Framer's shaders, animated backgrounds placed as a ShaderNode (liquid-gradient, mesh, wave-gradient, fluted-glass over a photo, particles…): which the site uses (onSite) and which it may add. Pass names to read their controls (colors up to 8, speed, scale, seed…) before placing one: <ShaderNode shader="<name>" $control__colors.0="var(--token-<id>)" …/> in an absolute Background frame pinned to all sides, with a shade above it for text. Tint it with the palette's base and ink tones and one second hue, never the action accent; a token follows dark mode. One shader per page. Needs the project's Server API key.

ParameterTypeWhat
namesstring[]Shader names to read the controls of; omit to list every shader.

image_upload

Changes Plugin

Upload an image

Uploads an image to the project's assets and returns its url, for a fill, a logo or a favicon. Pass exactly one of: url (https), path (absolute path to a local png, jpg, gif, webp, avif or svg), or svg (SVG markup: own icons, logos and illustrations drawn as vectors).

ParameterTypeWhat
urlstring
pathstring
svgstring
namestring
altTextstring

file_upload

Changes Plugin

Upload a file

Puts a file that is not an image into the project's assets — a video for a code component's File control, a PDF, a font — and returns its url. Pass exactly one of: url (https, Framer downloads it) or path (absolute path to a local mp4, m4v, mov, webm, pdf, woff, woff2, ttf or otf). Images go through image_upload.

ParameterTypeWhat
urlstring
pathstring
namestring

svg_add

Changes Plugin only

Add an SVG layer

Adds SVG markup as an editable vector layer — own icons, logos, illustrations — and returns the new layer's id (nodeIds). Without parentId Framer puts it into the layer selected in the editor; with it, it moves there. Its size cannot be set through the DSL: to reuse a logo or icon across the site, ask the user to add the layer to a project vector set (Vectors panel; the API cannot), then place it as an IconNode of that set. Works through the Sitewright plugin only.

ParameterTypeWhat
svgstringSVG markup with width, height and viewBox. required
namestring
parentIdstringLayer to put the vector into. Without it Framer puts it into the layer selected in the editor.
indexnumberPosition among parentId's children; last by default.

CMS 11

Collections and their fields; items by slug, with values by field name. Undo covers items, not yet collections, fields or the order of items.

cms_collections_list

Reads Plugin

List CMS collections

Lists the project's CMS collections with their fields (id, type, enum cases, the collection a reference points at, a List's nested fields) and item counts. A field binds on the canvas by its id: var(--variable-<id>). Collections a sync plugin manages are read-only here.

ParameterTypeWhat
collectionstringOne collection by name or id; omit for all of them.

cms_collection_create

Changes Plugin

Create a CMS collection

Creates a CMS collection with its fields. A string Title comes first, unless you pass a string field named Title or Name, which then goes first: Framer names items and builds their slugs from the first string field. Types: string, formattedText, number, boolean, date, link, image, file, color, enum (with cases), collectionReference and multiCollectionReference (with collection), array (a List: entries with nested fields, e.g. [{ "name": "Image", "type": "image" }] for a gallery). Framer gives an item written without them true for a boolean field and #09F for a color field: write those for every item. Undo does not restore CMS collections, fields or the order of items yet: the journal cannot take this back.

ParameterTypeWhat
namestringCollection name, e.g. Blog. required
fieldsobject[]Fields in order. A string Title comes first unless you pass a string field named Title or Name, which then goes first. default []
  • name string
  • type "string" | "formattedText" | "number" | "boolean" | "date" | "link" | "image" | "file" | "color" | "enum" | "collectionReference" | "multiCollectionReference" | "array"
  • cases string[] optional — enum: its options, in order.
  • collection string optional — collectionReference / multiCollectionReference: the collection it points at, by name or id.
  • allowedFileTypes string[] optional — file: extensions or media types, e.g. ["pdf"] or ["image/*"]; any file when omitted.
  • fields object[] optional — array (a List): the fields of each entry, in order, e.g. [{ "name": "Image", "type": "image" }] for a gallery.

cms_collection_delete

Destructive Server API key

Delete a CMS collection

Deletes a CMS collection with all its items and returns its fields and items. Only when the user asked for it, or for a collection you created yourself in this task. Needs a Server API key. Undo does not restore CMS collections, fields or the order of items yet: the journal cannot take this back.

ParameterTypeWhat
collectionstringCollection name or id. required

cms_fields_set

Destructive Plugin

Change CMS fields

Adds, renames, removes and orders a collection's fields; update also adds, renames, removes and orders an enum's cases. A rename keeps every item's value and the layers bound to the field. Removing a field drops its value in every item: do it only when the user asked. Before a removal it searches every page for layers bound to the field (with a Server API key) and refuses while there are any, naming the pages: rebind them first, or pass force: true, and those layers show Framer's placeholder "Content". A new boolean field is true and a new color field #09F in every item until written. Undo does not restore CMS collections, fields or the order of items yet: the journal cannot take this back.

ParameterTypeWhat
collectionstringCollection name or id. required
addobject[]Fields to add; one that exists with the same name and type is left alone. default []
  • name string
  • type "string" | "formattedText" | "number" | "boolean" | "date" | "link" | "image" | "file" | "color" | "enum" | "collectionReference" | "multiCollectionReference" | "array"
  • cases string[] optional — enum: its options, in order.
  • collection string optional — collectionReference / multiCollectionReference: the collection it points at, by name or id.
  • allowedFileTypes string[] optional — file: extensions or media types, e.g. ["pdf"] or ["image/*"]; any file when omitted.
  • fields object[] optional — array (a List): the fields of each entry, in order, e.g. [{ "name": "Image", "type": "image" }] for a gallery.
updateobject[]Changes to fields that exist: a new name, enum cases added, renamed, removed or ordered. default []
  • field string — The field's name or id.
  • name string optional — Its new name; items keep their values and layers their binding.
  • addCases string[] optional — enum: cases to add at the end; one it has already is left alone.
  • renameCases object optional — enum: new names by current name, e.g. { "Field note": "Field Note" }; items keep the case.
  • removeCases string[] optional — enum: cases to remove; items set to one take the first case.
  • caseOrder string[] optional — enum: case names in the order they should come first; the rest keep their order after them.
removestring[]Field names to remove, with their values in every item. default []
forcebooleanRemove fields even when layers on the canvas are bound to them. default false
orderstring[]Field names (after renames) in the order they should come first; the rest keep their order after them. default []

cms_items_list

Reads Plugin

List CMS items

Lists a collection's items, a page at a time, with their id, slug and values by field name, Lists in full. A collection list on the canvas filters by a reference with the referenced item's id; a slug there matches nothing. Values: text and formattedText as strings (markdown or HTML), numbers, true/false, dates as ISO strings, link, file and color as strings, an image as its URL or { "url", "alt" } (a bare URL clears the alt), an enum by its case name, a reference by the referenced item's slug (a list of slugs for multi-references), a List (array) as a list of entries, each an object by its nested fields' names (a gallery also as a list of image URLs); a List value replaces the whole list, and a nested field an entry leaves out takes Framer's default (0, #09F); null clears a value.

ParameterTypeWhat
collectionstringCollection name or id. required
offsetnumber default 0
limitnumber default 50

cms_items_upsert

Changes Plugin

Write CMS items

Creates or updates items by slug, with values by field name, and answers each item's id and the slug Framer kept (lower case with hyphens); the journal can undo it. Values: text and formattedText as strings (markdown or HTML), numbers, true/false, dates as ISO strings, link, file and color as strings, an image as its URL or { "url", "alt" } (a bare URL clears the alt), an enum by its case name, a reference by the referenced item's slug (a list of slugs for multi-references), a List (array) as a list of entries, each an object by its nested fields' names (a gallery also as a list of image URLs); a List value replaces the whole list, and a nested field an entry leaves out takes Framer's default (0, #09F); null clears a value.

ParameterTypeWhat
collectionstringCollection name or id. required
itemsobject[] required
  • slug string — The item's slug: an item with it is updated, else one is created. Framer keeps slugs lower case with hyphens ("My Post!" as my-post), and items are matched that way.
  • draft boolean optional
  • values object optional — Field values by field name; fields left out keep their value.

cms_items_delete

Destructive Plugin

Delete CMS items

Deletes items by slug; the journal can undo it, and their values come back in the result too. Delete only items you created or the user asked to remove.

ParameterTypeWhat
collectionstringCollection name or id. required
slugsstring[] required

cms_items_order

Changes Plugin

Order CMS items

Moves items to the top of a collection in the given order; the rest keep their order after them.

ParameterTypeWhat
collectionstringCollection name or id. required
slugsstring[]Slugs in the order they should come first; the other items keep their order after them. required

cms_seo_collection

Changes Server API key

Make a blog collection ready for search

Creates a CMS collection with the fields a ranking blog needs (Title, Excerpt, Content, Image and its alt text, Meta Title, Meta Description, Target Keyword, Category, Tags, Published, Author, and Related posts pointing at the collection itself), or adds the missing ones to an existing collection. Then bind them on the list and post pages, and run cms_interlink once posts are in. Needs the project's Server API key.

ParameterTypeWhat
namestringThe collection; an existing one gets the fields it lacks. default "Blog"
categoriesstring[]The Category options. default ["Guides","News","Case studies"]

blog_add

Changes Server API key

Add a blog

Sets up a blog: a search-ready collection (cms_seo_collection), the list page (/blog by default) and the post page for each item (/blog/:Blog). The pages are left empty for you to build in the site's own styles; the answer says how. Needs the project's Server API key.

ParameterTypeWhat
collectionstring default "Blog"
pathstringThe list page; posts live under it. default "/blog"

Localization 4

New locales, what still needs translating, and the translations, one locale at a time.

locales_list

Reads Plugin

List locales

Lists the site's locales (code, name, URL slug, fallback) and which one is the default. Add one with locale_add.

No parameters.

localization_get

Reads Server API key

Read translations

Lists translatable texts (pages, CMS items, components, site settings) with their default-locale text and the translation for one locale. missing: true lists only what still needs translating. Page through with offset.

ParameterTypeWhat
localestringLocale by code, name or id, e.g. "nl" or "Dutch". required
type"page" | "collection" | "collection-item" | "component" | "template" | "settings"Only pages, CMS items, components…
groupstringOnly the groups whose name contains this, e.g. a page path or a CMS item's title.
missingbooleanOnly texts without a translation, in groups not excluded from the locale. default false
offsetnumber default 0
limitnumber default 100

localization_set

Changes Server API key

Write translations

Writes translations for one locale by source id from localization_get (null clears one, so the fallback shows), and can mark groups ready or excluded for the locale. Keep the markup of formattedText sources (the HTML tags) and translate only the text. Undo does not restore translations yet: the previous values are in the result.

ParameterTypeWhat
localestringLocale by code, name or id, e.g. "nl" or "Dutch". required
translationsobject[] default []
  • id string — Source id from localization_get.
  • value string | null — The translation; null clears it, so the fallback shows.
needsReviewbooleanMark the translations for the user to review. default false
groupsobject[] default []
  • group string — Group name or id, e.g. a page or CMS item.
  • status "ready" | "excluded" — excluded keeps the group out of this locale.

locale_add

Changes Server API key

Add a locale

Adds a locale to the site: a language ("nl" or "Dutch"), optionally for a region ("nl-BE", or region "BE"). A wrong language returns the languages Framer knows, a wrong region the language's regions. It is a draft by default: a draft locale stays off the published site until the user turns it on, so translate first with localization_get and localization_set. fallback names the site locale shown where a translation is missing; slug and name default to ones from the code. Needs the project's Server API key (Framer's createLocale is alpha and Server API only). Returns the locale's id, code, name, URL slug, draft and fallback. Undo does not remove a locale: the user removes it in the editor.

ParameterTypeWhat
languagestringLanguage by code or English name, e.g. "nl" or "Dutch"; "nl-BE" also gives the region. required
regionstringRegion by code or name for a regional variant, e.g. "BE" or "Belgium" for nl-BE.
fallbackstringThe site locale shown where a translation is missing, by code or name. Default: Framer's.
slugstringURL segment, e.g. "nl". Default: from the code.
namestringName in the editor, e.g. "Nederlands". Default: from the code.
draftbooleanA draft locale stays off the published site until the user turns it on. default true

Code (opt-in) 11

Custom HTML and code components. The agent uses them only when you ask for code or the canvas cannot do the task, and the writes work only while you allow them.

custom_code_get

Reads Plugin

Read custom code

Shows the site's custom HTML in each location (head start and end, body start and end).

No parameters.

custom_code_set

Destructive Plugin

Set custom code

Sets the site's custom HTML for one location on every page (analytics, verification tags, fonts); html null removes it. Use when the user asks for code, or when the canvas (design_apply), Framer's own components and Marketplace components cannot give what the task needs: a value or state the canvas has no node for (computed, from an API, random, shared by several components), input read every frame (cursor, drag, frames stepped by scroll), or a fix a component's controls cannot make. Name which one to the user before writing code. Works only while the user has Custom code switched on in the plugin.

ParameterTypeWhat
location"headStart" | "headEnd" | "bodyStart" | "bodyEnd" required
htmlstring | nullThe HTML for this location on every page; null removes it. required

code_files_list

Reads Plugin

List code files

Lists the project's code files with their exports (code components and overrides).

No parameters.

code_file_read

Reads Plugin

Read a code file

Returns a code file's source.

ParameterTypeWhat
namestringFile name or path, e.g. Ticker.tsx. required

code_files_read

Reads Plugin

Read several code files

Returns the source of up to 25 code files in one call; names not found are listed in missing.

ParameterTypeWhat
namesstring[]File names or paths. required

code_file_patch

Destructive Plugin

Edit part of a code file

Changes a code file by find-and-replace edits, in order, so only the changed snippets travel: each find must be in the file exactly once (or pass all), or nothing changes. Returns the TypeScript problems of the new version. Use when the user asks for code, or when the canvas (design_apply), Framer's own components and Marketplace components cannot give what the task needs: a value or state the canvas has no node for (computed, from an API, random, shared by several components), input read every frame (cursor, drag, frames stepped by scroll), or a fix a component's controls cannot make. Name which one to the user before writing code. Works only while the user has Code components switched on in the plugin.

ParameterTypeWhat
namestringFile name or path. required
editsobject[] required
  • find string — Text in the file, exactly, with enough around it to be found once.
  • replace string
  • all boolean optional — Replace every occurrence instead of exactly one.

code_file_rename

Changes Plugin

Rename a code file

Renames a code file. Its components and overrides keep working on the canvas. Works only while the user has Code components switched on in the plugin.

ParameterTypeWhat
namestringFile name or path. required
newNamestringThe new name, e.g. Marquee.tsx. required

code_file_check

Reads Plugin

Check a code file

Returns a code file's problems as Framer compiles it: TypeScript errors with line and column (and lint warnings while Framer still reports them). Run it after writing code, before telling the user it works.

ParameterTypeWhat
namestringFile name or path. required

theme_toggle_add

Changes Plugin

Add a light and dark switch

Writes a code override that switches the site between its color tokens' light and dark values when clicked, starting from the visitor's last choice or system theme and remembering it, and attaches it to the layer you give (a button or an icon). Framer has no theme switch of its own. Tokens without a dark value stay as they are. Works only while the user has Code components switched on in the plugin.

ParameterTypeWhat
nodeIdstringThe button or icon that switches the theme; omit to only write the override.
pagePathstring default "/"
fileNamestring default "ThemeToggle.tsx"

code_file_write

Destructive Plugin

Write a code file

Creates or replaces a code file: a React code component or a code override for Framer. The replaced version is not returned (only its size): read it with code_file_read first when you may need it back. Use when the user asks for code, or when the canvas (design_apply), Framer's own components and Marketplace components cannot give what the task needs: a value or state the canvas has no node for (computed, from an API, random, shared by several components), input read every frame (cursor, drag, frames stepped by scroll), or a fix a component's controls cannot make. Name which one to the user before writing code. Works only while the user has Code components switched on in the plugin.

ParameterTypeWhat
namestringFile name, e.g. Ticker.tsx; an existing file with this name or path is replaced. required
codestringThe whole file: a React component or override module for Framer. required

code_file_delete

Destructive Plugin

Delete a code file

Deletes a code file and returns its source. Undo does not bring it back: delete only files you created yourself (a temporary probe) or the user asked to remove. Works only while the user has Code components switched on in the plugin.

ParameterTypeWhat
namestringFile name or path, e.g. Ticker.tsx. required

Journal 7

What the agent did, undo and redo, checkpoints and restoring to one.

activity_list

Reads Local

Activity journal

Lists what the AI did in this Framer project, newest first: every tool call, undo, redo, restore, checkpoint and skill used, with a human title, the layer it ran through (plugin-api, server-api, framer-agent) and whether it can be undone. show picks changes with the skills (default), reads, skills, or all.

ParameterTypeWhat
limitnumber default 20
show"all" | "changes" | "cms" | "reads" | "skills" default "changes"

activity_get

Reads Local

Activity entry

One journal entry in full, including its undo steps (the state before and after each change).

ParameterTypeWhat
idstring required

activity_checkpoint

Changes Local

Mark a checkpoint

Marks a point in the activity journal (call it when you start a new user task). activity_restore can later roll the project back to it.

ParameterTypeWhat
labelstring required

activity_undo

Destructive Plugin

Undo an AI change

Undoes the newest AI change still in effect, or the entry given by entryId; andLater also undoes every change made after that entry, bringing the project back to how it was before it. Items someone changed after the AI are reported as conflicts and kept unless onConflict is force; an undo that kept every item changes nothing, so the entry can be undone again with force. Color tokens, text styles and design_apply edits undo exactly; deleted nodes come back with new ids (results[].newId). Undoing DSL edits needs the Server API.

ParameterTypeWhat
entryIdstring
andLaterbooleanAlso undo every change made after entryId. default false
dryRunbooleanOnly report what would happen. default false
onConflict"skip" | "force"skip keeps items someone changed after the AI; force overwrites them. default "skip"

activity_redo

Destructive Plugin

Redo an undone change

Reapplies the newest undo or restore still in effect, or the one given by entryId.

ParameterTypeWhat
entryIdstring
dryRunbooleanOnly report what would happen. default false
onConflict"skip" | "force"skip keeps items someone changed after the AI; force overwrites them. default "skip"

activity_restore

Destructive Plugin

Restore to a checkpoint

Brings the project back to how it was at a checkpoint: undoes the changes made after it and redoes undos of older changes made since. Runs as a dry run unless dryRun is false, so check the preview first.

ParameterTypeWhat
checkpointIdstring required
dryRunbooleanPreview only (default). Set false to restore. default true
onConflict"skip" | "force"skip keeps items someone changed after the AI; force overwrites them. default "skip"

activity_open

Reads Local

Open the activity journal

Returns the link to the local app in the browser: the activity journal with everything the AI did in the project, undo, redo and checkpoints, the settings (custom code, code components, plugin first), and the window that connects the Framer plugin. Give the link to the user.

No parameters.

Knowledge 3

How Framer behaves, from live builds (no design advice), and Framer's own DSL reference and guides.

framer_guide

Reads Local

Framer guide

How to build in Framer, from live builds: what Framer does without saying so, how layout and motion work, and how to check the result. It gives no design advice: the design is the user's. Read "dsl" before the first design_apply of a session, then the topic for the task. Topics: dsl (what Framer does without saying so: batches, breakpoints, text styles, components and clicks, menus, forms, overlays, CMS lists, which springs it keeps, metadata, assets, Marketplace components); layout (how stacks, sizes, equal heights, grids, containers, breakpoints, sticky and overflow, images and links behave in Framer); motion (listing the states of anything that moves or responds, which transitions Framer keeps, how to build effects, pinned scroll sections, scroll headers, horizontal galleries, page transitions, tabs, links on components); verify (the audit, looking at the result, going through every state in a real browser, the checks that it works, and what to tell the user at handover); template (a site for the Framer Marketplace: Framer's template checklist, what buyers edit, and the listing); no-key (what works through the plugin without a Server API key, and how to get the rest anyway).

ParameterTypeWhat
topic"dsl" | "layout" | "motion" | "verify" | "template" | "no-key"Which part of the guide to read. default "dsl"

framer_docs

Reads Server API key

Framer DSL reference

Framer's official agent reference for its DSL (commands, attributes, layout, CMS, variables, forms, effects), read live from Framer so it matches its current version. Start with section "essentials": its guardrails, core principles, command syntax with computed values and critical reminders in one read (continue with nextOffset). No arguments lists sections; pass section to read one, or query to search. guide reads one of Framer's implementation guides (FAQ, Navigations, Buttons, Effects, Overlays, Forms, Grids…): read the one for what you build before building it, they hold the recipes the reference lacks (e.g. how an accordion animates). Needs the project's Server API key (framer_status shows whether it is set).

ParameterTypeWhat
sectionstring"essentials" for the core of the reference in one read, or a section id or title, e.g. "Variables".
querystringFull-text search across the reference.
guidestringOne of Framer's implementation guides by name, e.g. "FAQ", "Navigations", "Buttons", "Effects", "Overlays", "Forms": its recipe with example nodes.
offsetnumberContinue a long section from nextOffset. default 0
limitnumberMaximum characters of content to return. default 20000

framer_read

Reads Server API key

Query Framer's agent

Runs Framer's own readProject queries (font-search, component-definition, icon-set-definition, shader-definition, implementation guides…) and returns their answer as is: for what the other tools do not read. framer_docs section "essentials" lists the query types. Needs the project's Server API key.

ParameterTypeWhat
queriesobject[]readProject queries as framer_docs section "essentials" lists them, e.g. { type: "font-search", query: "Inter" }. required
  • type string
pagePathstring