Efecto Design Tool

Design Tool

Tool Reference

Complete reference for all 64 MCP tools available in the Efecto Design Tool. Each tool can be called via MCP or the REST API.

Quick start

Install Efecto skills + MCP tools:
npx skills add pablostanley/efecto-plugin

Data Model

Efecto documents are built from artboards and nodes. The document is serialized as JSX-like markup where each element has a data-id attribute.

Node Types

TypeDescription
frameContainer element (div)
textText element (p, h1-h6, span)
imageImage element
buttonButton with variant support
linkAnchor link
iconIcon element
inputForm input
videoVideo element
componentReusable component instance
shaderWebGL shader (generative backgrounds)

Styling

All styling uses Tailwind CSS via the className property. You can also use style for inline CSS when needed (especially for dynamic colors).

Tailwind v4 runtime note

Dynamic arbitrary values like bg-[#f9f9f9] may not work at runtime because Tailwind 4 generates CSS at build time. For dynamic hex colors, use the style property or the set_fill tool.

Text Styling

Text nodes support full typography controls via Tailwind classes in className:

PropertyClasses
Italicitalic / not-italic
Underlineunderline / no-underline
Strikethroughline-through / no-underline
Text transformuppercase / lowercase / capitalize / normal-case
Line heightleading-none, leading-tight, leading-snug, leading-normal, leading-relaxed, leading-loose, leading-[0.85]

Text Shadow

Text shadow is applied via inline style (not Tailwind classes). Use update_node with a style object. Frame/container nodes use Tailwind shadow-* classes for box-shadow instead.

javascript
// Add text shadow to a heading
update_node({
  nodeId: "node-abc123",
  style: { textShadow: "0px 1px 2px rgba(0,0,0,0.2)" }
})

// Presets (matching Tailwind 4 theme tokens):
// 2xs: "0px 1px 0px rgb(0 0 0 / 0.15)"
// xs:  "0px 1px 1px rgb(0 0 0 / 0.2)"
// sm:  multi-layer shadow
// md:  multi-layer shadow
// lg:  multi-layer shadow

// Remove text shadow
update_node({
  nodeId: "node-abc123",
  style: { textShadow: "none" }
})

Artboard Sizes

DeviceWidthHeight
Desktop1440900
Tablet7681024
Mobile375812

Session Tools (4)

Manage the lifecycle of a design session. The MCP process tracks the active session so you don't need to pass the session ID to every tool.

create_session

Create a new session. Returns a URL the user opens in their browser. Once connected, all design tools execute in real-time. Only one session is active at a time.

ParameterTypeRequiredDescription
labelstringnoHuman-readable label (e.g. "Landing page design")
javascript
// Create a session
create_session({ label: "Landing page design" })
// → Returns { designUrl: "https://efecto.app/design?session=abc123" }
wait_for_connection

Blocks until the browser opens the design URL and pairs with the session. Call after create_session to ensure the browser is ready before executing tools.

ParameterTypeRequiredDescription
timeoutnumbernoMax wait time in ms (default: 120000)
session_status

Check if the browser is connected, pending calls, etc.

ParameterTypeRequiredDescription
sessionIdstringnoDefaults to active session
close_session

Close the active session. Disconnects the browser and cleans up.

ParameterTypeRequiredDescription
sessionIdstringnoDefaults to active session

Reading Tools (5)

Inspect the current document state. Always read the document before making edits.

get_document

Returns the full document as JSX-like markup. Each element has a data-id for referencing in other tools. Always call this before modifying an existing design.

get_selection

Returns the currently selected nodes with serialized JSX subtrees. Use to understand user context before making edits.

list_artboards

Lists all artboards with IDs, names, dimensions, and positions.

find_nodes

Search for nodes by name, text content, type, tag, className, exact class, or inline style.

ParameterTypeRequiredDescription
querystringnoSearch term (matches name and text, case-insensitive)
typestringnoframe | text | image | button | link | icon | input | video | component
tagstringnoFilter by HTML tag (e.g. "nav", "section", "h1")
classNameContainsstringnoSubstring match in className (case-insensitive)
hasClassstringnoExact Tailwind class match (e.g. "flex", "bg-white")
styleContainsstringnoSubstring match in inline style (e.g. "gradient")
get_node_tree

Returns JSX for a specific node or artboard subtree (faster than get_document for one section).

ParameterTypeRequiredDescription
nodeIdstringyesID of the node or artboard to serialize

Creating Tools (4)

Add new content to the document. Use add_section for complex layouts and add_node for single elements.

create_artboard

Creates a new artboard. Set className to "flex flex-col" for vertical layout.

ParameterTypeRequiredDescription
namestringyesName of the artboard
widthnumberyesWidth in CSS pixels (default: 1440)
heightnumberyesHeight in CSS pixels (default: 900)
xnumbernoHorizontal position on canvas
ynumbernoVertical position on canvas
backgroundColorstringnoBackground color as hex (default: "#ffffff")
classNamestringnoTailwind CSS classes
javascript
create_artboard({
  name: "Desktop",
  width: 1440,
  height: 900,
  className: "flex flex-col",
  backgroundColor: "#ffffff"
})
add_section

Adds a complete section from JSX-like markup. Most efficient for complex layouts.

ParameterTypeRequiredDescription
parentIdstringyesID of the parent artboard or node
jsxstringyesJSX-like markup with HTML tags and Tailwind className
indexnumbernoInsert position (appends if omitted)
xnumbernoX position on canvas (for floating elements)
ynumbernoY position on canvas (for floating elements)
widthnumbernoWidth in pixels (for floating elements)
heightnumbernoHeight in pixels (for floating elements)
javascript
add_section({
  parentId: "artboard-1",
  jsx: `<section className="flex flex-col items-center justify-center py-24 px-8 bg-black text-white">
  <h1 className="text-6xl font-bold tracking-tight mb-4">Build faster</h1>
  <p className="text-xl text-gray-400 max-w-2xl text-center">Ship beautiful products with AI-powered design.</p>
  <div className="flex items-center gap-2 mt-8 px-8 py-3 bg-white text-black rounded-full font-medium">
    <span>Get Started</span>
    <svg icon="arrow-right" className="w-4 h-4" />
  </div>
</section>`
})

// Icons: use <svg icon="name" className="w-5 h-5" />
// Common: arrow-right, heart, check, star, envelope, user, gear
// Libraries: phosphor (default), lucide, heroicons, radix
// Weights: <svg icon="star" iconWeight="fill" />
add_node

Adds a single node to the document tree.

ParameterTypeRequiredDescription
parentIdstringyesID of the parent artboard or node
typestringyesframe | text | image | button | link | icon | input | video | component
tagstringnoHTML tag to render
classNamestringnoTailwind CSS classes
textContentstringnoText content
srcstringnoImage/video source URL
altstringnoAlt text for images
hrefstringnoLink URL
placeholderstringnoPlaceholder text (for input nodes)
variantstringnoprimary | secondary | outline | ghost | destructive
disabledbooleannoDisabled state for buttons/inputs
namestringnoLayer name (shown in layers panel)
indexnumbernoInsert position (appends if omitted)
styleobjectnoInline CSS styles
linkobjectnoLink config: { type: "url"|"page"|"section"|"email"|"phone", url?, pageId?, sectionId?, email?, phone?, target? }
elementIdstringnoElement ID for anchor linking (e.g. "pricing")
iconNamestringnoIcon name for type "icon" (e.g. "arrow-right", "ArrowRight")
iconLibrarystringnophosphor | lucide | heroicons | radix (default: phosphor)
iconWeightstringnoPhosphor: thin|light|regular|bold|fill|duotone. Heroicons: outline|solid|mini
iconSizenumbernoIcon size in pixels (default: 24)
shaderTypestringnomeshGradient | dotGrid | voronoi | liquidMetal | chrome | pulsar | blackHole | glass | spiral | particles | fireworks
shaderSettingsobjectnoShader-specific settings (speed, scale, colors, etc.)
replace_section

Replaces an existing node with new JSX content in-place. Preserves position in parent.

ParameterTypeRequiredDescription
nodeIdstringyesID of the node to replace
jsxstringyesJSX-like markup for the replacement

Modifying Tools (5)

Update existing nodes without replacing them entirely.

update_node

Updates properties of an existing node. Only specified properties are changed.

ParameterTypeRequiredDescription
nodeIdstringyesID of the node to update (from data-id)
classNamestringnoNew Tailwind classes
textContentstringnoNew text content
tagstringnoChange HTML tag
namestringnoLayer name (shown in layers panel)
styleobjectnoInline CSS styles
srcstringnoImage/video source
altstringnoAlt text for images
hrefstringnoLink URL
placeholderstringnoPlaceholder text (for input nodes)
variantstringnoprimary | secondary | outline | ghost | destructive
disabledbooleannoDisabled state for buttons/inputs
linkobjectnoLink config: { type: "url"|"page"|"section"|"email"|"phone", url?, pageId?, sectionId?, email?, phone?, target? }. Set to null to remove.
elementIdstringnoElement ID for anchor linking (e.g. "pricing"). Empty string to remove.
iconNamestringnoIcon name (for icon nodes)
iconLibrarystringnophosphor | lucide | heroicons | radix
iconWeightstringnoPhosphor: thin|light|regular|bold|fill|duotone. Heroicons: outline|solid|mini
iconSizenumbernoIcon size in pixels
javascript
update_node({
  nodeId: "node-abc123",
  textContent: "New heading text",
  className: "text-4xl font-bold text-white"
})
update_class

Updates only the className of a node. Replaces existing className entirely.

ParameterTypeRequiredDescription
nodeIdstringyesNode ID
classNamestringyesNew Tailwind classes (replaces all)
batch_update

Updates multiple nodes in a single call. Efficient for bulk changes.

ParameterTypeRequiredDescription
updatesarrayyesArray of { nodeId, className?, textContent?, style?, link?, elementId? }
javascript
batch_update({
  updates: [
    { nodeId: "node-1", textContent: "Updated" },
    { nodeId: "node-2", className: "text-red-500" },
    { nodeId: "node-3", link: { type: "url", url: "https://example.com" } },
  ]
})
update_artboard

Updates artboard properties (resize, rename, change background).

ParameterTypeRequiredDescription
artboardIdstringyesID of the artboard to update
namestringnoNew name
widthnumbernoNew width
heightnumbernoNew height
backgroundColorstringnoNew background color
classNamestringnoTailwind classes
set_fill

Sets the fill (background) of a node or artboard. Supports solid colors, gradients, and images. Handles dual-write automatically.

ParameterTypeRequiredDescription
targetIdstringyesID of the node or artboard
fillobjectnoFill config: { type: "solid"|"gradient"|"image", color?, gradient?, url? }. Omit to clear.

Organizing Tools (8)

Restructure the document tree — move, duplicate, group, and delete nodes.

move_node

Moves a node to a new parent or reorders within current parent.

ParameterTypeRequiredDescription
nodeIdstringyesNode to move
newParentIdstringyesNew parent node/artboard
indexnumbernoPosition in parent
duplicate_node

Duplicates a node and all its children. Inserted after the original.

ParameterTypeRequiredDescription
nodeIdstringyesNode to duplicate
duplicate_artboard

Duplicates an entire artboard with all content. Creates a deep copy with fresh IDs. Optionally resize the duplicate.

ParameterTypeRequiredDescription
artboardIdstringyesArtboard to duplicate
newNamestringnoName for the copy
offsetXnumbernoHorizontal offset from original
widthnumbernoOverride width of the duplicate (CSS pixels)
heightnumbernoOverride height of the duplicate (CSS pixels)
javascript
// Duplicate Desktop artboard as Mobile version
duplicate_artboard({
  artboardId: "artboard-1",
  newName: "Mobile",
  width: 375,
  height: 812
})
group_nodes

Groups selected nodes into a new frame container.

ParameterTypeRequiredDescription
nodeIdsstring[]yesNode IDs to group
ungroup_node

Ungroups a frame container, moving its children up to the parent.

ParameterTypeRequiredDescription
groupIdstringyesID of the group/frame to ungroup
reorder_node

Changes z-order: "front" = bring to top, "back" = send to bottom.

ParameterTypeRequiredDescription
nodeIdstringyesNode to reorder
positionstringyes"front" or "back"
delete_nodes

Deletes one or more nodes and all their children.

ParameterTypeRequiredDescription
nodeIdsstring[]yesArray of node IDs to delete
delete_artboard

Deletes an artboard and all its contents.

ParameterTypeRequiredDescription
artboardIdstringyesID of the artboard to delete

Canvas & Viewport (6)

Manage the document and viewport.

new_document

Creates a new blank document, replacing the current one. Discards unsaved changes.

ParameterTypeRequiredDescription
namestringnoName for the new document
rename_document

Renames the document.

ParameterTypeRequiredDescription
namestringyesNew name
undo

Undoes the last action (Cmd+Z).

redo

Redoes the last undone action (Cmd+Shift+Z).

zoom_to_fit

Zooms the viewport to fit all artboards. Useful after creating multiple artboards.

zoom_to_artboard

Zooms the viewport to fit a specific artboard.

ParameterTypeRequiredDescription
artboardIdstringyesID of the artboard to zoom to

Selection & Visibility (3)

select_nodes

Selects nodes on the canvas to highlight for the user. Empty array deselects all.

ParameterTypeRequiredDescription
nodeIdsstring[]yesNode IDs to select
deselect_all

Deselects all currently selected nodes.

set_visibility

Shows or hides a node. Hidden nodes remain in the tree but are not rendered.

ParameterTypeRequiredDescription
nodeIdstringyesNode ID
visiblebooleanyestrue to show, false to hide

Layout Tools (4)

Align, distribute, and position elements on the canvas.

align_nodes

Aligns multiple nodes along a shared axis.

ParameterTypeRequiredDescription
nodeIdsstring[]yesNode IDs to align (min 2)
alignmentstringyesleft | center | right | top | middle | bottom
distribute_nodes

Distributes nodes evenly with equal spacing.

ParameterTypeRequiredDescription
nodeIdsstring[]yesNode IDs to distribute (min 3)
directionstringyes"horizontal" or "vertical"
move_artboard

Repositions an artboard on the canvas. Use to lay out multi-screen flows (e.g. Desktop at 0,0, Tablet at 1540,0).

ParameterTypeRequiredDescription
artboardIdstringyesArtboard to move
xnumberyesNew X position
ynumberyesNew Y position
set_viewport

Sets the viewport zoom level and/or pan position. Zoom 1.0 = 100%.

ParameterTypeRequiredDescription
zoomnumbernoZoom level (0.1 to 5.0)
panXnumbernoHorizontal pan offset
panYnumbernoVertical pan offset

Export (1)

Export designs as images. You can also Open in v0 from the Efecto UI to export any design as React + Tailwind and continue editing in v0.app.

export_image

Exports an artboard or node as an image (PNG, JPEG, WebP, SVG). Returns base64 data URL. Use thumbnail: true for a small preview suitable for AI agents.

ParameterTypeRequiredDescription
artboardIdstringyesArtboard to export
nodeIdstringnoSpecific node to export
formatstringnopng | jpeg | webp | svg (default: png)
scalenumbernoScale multiplier 0.25-4 (default: 1). Ignored when thumbnail is true.
qualitynumbernoQuality 0-1 for JPEG/WebP (default: 0.92)
thumbnailbooleannoIf true, returns a small preview (~200px, JPEG, low quality). Ideal for AI agents.

Design Validation

Audit your design for quality issues. Checks typography scale, color contrast, spacing consistency, and detects common AI-generated design patterns ("slop").

audit_design

Audits the current design against professional quality rules: typography (scale, weight contrast, sizing), color (neutral consistency, pure black, known low-contrast combos), spacing (4pt grid, touch targets), and AI slop detection (monotonous layouts). Returns issues with severity (warning/info) and actionable suggestions.

ParameterTypeRequiredDescription
artboardIdstringnoAudit a specific artboard (audits all if omitted)
checksobjectnoWhich checks to run (all enabled by default): { typography?: boolean, color?: boolean, spacing?: boolean, slop?: boolean }
javascript
// Audit everything
audit_design()

// Audit one artboard, only typography and spacing
audit_design({
  artboardId: "artboard-1",
  checks: { typography: true, spacing: true, color: false, slop: false }
})
repair_design

Applies safe, deterministic fixes to common design issues: adds missing w-full on top-level sections, converts arbitrary Tailwind values to inline styles, replaces pure black with zinc-950, bumps small touch targets to 44px, adds placeholder images to empty image nodes, and fills empty text content. Run after audit_design to auto-fix warnings.

ParameterTypeRequiredDescription
artboardIdstringnoRepair a specific artboard (repairs all if omitted)
dryRunbooleannoPreview fixes without applying them (default: false)
javascript
// Auto-repair all artboards
repair_design()

// Preview fixes without applying
repair_design({ dryRun: true })

// Repair one artboard
repair_design({ artboardId: "artboard-1" })

Theme (4)

Manage the document's design system. Themes use CSS custom properties (color variables) that power semantic Tailwind classes like bg-primary, text-foreground, and bg-muted.

get_theme

Returns the current document theme including all modes and their tokens. Use this to understand the active design system before creating content.

javascript
get_theme()
// → { id, name, modes: { light: {...}, dark: {...} }, activeMode: "light", activeTokens: {...} }
set_theme

Sets the document theme. Three options: (1) presetId — apply a built-in preset, (2) css — import raw CSS with :root {} and .dark {} blocks containing --background, --primary, etc. variables, (3) modes — provide token objects directly per mode.

ParameterTypeRequiredDescription
presetIdstringnodefault | zinc | slate | rose | blue | green | violet | orange
cssstringnoRaw CSS with :root {} and .dark {} blocks containing theme variables
modesobjectnoToken objects per mode, e.g. { light: { background: "#fff", ... }, dark: { ... } }
javascript
// Apply a preset
set_theme({ presetId: "blue" })

// Import CSS from any source
set_theme({ css: ":root { --background: #ffffff; --primary: #2563eb; }\n.dark { --background: #0a0a0a; --primary: #60a5fa; }" })
set_theme_mode

Switches the active theme mode. All artboards update to show the new mode colors. Standard modes are "light" and "dark" but custom modes are supported too.

ParameterTypeRequiredDescription
modestringyesMode name (e.g. "light", "dark", or a custom mode name)
javascript
set_theme_mode({ mode: "dark" })
reset_theme

Removes the document theme entirely, returning to raw Tailwind colors with no semantic tokens.

Brand Kit (17)

Manage brand systems — AI-powered design systems with identity, colors, typography, components, and compliance. A brand system IS the theme: applying a brand sets the document's semantic tokens. See the Brand Kit guide for details.

get_brand_kit

Returns the active brand system for the current document, including brand identity (company name, tagline, values, voice), color palette (semantic tokens for light/dark modes), typography (heading/body/mono fonts + type scale), icon preferences, and AI directives. Returns null if no brand system is active. Always call this at the start of any design task.

javascript
get_brand_kit()
// → { identity: { companyName, tagline, ... }, colors: { light: {...}, dark: {...} }, typography: {...}, icons: {...}, aiGuidelines: "..." }
set_brand_kit

Apply an existing brand system to the current document by ID. Sets the document theme to the brand's colors and stores the brand reference.

ParameterTypeRequiredDescription
brandKitIdstringyesThe ID of the brand system to apply.
list_brand_kits

Lists all brand systems available to the user. Returns summaries with id, name, primary color, and company name.

create_brand_kit

Create a new brand system from scratch and apply it to the current document. Provide a company name and optionally identity fields.

ParameterTypeRequiredDescription
companyNamestringyesCompany/brand name.
javascript
create_brand_kit({ companyName: "Acme Corp" })
detach_brand_kit

Detaches the active brand system from the document. Current theme colors are preserved as a standalone theme, but the brand reference is removed.

duplicate_brand_kit

Duplicate an existing brand system. Creates a copy with " (Copy)" appended to the name.

ParameterTypeRequiredDescription
brandKitIdstringyesID of the brand system to duplicate.
update_brand_identity

Update the active brand system's identity fields: company name, tagline, description, industry, target audience, brand values, voice & tone, AI directives.

ParameterTypeRequiredDescription
companyNamestringnoCompany/brand name
taglinestringnoBrand tagline
descriptionstringnoBrand description
industrystringnoIndustry/sector
brandValuesstring[]noCore brand values
update_brand_colors

Update colors in the active brand system (which IS the document theme). Provide a mode ("light" or "dark") and the token values to change.

ParameterTypeRequiredDescription
modestringyes"light" or "dark"
tokensobjectyesToken values to update, e.g. { primary: "#2563eb", background: "#ffffff" }
javascript
update_brand_colors({
  mode: "light",
  tokens: { primary: "#2563eb", accent: "#f59e0b" }
})
update_brand_ai_guidelines

Update the AI guidelines markdown document for the active brand system — the "brand bible" that tells AI how to design for this brand.

ParameterTypeRequiredDescription
guidelinesstringyesMarkdown guidelines content
export_brand_system

Export the active brand system in a given format: "css" (CSS variables), "tailwind" (Tailwind v4 config), "style-dictionary" (Style Dictionary tokens), "figma" (Figma Variables), or "package" (complete JSON).

ParameterTypeRequiredDescription
formatstringyescss | tailwind | style-dictionary | figma | package
javascript
export_brand_system({ format: "tailwind" })
save_brand_component

Save selected node(s) as a reusable brand component in the active brand system. Can be inserted later via insert_brand_component.

ParameterTypeRequiredDescription
namestringyesComponent name
nodeIdsstring[]yesNode IDs to save
categorystringnoCategory (e.g. "buttons", "cards", "headers")
list_brand_components

List all saved brand components and templates in the active brand system.

insert_brand_component

Insert a saved brand component or template into the design. Creates a fresh copy with new IDs.

ParameterTypeRequiredDescription
componentIdstringyesID of the brand component or template to insert.
parentIdstringyesParent node/artboard to insert into.
delete_brand_component

Delete a saved brand component or template from the active brand system.

ParameterTypeRequiredDescription
componentIdstringyesID of the component or template to delete.
save_brand_template

Save selected node(s) as a reusable brand template (section/page layout). Templates use semantic tokens so they re-theme automatically.

ParameterTypeRequiredDescription
namestringyesTemplate name
nodeIdsstring[]yesNode IDs to save
categorystringnoCategory (e.g. "hero", "pricing", "footer")
get_brand_images

Get curated brand images and Lummi seed IDs from the active brand system. Returns image URLs that define the brand's visual style.

audit_brand_compliance

Audit the design for brand system compliance violations. Checks: hardcoded colors, wrong fonts, wrong icon library/weight, non-semantic tokens.

ParameterTypeRequiredDescription
artboardIdstringnoAudit a specific artboard (audits all if omitted)
javascript
audit_brand_compliance()
// → { violations: [{ type: "hardcoded-color", nodeId: "...", message: "..." }] }

Shaders

Shader nodes render generative WebGL backgrounds. Add them with add_node using type: "shader" and a shaderType. All shaders animate automatically.

Shader TypeDescription
meshGradientSmooth animated mesh gradient with customizable color points
dotGridAnimated dot pattern grid with wave motion
voronoiVoronoi cell pattern with organic movement
liquidMetalReflective liquid metal surface
chromeChrome/metallic reflection effect
pulsarPulsing radial energy burst
blackHoleGravitational distortion vortex
glassFrosted glass refraction effect
spiralRotating spiral pattern
particlesFloating particle field
fireworksFirework burst animation
javascript
// Add a mesh gradient background
add_node({
  parentId: "artboard-1",
  type: "shader",
  shaderType: "meshGradient",
  name: "Background Gradient",
  className: "w-full h-full absolute inset-0"
})

// Add a shader with custom settings
add_node({
  parentId: "artboard-1",
  type: "shader",
  shaderType: "voronoi",
  shaderSettings: {
    speed: 0.5,
    scale: 2.0,
    colors: ["#2563eb", "#7c3aed", "#ec4899"],
    backgroundColor: "#0a0a0a"
  }
})

Shader settings vary by type. Common properties include speed, scale, colors (array of hex strings), and backgroundColor. Omit shaderSettings to use defaults for the chosen type.

Image Search (1)

Search for free, high-quality stock images. No session required — call this anytime.

search_images

Search for free, high-quality stock images (powered by Lummi). Returns image URLs that can be used with add_node (type: 'image') or set_fill (type: 'image'). No session required.

ParameterTypeRequiredDescription
querystringnoSearch query (e.g. "mountain landscape"). Omit for featured images.
orientationstringnosquare | horizontal | vertical
typestringnophoto | illustration | 3d
luminancestringnodark | neutral | bright
limitnumbernoNumber of results (default: 6, max: 20)
javascript
search_images({ query: "team working", orientation: "horizontal" })
// → [{ url: "https://...", width: 1920, height: 1080, alt: "..." }, ...]