用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/Aradotso/design-skills --skill talktofigma-desktop-mcp命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
AI-powered Figma enhancement toolkit with MCP integration for design automation, icon management, and creative workflows
AI SDLC patterns catalog for working effectively with AI coding agents
Decode Figma's binary Kiwi wire protocol to extract scenegraph, SVGs, and CSS from WebSocket frames, and write mutations back to live files.
基于 SOC 职业分类
正在显示 SKILL.md
| name | talktofigma-desktop-mcp |
| description | Bridge Figma designs with AI assistants using TalkToFigma Desktop via Model Context Protocol |
| triggers | ["connect to figma designs","read figma file layers","modify figma components","extract design tokens from figma","sync figma with ai tools","access figma via mcp","talk to figma desktop","integrate figma with cursor"] |
Skill by ara.so — Design Skills collection.
TalkToFigma Desktop is a cross-platform desktop application that bridges Figma and AI coding assistants through the Model Context Protocol (MCP). It provides 50+ MCP tools for reading and manipulating Figma designs, enabling AI agents to directly interact with design files through a WebSocket server and stdio-based MCP servers.
MCP Client (Cursor/Claude Code) → stdio MCP Server → WebSocket (port 3055) → Desktop App → Figma Plugin
The desktop app manages:
Download from GitHub Releases:
TalkToFigma-v*.*.*.zip (Universal binary)TalkToFigma-v*.*.*.exeFirst run on macOS: Right-click app → "Open" → "Open" (bypass Gatekeeper)
First run on Windows: SmartScreen → "More info" → "Run anyway"
Install the Talk to Figma MCP Plugin from Figma Community.
For Cursor, Claude Code, or VS Code with Cline:
macOS (~/Library/Application Support/Cursor/User/globalStorage/saoudrizwan.claude-dev/settings/cline_mcp_settings.json):
{
"mcpServers": {
"TalkToFigmaDesktop": {
"command": "node",
"args": [
"/Users/yourname/Library/Application Support/TalkToFigma/mcp-server.cjs"
]
}
}
}
Windows Direct Install (%APPDATA%\Cursor\User\globalStorage\saoudrizwan.claude-dev\settings\cline_mcp_settings.json):
{
"mcpServers": {
"TalkToFigmaDesktop": {
"command": "node",
"args": [
"%APPDATA%\\TalkToFigma\\mcp-server.cjs"
]
}
}
}
Windows Store/MSIX: Use the exact path from Settings page (usually under %LOCALAPPDATA%\Packages\...\LocalCache\Roaming\TalkToFigma\mcp-server.cjs)
join_channelJoin a Figma file channel to start interacting with it.
Parameters:
channel (string): Format {file_key}:{page_id}:{view_id}Usage:
// Extract from Figma URL: https://www.figma.com/design/ABC123/Project?node-id=1-2&t=xyz
// Format: ABC123:1:2
await use_mcp_tool("TalkToFigmaDesktop", "join_channel", {
channel: "ABC123:1:2"
});
leave_channelLeave the current Figma file channel.
await use_mcp_tool("TalkToFigmaDesktop", "leave_channel", {});
get_current_pageGet the currently active page in Figma.
const page = await use_mcp_tool("TalkToFigmaDesktop", "get_current_page", {});
// Returns: { id: "1:2", name: "Page 1", type: "PAGE" }
get_node_by_idRetrieve a specific node by its ID.
const node = await use_mcp_tool("TalkToFigmaDesktop", "get_node_by_id", {
nodeId: "123:456"
});
// Returns complete node data including children, properties, styles
get_all_nodesGet all nodes in the current page with optional filtering.
const allFrames = await use_mcp_tool("TalkToFigmaDesktop", "get_all_nodes", {
type: "FRAME"
});
const allComponents = await use_mcp_tool("TalkToFigmaDesktop", "get_all_nodes", {
type: "COMPONENT"
});
search_nodesSearch for nodes by name or type.
const buttons = await use_mcp_tool("TalkToFigmaDesktop", "search_nodes", {
query: "Button",
type: "COMPONENT"
});
get_selectionGet currently selected nodes in Figma.
const selection = await use_mcp_tool("TalkToFigmaDesktop", "get_selection", {});
// Returns: [{ id: "123:456", name: "Selected Frame", type: "FRAME" }]
create_rectangleCreate a rectangle node.
await use_mcp_tool("TalkToFigmaDesktop", "create_rectangle", {
name: "Background",
x: 0,
y: 0,
width: 375,
height: 812,
fills: JSON.stringify([{
type: "SOLID",
color: { r: 0.95, g: 0.95, b: 0.95 }
}])
});
create_frameCreate a frame container.
await use_mcp_tool("TalkToFigmaDesktop", "create_frame", {
name: "Mobile Screen",
x: 100,
y: 100,
width: 375,
height: 812
});
create_textCreate a text node.
await use_mcp_tool("TalkToFigmaDesktop", "create_text", {
name: "Heading",
characters: "Welcome to TalkToFigma",
x: 20,
y: 40,
fontSize: 24,
fontName: JSON.stringify({ family: "Inter", style: "Bold" })
});
create_componentCreate a reusable component.
await use_mcp_tool("TalkToFigmaDesktop", "create_component", {
name: "Button/Primary",
x: 0,
y: 0,
width: 120,
height: 44
});
set_propertiesModify properties of existing nodes.
await use_mcp_tool("TalkToFigmaDesktop", "set_properties", {
nodeId: "123:456",
properties: JSON.stringify({
name: "Updated Button",
x: 50,
y: 50,
fills: [{
type: "SOLID",
color: { r: 0.2, g: 0.4, b: 0.8 }
}]
})
});
delete_nodeDelete a node by ID.
await use_mcp_tool("TalkToFigmaDesktop", "delete_node", {
nodeId: "123:456"
});
set_auto_layoutApply auto layout to a frame.
await use_mcp_tool("TalkToFigmaDesktop", "set_auto_layout", {
nodeId: "123:456",
mode: "VERTICAL",
padding: 16,
spacing: 12,
primaryAxisAlignItems: "MIN",
counterAxisAlignItems: "CENTER"
});
group_nodesGroup multiple nodes together.
await use_mcp_tool("TalkToFigmaDesktop", "group_nodes", {
nodeIds: JSON.stringify(["123:456", "123:457", "123:458"]),
name: "Button Group"
});
get_local_paint_stylesGet all local color styles.
const colors = await use_mcp_tool("TalkToFigmaDesktop", "get_local_paint_styles", {});
// Returns: [{ id: "S:...", name: "Primary/Blue", paints: [...] }]
get_local_text_stylesGet all local text styles.
const textStyles = await use_mcp_tool("TalkToFigmaDesktop", "get_local_text_styles", {});
// Returns: [{ id: "S:...", name: "Heading/H1", fontSize: 32, ... }]
create_paint_styleCreate a new color style.
await use_mcp_tool("TalkToFigmaDesktop", "create_paint_style", {
name: "Brand/Primary",
paints: JSON.stringify([{
type: "SOLID",
color: { r: 0.2, g: 0.4, b: 0.8 }
}])
});
apply_paint_styleApply a color style to a node.
await use_mcp_tool("TalkToFigmaDesktop", "apply_paint_style", {
nodeId: "123:456",
styleId: "S:abc123..."
});
export_nodeExport a node as an image.
const imageData = await use_mcp_tool("TalkToFigmaDesktop", "export_node", {
nodeId: "123:456",
format: "PNG",
scale: 2
});
// Returns base64-encoded image data
get_image_fillsGet image fill data from nodes.
const images = await use_mcp_tool("TalkToFigmaDesktop", "get_image_fills", {
nodeId: "123:456"
});
// 1. Join the Figma file
await use_mcp_tool("TalkToFigmaDesktop", "join_channel", {
channel: "FILE_KEY:PAGE_ID:VIEW_ID"
});
// 2. Get all color styles
const colors = await use_mcp_tool("TalkToFigmaDesktop", "get_local_paint_styles", {});
// 3. Get all text styles
const typography = await use_mcp_tool("TalkToFigmaDesktop", "get_local_text_styles", {});
// 4. Convert to design tokens
const tokens = {
colors: colors.map(style => ({
name: style.name.replace(/\//g, '-'),
value: rgbToHex(style.paints[0].color)
})),
typography: typography.map(style => ({
name: style.name.replace(/\//g, '-'),
fontSize: style.fontSize,
fontFamily: style.fontName.family,
fontWeight: style.fontName.
}))
};
// 1. Search for all components
const components = await use_mcp_tool("TalkToFigmaDesktop", "get_all_nodes", {
type: "COMPONENT"
});
// 2. For each component, get detailed properties
for (const comp of components) {
const details = await use_mcp_tool("TalkToFigmaDesktop", "get_node_by_id", {
nodeId: comp.id
});
// 3. Generate React component code
const componentCode = generateReactComponent(details);
// Write to file system...
}
// 1. Get current selection in Figma
const selection = await use_mcp_tool("TalkToFigmaDesktop", "get_selection", {});
// 2. For each selected node
for (const node of selection) {
const nodeData = await use_mcp_tool("TalkToFigmaDesktop", "get_node_by_id", {
nodeId: node.id
});
// 3. Update corresponding code file
const cssProperties = {
width: `${nodeData.width}px`,
height: `${nodeData.height}px`,
backgroundColor: rgbToHex(nodeData.fills[0].color),
borderRadius: `${nodeData.cornerRadius}px`
};
// Update CSS/styled-components...
}
// 1. Join channel
await use_mcp_tool("TalkToFigmaDesktop", "join_channel", {
channel: "FILE_KEY:PAGE_ID:VIEW_ID"
});
// 2. Create mobile frame
await use_mcp_tool("TalkToFigmaDesktop", "create_frame", {
name: "Mobile/Login",
x: 0,
y: 0,
width: 375,
height: 812
});
// 3. Get the created frame
const frames = await use_mcp_tool("TalkToFigmaDesktop", "search_nodes", {
query: "Mobile/Login",
type: "FRAME"
});
const frameId = frames[0].id;
// 4. Set auto layout
await use_mcp_tool("TalkToFigmaDesktop", "set_auto_layout", {
nodeId: frameId,
mode: "VERTICAL",
padding: 24,
spacing: 16
});
// 5. Add heading
await use_mcp_tool("TalkToFigmaDesktop", "create_text", {
: ,
: ,
: ,
: .({ : , : })
});
TalkToFigma Desktop doesn't require API keys, but the stdio server path varies by platform:
# macOS
TALKTOFIGMA_STDIO_PATH="$HOME/Library/Application Support/TalkToFigma/mcp-server.cjs"
# Windows (Direct Install)
TALKTOFIGMA_STDIO_PATH="%APPDATA%\TalkToFigma\mcp-server.cjs"
# Windows (Store/MSIX)
# Check Settings page for exact path under LocalCache
Default port: 3055
To verify the server is running:
# macOS/Linux
lsof -i :3055
# Windows
netstat -ano | findstr :3055
Each AI client spawns its own stdio server process. All connect to the same WebSocket server (port 3055).
Cursor config (~/.cursor/mcp.json):
{
"mcpServers": {
"TalkToFigmaDesktop": {
"command": "node",
"args": ["/path/to/mcp-server.cjs"]
}
}
}
Claude Code config (~/.claude/mcp.json):
{
"mcpServers": {
"TalkToFigmaDesktop": {
"command": "node",
"args": ["/path/to/mcp-server.cjs"]
}
}
}
Check logs:
Common issues:
macOS port check:
lsof -i :3055
kill -9 <PID>
Windows port check:
netstat -ano | findstr :3055
taskkill /PID <PID> /F
Verify:
Reset connection:
Check stdio path:
macOS:
ls -la ~/Library/Application\ Support/TalkToFigma/mcp-server.cjs
Windows:
dir "%APPDATA%\TalkToFigma\mcp-server.cjs"
If missing:
Always call join_channel before any other operations:
// Extract channel from Figma URL
// https://www.figma.com/design/ABC123/Project?node-id=1-2
const channel = "ABC123:1:2";
await use_mcp_tool("TalkToFigmaDesktop", "join_channel", { channel });
// Now other operations work
const page = await use_mcp_tool("TalkToFigmaDesktop", "get_current_page", {});
Figma node IDs use format 123:456. Extract from:
figma.currentPage.selection[0].idnode-id=123-456 → convert to 123:456// Convert URL format to ID format
const nodeId = urlNodeId.replace(/-/g, ':'); // "123-456" → "123:456"
# Clone repository
git clone https://github.com/grab/TalkToFigmaDesktop.git
cd TalkToFigmaDesktop
# Install dependencies
npm install
# Development mode
npm start
# Build package
npm run package
# Create installer
npm run make
Output locations:
out/TalkToFigma-{platform}-{arch}/out/make/| Tool | Purpose | Key Parameters |
|---|---|---|
join_channel | Connect to Figma file | channel |
get_current_page | Get active page | - |
get_node_by_id | Fetch node details | nodeId |
get_all_nodes | List all nodes | type (optional) |
search_nodes | Search by name/type | query, type |
get_selection | Get selected nodes | - |
create_rectangle | Create rectangle | x, y, width, height |
create_frame | Create frame | x, y, width, height |
create_text | Create text | characters, fontSize |
create_component | Create component | name, width, height |
set_properties | Update node | nodeId, properties |
delete_node | Remove node | nodeId |
set_auto_layout | Apply auto layout | nodeId, mode, padding |
get_local_paint_styles | Get color styles | - |
get_local_text_styles | Get text styles | - |
Full tool list available in desktop app Terminal logs on startup.
export_node |
| Export as image |
nodeId, format, scale |