Skip to main content
Glama
neozhehan

Figma Edit MCP

by neozhehan

Manage Style

style_manage

Create or update named Figma styles for paints, text, effects, and grids. To modify an existing style, pass its styleId and currentStyleName from style_list.

Instructions

Create a named style (paint/text/effect/grid), or update an existing one when styleId is given. UPDATE requires currentStyleName.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
nameNoStyle name. Must be non-empty when supplied. REQUIRED for CREATE; omit it on UPDATE to leave the current style name unchanged.
typeYesType of style to create or update
styleIdNoID of the style to update (if not creating a new one)
propertiesNoStyle properties to set; which subset applies depends on `type` (TEXT/PAINT/EFFECT/GRID).
descriptionNoDescription of the style
bindVariablesNoMap of field names to variable IDs (to bind) or null (to unbind). For PAINT styles, valid fields include 'color'. For TEXT styles, fields include 'fontSize', 'fontFamily', etc.
currentStyleNameNoREQUIRED for UPDATE when styleId is supplied — the style's **current exact** name, passed back verbatim from `style_list`

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
idNoID of the style
nameNoName of the style
typeNoType of the style
errorNo

Schema Changelog

Changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. Changed16 schema fields changedv2.3.3
    • addedInput schema / properties / currentStyleName
      Added value: +{
      +  "description": "REQUIRED for UPDATE when styleId is supplied — the style's **current exact** name, passed back verbatim from `style_list`",
      +  "type": "string"
      +}
    • changedInput schema / properties / name / description
      Previous value: -"Name of the style"New value: +"Style name. Must be non-empty when supplied. REQUIRED for CREATE; omit it on UPDATE to leave the current style name unchanged."
    • addedInput schema / properties / properties / additionalProperties
      Added value: +false
    • changedInput schema / properties / properties / properties / effects / description
      Previous value: -"EFFECT: array of Figma Effect objects, e.g. {type:'DROP_SHADOW', color, offset:{x,y}, radius, spread?, visible?, blendMode?}"New value: +"EFFECT: array of Figma Effect objects, one shape per `type` — DROP_SHADOW/INNER_SHADOW (color, offset, radius, spread), LAYER_BLUR/BACKGROUND_BLUR (radius, blurType), NOISE (noiseType, color, noiseSize, density), TEXTURE (noiseSize, radius, clipToShape), GLASS (lightIntensity, lightAngle, refraction, depth, dispersion, radius). At most one GLASS effect is allowed per node. Required-vs-optional and numeric bounds are authoritative in each variant's schema."
    • removedInput schema / properties / properties / properties / effects / items / additionalProperties
      Removed value: -{}
    • addedInput schema / properties / properties / properties / effects / items / oneOf
      Added value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "blendMode": {
      +        "description": "Figma BlendMode (default 'NORMAL')",
      +        "enum": [
      +          "PASS_THROUGH",
      +          "NORMAL",
      +          "DARKEN",
      +          "MULTIPLY",
      +          "LINEAR_BURN",
      +          "COLOR_BURN",
      +          "LIGHTEN",
      +          "SCREEN",
      +          "LINEAR_DODGE",
      +          "COLOR_DODGE",
      +          "OVERLAY",
      +          "SOFT_LIGHT",
      +          "HARD_LIGHT",
      +          "DIFFERENCE",
      +          "EXCLUSION",
      +          "HUE",
      +          "SATURATION",
      +          "COLOR",
      +          "LUMINOSITY"
      +        ],
      +        "type": "string"
      +      },
      +      "color": {
      +        "additionalProperties": false,
      +        "description": "Shadow colour (default {r:0,g:0,b:0,a:0.25})",
      +        "properties": {
      +          "a": {
      +            "description": "Alpha, 0–1 — required: Figma rejects an effect colour without it",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "b": {
      +            "description": "Blue, 0–1",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "g": {
      +            "description": "Green, 0–1",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "r": {
      +            "description": "Red, 0–1",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "r",
      +          "g",
      +          "b",
      +          "a"
      +        ],
      +        "type": "object"
      +      },
      +      "offset": {
      +        "additionalProperties": false,
      +        "description": "Shadow offset (default {x:0,y:4})",
      +        "properties": {
      +          "x": {
      +            "description": "X offset, px",
      +            "type": "number"
      +          },
      +          "y": {
      +            "description": "Y offset, px",
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "x",
      +          "y"
      +        ],
      +        "type": "object"
      +      },
      +      "radius": {
      +        "description": "Blur radius, px; must be ≥ 0 (default 4)",
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "showShadowBehindNode": {
      +        "description": "DROP_SHADOW only (default false)",
      +        "type": "boolean"
      +      },
      +      "spread": {
      +        "description": "Shadow spread, px (default 0)",
      +        "type": "number"
      +      },
      +      "type": {
      +        "const": "DROP_SHADOW",
      +        "type": "string"
      +      },
      +      "visible": {
      +        "description": "default true",
      +        "type": "boolean"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "blendMode": {
      +        "description": "Figma BlendMode (default 'NORMAL')",
      +        "enum": [
      +          "PASS_THROUGH",
      +          "NORMAL",
      +          "DARKEN",
      +          "MULTIPLY",
      +          "LINEAR_BURN",
      +          "COLOR_BURN",
      +          "LIGHTEN",
      +          "SCREEN",
      +          "LINEAR_DODGE",
      +          "COLOR_DODGE",
      +          "OVERLAY",
      +          "SOFT_LIGHT",
      +          "HARD_LIGHT",
      +          "DIFFERENCE",
      +          "EXCLUSION",
      +          "HUE",
      +          "SATURATION",
      +          "COLOR",
      +          "LUMINOSITY"
      +        ],
      +        "type": "string"
      +      },
      +      "color": {
      +        "additionalProperties": false,
      +        "description": "Shadow colour (default {r:0,g:0,b:0,a:0.25})",
      +        "properties": {
      +          "a": {
      +            "description": "Alpha, 0–1 — required: Figma rejects an effect colour without it",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "b": {
      +            "description": "Blue, 0–1",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "g": {
      +            "description": "Green, 0–1",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "r": {
      +            "description": "Red, 0–1",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "r",
      +          "g",
      +          "b",
      +          "a"
      +        ],
      +        "type": "object"
      +      },
      +      "offset": {
      +        "additionalProperties": false,
      +        "description": "Shadow offset (default {x:0,y:4})",
      +        "properties": {
      +          "x": {
      +            "description": "X offset, px",
      +            "type": "number"
      +          },
      +          "y": {
      +            "description": "Y offset, px",
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "x",
      +          "y"
      +        ],
      +        "type": "object"
      +      },
      +      "radius": {
      +        "description": "Blur radius, px; must be ≥ 0 (default 4)",
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "spread": {
      +        "description": "Shadow spread, px (default 0)",
      +        "type": "number"
      +      },
      +      "type": {
      +        "const": "INNER_SHADOW",
      +        "type": "string"
      +      },
      +      "visible": {
      +        "description": "default true",
      +        "type": "boolean"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "blurType": {
      +        "description": "default 'NORMAL'",
      +        "enum": [
      +          "NORMAL",
      +          "PROGRESSIVE"
      +        ],
      +        "type": "string"
      +      },
      +      "endOffset": {
      +        "additionalProperties": false,
      +        "description": "PROGRESSIVE only: where the ramp ends",
      +        "properties": {
      +          "x": {
      +            "description": "X offset, px",
      +            "type": "number"
      +          },
      +          "y": {
      +            "description": "Y offset, px",
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "x",
      +          "y"
      +        ],
      +        "type": "object"
      +      },
      +      "radius": {
      +        "description": "Blur radius, px; must be ≥ 0 (default 4)",
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "startOffset": {
      +        "additionalProperties": false,
      +        "description": "PROGRESSIVE only: where the ramp starts",
      +        "properties": {
      +          "x": {
      +            "description": "X offset, px",
      +            "type": "number"
      +          },
      +          "y": {
      +            "description": "Y offset, px",
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "x",
      +          "y"
      +        ],
      +        "type": "object"
      +      },
      +      "startRadius": {
      +        "description": "PROGRESSIVE only: radius at the start of the ramp",
      +        "type": "number"
      +      },
      +      "type": {
      +        "const": "LAYER_BLUR",
      +        "type": "string"
      +      },
      +      "visible": {
      +        "description": "default true",
      +        "type": "boolean"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "blurType": {
      +        "description": "default 'NORMAL'",
      +        "enum": [
      +          "NORMAL",
      +          "PROGRESSIVE"
      +        ],
      +        "type": "string"
      +      },
      +      "endOffset": {
      +        "additionalProperties": false,
      +        "description": "PROGRESSIVE only: where the ramp ends",
      +        "properties": {
      +          "x": {
      +            "description": "X offset, px",
      +            "type": "number"
      +          },
      +          "y": {
      +            "description": "Y offset, px",
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "x",
      +          "y"
      +        ],
      +        "type": "object"
      +      },
      +      "radius": {
      +        "description": "Blur radius, px; must be ≥ 0 (default 4)",
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "startOffset": {
      +        "additionalProperties": false,
      +        "description": "PROGRESSIVE only: where the ramp starts",
      +        "properties": {
      +          "x": {
      +            "description": "X offset, px",
      +            "type": "number"
      +          },
      +          "y": {
      +            "description": "Y offset, px",
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "x",
      +          "y"
      +        ],
      +        "type": "object"
      +      },
      +      "startRadius": {
      +        "description": "PROGRESSIVE only: radius at the start of the ramp",
      +        "type": "number"
      +      },
      +      "type": {
      +        "const": "BACKGROUND_BLUR",
      +        "type": "string"
      +      },
      +      "visible": {
      +        "description": "default true",
      +        "type": "boolean"
      +      }
      +    },
      +    "required": [
      +      "type"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "blendMode": {
      +        "description": "Figma BlendMode (default 'NORMAL')",
      +        "enum": [
      +          "PASS_THROUGH",
      +          "NORMAL",
      +          "DARKEN",
      +          "MULTIPLY",
      +          "LINEAR_BURN",
      +          "COLOR_BURN",
      +          "LIGHTEN",
      +          "SCREEN",
      +          "LINEAR_DODGE",
      +          "COLOR_DODGE",
      +          "OVERLAY",
      +          "SOFT_LIGHT",
      +          "HARD_LIGHT",
      +          "DIFFERENCE",
      +          "EXCLUSION",
      +          "HUE",
      +          "SATURATION",
      +          "COLOR",
      +          "LUMINOSITY"
      +        ],
      +        "type": "string"
      +      },
      +      "color": {
      +        "additionalProperties": false,
      +        "description": "Primary noise colour",
      +        "properties": {
      +          "a": {
      +            "description": "Alpha, 0–1 — required: Figma rejects an effect colour without it",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "b": {
      +            "description": "Blue, 0–1",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "g": {
      +            "description": "Green, 0–1",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "r": {
      +            "description": "Red, 0–1",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "r",
      +          "g",
      +          "b",
      +          "a"
      +        ],
      +        "type": "object"
      +      },
      +      "density": {
      +        "description": "Noise density, 0–1",
      +        "maximum": 1,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "noiseSize": {
      +        "description": "Noise grain size, 0–100 (Figma clamps above 100)",
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "noiseType": {
      +        "description": "Noise variant",
      +        "enum": [
      +          "MONOTONE",
      +          "DUOTONE",
      +          "MULTITONE"
      +        ],
      +        "type": "string"
      +      },
      +      "opacity": {
      +        "description": "MULTITONE only: 0–1",
      +        "maximum": 1,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "secondaryColor": {
      +        "additionalProperties": false,
      +        "description": "DUOTONE only: the second colour",
      +        "properties": {
      +          "a": {
      +            "description": "Alpha, 0–1 — required: Figma rejects an effect colour without it",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "b": {
      +            "description": "Blue, 0–1",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "g": {
      +            "description": "Green, 0–1",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          },
      +          "r": {
      +            "description": "Red, 0–1",
      +            "maximum": 1,
      +            "minimum": 0,
      +            "type": "number"
      +          }
      +        },
      +        "required": [
      +          "r",
      +          "g",
      +          "b",
      +          "a"
      +        ],
      +        "type": "object"
      +      },
      +      "type": {
      +        "const": "NOISE",
      +        "type": "string"
      +      },
      +      "visible": {
      +        "description": "default true",
      +        "type": "boolean"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "noiseType",
      +      "color",
      +      "noiseSize",
      +      "density"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "clipToShape": {
      +        "description": "Clip the texture to the shape",
      +        "type": "boolean"
      +      },
      +      "noiseSize": {
      +        "description": "Texture grain size, 0–100 (Figma clamps above 100)",
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "radius": {
      +        "description": "Texture radius, 0–100 (Figma clamps above 100)",
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "type": {
      +        "const": "TEXTURE",
      +        "type": "string"
      +      },
      +      "visible": {
      +        "description": "default true",
      +        "type": "boolean"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "noiseSize",
      +      "radius",
      +      "clipToShape"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "depth": {
      +        "description": "Glass depth; must be ≥ 1",
      +        "minimum": 1,
      +        "type": "number"
      +      },
      +      "dispersion": {
      +        "description": "Chromatic dispersion, 0–1",
      +        "maximum": 1,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "lightAngle": {
      +        "description": "Light angle, degrees",
      +        "type": "number"
      +      },
      +      "lightIntensity": {
      +        "description": "Light intensity, 0–1",
      +        "maximum": 1,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "radius": {
      +        "description": "Corner/blur radius; must be ≥ 0",
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "refraction": {
      +        "description": "Refraction amount, 0–1",
      +        "maximum": 1,
      +        "minimum": 0,
      +        "type": "number"
      +      },
      +      "type": {
      +        "const": "GLASS",
      +        "type": "string"
      +      },
      +      "visible": {
      +        "description": "default true",
      +        "type": "boolean"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "lightIntensity",
      +      "lightAngle",
      +      "refraction",
      +      "depth",
      +      "dispersion",
      +      "radius"
      +    ],
      +    "type": "object"
      +  }
      +]
    • removedInput schema / properties / properties / properties / effects / items / properties
      Removed value: -{
      -  "blendMode": {
      -    "description": "Blend mode for shadow effects, e.g. 'NORMAL', 'MULTIPLY'",
      -    "type": "string"
      -  },
      -  "type": {
      -    "description": "DROP_SHADOW|INNER_SHADOW|LAYER_BLUR|BACKGROUND_BLUR",
      -    "type": "string"
      -  }
      -}
    • removedInput schema / properties / properties / properties / effects / items / required
      Removed value: -[
      -  "type"
      -]
    • removedInput schema / properties / properties / properties / effects / items / type
      Removed value: -"object"
    • addedInput schema / properties / properties / properties / fontName / additionalProperties
      Added value: +false
    • addedInput schema / properties / properties / properties / letterSpacing / additionalProperties
      Added value: +false
    • changedInput schema / properties / properties / properties / lineHeight / anyOf
      Previous value: -[
      -  {
      -    "properties": {
      -      "unit": {
      -        "const": "AUTO",
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "unit"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "properties": {
      -      "unit": {
      -        "enum": [
      -          "PIXELS",
      -          "PERCENT"
      -        ],
      -        "type": "string"
      -      },
      -      "value": {
      -        "type": "number"
      -      }
      -    },
      -    "required": [
      -      "value",
      -      "unit"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "unit": {
      +        "const": "AUTO",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "unit"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": false,
      +    "properties": {
      +      "unit": {
      +        "enum": [
      +          "PIXELS",
      +          "PERCENT"
      +        ],
      +        "type": "string"
      +      },
      +      "value": {
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "value",
      +      "unit"
      +    ],
      +    "type": "object"
      +  }
      +]
    • addedInput schema / properties / properties / properties / paints / items / properties / color / additionalProperties
      Added value: +false
    • changedInput schema / required
      Previous value: -[
      -  "type",
      -  "name"
      -]New value: +[
      +  "type"
      +]
    • addedOutput schema / properties / error
      Added value: +{
      +  "additionalProperties": false,
      +  "properties": {
      +    "code": {
      +      "description": "Stable machine-readable failure code (see the error playbook)",
      +      "type": "string"
      +    },
      +    "details": {
      +      "description": "Optional structured context (e.g. partialMutation, before-values)"
      +    },
      +    "message": {
      +      "description": "Human/agent-readable message embedding its own recovery",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "code",
      +    "message"
      +  ],
      +  "type": "object"
      +}
    • removedOutput schema / required
      Removed value: -[
      -  "id",
      -  "name",
      -  "type"
      -]
  2. Changed1 schema field changedv2.3.2
    • changedOutput schema / additionalProperties
      Previous value: -falseNew value: +{}
  3. Changed3 schema fields changedv2.3.0
    • addedInput schema / additionalProperties
      Added value: +false
    • changedInput schema / properties / properties / properties / effects / description
      Previous value: -"EFFECT: array of Figma Effect objects, e.g. {type:'DROP_SHADOW', color, offset:{x,y}, radius, spread?, visible?}"New value: +"EFFECT: array of Figma Effect objects, e.g. {type:'DROP_SHADOW', color, offset:{x,y}, radius, spread?, visible?, blendMode?}"
    • addedInput schema / properties / properties / properties / effects / items / properties / blendMode
      Added value: +{
      +  "description": "Blend mode for shadow effects, e.g. 'NORMAL', 'MULTIPLY'",
      +  "type": "string"
      +}
  4. Addedv2.0.0

TDQS

A3.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only include openWorldHint, so the description carries the burden of behavioral disclosure. It mentions the currentStyleName requirement but omits side effects on existing nodes, whether update overwrites properties, what happens if the style doesn't exist, or permission requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short sentences, front-loaded with the core purpose, and contains no redundant words or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The complex nested schema and output schema cover field-level details, but the description lacks complete contextual guidance on mutation behavior, side effects, or failure modes. It's minimally sufficient for a well-schema'd tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all parameters. The description adds minimal value beyond restating that styleId switches to update mode and currentStyleName is required, which is also present in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool creates or updates named styles (paint/text/effect/grid), and distinguishes between create (no styleId) and update (with styleId) modes. This differentiates it from siblings like style_delete and style_list.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit usage conditions: use create when no styleId is provided, and update with styleId plus currentStyleName. It doesn't explicitly say when NOT to use it versus alternatives like node_apply_style, but the create/update branching provides clear context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/neozhehan/figma-edit-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server