genable-mcp 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +39 -9
- package/dist/tools-schema.json +33 -20
- package/package.json +24 -3
package/README.md
CHANGED
|
@@ -1,24 +1,52 @@
|
|
|
1
1
|
# genable-mcp
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
[](https://www.npmjs.com/package/genable-mcp)
|
|
4
|
+
[](https://www.npmjs.com/package/genable-mcp)
|
|
5
|
+
[](https://opensource.org/licenses/MIT)
|
|
6
|
+
[](https://modelcontextprotocol.io)
|
|
7
|
+
|
|
8
|
+
**The write-side MCP server for Figma.** Build, edit, restructure, and search Figma designs from Claude Code, Cursor, Cline, or any MCP-compatible client.
|
|
9
|
+
|
|
10
|
+
> Figma's official MCP is read-only — perfect for code generation. `genable-mcp` is the complement: **41 write-side tools** so an LLM can actually build and edit your designs.
|
|
4
11
|
|
|
5
12
|
## What this is
|
|
6
13
|
|
|
7
14
|
Figma's official MCP is excellent for **reading** designs (`get_design_context`, code generation). But it's mostly read-only — there's no first-class way to write to the canvas, navigate across pages, or run plugin-API code from your MCP client.
|
|
8
15
|
|
|
9
|
-
`genable-mcp` fills that gap. It exposes
|
|
16
|
+
`genable-mcp` fills that gap. It exposes **41 tools** focused on the **write** side:
|
|
10
17
|
|
|
11
|
-
- **Tree creation** — build complete subtrees with JSX-like markup (`jsx`)
|
|
18
|
+
- **Tree creation** — build complete subtrees with JSX-like markup (`jsx`), vector primitives (`create_vector`)
|
|
12
19
|
- **Property edits** — text, fills, strokes, layout, all auto-layout aware (`set_text`, `set_fill`, `set_layout`, `set_stroke`, `edit`)
|
|
13
20
|
- **Variables / tokens** — collections, modes, bindings (`create_variable`, `bind_variable`, `set_variable_mode`, etc.)
|
|
14
21
|
- **Components** — create, combine, expose props, instance (`create_component`, `add_component_prop`, `create_instance`)
|
|
15
22
|
- **Cross-page navigation** — `switch_page` (officially the painful gap)
|
|
16
|
-
- **Search & inspect** — `find_nodes`, `inspect`, `describe`, `find_references`
|
|
17
|
-
- **Visual verification** — `get_screenshot`
|
|
18
|
-
- **
|
|
23
|
+
- **Search & inspect** — `find_nodes`, `inspect`, `describe`, `find_references`, `discover_props`
|
|
24
|
+
- **Visual verification** — `get_screenshot` returns PNG as MCP image content for vision-capable models
|
|
25
|
+
- **Curated knowledge** — design `skill` / `style` / `guideline` readers built into the plugin
|
|
26
|
+
- **Agent ergonomics** — `session_note` scratchpad, `subtask` delegation, `ask_user` interactive pause
|
|
19
27
|
|
|
20
28
|
We **recommend pairing** with Figma's official MCP. They cover read-for-codegen; we cover write-and-edit. The two MCPs together give an LLM full read+write access to a Figma file.
|
|
21
29
|
|
|
30
|
+
## FAQ
|
|
31
|
+
|
|
32
|
+
**Is this an alternative to Figma's official MCP?**
|
|
33
|
+
No — it's a complement. Use both. Official MCP for "read this design → give me code". `genable-mcp` for "build / edit / restructure this design".
|
|
34
|
+
|
|
35
|
+
**What MCP clients does it work with?**
|
|
36
|
+
Any client that supports STDIO MCP servers: Claude Code, Claude Desktop, Cursor, Cline, Continue, Zed, and others.
|
|
37
|
+
|
|
38
|
+
**Does it need a Figma plugin?**
|
|
39
|
+
Yes. The plugin runs inside Figma desktop and is the only way to actually call `figma.*` API. `genable-mcp` is the bridge between your MCP client (outside Figma) and the plugin (inside Figma).
|
|
40
|
+
|
|
41
|
+
**How is this different from "Figma to code" plugins?**
|
|
42
|
+
Those plugins are one-shot exporters (Figma → React/Vue/HTML). `genable-mcp` is bidirectional and interactive — your AI agent can read, edit, verify visually, and iterate inside Figma.
|
|
43
|
+
|
|
44
|
+
**Can it build a full design from a prompt?**
|
|
45
|
+
Yes. The `jsx` tool accepts JSX-like markup and creates an entire subtree atomically. Pair with `bind_variable` for token-driven designs.
|
|
46
|
+
|
|
47
|
+
**Is it free?**
|
|
48
|
+
Yes. MIT license. The MCP server is free; the Genable plugin in Figma Community is free.
|
|
49
|
+
|
|
22
50
|
## How it works
|
|
23
51
|
|
|
24
52
|
```
|
|
@@ -97,6 +125,7 @@ Each tool's full description (parameters, examples, sandbox limits) is exposed v
|
|
|
97
125
|
|
|
98
126
|
### Tree creation
|
|
99
127
|
- `jsx` — Build a complete subtree with JSX-like markup. Single-call atomicity.
|
|
128
|
+
- `create_vector` — Create vector primitives from SVG path data.
|
|
100
129
|
|
|
101
130
|
### Read
|
|
102
131
|
- `inspect` — Read a node with selectable property facets (layout, paint, typography, etc.).
|
|
@@ -126,7 +155,7 @@ Each tool's full description (parameters, examples, sandbox limits) is exposed v
|
|
|
126
155
|
- `bind_variable` — Bind a variable to a node property.
|
|
127
156
|
|
|
128
157
|
### Knowledge readers
|
|
129
|
-
- `skill`, `style`, `
|
|
158
|
+
- `skill`, `style`, `guideline`, `help` — Curated design knowledge baked into the plugin.
|
|
130
159
|
|
|
131
160
|
### Page navigation
|
|
132
161
|
- `switch_page` — Switch active page by ID or name. Returns the full page roster.
|
|
@@ -137,9 +166,10 @@ Each tool's full description (parameters, examples, sandbox limits) is exposed v
|
|
|
137
166
|
### Interaction
|
|
138
167
|
- `ask_user` — Pause and ask the user a question (interactive client only).
|
|
139
168
|
- `subtask` — Delegate a sub-prompt to a focused agent.
|
|
169
|
+
- `session_note` — Scratchpad for the agent to record findings across a session.
|
|
140
170
|
|
|
141
|
-
###
|
|
142
|
-
- `
|
|
171
|
+
### Plugin data
|
|
172
|
+
- `read_plugin_data`, `write_plugin_data` — Persist key/value metadata on nodes via Figma's plugin-data API.
|
|
143
173
|
|
|
144
174
|
## Limitations
|
|
145
175
|
|
package/dist/tools-schema.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
[
|
|
2
2
|
{
|
|
3
3
|
"name": "jsx",
|
|
4
|
-
"description": "Create design trees with nested JSX markup. One jsx call builds a complete subtree atomically — nesting is the hierarchy. Keep a single logical unit inside one call; the returned root's children are already built, not stubs to be filled in later.\n\nExamples:\n jsx({markup: \"<frame name='Card' layout='column' padding={16} fill='#FFFFFF' w='fill' />\"})\n jsx({markup: \"<frame name='Row' layout='row' gap={8} padding={12} w='fill'><icon name='lucide:settings' size={20} /><text name='Label' w='fill'>Account</text><icon name='lucide:chevron-right' size={16} /></frame>\"})\n\nElements: frame, text, rect, ellipse, line, icon, image, instance, component, group, section, vector\nAttributes (frame): layout, justify, items, wrap, w, h, minW, maxW, p, gap, bg, fill, rounded, stroke, shadow, blur, bgblur, opacity, layoutPositioning\nAttributes (text): size, weight, lineHeight, font, fill, w (w=\"fill\" for wrap), maxLines, textTruncation\nEffects: shadow=\"0,8,32,0,#0006\" or shadow={shadow(0,8,32,0,'#0006')}; blur={10} for layer blur; bgblur={20} for frosted-glass/glassmorphism background blur. Multiple effects merge automatically.\nDecoration in auto-layout: floating orbs/blobs/decorative shapes inside a row/column parent need layoutPositioning=\"absolute\" so they don't get stacked into the main-axis flow.\nFull-frame backgrounds: set the parent frame's bg directly (
|
|
4
|
+
"description": "Create design trees with nested JSX markup. One jsx call builds a complete subtree atomically — nesting is the hierarchy. Keep a single logical unit inside one call; the returned root's children are already built, not stubs to be filled in later.\n\nExamples:\n jsx({markup: \"<frame name='Card' layout='column' padding={16} fill='#FFFFFF' w='fill' />\"})\n jsx({markup: \"<frame name='Row' layout='row' gap={8} padding={12} w='fill'><icon name='lucide:settings' size={20} /><text name='Label' w='fill'>Account</text><icon name='lucide:chevron-right' size={16} /></frame>\"})\n\nElements: frame, text, rect, ellipse, line, icon, image, instance, component, group, section, vector\nAttributes (frame): layout, justify, items, wrap, w, h, minW, maxW, p, gap, bg, fill, rounded, stroke, shadow, blur, bgblur, opacity, layoutPositioning\nAttributes (text): size, weight, lineHeight, font, fill, w (w=\"fill\" for wrap), maxLines, textTruncation\nEffects: shadow=\"0,8,32,0,#0006\" or shadow={shadow(0,8,32,0,'#0006')}; blur={10} for layer blur; bgblur={20} for frosted-glass/glassmorphism background blur. Multiple effects merge automatically.\nDecoration in auto-layout: floating orbs/blobs/decorative shapes inside a row/column parent need layoutPositioning=\"absolute\" so they don't get stacked into the main-axis flow.\nFull-frame backgrounds: set the parent frame's bg directly. Don't add a separate <rect> backdrop. Supported gradient strings (CSS-like subset, not full CSS):\n - linear-gradient(<angle>deg, <#hex> <pos>%, ...) e.g. \"linear-gradient(135deg, #A 0%, #B 100%)\"\n - linear-gradient(to <direction>, <stops>) directions: top/right/bottom/left and corners (e.g. \"to bottom right\")\n - radial-gradient(<stops>) centered, ellipse-fill — no position/shape modifiers\n - radial-gradient(circle, <stops>) centered, circle shape only\n - conic-gradient(from <angle>deg, <stops>)\n Unsupported (will be rejected): \"circle at X% Y%\", \"ellipse at ...\", \"X% Y%\" position syntax, named colors (red/blue/...), hsl(), and numeric stops without a percent sign.\nText: <text size={24}>content here</text>\nInstance: <instance ref=\"Button\" variant=\"Size=Large\"/>\nSelf-closing: <line w=\"fill\" stroke=\"#E5E7EB\"/> (use line for dividers/separators; rect/ellipse for SMALL pure decoration with no children — page-level backgrounds belong on the parent frame's bg)\nArc/Ring: <ellipse w={120} h={120} arc=\"0 270\" fill=\"#4F46E5\"/> (arc=\"start end innerRadius?\" — innerRadius 0-1 makes a donut/ring)\nGrid layout: call help({ name: \"grid-layout\" }) for tracks, gaps, and when row/column is a better fit\nVariable binding: fill/bg/stroke accept qualified bare-name token strings (e.g. bg=\"$Theme/Bg/Surface\"). Object literals (fill={{variable_id:...}}) drop the binding silently — always use the string form.\n\nSwap an existing subtree: jsx({replaceId: \"<id>\", markup: \"...\"}) replaces the old node at the same parent and sibling index atomically, preserving position in one call. Markup must have a single root. Use jsx for tree creation; edit for property updates on known nodes.",
|
|
5
5
|
"parameters": {
|
|
6
6
|
"type": "object",
|
|
7
7
|
"properties": {
|
|
@@ -335,7 +335,7 @@
|
|
|
335
335
|
},
|
|
336
336
|
{
|
|
337
337
|
"name": "style",
|
|
338
|
-
"description": "Load a visual style preset — color tokens, typography, shape, depth.
|
|
338
|
+
"description": "Load a visual style preset as INSPIRATION — color tokens, typography, shape, depth. Treat as a reference library, not a cage: pick one wholesale, mix elements, or invent your own. You are not restricted to the menu.\n\nExample: style({ name: \"neon-cyber\" })",
|
|
339
339
|
"parameters": {
|
|
340
340
|
"type": "object",
|
|
341
341
|
"properties": {
|
|
@@ -349,22 +349,6 @@
|
|
|
349
349
|
]
|
|
350
350
|
}
|
|
351
351
|
},
|
|
352
|
-
{
|
|
353
|
-
"name": "anatomy",
|
|
354
|
-
"description": "Load a component anatomy reference — structural blueprint of a UI component (parts, slots, hierarchy). Use before building complex components.\n\nExample: anatomy({ name: \"data-table\" })",
|
|
355
|
-
"parameters": {
|
|
356
|
-
"type": "object",
|
|
357
|
-
"properties": {
|
|
358
|
-
"name": {
|
|
359
|
-
"type": "string",
|
|
360
|
-
"description": "The anatomy name exactly as it appears in the KNOWLEDGE LIBRARY menu — no \"anatomy:\" prefix, no quotes."
|
|
361
|
-
}
|
|
362
|
-
},
|
|
363
|
-
"required": [
|
|
364
|
-
"name"
|
|
365
|
-
]
|
|
366
|
-
}
|
|
367
|
-
},
|
|
368
352
|
{
|
|
369
353
|
"name": "guideline",
|
|
370
354
|
"description": "Load a page-type design guideline — layout patterns for landing pages, dashboards, login flows, forms, etc.\n\nExample: guideline({ name: \"form\" })",
|
|
@@ -793,7 +777,7 @@
|
|
|
793
777
|
},
|
|
794
778
|
{
|
|
795
779
|
"name": "set_fill",
|
|
796
|
-
"description": "Set fill or background color on a node.\n\n set_fill({node: \"1:2\", bg: \"#F5F5F5\"})\n set_fill({node: \"1:2\", fill: \"#333333\"})\n set_fill({node: \"1:2\", bg: \"linear-gradient(135deg, #8B5CF6 0%, #F97316 100%)\"})\n\n // Batch — bulk paint update in one call:\n set_fill({nodes: [{node: \"1:2\", bg: \"#FFF\"}, {node: \"1:3\", bg: \"#F5F5F5\"}]})\n\nfill = text color or shape fill. bg = frame background.\nFor stroke color, use set_stroke.\n\nAccepted color formats (for fill or bg):\n hex \"#FFF\", \"#F5F5F5\"\n gradient string \"linear-gradient(angle,
|
|
780
|
+
"description": "Set fill or background color on a node.\n\n set_fill({node: \"1:2\", bg: \"#F5F5F5\"})\n set_fill({node: \"1:2\", fill: \"#333333\"})\n set_fill({node: \"1:2\", bg: \"linear-gradient(135deg, #8B5CF6 0%, #F97316 100%)\"})\n\n // Batch — bulk paint update in one call:\n set_fill({nodes: [{node: \"1:2\", bg: \"#FFF\"}, {node: \"1:3\", bg: \"#F5F5F5\"}]})\n\nfill = text color or shape fill. bg = frame background.\nFor stroke color, use set_stroke.\n\nAccepted color formats (for fill or bg):\n hex \"#FFF\", \"#F5F5F5\"\n gradient string CSS-like subset, not full CSS:\n \"linear-gradient(<angle>deg, <#hex> <pos>%, ...)\"\n \"linear-gradient(to <direction>, ...)\" directions: top/right/bottom/left + corners\n \"radial-gradient(<stops>)\" centered, no position/shape modifiers\n \"radial-gradient(circle, <stops>)\" circle shape only\n \"conic-gradient(from <angle>deg, ...)\"\n Rejected: \"circle at X% Y%\", \"ellipse at ...\", named colors, hsl().\n variable token qualified bare name \"$Surface/Card\"\n transparent \"transparent\" (bg only)",
|
|
797
781
|
"parameters": {
|
|
798
782
|
"type": "object",
|
|
799
783
|
"properties": {
|
|
@@ -823,7 +807,7 @@
|
|
|
823
807
|
},
|
|
824
808
|
{
|
|
825
809
|
"name": "set_stroke",
|
|
826
|
-
"description": "Set stroke (border) on a node.\n\n set_stroke({node: \"1:2\", stroke: \"1 #E0E0E0\"})\n set_stroke({node: \"1:2\", stroke: \"2 #333 inside\"})\n set_stroke({node: \"1:2\", color: \"#E0E0E0\", weight: 1, align: \"inside\"})\n set_stroke({node: \"1:2\", color: \"linear-gradient(90deg, #8B5CF6 0%, #F97316 100%)\", weight: 1.5, align: \"inside\"})\n\n // Batch — bulk stroke update in one call:\n set_stroke({nodes: [{node: \"1:2\", color: \"#E0E0E0\", weight: 1}, {node: \"1:3\", color: \"#333\", weight: 2}]})\n\nShorthand: \"weight color align\" (e.g. \"1 #E0E0E0 inside\"). Hex only in shorthand.\n\nAccepted color formats (for the explicit `color` field, not the shorthand):\n hex \"#E0E0E0\"\n gradient string \"linear-gradient(angle,
|
|
810
|
+
"description": "Set stroke (border) on a node.\n\n set_stroke({node: \"1:2\", stroke: \"1 #E0E0E0\"})\n set_stroke({node: \"1:2\", stroke: \"2 #333 inside\"})\n set_stroke({node: \"1:2\", color: \"#E0E0E0\", weight: 1, align: \"inside\"})\n set_stroke({node: \"1:2\", color: \"linear-gradient(90deg, #8B5CF6 0%, #F97316 100%)\", weight: 1.5, align: \"inside\"})\n\n // Batch — bulk stroke update in one call:\n set_stroke({nodes: [{node: \"1:2\", color: \"#E0E0E0\", weight: 1}, {node: \"1:3\", color: \"#333\", weight: 2}]})\n\nShorthand: \"weight color align\" (e.g. \"1 #E0E0E0 inside\"). Hex only in shorthand.\n\nAccepted color formats (for the explicit `color` field, not the shorthand):\n hex \"#E0E0E0\"\n gradient string CSS-like subset (see set_fill description for full grammar — same rules).\n Common: \"linear-gradient(<angle>deg, <#hex> <pos>%, ...)\", \"radial-gradient(<stops>)\".\n Rejected: \"circle at X% Y%\", named colors, hsl().\n variable token qualified bare name \"$Border/Default\"\n\nTo bind a variable to the stroke color, use the explicit `color` field — the shorthand parser silently drops bare-name tokens.",
|
|
827
811
|
"parameters": {
|
|
828
812
|
"type": "object",
|
|
829
813
|
"properties": {
|
|
@@ -1216,5 +1200,34 @@
|
|
|
1216
1200
|
"prompt"
|
|
1217
1201
|
]
|
|
1218
1202
|
}
|
|
1203
|
+
},
|
|
1204
|
+
{
|
|
1205
|
+
"name": "session_note",
|
|
1206
|
+
"description": "Read / write your own session scratchpad. Persists across turns within one design session (\"New Design\" resets it). Notes are how state carries from this turn into the next — the next session loads them as context.\n\nActions:\n action: \"read\" → read({key}) returns the current value (empty string if unset)\n action: \"write\" → write({key, value}) replaces or deletes (pass value:\"\" to delete)\n action: \"list\" → list({}) returns [{key, chars}] for all existing notes\n\nSlots — FORWARD-LOOKING (what we plan / commit to):\n - plan — this turn's intent + step outline (write at turn start)\n - decisions — locked choices: style picked + reason, accent token, font scale, hero treatment, etc. (write BEFORE jsx)\n - brand — durable brand notes pulled from a project design.md (if user supplied one)\n - todo — TRULY unfinished work for the next turn (omit if everything shipped)\n\nSlots — BACKWARD-LOOKING (what happened, write AT TURN END):\n - failures — tool calls that failed this turn + how you worked around them.\n Example: \"jsx items='stretch' rejected (DSL valid: center|start|end|space-between|baseline); retried with 'center'.\"\n If a failure repeats a class you've seen before, name the class.\n - gotchas — validator warnings you noticed but chose not to fix + why.\n Example: \"4 LOW_CONTRAST on nav links (2.5:1) — deliberate for ambient-grey style; revisit if user complains.\"\n Also: magic numbers / hand-tuned positions and what motivated them.\n Example: \"Glow ellipses at (-180, 220) / (1060, 70) — placed half outside frame to bleed in.\"\n - learnings — surprises about this codebase / DSL / Figma API.\n Example: \"radial-gradient(circle at X% Y%) rejected — DSL only takes the simple form. Same trap as CSS-prior bleed elsewhere.\"\n\nREQUIRED behavior:\n - First turn: write at least `decisions` BEFORE any jsx (commit-before-act).\n - Every turn end: write at least ONE of `failures / gotchas / learnings` if ANY of these happened this turn:\n • a tool call returned an error\n • a tool call returned warnings you chose not to fix\n • you hand-tuned a coordinate / size / color away from a value the model would have picked\n • you found a DSL behavior that surprised you\n \"All clean, no carry-over\" is almost never accurate — at least one backward slot belongs.\n - jsx that uses a color / font / size should round-trip through `decisions` (token traceability).\n\nExamples:\n session_note({action: \"write\", key: \"decisions\", value: \"Style: fintech-dark.\\nAccent: #3B82F6 (style.accent — NOT indigo).\\nFont: Space Grotesk display / Inter body.\\nHero treatment: split (overrides anatomy VERTICAL — desktop convention).\\nH1 size: 32 (style.display).\"})\n session_note({action: \"write\", key: \"failures\", value: \"jsx #6 align='stretch' rejected (DSL valid: center|start|end|space-between|baseline) — retried with 'center'. Same CSS-prior class as gradient: model has CSS values that DSL doesn't accept.\"})\n session_note({action: \"write\", key: \"gotchas\", value: \"8 LOW_CONTRAST warnings on nav links + secondary CTA (2.5:1 against dark bg). Left as-is — user prompt didn't require WCAG pass; flagging in case next iteration tightens contrast.\"})\n session_note({action: \"write\", key: \"learnings\", value: \"layoutPositioning='absolute' children render correctly inside auto-layout frame, but parent needs clipsContent=true to suppress overflow on big glow ellipses.\"})\n session_note({action: \"read\", key: \"decisions\"})\n session_note({action: \"list\"})",
|
|
1207
|
+
"parameters": {
|
|
1208
|
+
"type": "object",
|
|
1209
|
+
"properties": {
|
|
1210
|
+
"action": {
|
|
1211
|
+
"type": "string",
|
|
1212
|
+
"enum": [
|
|
1213
|
+
"read",
|
|
1214
|
+
"write",
|
|
1215
|
+
"list"
|
|
1216
|
+
],
|
|
1217
|
+
"description": "read | write | list"
|
|
1218
|
+
},
|
|
1219
|
+
"key": {
|
|
1220
|
+
"type": "string",
|
|
1221
|
+
"description": "Note key. Required for read/write. Recommended slots: plan, decisions, brand, todo."
|
|
1222
|
+
},
|
|
1223
|
+
"value": {
|
|
1224
|
+
"type": "string",
|
|
1225
|
+
"description": "Markdown body for write. Pass \"\" to delete. Ignored for read/list."
|
|
1226
|
+
}
|
|
1227
|
+
},
|
|
1228
|
+
"required": [
|
|
1229
|
+
"action"
|
|
1230
|
+
]
|
|
1231
|
+
}
|
|
1219
1232
|
}
|
|
1220
1233
|
]
|
package/package.json
CHANGED
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "genable-mcp",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"mcpName": "io.github.muse40007/genable-mcp",
|
|
5
|
+
"description": "Write-side MCP server for Figma — build, edit, restructure, and search Figma designs from Claude Code, Cursor, Cline, or any MCP client. Complements Figma's official MCP (which is read-only). 41 tools covering tree creation (JSX), variables/tokens, components, cross-page navigation, and visual verification.",
|
|
6
|
+
"author": "musec <muse40007@gmail.com>",
|
|
7
|
+
"bugs": {
|
|
8
|
+
"url": "https://github.com/muse40007/figma-ai-generator-dogfood/issues"
|
|
9
|
+
},
|
|
5
10
|
"main": "dist/index.js",
|
|
6
11
|
"bin": {
|
|
7
12
|
"genable-mcp": "dist/index.js"
|
|
@@ -20,12 +25,28 @@
|
|
|
20
25
|
},
|
|
21
26
|
"keywords": [
|
|
22
27
|
"figma",
|
|
28
|
+
"figma-mcp",
|
|
29
|
+
"figma-plugin",
|
|
30
|
+
"figma-api",
|
|
31
|
+
"figma-write",
|
|
23
32
|
"mcp",
|
|
33
|
+
"mcp-server",
|
|
24
34
|
"model-context-protocol",
|
|
25
|
-
"figma-plugin",
|
|
26
35
|
"ai",
|
|
36
|
+
"ai-agent",
|
|
37
|
+
"llm",
|
|
38
|
+
"claude",
|
|
27
39
|
"claude-code",
|
|
40
|
+
"claude-desktop",
|
|
28
41
|
"cursor",
|
|
42
|
+
"cline",
|
|
43
|
+
"design-system",
|
|
44
|
+
"design-tokens",
|
|
45
|
+
"design-automation",
|
|
46
|
+
"ui-generation",
|
|
47
|
+
"generative-ui",
|
|
48
|
+
"jsx",
|
|
49
|
+
"anthropic",
|
|
29
50
|
"genable"
|
|
30
51
|
],
|
|
31
52
|
"engines": {
|