Skip to main content
Glama
paragdesai1

Cursor Talk to Figma MCP

by paragdesai1

Cursor Talk to Figma MCP

This project implements a Model Context Protocol (MCP) integration between Cursor AI and Figma, allowing Cursor to communicate with Figma for reading designs and modifying them programmatically.

https://github.com/user-attachments/assets/129a14d2-ed73-470f-9a4c-2240b2a4885c

Project Structure

  • src/talk_to_figma_mcp/ - TypeScript MCP server for Figma integration

  • src/cursor_mcp_plugin/ - Figma plugin for communicating with Cursor

  • src/socket.ts - WebSocket server that facilitates communication between the MCP server and Figma plugin

Related MCP server: Figma MCP Server

Get Started

  1. Install Bun if you haven't already:

curl -fsSL https://bun.sh/install | bash
  1. Run setup, this will also install MCP in your Cursor's active project

bun setup
  1. Start the Websocket server

bun socket
  1. MCP server

bunx cursor-talk-to-figma-mcp
  1. Install Figma Plugin

Quick Video Tutorial

Video Link

Design Automation Example

Bulk text content replacement

Thanks to @dusskapark for contributing the bulk text replacement feature. Here is the demo video.

Manual Setup and Installation

MCP Server: Integration with Cursor

Add the server to your Cursor MCP configuration in ~/.cursor/mcp.json:

{
  "mcpServers": {
    "TalkToFigma": {
      "command": "bunx",
      "args": ["cursor-talk-to-figma-mcp@latest"]
    }
  }
}

WebSocket Server

Start the WebSocket server:

bun socket

Figma Plugin

  1. In Figma, go to Plugins > Development > New Plugin

  2. Choose "Link existing plugin"

  3. Select the src/cursor_mcp_plugin/manifest.json file

  4. The plugin should now be available in your Figma development plugins

Windows + WSL Guide

  1. Install bun via powershell

powershell -c "irm bun.sh/install.ps1|iex"
  1. Uncomment the hostname 0.0.0.0 in src/socket.ts

// uncomment this to allow connections in windows wsl
hostname: "0.0.0.0",
  1. Start the websocket

bun socket

Usage

  1. Start the WebSocket server

  2. Install the MCP server in Cursor

  3. Open Figma and run the Cursor MCP Plugin

  4. Connect the plugin to the WebSocket server by joining a channel using join_channel

  5. Use Cursor to communicate with Figma using the MCP tools

MCP Tools

The MCP server provides the following tools for interacting with Figma:

Document & Selection

  • get_document_info - Get information about the current Figma document

  • get_selection - Get information about the current selection

  • read_my_design - Get detailed node information about the current selection without parameters

  • get_node_info - Get detailed information about a specific node

  • get_nodes_info - Get detailed information about multiple nodes by providing an array of node IDs

Annotations

  • get_annotations - Get all annotations in the current document or specific node

  • set_annotation - Create or update an annotation with markdown support

  • set_multiple_annotations - Batch create/update multiple annotations efficiently

  • scan_nodes_by_types - Scan for nodes with specific types (useful for finding annotation targets)

Creating Elements

  • create_rectangle - Create a new rectangle with position, size, and optional name

  • create_frame - Create a new frame with position, size, and optional name

  • create_text - Create a new text node with customizable font properties

Modifying text content

  • scan_text_nodes - Scan text nodes with intelligent chunking for large designs

  • set_text_content - Set the text content of a single text node

  • set_multiple_text_contents - Batch update multiple text nodes efficiently

Styling

  • set_fill_color - Set the fill color of a node (RGBA)

  • set_stroke_color - Set the stroke color and weight of a node

  • set_corner_radius - Set the corner radius of a node with optional per-corner control

Layout & Organization

  • move_node - Move a node to a new position

  • resize_node - Resize a node with new dimensions

  • delete_node - Delete a node

  • delete_multiple_nodes - Delete multiple nodes at once efficiently

  • clone_node - Create a copy of an existing node with optional position offset

Components & Styles

  • get_styles - Get information about local styles

  • get_local_components - Get information about local components

  • create_component_instance - Create an instance of a component

Export & Advanced

  • export_node_as_image - Export a node as an image (PNG, JPG, SVG, or PDF) - limited support on image currently returning base64 as text

Connection Management

  • join_channel - Join a specific channel to communicate with Figma

Development

Building the Figma Plugin

  1. Navigate to the Figma plugin directory:

    cd src/cursor_mcp_plugin
  2. Edit code.js and ui.html

Best Practices

When working with the Figma MCP:

  1. Always join a channel before sending commands

  2. Get document overview using get_document_info first

  3. Check current selection with get_selection before modifications

  4. Use appropriate creation tools based on needs:

    • create_frame for containers

    • create_rectangle for basic shapes

    • create_text for text elements

  5. Verify changes using get_node_info

  6. Use component instances when possible for consistency

  7. Handle errors appropriately as all commands can throw exceptions

  8. For large designs:

    • Use chunking parameters in scan_text_nodes

    • Monitor progress through WebSocket updates

    • Implement appropriate error handling

  9. For text operations:

    • Use batch operations when possible

    • Consider structural relationships

    • Verify changes with targeted exports

  10. For converting legacy annotations:

    • Scan text nodes to identify numbered markers and descriptions

    • Use scan_nodes_by_types to find UI elements that annotations refer to

    • Match markers with their target elements using path, name, or proximity

    • Categorize annotations appropriately with get_annotations

    • Create native annotations with set_multiple_annotations in batches

    • Verify all annotations are properly linked to their targets

    • Delete legacy annotation nodes after successful conversion

License

MIT

Available Tools

33 tools
clone_nodeB

Clone an existing node in Figma

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdYesThe ID of the node to clone
xNoNew X position for the clone
yNoNew Y position for the clone

TDQS

B3.3/5.0
Behavior2/5

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

With no annotations available, the description bears full responsibility for behavioral disclosure. It only states the basic action, omitting details like whether children are copied, if the clone gets a new ID, or any side effects.

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 a single, front-loaded sentence that conveys the core purpose without any wasteful words. It is appropriately concise for a simple tool.

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?

For a simple clone operation with only three parameters and no output schema, the description is minimally adequate. However, it lacks information about return values or default behavior (e.g., what happens if x/y are omitted), which would make it more complete.

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 parameters are already fully documented. The description adds no additional parameter-level context beyond what the schema provides, earning the baseline score.

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 uses a specific verb 'Clone' with the resource 'an existing node in Figma', clearly distinguishing it from sibling tools like move_node or resize_node. There is no ambiguity about the tool's primary action.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives, such as create_rectangle or create_component_instance. No exclusions or preferred contexts are mentioned.

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

create_component_instanceC

Create an instance of a component in Figma

ParametersJSON Schema
NameRequiredDescriptionDefault
componentKeyYesKey of the component to instantiate
xYesX position
yYesY position

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations provided, the description bears the full burden for behavioral disclosure. It only says 'Create an instance' without stating that this mutates the document, whether a loaded file is required, what the return value is, or any coordinate system assumptions. This is a significant gap for a creation tool.

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

Conciseness4/5

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

The description is seven words long and wastes no words. However, it is essentially a restatement of the tool name with 'in Figma' appended, adding minimal new information. Still, its brevity is appropriate and it is front-loaded.

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

Completeness2/5

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

For a tool with 3 required parameters, no annotations, and no output schema, the description is too sparse. It omits crucial operational context such as return value, coordinate space, and how to obtain a componentKey, and it does not position the tool among the many sibling editing operations.

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 descriptions cover 100% of parameters ('X position', 'Y position', 'Key of the component to instantiate'), so the description need not repeat them. The baseline of 3 applies because the description adds no additional semantic depth such as coordinate units or instructions on sourcing the componentKey.

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

Purpose4/5

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

The description uses a specific verb+resource ('Create an instance of a component') and mentions the context 'in Figma', which clearly conveys the tool's function. However, it does not distinguish from sibling creation tools like create_frame or create_text beyond the component-instance target, so it falls short of a 5.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives, no prerequisites for obtaining a componentKey, and no mention of how to position the instance. There is no contrast with siblings like create_frame or clone_node, so the agent gets no decision support.

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

create_frameC

Create a new frame in Figma

ParametersJSON Schema
NameRequiredDescriptionDefault
xYesX position
yYesY position
widthYesWidth of the frame
heightYesHeight of the frame
nameNoOptional name for the frame
parentIdNoOptional parent node ID to append the frame to
fillColorNoFill color in RGBA format
strokeColorNoStroke color in RGBA format
strokeWeightNoStroke weight
layoutModeNoAuto-layout mode for the frame
layoutWrapNoWhether the auto-layout frame wraps its children
paddingTopNoTop padding for auto-layout frame
paddingRightNoRight padding for auto-layout frame
paddingBottomNoBottom padding for auto-layout frame
paddingLeftNoLeft padding for auto-layout frame
primaryAxisAlignItemsNoPrimary axis alignment for auto-layout frame. Note: When set to SPACE_BETWEEN, itemSpacing will be ignored as children will be evenly spaced.
counterAxisAlignItemsNoCounter axis alignment for auto-layout frame
layoutSizingHorizontalNoHorizontal sizing mode for auto-layout frame
layoutSizingVerticalNoVertical sizing mode for auto-layout frame
itemSpacingNoDistance between children in auto-layout frame. Note: This value will be ignored if primaryAxisAlignItems is set to SPACE_BETWEEN.

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It only says 'Create a new frame' which implies a mutating side effect, but does not mention what the tool returns, whether it requires authentication, whether it appends to a parent, or any other behavioral details. This is minimal disclosure for a mutation tool.

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

Conciseness4/5

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

The description is a single, succinct sentence with no wasted words, making it highly concise. However, given the tool's complexity (20 parameters), the extreme brevity could be considered under-specification, but it remains free of fluff and is easy to parse.

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

Completeness2/5

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

This is a complex tool with 20 parameters, six enums, nested objects, and no output schema. The description is only one sentence, which does not explain return values, the role of optional parameters like parentId and layoutMode, or any side effects. The schema covers parameter meaning but not overall tool behavior, leaving the description incomplete.

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?

The input schema has 100% parameter description coverage, so the baseline is 3. The tool description itself adds no parameter information beyond what's in the schema, but the schema already documents all parameters including nested objects and enums.

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

Purpose4/5

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

The description uses a specific verb+resource ('Create a new frame in Figma') that clearly identifies the tool's function and the object type. It distinguishes itself from sibling creation tools like create_rectangle or create_text by naming the frame resource, though it does not explicitly discuss alternatives.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives, no prerequisites, and no context about workflow. It simply states the action without explaining scenarios where creating a frame is appropriate or how it relates to other creation/modification tools.

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

create_rectangleB

Create a new rectangle in Figma

ParametersJSON Schema
NameRequiredDescriptionDefault
xYesX position
yYesY position
widthYesWidth of the rectangle
heightYesHeight of the rectangle
nameNoOptional name for the rectangle
parentIdNoOptional parent node ID to append the rectangle to

TDQS

B3.1/5.0
Behavior1/5

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

With no annotations provided, the description must carry the full burden of behavioral disclosure. It only restates the name and domain ('Create a new rectangle in Figma') and does not mention side effects, default parent behavior, mutation, permissions, or reversibility. This adds no value beyond the purpose clarity.

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 a single concise sentence with no redundancy. It front-loads the core purpose effectively, and every word earns its place, making it appropriately sized for a simple creation tool.

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 description alone is minimal but sufficient for a basic create operation given the schema covers all parameters. However, it lacks context about default behaviors (e.g., what happens if parentId is omitted) and does not enrich the overall workflow. It is a minimum viable description.

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 (e.g., x, y, width, height, name, parentId). The description adds no parameter semantics beyond the schema, meeting the baseline of 3 as the schema does the heavy lifting.

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 uses the specific verb 'Create' with the resource 'rectangle' and context 'Figma', clearly distinguishing it from sibling tools like create_frame or create_text. The purpose is unambiguous and directly tied to the tool's name.

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

Usage Guidelines2/5

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

No guidance is provided on when to choose this tool over alternatives such as create_frame or create_text. The description only states the action without contextual use cases, exclusions, or comparisons to sibling creation tools.

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

create_textB

Create a new text element in Figma

ParametersJSON Schema
NameRequiredDescriptionDefault
xYesX position
yYesY position
textYesText content
fontSizeNoFont size (default: 14)
fontWeightNoFont weight (e.g., 400 for Regular, 700 for Bold)
fontColorNoFont color in RGBA format
nameNoSemantic layer name for the text node
parentIdNoOptional parent node ID to append the text to

TDQS

B3.2/5.0
Behavior2/5

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

With no annotations provided, the description carries full responsibility for behavioral disclosure. It only states the basic action ('create') and reveals nothing about return values, side effects, permissions, or how it interacts with the document. This is a minimal but non-misleading disclosure.

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 a single, short, grammatically complete sentence with zero filler. It efficiently communicates the tool's purpose without unnecessary detail, matching the standard for appropriate conciseness.

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

Completeness2/5

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

The tool has 8 parameters including a nested fontColor object and no output schema, yet the description provides no context about return values, default behavior, parent requirements, or typical use scenarios. The single-sentence description is insufficient for an agent to fully understand the tool's behavior in complex workflows.

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 all 8 parameters (x, y, text, name, fontSize, parentId, fontColor, fontWeight) have individual descriptions. The tool description adds no additional parameter meaning, so the schema already provides the needed semantics. Baseline 3 is appropriate.

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 states a specific verb ('Create') and resource ('text element') with clear scope ('in Figma'). It distinguishes from sibling tools like set_text_content (which modifies) and create_rectangle (which creates a different resource type).

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

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus alternatives. It doesn't mention that set_text_content should be used for modifying existing text, or any context about parent frames or prerequisites. The description simply states what it does without guiding selection.

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

delete_multiple_nodesA

Delete multiple nodes from Figma at once

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdsYesArray of node IDs to delete

TDQS

A3.5/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden for behavioral disclosure. It merely restates the delete action without mentioning irreversibility, effects on child nodes, permission requirements, or limits. For a destructive operation, this is insufficient transparency.

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 a single, short, front-loaded sentence with no filler. It efficiently communicates the action and scope without unnecessary words.

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 tool is simple with one parameter and no output schema, so the description needn't explain return values. However, it omits behavioral context such as error handling, effects on child nodes, or any limits. It is minimally complete but lacks ancillary detail that would make it fully informative.

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% for the single parameter nodeIds. The description adds no new semantic detail beyond the schema, and the 'multiple' qualifier is redundant with the array type. Baseline 3 applies because the schema fully documents the parameter.

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 deletes multiple nodes from Figma at once. 'Multiple' distinguishes it from the sibling delete_node, and the verb 'delete' plus resource 'nodes from Figma' make the purpose unambiguous.

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

Usage Guidelines3/5

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

No explicit when-to-use guidance or mention of alternatives. The 'multiple' qualifier implies it is for batch deletion, and the existence of sibling delete_node suggests a choice, but the description does not state when to prefer one over the other. Usage is implied rather than stated.

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

delete_nodeC

Delete a node from Figma

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdYesThe ID of the node to delete

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It explicitly says 'Delete', which implies a destructive operation, but it does not disclose consequences such as deletion of child nodes, permanence, undo behavior, or required permissions. This is a significant gap for a mutation tool.

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 a single concise sentence with no redundant words. It is front-loaded with the action and resource, making it easy to parse. For a simple one-parameter tool, the length is appropriate.

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

Completeness2/5

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

Given that this is a destructive deletion tool with no annotations and no output schema, the description is too sparse. It fails to mention single-node scope (versus 'delete_multiple_nodes'), side effects, or any prerequisites. The minimal information leaves an agent uncertain about important usage details.

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?

The input schema provides a full description of the single parameter 'nodeId' (100% coverage). The tool description adds no additional parameter semantics beyond what the schema already states, so a baseline of 3 is appropriate.

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

Purpose4/5

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

The description states a clear action ('Delete a node') and resource ('from Figma'), making it obvious what the tool does. However, it does not differentiate from the sibling tool 'delete_multiple_nodes', which also deals with deletion. Adding 'single' or 'one' would distinguish it.

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

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus alternatives. The sibling tool 'delete_multiple_nodes' suggests batch deletion, but the description does not mention this distinction or any other usage context.

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

export_node_as_imageB

Export a node as an image from Figma

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdYesThe ID of the node to export
formatNoExport format
scaleNoExport scale

TDQS

B3.2/5.0
Behavior2/5

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

With no annotations, the description carries the full burden of behavioral disclosure, but it only states the core action. It does not disclose whether the tool returns binary data, a URL, or a file path, nor does it mention permissions, side effects, or limitations on node types. This is a significant gap for a tool with no annotations.

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 a single, front-loaded sentence with no unnecessary words. It effectively communicates the core purpose without fluff.

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

Completeness2/5

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

The tool has no output schema and no annotations, so the description must explain what the agent should expect after invocation. It does not mention the response format, return value, or any constraints on the export. Given the tool's simplicity in parameters, this lack of contextual detail is a clear gap.

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 baseline is 3. The description adds no extra meaning beyond the schema; the schema already documents each parameter adequately (nodeId, scale, format). The description does not compensate for any ambiguity.

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 action ('Export'), the resource ('a node'), and the result ('as an image from Figma'). It is specific and distinguishes this tool from all sibling tools, which focus on other operations like setting, getting, or creating nodes.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives, no exclusions, and no context about typical scenarios. It does not mention which node types are exportable, how scale or format affect usage, or when to prefer another tool.

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

get_annotationsA

Get all annotations in the current document or specific node

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdNoOptional node ID to get annotations for specific node
includeCategoriesNoWhether to include category information

TDQS

A3.5/5.0
Behavior2/5

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

No annotations are provided, so the description carries full responsibility for behavioral disclosure. It only states that the tool 'gets' annotations, revealing nothing about return format, potential side effects (e.g., read-only), or error behavior. This is insufficient for a tool without annotations.

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 a single, front-loaded sentence with no filler. Every word carries meaning, clearly conveying the action and scope.

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?

For a simple getter with two optional parameters and no output schema, the description gives the essential purpose but omits details about the return structure or how categories are represented. Given the lack of annotations and output schema, a bit more context would improve completeness.

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?

The input schema already provides 100% coverage for both parameters (nodeId and includeCategories) with descriptive texts. The tool description adds no additional parameter insights, so it neither compensates for gaps nor enhances understanding beyond 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's function with a specific verb ('Get') and resource ('annotations'), and further specifies scope ('in the current document or specific node'). This distinguishes it from sibling write tools like set_annotation and set_multiple_annotations.

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

Usage Guidelines3/5

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

The description implies usage for retrieving annotations from either the whole document or a specific node, but it does not explicitly state when to prefer this over alternatives (e.g., get_reactions) or mention any exclusions. Sibling tools are not referenced.

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

get_document_infoB

Get detailed information about the current Figma document

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.2/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. 'Get' implies a read operation, but the description does not state whether there are side effects, authentication requirements, or any details about what 'detailed information' includes or how it is returned.

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 a single, concise sentence with no filler. It front-loads the action and resource clearly, earning its place without redundancy.

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?

For a parameterless tool, the description is minimally adequate, but it leaves the agent without a clear sense of what 'detailed information' means or what the output will contain. With no output schema and no annotations, more specificity about the returned content would make it complete.

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

Parameters4/5

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

The tool has zero parameters, so the schema already fully covers this dimension. The description adds no parameter semantics, but none are needed for a parameterless tool; the baseline of 4 is appropriate.

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

Purpose4/5

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

The description clearly states the verb 'get' and the resource 'current Figma document,' which identifies the tool's function. However, 'detailed information' is vague and does not specify what is included, and it doesn't explicitly distinguish itself from sibling tools like get_node_info or read_my_design.

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

Usage Guidelines2/5

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

There is no guidance on when to use this tool versus alternatives such as get_selection, get_node_info, or read_my_design. The description gives a general purpose but no context, exclusions, or selection criteria, leaving the agent to infer usage.

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

get_local_componentsA

Get all local components from the Figma document

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.6/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It clearly signals a read-only list operation via 'Get,' but it does not define what qualifies as 'local,' whether nested/variant components are included, or what the returned component data contains.

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 a single sentence with no filler. Every word adds value, and the key scoping terms 'local' and 'Figma document' are included.

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?

For a zero-parameter getter, the description is mostly sufficient to invoke the tool correctly. However, with no annotations and no output schema, the agent is left to infer the exact return structure and the precise boundary of 'local components.'

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

Parameters4/5

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

The tool has zero parameters, so there is no schema to elaborate on and no parameter meaning to clarify. Baseline 4 applies because no input documentation is needed.

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

Purpose4/5

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

The description states a specific verb and resource: 'Get all local components' scoped to 'the Figma document.' It is clear and distinguishable from siblings like get_selection, get_styles, or get_node_info, though it does not explicitly name an alternative.

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

Usage Guidelines3/5

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

There is no explicit guidance about when to use this tool instead of related tools like scan_nodes_by_types or get_styles. The term 'local' implies it excludes library/team components, but this distinction is not spelled out.

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

get_node_infoB

Get detailed information about a specific node in Figma

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdYesThe ID of the node to get information about

TDQS

B3.4/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It only says 'get detailed information' without specifying read-only nature, return structure, potential errors, or any limitations. It adds minimal value beyond the tool's name and schema.

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 a single concise sentence that front-loads the action ('Get') and resource ('detailed information about a specific node in Figma'). No unnecessary words or repetitive content.

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

Completeness2/5

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

Given the absence of an output schema and annotations, the description is too vague. It does not explain what 'detailed information' includes, nor does it clarify how this tool differs from get_nodes_info or handle error cases. Leaves significant ambiguity for an agent.

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% for the single nodeId parameter. The tool description adds no additional meaning about the parameter, such as format or how to obtain it, so it stays at the baseline for full schema coverage.

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's function: it retrieves detailed information for a specific node. The phrase 'a specific node' distinguishes it from sibling tools like get_nodes_info (plural) and get_document_info, making the purpose unambiguous.

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

Usage Guidelines3/5

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

The description provides a clear context—use when you need info about a single node—but it does not explicitly mention when not to use it or point to alternatives like get_nodes_info. The usage is implied rather than explicitly stated.

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

get_nodes_infoA

Get detailed information about multiple nodes in Figma

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdsYesArray of node IDs to get information about

TDQS

A3.7/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden. The verb 'Get' indicates a read-only operation, which is somewhat transparent, but it does not disclose any limitations, error behavior, or what 'detailed information' specifically includes. It is minimally adequate but lacks depth.

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 a single concise sentence with no wasted words. It is front-loaded with the verb and resource, making it easily scannable for an agent.

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?

For a simple one-parameter tool with no output schema, the description provides the essential purpose. However, it does not mention return values, any limits on the number of node IDs, or how it differs from get_node_info beyond the plural. It is adequate but could be more complete.

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?

The schema covers the single parameter (nodeIds) with a clear description ('Array of node IDs to get information about'), and the tool description aligns with this. However, the description adds no additional semantic meaning beyond the schema, so a baseline score of 3 is appropriate given 100% schema coverage.

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 uses a specific verb ('Get') and resource ('detailed information about multiple nodes in Figma'), clearly distinguishing it from the sibling tool get_node_info by explicitly stating the plural scope. It is precise and unambiguous.

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

Usage Guidelines3/5

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

The description implies usage when multiple nodes need information, but does not explicitly mention when to use this tool versus alternatives like get_node_info or scan_nodes_by_types. There are no explicit exclusions or alternative references; guidance is only inferred from the plural wording.

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

get_selectionB

Get information about the current selection in Figma

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

B3.4/5.0
Behavior2/5

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

With no annotations provided, the description must carry the behavioral disclosure burden. It signals a read operation through 'Get information' but does not disclose return fields, side-effect freedom, or any prerequisites like needing an open document. This is minimal extra value beyond the tool's name.

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 a single, front-loaded sentence with no filler or redundancy. Every word contributes to stating the tool's purpose.

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?

This is a simple zero-parameter getter, so the description is nearly sufficient. However, with no output schema present, the vague term 'information' leaves the agent guessing about the return shape, such as whether it returns node IDs, types, or names.

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

Parameters4/5

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

There are zero parameters and schema coverage is effectively complete, so the description has nothing to add. The baseline of 4 applies because no parameter semantics are needed.

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

Purpose4/5

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

The description states a clear verb ('Get') and resource ('current selection in Figma'), making the tool's basic purpose understandable. It is distinct from siblings such as set_selections, get_node_info, and get_document_info, though it does not enumerate exactly what information is returned.

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

Usage Guidelines3/5

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

No explicit when-to-use or alternative tool guidance is provided. The name and sibling list imply it is for reading the active selection rather than mutating it with set_selections or querying a specific node with get_node_info, but this is left to inference.

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

get_stylesA

Get all styles from the current Figma document

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.6/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden of behavioral disclosure. It only says 'Get', implying a read operation, but does not clarify what kinds of styles are included (fill, text, effect, grid), whether library styles are returned, or what the response contains. This is minimal behavioral detail.

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 a single, front-loaded sentence with no filler. Every word earns its place, and the verb-resource-scope structure makes it easy to parse quickly.

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

Completeness4/5

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

For a simple zero-parameter getter, the description is largely sufficient: an agent knows what action to take and what resource to expect. The main gap is the ambiguous scope of 'styles', which could be interpreted in multiple ways, but the overall call is straightforward.

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

Parameters4/5

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

The tool has zero parameters, so the schema requires no documentation. The baseline of 4 applies because there are no parameter semantics to clarify; the description does not need to add parameter-level meaning.

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 uses a specific verb ('Get'), a clear resource ('all styles'), and a scope ('current Figma document'). It is immediately distinguishable from sibling tools like get_local_components or get_document_info, which target different resources.

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

Usage Guidelines2/5

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

There is no guidance on when to use this tool versus alternatives such as get_local_components or get_document_info. The phrase 'from the current Figma document' gives some context, but no explicit conditions, exclusions, or alternative-tool routing are provided.

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

join_channelB

Join a specific channel to communicate with Figma

ParametersJSON Schema
NameRequiredDescriptionDefault
channelNoThe name of the channel to join

TDQS

B3.3/5.0
Behavior2/5

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

With no annotations, the description carries the full burden of disclosing behavioral traits. It only states the action but does not disclose side effects, whether joining requires an existing channel, whether it modifies state, whether it can be undone, or what happens after joining. This is a significant gap for a state-changing operation.

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 a single, concise sentence that front-loads the core action. It has no filler or redundant information, and it is appropriately sized for a tool with one parameter.

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?

For a simple tool with one parameter and no output schema, the description provides the basic function but lacks context about what a 'channel' is in Figma, what communication entails, and any behavioral details. Given the tool's simplicity, the description is adequate but not complete, leaving a notable gap in understanding the tool's role in the overall workflow.

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?

The input schema already provides 100% coverage for the only parameter, describing 'channel' as 'The name of the channel to join'. The description adds nothing beyond the schema, using the word 'specific' without providing additional meaning. Thus, the score is at the baseline for high schema coverage.

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

Purpose4/5

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

The description 'Join a specific channel to communicate with Figma' clearly names the action (join) and the resource (channel), and implies a purpose. It distinguishes itself from sibling tools by focusing on the channel concept, which none of the siblings mention. However, the exact nature of the channel (e.g., comment feed, plugin communication) is left undefined, so it is not fully explicit.

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

Usage Guidelines3/5

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

The description implies the usage context (you join a channel to communicate with Figma) but does not explicitly state when to use this tool versus alternatives, nor does it mention any prerequisites or conditions. There are no alternative join tools among siblings, which reduces the need for exclusions, but the description still lacks concrete guidance on when the tool is appropriate.

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

move_nodeA

Move a node to a new position in Figma

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdYesThe ID of the node to move
xYesNew X position
yYesNew Y position

TDQS

A3.6/5.0
Behavior3/5

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

With no annotations provided, the description carries the full burden of disclosing behavioral traits. The verb 'Move' implies a mutation (change of position), and the schema adds coordinates, but the description does not mention side effects, reversibility, or return behavior. It conveys the core action but lacks contextual detail such as whether the move is absolute or relative, or if it affects child nodes. This is adequate but not rich.

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 a single, well-structured sentence with no filler. It immediately states the action and target, earning its place without redundancy. This is an exemplary concise description.

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

Completeness4/5

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

For a simple three-parameter tool with full schema coverage and no output schema, the description is mostly complete. It identifies the operation and the resource, and the schema covers parameters. However, with no annotations, it could have added a note about mutation or side effects, but the simplicity of the operation makes the current level sufficient. A small gap exists in not mentioning what happens after the move (e.g., return value or undo behavior).

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%, with each parameter having a clear description ('New X position', 'New Y position', 'The ID of the node to move'). The tool description adds no additional meaning beyond what the schema already provides. Since the schema fully documents the parameters, a baseline score of 3 is appropriate.

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 uses a specific verb ('Move') with a clear resource ('a node') and context ('to a new position in Figma'). It clearly distinguishes from sibling tools like resize_node, clone_node, and delete_node by specifying the action of repositioning. The schema confirms x/y coordinates, so there is no ambiguity.

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

Usage Guidelines2/5

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

The description provides no explicit guidance on when to use this tool versus alternatives, nor does it mention prerequisites or exclusions. While the name and verb imply its use for repositioning nodes, it does not state scenarios where it should be preferred over other node manipulation tools. Without this, the agent must infer usage from the name alone.

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

read_my_designA

Get detailed information about the current selection in Figma, including all node details

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.6/5.0
Behavior3/5

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

Since 'Get' indicates a read-only operation, the basic behavior is clear, and there is no annotation contradiction. But with no annotations and no output schema, the description does not disclose edge cases such as behavior with an empty selection, whether children are included, or what 'all node details' concretely covers.

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?

A single front-loaded sentence communicates the tool's purpose without wasted words. 'Including all node details' is slightly redundant with 'detailed information,' but the overall structure is clean and immediately actionable.

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?

For a zero-parameter tool, the description is adequate for a basic invocation and clearly identifies the subject as the current selection. However, it leaves sibling-tool differentiation unaddressed and does not describe the return shape or selection edge cases, so it is not fully complete.

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

Parameters4/5

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

The tool has zero parameters and an empty input schema, so the description cannot add parameter-level meaning. A baseline of 4 is appropriate because parameter semantics are irrelevant here.

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

Purpose4/5

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

The description clearly identifies the action ('Get') and the resource ('current selection in Figma'), with 'including all node details' signaling a comprehensive read. It does not explicitly distinguish itself from similar sibling tools like get_selection or get_node_info, so it falls short of a 5.

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

Usage Guidelines3/5

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

The description implies the tool should be used when an agent needs detailed information about the current selection. However, it provides no explicit guidance about when to prefer this over get_selection, get_node_info, or get_nodes_info, and it names no alternatives or exclusions.

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

resize_nodeC

Resize a node in Figma

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdYesThe ID of the node to resize
widthYesNew width
heightYesNew height

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries the burden of behavioral disclosure. 'Resize a node' only implies a change in dimensions without revealing details about how the node's position, constraints, or children are affected. The description offers no insight into side effects or 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 a single sentence with no filler words and immediately front-loads the core action. It is appropriately concise given the tool's simplicity.

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

Completeness2/5

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

The description lacks necessary context for correct use, especially with no output schema or annotations. It does not explain units, coordinate system, or how resizing interacts with layout constraints. For a tool with three required parameters, this is insufficient.

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 baseline is 3. The description itself adds no parameter-specific meaning; it simply states the action. All parameter semantics are adequately captured by the input schema.

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

Purpose4/5

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

The description uses a specific verb 'resize' and resource 'node', clearly indicating the operation. It is distinguishable from sibling tools like move_node or set_layout_sizing, though it does not explicitly differentiate itself from those alternatives.

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

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus alternatives. The description does not mention when resizing is appropriate, what prerequisites exist, or how this differs from related operations such as moving or layout adjustments.

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

scan_nodes_by_typesC

Scan for nodes with specific types in the selected Figma node

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdYesID of the node to scan
typesYesArray of node types to find (e.g. ['COMPONENT', 'FRAME'])

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations provided, the description carries full burden but offers minimal behavioral insight. It doesn't disclose whether this is a read-only operation, what the output format might be (e.g., list of nodes, counts), or any performance considerations (e.g., depth of scan, recursion). The term 'scan' implies searching, but details are lacking.

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 a single, efficient sentence that directly states the tool's purpose without unnecessary words. It is front-loaded with the core action ('Scan for nodes'), making it easy to parse quickly.

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

Completeness2/5

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

Given the complexity of scanning operations in Figma (with potential for nested nodes and varied types), the description is insufficient. No annotations exist to clarify behavior, and there's no output schema to describe return values. The description should explain what 'scan' entails (e.g., recursive search, flat list) and the result format.

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 both parameters (nodeId and types) adequately. The description adds no additional meaning beyond what the schema provides, such as examples of valid types beyond 'COMPONENT' and 'FRAME' or constraints on nodeId format.

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

Purpose4/5

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

The description clearly states the action ('Scan for nodes') and the target ('with specific types in the selected Figma node'), distinguishing it from general node retrieval tools like get_node_info. However, it doesn't explicitly differentiate from scan_text_nodes, which is a similar scanning tool but for text nodes specifically.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives like scan_text_nodes or get_nodes_info. It lacks context about prerequisites (e.g., needing a valid node ID) or exclusions (e.g., not for scanning entire documents).

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

scan_text_nodesB

Scan all text nodes in the selected Figma node

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdYesID of the node to scan

TDQS

B3.2/5.0
Behavior2/5

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

With no annotations, the description must disclose behavior itself, but it only says 'scan'. It does not clarify whether the operation is read-only, what it returns, how deep the scan goes, or how 'selected' relates to the nodeId. This ambiguity is a significant gap.

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 a single, clear, front-loaded sentence. Every word contributes to the core purpose with no redundancy or filler.

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

Completeness2/5

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

Given the absence of an output schema and annotations, the description should explain what 'scan' yields (e.g., list of node IDs, text values) and whether the scan is recursive. It also leaves the 'selected' vs. 'nodeId' relationship unclear, making the tool incomplete for an agent to use confidently.

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?

The schema already fully documents nodeId as 'ID of the node to scan'. The description adds only the word 'selected', which slightly narrows the context but does not provide meaningful additional semantics beyond 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 a specific action ('scan') applied to a specific resource ('all text nodes') within a given scope ('selected Figma node'). This distinguishes it from sibling tools like set_text_content or scan_nodes_by_types.

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

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus alternatives. There is no mention of prerequisites, exclusions, or context such as how the selected node relates to the nodeId parameter.

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

set_annotationC

Create or update an annotation

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdYesThe ID of the node to annotate
annotationIdNoThe ID of the annotation to update (if updating existing annotation)
labelMarkdownYesThe annotation text in markdown format
categoryIdNoThe ID of the annotation category
propertiesNoAdditional properties for the annotation

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries full behavioral disclosure burden. It merely says 'create or update' without revealing key traits such as upsert behavior, whether annotationId is required for updates, or what happens if no annotationId is supplied, creating ambiguity.

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

Conciseness4/5

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

The description is a single, succinct sentence that front-loads the core action. It is efficient, though for a tool with five parameters it could benefit from a bit more context while remaining concise.

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

Completeness2/5

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

With five parameters, create/update semantics, no output schema, and no annotations, this description is far from complete. It does not explain the distinction between create and update flows, required parameters for each path, or any side effects.

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 baseline is 3. The description adds no extra meaning about parameter relationships (e.g., that annotationId is needed for updates or categoryId for creation), but the schema already documents each parameter individually.

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

Purpose4/5

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

The description clearly states the action ('create or update') and resource ('annotation'), making the core purpose understandable. However, it does not explicitly differentiate this from the sibling tool 'set_multiple_annotations', which also deals with annotations.

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

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives like 'set_multiple_annotations' or 'get_annotations'. It also fails to mention prerequisites or context, leaving the agent to infer when this tool is appropriate.

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

set_axis_alignA

Set primary and counter axis alignment for an auto-layout frame in Figma

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdYesThe ID of the frame to modify
primaryAxisAlignItemsNoPrimary axis alignment (MIN/MAX = left/right in horizontal, top/bottom in vertical). Note: When set to SPACE_BETWEEN, itemSpacing will be ignored as children will be evenly spaced.
counterAxisAlignItemsNoCounter axis alignment (MIN/MAX = top/bottom in horizontal, left/right in vertical)

TDQS

A3.7/5.0
Behavior2/5

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

No annotations are present, so the description carries the full burden of behavioral disclosure. It only states the action without mentioning side effects, prerequisites (e.g., frame must already be auto-layout), error handling, or in-place mutation. This is a significant gap for a mutation tool.

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?

One sentence, 13 words, perfectly front-loaded with the action and target. Every word earns its place, with no wasted content.

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 description is adequate given the schema's thorough parameter documentation, but it omits important context like whether the frame must already be auto-layout, what happens if it isn't, and that there is no return value. No output schema or annotations increase the need for such context.

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 coverage is 100% with detailed descriptions for both enum parameters, including the SPACE_BETWEEN side effect. The description adds no additional parameter-specific semantics, so the baseline of 3 applies.

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 action ('Set') and the specific resources ('primary and counter axis alignment for an auto-layout frame'), making it straightforward to understand what the tool does. It is distinct from sibling tools like set_layout_mode or set_padding because it focuses specifically on alignment.

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?

The description provides a clear context by specifying it applies to 'an auto-layout frame', implying when the tool should be used. However, it does not explicitly mention alternatives or exclusions, so while the context is clear, there is no comparative guidance.

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

set_corner_radiusA

Set the corner radius of a node in Figma

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdYesThe ID of the node to modify
radiusYesCorner radius value
cornersNoOptional array of 4 booleans to specify which corners to round [topLeft, topRight, bottomRight, bottomLeft]

TDQS

A3.5/5.0
Behavior2/5

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

No annotations are present, so the description carries the full burden for behavioral disclosure. It states the mutation ('Set') but does not disclose side effects, behavior when 'corners' is omitted, node type restrictions, or whether the operation replaces or modifies existing corner radius values. This is a significant gap for a write operation.

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 a single, clear sentence with no unnecessary words. It is front-loaded and appropriately concise for the tool's simplicity.

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 tool is simple and the schema covers all parameters, but the description lacks any mention of return values, default behavior for the optional 'corners' parameter, or edge cases. Given the lack of annotations and output schema, it is adequate but leaves clear gaps.

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%, meaning all three parameters are already well-documented. The description adds no additional meaning beyond what the schema provides, so the baseline score of 3 is appropriate.

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 uses a specific verb ('Set') and resource ('a node in Figma') with the exact property ('corner radius'), clearly distinguishing this from sibling tools like set_fill_color or set_padding. It unambiguously states what the tool does.

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

Usage Guidelines3/5

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

No explicit guidance is provided on when to use this tool versus alternatives. Usage is implied by the name and description, but there are no exclusions, prerequisites, or alternative recommendations, leaving the agent to infer the intended context.

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

set_fill_colorC

Set the fill color of a node in Figma can be TextNode or FrameNode

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdYesThe ID of the node to modify
rYesRed component (0-1)
gYesGreen component (0-1)
bYesBlue component (0-1)
aNoAlpha component (0-1)

TDQS

C2.6/5.0
Behavior1/5

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

With no annotations provided, the description carries the full behavioral transparency burden. It only states the valid node types but fails to disclose critical behavior such as whether the fill is replaced or appended, what happens if the node has multiple fills, or how the alpha channel behaves when not specified. This is a significant gap for a mutation tool.

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

Conciseness3/5

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

The description is a single short sentence and front-loads the main action, but the sentence is grammatically incomplete ('can be TextNode or FrameNode' is a fragment). It could be more polished, but it is concise and does not contain unnecessary filler.

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

Completeness2/5

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

For a 5-parameter mutation tool with no annotations and no output schema, the description is too minimal. It does not mention side effects, prerequisites, what the result looks like, or any error conditions. The node type restriction is helpful but insufficient for an agent to fully understand the tool's impact.

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?

The input schema already describes all five parameters (nodeId, r, g, b, a) with full coverage. The description adds no additional meaning to the parameters. Since schema coverage is 100%, the baseline score of 3 is appropriate; the description does not need to explain parameters further.

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

Purpose4/5

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

The description clearly identifies the action (Set the fill color) and the target resource (a node in Figma), and even specifies valid node types (TextNode or FrameNode). However, the grammar is awkward and incomplete, which prevents a perfect score. It still distinguishes itself from siblings like set_stroke_color by focusing on fill color.

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

Usage Guidelines2/5

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

No guidance is provided about when to use this tool versus alternatives. It does not mention that it should be used for fill colors specifically as opposed to stroke colors, borders, or other properties. The usage context is only implied by the tool name, not explicitly stated.

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

set_item_spacingA

Set distance between children in an auto-layout frame

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdYesThe ID of the frame to modify
itemSpacingYesDistance between children. Note: This value will be ignored if primaryAxisAlignItems is set to SPACE_BETWEEN.

TDQS

A3.6/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It states the basic action but does not mention potential side effects, error conditions (e.g., if the frame is not auto-layout), or any interaction with other layout properties like primaryAxisAlignItems. This leaves significant behavioral aspects undisclosed.

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 a single sentence that front-loads the verb and resource, with no extraneous words or repetition. Every word earns its place.

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

Completeness4/5

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

For a simple setter with two fully-documented parameters and no output schema, the description covers the essential purpose. The schema already provides detailed parameter notes (e.g., the SPACE_BETWEEN interaction), so the description does not need to repeat them. It lacks only minor context about preconditions or failure behavior, which would push it to a 5.

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%, with both nodeId and itemSpacing fully described in the schema. The description's phrase 'distance between children' paraphrases itemSpacing but adds no additional semantic value beyond the schema. The baseline of 3 is appropriate since the schema already handles parameter documentation.

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 uses a specific verb ('Set') and clearly identifies the resource ('distance between children in an auto-layout frame'). It distinguishes itself from sibling tools like set_padding or set_axis_align by targeting the item spacing property specifically.

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

Usage Guidelines3/5

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

The phrase 'in an auto-layout frame' implies the tool applies only to auto-layout frames, giving some context. However, it does not explicitly state when to use this tool versus alternatives, nor does it mention any exclusions or prerequisites.

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

set_layout_modeB

Set the layout mode and wrap behavior of a frame in Figma

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdYesThe ID of the frame to modify
layoutModeYesLayout mode for the frame
layoutWrapNoWhether the auto-layout frame wraps its children

TDQS

B3.3/5.0
Behavior2/5

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

With no annotations provided, the description carries full responsibility for disclosing behavioral traits. It states what is changed (layout mode and wrap) but omits side effects, such as whether existing children are rearranged, whether the frame must already be a frame/auto-layout, or whether setting NONE disables auto-layout entirely. The optional layoutWrap behavior is also left implicit.

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 a single, concise sentence that immediately states the verb and target. No wasted words or redundant information. Front-loaded and easy to scan.

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?

For a simple setter tool with a fully self-explanatory schema, the description covers the basics. However, it lacks usage context and behavioral caveats (e.g., what 'wrap behavior' means visually or how layoutMode NONE interacts with children). Given no annotations or output schema, the description could have added a bit more context to reach full completeness.

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 three parameters (nodeId, layoutMode, layoutWrap) with meaningful descriptions and enums. The description adds no extra semantic meaning beyond what the schema provides, but it also does not need to, hence baseline 3.

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 uses a specific verb ('Set') and names the exact resource ('layout mode and wrap behavior of a frame'). It clearly distinguishes from sibling tools like set_layout_sizing or set_item_spacing, which target different aspects of layout.

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

Usage Guidelines2/5

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

No guidance on when to use this tool vs. alternatives. The description merely states the action without providing context, prerequisites, or exclusions. For example, it does not mention that this is for frames with auto-layout enabled or that set_layout_sizing handles sizing dimensions.

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

set_layout_sizingB

Set horizontal and vertical sizing modes for an auto-layout frame in Figma

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdYesThe ID of the frame to modify
layoutSizingHorizontalNoHorizontal sizing mode (HUG for frames/text only, FILL for auto-layout children only)
layoutSizingVerticalNoVertical sizing mode (HUG for frames/text only, FILL for auto-layout children only)

TDQS

B3.3/5.0
Behavior2/5

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

There are no annotations, so the description carries the burden of disclosing behavioral traits. It does not mention side effects, constraints, error handling, or what happens if the target node is not an auto-layout frame. The only hint is that the target is an auto-layout frame, but this is more a target description than a behavioral disclosure.

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?

A single, compact sentence that conveys the tool's purpose without extraneous details. It is well-structured and front-loaded, making it easy for an agent to quickly understand the action.

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 tool is a simple setter with 3 well-described parameters and no output schema. The description is adequate for basic use but lacks details about failure modes, prerequisites (e.g., node must be an auto-layout frame), or interactions with other layout settings. Given the simplicity, it meets the minimum viable threshold.

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%, with each parameter fully described (nodeId, layoutSizingVertical, layoutSizingHorizontal) including enum constraints and special conditions (e.g., HUG for frames/text only, FILL for auto-layout children). The description adds no additional parameter semantics beyond what the schema already provides, so the baseline 3 applies.

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 action ('Set') and the resource ('horizontal and vertical sizing modes for an auto-layout frame in Figma'). This distinguishes it from sibling tools like set_layout_mode, which focuses on layout direction rather than sizing modes. The mention of both horizontal and vertical adds specificity.

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

Usage Guidelines2/5

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

No guidance is provided about when to use this tool versus alternatives. It does not mention that this is specifically for auto-layout frames (though implied) or that it complements set_layout_mode or set_padding. No exclusions or alternative tool mentions exist.

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

set_multiple_annotationsC

Set multiple annotations parallelly in a node

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdYesThe ID of the node containing the elements to annotate
annotationsYesArray of annotations to apply

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations provided, the description carries full responsibility for behavioral disclosure. It mentions 'parallelly' suggesting concurrency, but does not explain potential side effects, atomicity, failure handling, or whether annotations are created or updated (especially since `annotationId` is in the schema for updates). This leaves significant behavioral uncertainty.

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

Conciseness4/5

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

The description is a single sentence, front-loaded with the action and object. It is concise with no wasted words, though 'parallelly' is an awkward adverb that could be replaced with 'in parallel' without losing meaning. Overall, it is structurally efficient.

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

Completeness2/5

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

Given there is no output schema and no annotations, the description should provide more context about return values, validation, and operational behavior. The tool performs a batch operation with potential partial-failure scenarios, but the description gives no hint of these complexities. The result is insufficient for an agent to fully anticipate outcomes.

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?

The schema covers 100% of parameters with descriptions, so the baseline is 3. The description itself adds no parameter-level context, and notably does not clarify the relationship between the top-level `nodeId` and the per-item `nodeId` in the annotations array—a potential source of confusion. Since the schema already handles semantics, this is acceptable but not enhanced.

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

Purpose4/5

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

The description clearly states the tool's function: setting multiple annotations at once within a node. It uses a specific verb ('set') and resource ('annotations'), and distinguishes from the sibling tool `set_annotation` by emphasizing 'multiple'. However, 'parallelly' is slightly ambiguous and not a standard term.

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

Usage Guidelines2/5

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

The description provides no explicit guidance on when to use this tool versus alternatives like `set_annotation` or `get_annotations`. It only implies usage through the name and the word 'multiple', but does not mention advantages, prerequisites, or exclusions.

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

set_multiple_text_contentsC

Set multiple text contents parallelly in a node

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdYesThe ID of the node containing the text nodes to replace
textYesArray of text node IDs and their replacement texts

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations provided, the description carries the full burden for disclosure. It only mentions 'parallelly', hinting at concurrent execution, but fails to disclose effects such as whether existing text is replaced, whether the operation is atomic, or if special permissions are needed. This is a significant gap for a mutation tool.

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

Conciseness4/5

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

The description is concise, using a single sentence that front-loads the action. However, the word 'parallelly' is non-standard and slightly awkward, which slightly reduces clarity. Overall, it is efficient with no wasted words.

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

Completeness2/5

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

For a batch operation with two parameters, no output schema, and no annotations, this description is under-specified. It lacks context about return values, failure modes, or behavior on partial failures. A richer description would be needed to fully guide an agent in using this tool correctly.

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 parameters are already well-documented. The description adds no additional semantic value about parameters (e.g., that 'nodeId' is the parent container and 'text' is an array of child node-specific replacements). The baseline of 3 applies since the schema handles the explanation.

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

Purpose4/5

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

The description clearly states the tool's action: setting multiple text contents within a node. It uses a specific verb ('set') and resource ('text contents'), and the word 'multiple' differentiates it from the sibling tool 'set_text_content'. However, 'parallelly' is an unusual adverb that could confuse, but the core purpose is clear.

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

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus alternatives like 'set_text_content'. It does not explicitly state that this should be used when updating several text nodes at once, nor does it mention any exclusions or prerequisites. The user is left to infer usage from the name and schema.

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

set_paddingA

Set padding values for an auto-layout frame in Figma

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdYesThe ID of the frame to modify
paddingTopNoTop padding value
paddingRightNoRight padding value
paddingBottomNoBottom padding value
paddingLeftNoLeft padding value

TDQS

A3.5/5.0
Behavior2/5

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

With no annotations, the description carries the full burden of behavioral disclosure. It merely states the action without revealing whether padding values are merged or replaced, what happens if the node is not an auto-layout frame, or any side effects or failure modes.

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 a single, front-loaded sentence that conveys the core purpose without any wasted words. It is appropriately sized for the tool's simplicity.

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 schema covers parameter meanings, and the description states the purpose, but critical behavioral details (merge vs replace, error handling) are missing. For a mutation tool with no output schema, this is adequate but not fully complete for safe autonomous use.

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?

The input schema already describes all parameters in full (100% coverage), so the description adds little beyond identifying the target as an auto-layout frame. It does not clarify the relationship between parameters (e.g., setting only one side).

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 uses a specific verb ('Set') and resource ('padding values') with a clear target ('auto-layout frame'), distinguishing it from sibling tools like set_item_spacing or set_corner_radius. It unambiguously states the tool's function.

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

Usage Guidelines3/5

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

The description implies the tool is only for auto-layout frames, giving some context, but it does not explicitly state when to use this tool over alternatives or when not to use it. No exclusions or alternative tool references are provided.

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

set_stroke_colorB

Set the stroke color of a node in Figma

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdYesThe ID of the node to modify
rYesRed component (0-1)
gYesGreen component (0-1)
bYesBlue component (0-1)
aNoAlpha component (0-1)
weightNoStroke weight

TDQS

B3.1/5.0
Behavior2/5

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

With no annotations, the description carries the full burden of behavioral disclosure. It does not mention side effects (e.g., whether it replaces existing stroke colors), permissions, error conditions, or return values. For a mutation tool, this is a significant gap.

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

Conciseness4/5

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

The description is a single efficient sentence that earns its place. It is not overly verbose, though it could be slightly more informative without becoming bloated.

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

Completeness2/5

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

For a mutation tool with no annotations and no output schema, the description is insufficient. It does not explain what happens after the stroke color is set, whether the node must have a stroke, or any other behavioral context. The schema covers parameters, but return values and edge cases remain undocumented.

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 (nodeId, r, g, b, a, weight). The description adds no parameter-specific meaning, but per the rubric baseline 3 applies when schema coverage is high.

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 a specific action ('Set') on a specific resource ('stroke color of a node in Figma'). It distinguishes from siblings like set_fill_color by explicitly naming 'stroke color'.

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

Usage Guidelines2/5

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

No guidance is provided on when to use this tool versus alternatives such as set_fill_color, nor are any prerequisites or constraints mentioned. The description only states what it does, not when or when not to use it.

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

set_text_contentA

Set the text content of an existing text node in Figma

ParametersJSON Schema
NameRequiredDescriptionDefault
nodeIdYesThe ID of the text node to modify
textYesNew text content

TDQS

A3.5/5.0
Behavior2/5

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

No annotations are provided, so the description must disclose behavioral traits. It only states that the node must be existing, without detailing mutation effects, reversibility, permissions, or return values. This is insufficient for a write operation.

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?

A single concise sentence with no superfluous content, front-loading the action. It is appropriately sized for the tool's simplicity.

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?

For a simple setter with fully documented parameters, the description is minimally viable but lacks information on results, errors, or related tools, especially given no annotations. It is adequate but with clear gaps.

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?

The input schema already provides full descriptions for both parameters (text and nodeId), so the description adds little beyond confirming the node must be a text node. Baseline 3 applies due to 100% schema coverage.

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 identifies the action (set), the target resource (text content of an existing text node), and the context (Figma). It distinguishes from sibling tools like set_multiple_text_contents (singular vs. plural) and create_text (existing vs. new).

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

Usage Guidelines3/5

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

The description implies the tool is for modifying an existing text node, which distinguishes it from creation tools. However, it does not explicitly mention when to use it over set_multiple_text_contents or provide alternatives.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 33 tool updatesv1.0.0
    • Changedclone_node5 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / nodeId
        Added value: +{
        +  "description": "The ID of the node to clone",
        +  "type": "string"
        +}
      • addedInput schema / properties / x
        Added value: +{
        +  "description": "New X position for the clone",
        +  "type": "number"
        +}
      • addedInput schema / properties / y
        Added value: +{
        +  "description": "New Y position for the clone",
        +  "type": "number"
        +}
      • addedInput schema / required
        Added value: +[
        +  "nodeId"
        +]
    • Changedcreate_component_instance5 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / componentKey
        Added value: +{
        +  "description": "Key of the component to instantiate",
        +  "type": "string"
        +}
      • addedInput schema / properties / x
        Added value: +{
        +  "description": "X position",
        +  "type": "number"
        +}
      • addedInput schema / properties / y
        Added value: +{
        +  "description": "Y position",
        +  "type": "number"
        +}
      • addedInput schema / required
        Added value: +[
        +  "componentKey",
        +  "x",
        +  "y"
        +]
    • Changedcreate_frame22 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / counterAxisAlignItems
        Added value: +{
        +  "description": "Counter axis alignment for auto-layout frame",
        +  "enum": [
        +    "MIN",
        +    "MAX",
        +    "CENTER",
        +    "BASELINE"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / fillColor
        Added value: +{
        +  "description": "Fill color in RGBA format",
        +  "properties": {
        +    "a": {
        +      "description": "Alpha component (0-1)",
        +      "maximum": 1,
        +      "minimum": 0,
        +      "type": "number"
        +    },
        +    "b": {
        +      "description": "Blue component (0-1)",
        +      "maximum": 1,
        +      "minimum": 0,
        +      "type": "number"
        +    },
        +    "g": {
        +      "description": "Green component (0-1)",
        +      "maximum": 1,
        +      "minimum": 0,
        +      "type": "number"
        +    },
        +    "r": {
        +      "description": "Red component (0-1)",
        +      "maximum": 1,
        +      "minimum": 0,
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "r",
        +    "g",
        +    "b"
        +  ],
        +  "type": "object"
        +}
      • addedInput schema / properties / height
        Added value: +{
        +  "description": "Height of the frame",
        +  "type": "number"
        +}
      • addedInput schema / properties / itemSpacing
        Added value: +{
        +  "description": "Distance between children in auto-layout frame. Note: This value will be ignored if primaryAxisAlignItems is set to SPACE_BETWEEN.",
        +  "type": "number"
        +}
      • addedInput schema / properties / layoutMode
        Added value: +{
        +  "description": "Auto-layout mode for the frame",
        +  "enum": [
        +    "NONE",
        +    "HORIZONTAL",
        +    "VERTICAL"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / layoutSizingHorizontal
        Added value: +{
        +  "description": "Horizontal sizing mode for auto-layout frame",
        +  "enum": [
        +    "FIXED",
        +    "HUG",
        +    "FILL"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / layoutSizingVertical
        Added value: +{
        +  "description": "Vertical sizing mode for auto-layout frame",
        +  "enum": [
        +    "FIXED",
        +    "HUG",
        +    "FILL"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / layoutWrap
        Added value: +{
        +  "description": "Whether the auto-layout frame wraps its children",
        +  "enum": [
        +    "NO_WRAP",
        +    "WRAP"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / name
        Added value: +{
        +  "description": "Optional name for the frame",
        +  "type": "string"
        +}
      • addedInput schema / properties / paddingBottom
        Added value: +{
        +  "description": "Bottom padding for auto-layout frame",
        +  "type": "number"
        +}
      • addedInput schema / properties / paddingLeft
        Added value: +{
        +  "description": "Left padding for auto-layout frame",
        +  "type": "number"
        +}
      • addedInput schema / properties / paddingRight
        Added value: +{
        +  "description": "Right padding for auto-layout frame",
        +  "type": "number"
        +}
      • addedInput schema / properties / paddingTop
        Added value: +{
        +  "description": "Top padding for auto-layout frame",
        +  "type": "number"
        +}
      • addedInput schema / properties / parentId
        Added value: +{
        +  "description": "Optional parent node ID to append the frame to",
        +  "type": "string"
        +}
      • addedInput schema / properties / primaryAxisAlignItems
        Added value: +{
        +  "description": "Primary axis alignment for auto-layout frame. Note: When set to SPACE_BETWEEN, itemSpacing will be ignored as children will be evenly spaced.",
        +  "enum": [
        +    "MIN",
        +    "MAX",
        +    "CENTER",
        +    "SPACE_BETWEEN"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / strokeColor
        Added value: +{
        +  "description": "Stroke color in RGBA format",
        +  "properties": {
        +    "a": {
        +      "description": "Alpha component (0-1)",
        +      "maximum": 1,
        +      "minimum": 0,
        +      "type": "number"
        +    },
        +    "b": {
        +      "description": "Blue component (0-1)",
        +      "maximum": 1,
        +      "minimum": 0,
        +      "type": "number"
        +    },
        +    "g": {
        +      "description": "Green component (0-1)",
        +      "maximum": 1,
        +      "minimum": 0,
        +      "type": "number"
        +    },
        +    "r": {
        +      "description": "Red component (0-1)",
        +      "maximum": 1,
        +      "minimum": 0,
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "r",
        +    "g",
        +    "b"
        +  ],
        +  "type": "object"
        +}
      • addedInput schema / properties / strokeWeight
        Added value: +{
        +  "description": "Stroke weight",
        +  "exclusiveMinimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / width
        Added value: +{
        +  "description": "Width of the frame",
        +  "type": "number"
        +}
      • addedInput schema / properties / x
        Added value: +{
        +  "description": "X position",
        +  "type": "number"
        +}
      • addedInput schema / properties / y
        Added value: +{
        +  "description": "Y position",
        +  "type": "number"
        +}
      • addedInput schema / required
        Added value: +[
        +  "x",
        +  "y",
        +  "width",
        +  "height"
        +]
    • Changedcreate_rectangle8 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / height
        Added value: +{
        +  "description": "Height of the rectangle",
        +  "type": "number"
        +}
      • addedInput schema / properties / name
        Added value: +{
        +  "description": "Optional name for the rectangle",
        +  "type": "string"
        +}
      • addedInput schema / properties / parentId
        Added value: +{
        +  "description": "Optional parent node ID to append the rectangle to",
        +  "type": "string"
        +}
      • addedInput schema / properties / width
        Added value: +{
        +  "description": "Width of the rectangle",
        +  "type": "number"
        +}
      • addedInput schema / properties / x
        Added value: +{
        +  "description": "X position",
        +  "type": "number"
        +}
      • addedInput schema / properties / y
        Added value: +{
        +  "description": "Y position",
        +  "type": "number"
        +}
      • addedInput schema / required
        Added value: +[
        +  "x",
        +  "y",
        +  "width",
        +  "height"
        +]
    • Changedcreate_text10 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / fontColor
        Added value: +{
        +  "description": "Font color in RGBA format",
        +  "properties": {
        +    "a": {
        +      "description": "Alpha component (0-1)",
        +      "maximum": 1,
        +      "minimum": 0,
        +      "type": "number"
        +    },
        +    "b": {
        +      "description": "Blue component (0-1)",
        +      "maximum": 1,
        +      "minimum": 0,
        +      "type": "number"
        +    },
        +    "g": {
        +      "description": "Green component (0-1)",
        +      "maximum": 1,
        +      "minimum": 0,
        +      "type": "number"
        +    },
        +    "r": {
        +      "description": "Red component (0-1)",
        +      "maximum": 1,
        +      "minimum": 0,
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "r",
        +    "g",
        +    "b"
        +  ],
        +  "type": "object"
        +}
      • addedInput schema / properties / fontSize
        Added value: +{
        +  "description": "Font size (default: 14)",
        +  "type": "number"
        +}
      • addedInput schema / properties / fontWeight
        Added value: +{
        +  "description": "Font weight (e.g., 400 for Regular, 700 for Bold)",
        +  "type": "number"
        +}
      • addedInput schema / properties / name
        Added value: +{
        +  "description": "Semantic layer name for the text node",
        +  "type": "string"
        +}
      • addedInput schema / properties / parentId
        Added value: +{
        +  "description": "Optional parent node ID to append the text to",
        +  "type": "string"
        +}
      • addedInput schema / properties / text
        Added value: +{
        +  "description": "Text content",
        +  "type": "string"
        +}
      • addedInput schema / properties / x
        Added value: +{
        +  "description": "X position",
        +  "type": "number"
        +}
      • addedInput schema / properties / y
        Added value: +{
        +  "description": "Y position",
        +  "type": "number"
        +}
      • addedInput schema / required
        Added value: +[
        +  "x",
        +  "y",
        +  "text"
        +]
    • Changeddelete_multiple_nodes3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / nodeIds
        Added value: +{
        +  "description": "Array of node IDs to delete",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / required
        Added value: +[
        +  "nodeIds"
        +]
    • Changeddelete_node3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / nodeId
        Added value: +{
        +  "description": "The ID of the node to delete",
        +  "type": "string"
        +}
      • addedInput schema / required
        Added value: +[
        +  "nodeId"
        +]
    • Changedexport_node_as_image5 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / format
        Added value: +{
        +  "description": "Export format",
        +  "enum": [
        +    "PNG",
        +    "JPG",
        +    "SVG",
        +    "PDF"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / nodeId
        Added value: +{
        +  "description": "The ID of the node to export",
        +  "type": "string"
        +}
      • addedInput schema / properties / scale
        Added value: +{
        +  "description": "Export scale",
        +  "exclusiveMinimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / required
        Added value: +[
        +  "nodeId"
        +]
    • Changedget_annotations3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / includeCategories
        Added value: +{
        +  "default": true,
        +  "description": "Whether to include category information",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / nodeId
        Added value: +{
        +  "description": "Optional node ID to get annotations for specific node",
        +  "type": "string"
        +}
    • Changedget_document_info1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedget_local_components1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedget_node_info3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / nodeId
        Added value: +{
        +  "description": "The ID of the node to get information about",
        +  "type": "string"
        +}
      • addedInput schema / required
        Added value: +[
        +  "nodeId"
        +]
    • Changedget_nodes_info3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / nodeIds
        Added value: +{
        +  "description": "Array of node IDs to get information about",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / required
        Added value: +[
        +  "nodeIds"
        +]
    • Changedget_selection1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedget_styles1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedjoin_channel2 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / channel
        Added value: +{
        +  "default": "",
        +  "description": "The name of the channel to join",
        +  "type": "string"
        +}
    • Changedmove_node5 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / nodeId
        Added value: +{
        +  "description": "The ID of the node to move",
        +  "type": "string"
        +}
      • addedInput schema / properties / x
        Added value: +{
        +  "description": "New X position",
        +  "type": "number"
        +}
      • addedInput schema / properties / y
        Added value: +{
        +  "description": "New Y position",
        +  "type": "number"
        +}
      • addedInput schema / required
        Added value: +[
        +  "nodeId",
        +  "x",
        +  "y"
        +]
    • Changedread_my_design1 field changed
      • removedInput schema / additionalProperties
        Removed value: -false
    • Changedresize_node5 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / height
        Added value: +{
        +  "description": "New height",
        +  "exclusiveMinimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / nodeId
        Added value: +{
        +  "description": "The ID of the node to resize",
        +  "type": "string"
        +}
      • addedInput schema / properties / width
        Added value: +{
        +  "description": "New width",
        +  "exclusiveMinimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / required
        Added value: +[
        +  "nodeId",
        +  "width",
        +  "height"
        +]
    • Changedscan_nodes_by_types4 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / nodeId
        Added value: +{
        +  "description": "ID of the node to scan",
        +  "type": "string"
        +}
      • addedInput schema / properties / types
        Added value: +{
        +  "description": "Array of node types to find (e.g. ['COMPONENT', 'FRAME'])",
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / required
        Added value: +[
        +  "nodeId",
        +  "types"
        +]
    • Changedscan_text_nodes3 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / nodeId
        Added value: +{
        +  "description": "ID of the node to scan",
        +  "type": "string"
        +}
      • addedInput schema / required
        Added value: +[
        +  "nodeId"
        +]
    • Changedset_annotation7 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / annotationId
        Added value: +{
        +  "description": "The ID of the annotation to update (if updating existing annotation)",
        +  "type": "string"
        +}
      • addedInput schema / properties / categoryId
        Added value: +{
        +  "description": "The ID of the annotation category",
        +  "type": "string"
        +}
      • addedInput schema / properties / labelMarkdown
        Added value: +{
        +  "description": "The annotation text in markdown format",
        +  "type": "string"
        +}
      • addedInput schema / properties / nodeId
        Added value: +{
        +  "description": "The ID of the node to annotate",
        +  "type": "string"
        +}
      • addedInput schema / properties / properties
        Added value: +{
        +  "description": "Additional properties for the annotation",
        +  "items": {
        +    "properties": {
        +      "type": {
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "type"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / required
        Added value: +[
        +  "nodeId",
        +  "labelMarkdown"
        +]
    • Changedset_axis_align5 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / counterAxisAlignItems
        Added value: +{
        +  "description": "Counter axis alignment (MIN/MAX = top/bottom in horizontal, left/right in vertical)",
        +  "enum": [
        +    "MIN",
        +    "MAX",
        +    "CENTER",
        +    "BASELINE"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / nodeId
        Added value: +{
        +  "description": "The ID of the frame to modify",
        +  "type": "string"
        +}
      • addedInput schema / properties / primaryAxisAlignItems
        Added value: +{
        +  "description": "Primary axis alignment (MIN/MAX = left/right in horizontal, top/bottom in vertical). Note: When set to SPACE_BETWEEN, itemSpacing will be ignored as children will be evenly spaced.",
        +  "enum": [
        +    "MIN",
        +    "MAX",
        +    "CENTER",
        +    "SPACE_BETWEEN"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / required
        Added value: +[
        +  "nodeId"
        +]
    • Changedset_corner_radius5 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / corners
        Added value: +{
        +  "description": "Optional array of 4 booleans to specify which corners to round [topLeft, topRight, bottomRight, bottomLeft]",
        +  "items": {
        +    "type": "boolean"
        +  },
        +  "maxItems": 4,
        +  "minItems": 4,
        +  "type": "array"
        +}
      • addedInput schema / properties / nodeId
        Added value: +{
        +  "description": "The ID of the node to modify",
        +  "type": "string"
        +}
      • addedInput schema / properties / radius
        Added value: +{
        +  "description": "Corner radius value",
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / required
        Added value: +[
        +  "nodeId",
        +  "radius"
        +]
    • Changedset_fill_color7 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / a
        Added value: +{
        +  "description": "Alpha component (0-1)",
        +  "maximum": 1,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / b
        Added value: +{
        +  "description": "Blue component (0-1)",
        +  "maximum": 1,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / g
        Added value: +{
        +  "description": "Green component (0-1)",
        +  "maximum": 1,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / nodeId
        Added value: +{
        +  "description": "The ID of the node to modify",
        +  "type": "string"
        +}
      • addedInput schema / properties / r
        Added value: +{
        +  "description": "Red component (0-1)",
        +  "maximum": 1,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / required
        Added value: +[
        +  "nodeId",
        +  "r",
        +  "g",
        +  "b"
        +]
    • Changedset_item_spacing4 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / itemSpacing
        Added value: +{
        +  "description": "Distance between children. Note: This value will be ignored if primaryAxisAlignItems is set to SPACE_BETWEEN.",
        +  "type": "number"
        +}
      • addedInput schema / properties / nodeId
        Added value: +{
        +  "description": "The ID of the frame to modify",
        +  "type": "string"
        +}
      • addedInput schema / required
        Added value: +[
        +  "nodeId",
        +  "itemSpacing"
        +]
    • Changedset_layout_mode5 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / layoutMode
        Added value: +{
        +  "description": "Layout mode for the frame",
        +  "enum": [
        +    "NONE",
        +    "HORIZONTAL",
        +    "VERTICAL"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / layoutWrap
        Added value: +{
        +  "description": "Whether the auto-layout frame wraps its children",
        +  "enum": [
        +    "NO_WRAP",
        +    "WRAP"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / nodeId
        Added value: +{
        +  "description": "The ID of the frame to modify",
        +  "type": "string"
        +}
      • addedInput schema / required
        Added value: +[
        +  "nodeId",
        +  "layoutMode"
        +]
    • Changedset_layout_sizing5 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / layoutSizingHorizontal
        Added value: +{
        +  "description": "Horizontal sizing mode (HUG for frames/text only, FILL for auto-layout children only)",
        +  "enum": [
        +    "FIXED",
        +    "HUG",
        +    "FILL"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / layoutSizingVertical
        Added value: +{
        +  "description": "Vertical sizing mode (HUG for frames/text only, FILL for auto-layout children only)",
        +  "enum": [
        +    "FIXED",
        +    "HUG",
        +    "FILL"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / nodeId
        Added value: +{
        +  "description": "The ID of the frame to modify",
        +  "type": "string"
        +}
      • addedInput schema / required
        Added value: +[
        +  "nodeId"
        +]
    • Changedset_multiple_annotations4 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / annotations
        Added value: +{
        +  "description": "Array of annotations to apply",
        +  "items": {
        +    "properties": {
        +      "annotationId": {
        +        "description": "The ID of the annotation to update (if updating existing annotation)",
        +        "type": "string"
        +      },
        +      "categoryId": {
        +        "description": "The ID of the annotation category",
        +        "type": "string"
        +      },
        +      "labelMarkdown": {
        +        "description": "The annotation text in markdown format",
        +        "type": "string"
        +      },
        +      "nodeId": {
        +        "description": "The ID of the node to annotate",
        +        "type": "string"
        +      },
        +      "properties": {
        +        "description": "Additional properties for the annotation",
        +        "items": {
        +          "properties": {
        +            "type": {
        +              "type": "string"
        +            }
        +          },
        +          "required": [
        +            "type"
        +          ],
        +          "type": "object"
        +        },
        +        "type": "array"
        +      }
        +    },
        +    "required": [
        +      "nodeId",
        +      "labelMarkdown"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / properties / nodeId
        Added value: +{
        +  "description": "The ID of the node containing the elements to annotate",
        +  "type": "string"
        +}
      • addedInput schema / required
        Added value: +[
        +  "nodeId",
        +  "annotations"
        +]
    • Changedset_multiple_text_contents4 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / nodeId
        Added value: +{
        +  "description": "The ID of the node containing the text nodes to replace",
        +  "type": "string"
        +}
      • addedInput schema / properties / text
        Added value: +{
        +  "description": "Array of text node IDs and their replacement texts",
        +  "items": {
        +    "properties": {
        +      "nodeId": {
        +        "description": "The ID of the text node",
        +        "type": "string"
        +      },
        +      "text": {
        +        "description": "The replacement text",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "nodeId",
        +      "text"
        +    ],
        +    "type": "object"
        +  },
        +  "type": "array"
        +}
      • addedInput schema / required
        Added value: +[
        +  "nodeId",
        +  "text"
        +]
    • Changedset_padding7 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / nodeId
        Added value: +{
        +  "description": "The ID of the frame to modify",
        +  "type": "string"
        +}
      • addedInput schema / properties / paddingBottom
        Added value: +{
        +  "description": "Bottom padding value",
        +  "type": "number"
        +}
      • addedInput schema / properties / paddingLeft
        Added value: +{
        +  "description": "Left padding value",
        +  "type": "number"
        +}
      • addedInput schema / properties / paddingRight
        Added value: +{
        +  "description": "Right padding value",
        +  "type": "number"
        +}
      • addedInput schema / properties / paddingTop
        Added value: +{
        +  "description": "Top padding value",
        +  "type": "number"
        +}
      • addedInput schema / required
        Added value: +[
        +  "nodeId"
        +]
    • Changedset_stroke_color8 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / a
        Added value: +{
        +  "description": "Alpha component (0-1)",
        +  "maximum": 1,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / b
        Added value: +{
        +  "description": "Blue component (0-1)",
        +  "maximum": 1,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / g
        Added value: +{
        +  "description": "Green component (0-1)",
        +  "maximum": 1,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / nodeId
        Added value: +{
        +  "description": "The ID of the node to modify",
        +  "type": "string"
        +}
      • addedInput schema / properties / r
        Added value: +{
        +  "description": "Red component (0-1)",
        +  "maximum": 1,
        +  "minimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / properties / weight
        Added value: +{
        +  "description": "Stroke weight",
        +  "exclusiveMinimum": 0,
        +  "type": "number"
        +}
      • addedInput schema / required
        Added value: +[
        +  "nodeId",
        +  "r",
        +  "g",
        +  "b"
        +]
    • Changedset_text_content4 fields changed
      • removedInput schema / additionalProperties
        Removed value: -false
      • addedInput schema / properties / nodeId
        Added value: +{
        +  "description": "The ID of the text node to modify",
        +  "type": "string"
        +}
      • addedInput schema / properties / text
        Added value: +{
        +  "description": "New text content",
        +  "type": "string"
        +}
      • addedInput schema / required
        Added value: +[
        +  "nodeId",
        +  "text"
        +]
  2. 33 tool updates
    • First observedclone_node
    • First observedcreate_component_instance
    • First observedcreate_frame
    • First observedcreate_rectangle
    • First observedcreate_text
    • First observeddelete_multiple_nodes
    • First observeddelete_node
    • First observedexport_node_as_image
    • First observedget_annotations
    • First observedget_document_info
    • First observedget_local_components
    • First observedget_node_info
    • First observedget_nodes_info
    • First observedget_selection
    • First observedget_styles
    • First observedjoin_channel
    • First observedmove_node
    • First observedread_my_design
    • First observedresize_node
    • First observedscan_nodes_by_types
    • First observedscan_text_nodes
    • First observedset_annotation
    • First observedset_axis_align
    • First observedset_corner_radius
    • First observedset_fill_color
    • First observedset_item_spacing
    • First observedset_layout_mode
    • First observedset_layout_sizing
    • First observedset_multiple_annotations
    • First observedset_multiple_text_contents
    • First observedset_padding
    • First observedset_stroke_color
    • First observedset_text_content

TDQS

B3.1/5.0

Scored across 33 tools

Disambiguation3/5

Most tools have distinct purposes, but some overlap exists. For example, 'get_selection' and 'read_my_design' both retrieve selection information, and 'get_node_info' vs 'get_nodes_info' are similar but for single vs multiple nodes. Descriptions help clarify, but an agent might occasionally misselect between closely related tools.

Naming Consistency5/5

Tool names follow a consistent snake_case verb_noun pattern throughout, such as 'create_frame', 'delete_node', and 'set_fill_color'. The naming is predictable and readable, with no deviations in style or convention across all 33 tools.

Tool Count2/5

With 33 tools, the count is too high for a typical MCP server, making it feel heavy and potentially overwhelming. While Figma is a complex domain, this many tools suggests fragmentation rather than a well-scoped set, which could hinder agent usability.

Completeness4/5

The tool set covers a wide range of Figma operations, including creation, deletion, modification, and querying of nodes, with good lifecycle coverage. Minor gaps exist, such as no explicit tool for updating node properties beyond specific setters or handling component overrides, but agents can likely work around these.

Maintenance

ActivityInactive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers