smart-figma-mcp
Reads Figma nodes via the Figma REST API, compiles Figma components to Tailwind/CSS, performs variant mapping, and can fetch raw Figma nodes.
Scans local MUI component library and maps Figma designs to MUI components using component metadata.
Integrates OpenAI as a BYOK LLM provider for semantic and visual compilation paths.
Scans local shadcn/ui components and auto-aligns cva variant definitions, enabling variant-level mapping from Figma designs to shadcn/ui components.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@smart-figma-mcpMap this Figma frame to our shadcn/ui components and write the files."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
smart-figma-mcp
Map Figma designs to your local component library — shadcn/ui, antd, mui, or Astryx — generate code, and write files.
BYOK · Variant-level mapping · Deterministic write · Zero external dependencies
Why smart-figma-mcp?
When you paste a Figma link into Cursor / Claude Code / Codex, AI doesn't know your project components. It generates raw <div> soup every time — wrong styles, no variants, garbage data-node-id attributes. Ask for a <Button variant="ghost-primary"> and you'll get a prop that doesn't exist.
smart-figma-mcp bridges this gap:
Figma Official MCP | smart-figma-mcp | |
Read Figma / suggest mapping | ✅ Native | ✅ |
Write to your codebase | ❌ | ✅ Deterministic write |
Variant mapping (zero config) | ❌ (needs Code Connect) | ✅ shadcn/ui + cva auto-align |
Authoritative component contract | ❌ | ✅ shadcn/ui, antd, mui, Astryx (166 components) |
Token cost attribution | Unclear | ✅ BYOK — key-validated, no server token spend |
data-node-id cleanup | ❌ | ✅ Stripped on save |
We don't compete on "read and suggest". We win on "write and land".
Related MCP server: Component MCP Server
Design-System Contract Engines
The core problem with AI-generated UI isn't layout — it's that the model
guesses at your component API. smart-figma-mcp resolves variants against a
real source of truth instead, and each supported library has its own engine:
Library | Contract source | How variants are resolved |
shadcn/ui |
| Parsed from the variant definition by |
radix-ui | local | Primitives + your own wrappers |
antd / mui | shipped |
|
Astryx (Meta) | CLI JSON contract |
|
Astryx: zero-hallucination mapping
Astryx is Meta's open-source design
system, built to be consumed by AI agents. It publishes its component API as
JSON, so smart-figma-mcp can validate props deterministically instead of
inferring them:
npm install @astryxdesign/core @stylexjs/stylex
npm install -D @astryxdesign/cli{
"name": "Button",
"importPath": "@astryxdesign/core/Button",
"variants": {
"variant": ["primary", "secondary", "ghost", "destructive"],
"size": ["sm", "md", "lg"],
"elevation": ["none", "low", "med", "high"]
},
"requiredProps": ["label"]
}That variants map is the shipped contract, not a scrape — so
variant="ghost-primary" is rejected because it genuinely isn't in the enum,
not because a heuristic guessed wrong.
Two properties worth knowing:
Beta-contained. Astryx is v0.x and may break between minors. Contract
reads are cached per CLI version, and any failure degrades to "no Astryx
components" — it never breaks component scanning for your other libraries.
Lazy by design. The 166-component index is enumerated once; props are
fetched per component on demand rather than all up front.
Quick Start (5 minutes)
npx smart-figma-mcpIDE Setup
smart-figma-mcp uses MCP (Model Context Protocol). Add this to your IDE's MCP config:
Cursor / Kiro / Windsurf — same JSON, different config paths:
IDE | Config File |
Cursor |
|
Kiro |
|
Windsurf |
|
{
"mcpServers": {
"smart-figma": {
"command": "npx",
"args": ["smart-figma-mcp"],
"env": {
"SMART_FIGMA_LICENSE": "<your-license-token>",
"FIGMA_ACCESS_TOKEN": "<your-figma-personal-access-token>",
"LLM_PROVIDER": "anthropic",
"LLM_API_KEY": "sk-..."
}
}
}
}Codex CLI / IDE extension — config is TOML, not JSON. Add a[mcp_servers.smart-figma] table to ~/.codex/config.toml (or.codex/config.toml in a trusted project):
[mcp_servers.smart-figma]
command = "npx"
args = ["smart-figma-mcp"]
startup_timeout_sec = 30
# "writes" prompts before any tool that mutates the filesystem, which is what
# you want for save_component; "auto" trusts the server without prompting.
default_tools_approval_mode = "writes"Codex spawns the command directly rather than through a shell, so command
takes the bare program name and everything else belongs in args — putting a
whole command line in command is the most common setup error. Secrets are
best passed by reference so they never land in the file:
[mcp_servers.smart-figma]
command = "npx"
args = ["smart-figma-mcp"]
env_vars = ["SMART_FIGMA_LICENSE", "FIGMA_ACCESS_TOKEN", "LLM_API_KEY"]Or let the CLI write the block for you:
codex mcp add smart-figma --env SMART_FIGMA_LICENSE=<token> -- npx smart-figma-mcp
codex mcp list # verify it registeredTwo Codex-specific notes:
Startup timeout. A cold
npxdownloads the package on first run, which
can exceed the 10s default and surface as a handshake failure. Thestartup_timeout_sec = 30above avoids it.IDE extension. Servers registered via
config.tomlwork in the CLI; the
VS Code extension has a known issue where it does not always pick them up
(openai/codex#6465). If tools
are missing in the extension but/mcplists them in the TUI, this is why.
Claude Code — use shell env variables instead of inline env:
{
"mcpServers": {
"smart-figma": {
"command": "npx",
"args": ["smart-figma-mcp"]
}
}
}export SMART_FIGMA_LICENSE="<your-license-token>"
export FIGMA_ACCESS_TOKEN="<your-figma-personal-access-token>"Tools
Tool | Description |
| Compile Figma node → Tailwind/CSS + variant mapping + assembly context |
| Fetch raw Figma node via Figma REST API |
| Deterministic write: clean data-node-id, save file, update index.ts |
| Save user-confirmed mapping → private asset library |
| Auto-scan project component library (shadcn/ui / antd / mui / Astryx) |
| Check whether the Astryx contract is available (CLI + core, version) |
| Fetch authoritative Astryx components + props (types, enums, required) |
| Check if mapped component files still exist |
| Export mapping assets as JSON |
| Import mapping assets from JSON (merge, non-destructive) |
| Clear compilation cache |
| Refresh License revocation list from remote |
Modes
Free Tier (Hacker)
Pure digital compilation (PURE_DIGITAL path)
No LLM call, zero token consumption
Auto Layout nodes → Tailwind/CSS output
Good for: well-structured Figma files with Auto Layout
BYOK (Bring Your Own Key)
$9/month or $19 lifetime (early bird)
Plug your own API key (OpenAI / Anthropic / DeepSeek / Zhipu)
Usage is attributed to your key; the server makes no LLM calls (code generation runs on your host LLM — already your subscription)
Semantic + Visual compilation paths enabled
All tools unlocked
Supported LLM Providers
Provider |
| Base URL |
OpenAI |
|
|
Anthropic |
|
|
DeepSeek |
|
|
Zhipu (GLM) |
|
|
Gemini |
|
|
Set LLM_PROVIDER + LLM_API_KEY to enable BYOK. The server reads only these two variables — provider-specific vars like OPENAI_API_KEY are not consumed.
Compilation Strategy
The compiler auto-detects node complexity with an additive score and routes accordingly:
Score | Level | Strategy | Server Credit Cost |
| SIMPLE | PURE_DIGITAL — direct math computation | 0 |
| MODERATE | SEMANTIC — coordinate-flow clustering | ~1 credit |
| COMPLEX | VISUAL — multi-modal LLM | ~5 credits |
In BYOK mode the server makes no LLM calls, so this column is always $0 — generation runs on your own host LLM. The costs above apply only to the Credits model.
Score terms: no Auto Layout +30, absolute-positioned child +15 each,
coordinate-flow child +5 each (capped at 50, +20 more beyond 10),
depth beyond 4 +8 per level.
Non-standard layouts don't fail — they return SUGGEST_AUTOLAYOUT, guiding you to fix at the Figma source.
Architecture
┌─────────────┐ JSON-RPC ┌──────────────────────┐
│ Cursor / │ over stdio │ smart-figma-mcp │
│ Claude Code│◄────────────►│ │
│ Codex │ │ ┌────────────────┐ │
└─────────────┘ │ │ Offline │ │
│ │ Ed25519 License │ │
│ │ (zero network) │ │
│ └────────────────┘ │
│ ┌────────────────┐ │
│ │ Variant Mapping │ │
│ │ + Compiler │ │
│ └────────────────┘ │
│ ┌────────────────┐ │
│ │ Daemon (cache) │ │
│ │ Unix Socket IPC │ │
│ └────────────────┘ │
└──────────────────────┘
│
Figma REST API
(fetch_figma_node)Engineering Notes
What follows is the reasoning behind the parts that are not obvious from the
tool list. If you only want to use it, skip this section.
~4,200 lines, no runtime dependencies
Module | Lines | Responsibility |
| 890 | MCP surface, tool routing, Figma REST orchestration |
| 525 | Tiered compile strategy, recursive subtree compile |
| 480 | Astryx CLI contract adapter, union-type → enum resolution |
| 286 | antd / mui |
| 404 | Variant resolution against the local component library |
| 387 | Long-lived cache process, socket IPC |
| 311 | REST fetch + node normalization |
| 413 | Entitlement, quota accounting, provider routing |
| 309 | Compile cache, screenshot fallback |
| 336 | Key generation, license issuing, quota service |
| 341 | End-to-end smoke coverage |
| 288 | Astryx adapter + mapping contract tests (62 assertions) |
| 101 | antd / mui |
No runtime dependencies field in package.json — MCP over stdio plus fetch
and node:crypto are all that is required. This keeps install fast and avoids
the supply-chain surface a dependency tree would add.
Why a tiered compile strategy
A single strategy wastes money and produces bad output. compiler.js scores
every node and routes it by additive score (the table above). Two details in
that scoring are deliberate:
**Coordinate-flow children are counted separately from absolute-positioned
ones.** A child with x/y but no Auto Layout is a grid the compiler can
recover; a child tagged layoutPositioning === "ABSOLUTE" is an overlay it
cannot. Treating the two the same is what makes naive implementations fail on
real design files.
Depth is a hard limit, not a hint. MAX_DEPTH = 6; compileRecursive()
records a depthWarning and skips rather than recursing deeper. Unbounded
recursion on a pathological Figma tree is a real failure mode, and a skipped
subtree is visible in the output instead of silently truncating.
Degrade to advice, not to a guess. When a node is too complex to compile
reliably, the compiler returns SUGGEST_AUTOLAYOUT and points at the
figma_auto_layoutify plugin — a source-side fix. It does not emit code it
cannot stand behind. The free tier is PURE_DIGITAL only, which means the free
path is genuinely deterministic rather than quietly degraded.
Naming reflects what actually ran. The router reports PURE_DIGITAL /
SEMANTIC / VISUAL, while the recursive compiler emits PURE_DIGITAL /
COORDINATE_FLOW / LEAF. The first is a cost decision; the second is the
executed path. They line up in practice but are not the same vocabulary, and
MappingResult.strategy reflects the executed path.
Variant mapping without a config file
mapping.js resolves a Figma node to a local component by inspecting the
project's own component library (shadcn/ui, antd, mui, Astryx). Variants come
from Figma's own variant properties reconciled against the library's contract,
so adding a component to the project is enough — there is no mapping file to
maintain.
Three contract engines, one descriptor
All three supported paths end at the same shape — { name, importPath, variants } —
so mapToVariant() and everything downstream stays library-agnostic. Only the
way the contract is obtained differs:
Source-derived (shadcn/ui).
parseCVA()reads thecva()call out ofthe component's
.tsx. It is a heuristic over source that happens to bereliable because shadcn has a fixed convention.
Typed-declaration-derived (antd / mui).
mui-antd-contract.jsreads thelibrary's shipped
.d.tsand extracts the literal-union values from each<Component>Propstype — it resolves named type aliases (type ButtonType = ...)and peels mui's
OverridableStringUnion<T>wrapper (which otherwise decays tostringand loses the literals). Nocva, no node_modules source scan needed.Contract-derived (Astryx).
astryx-contract.jsshells out to@astryxdesign/cliand reads the component's props table directly. The enumvalues are the ones Meta ships, so nothing is inferred.
The interesting part is what the CLI actually hands back: a prop's type is a
raw TypeScript union of string literals, e.g.
"'primary' | 'secondary' | 'ghost' | 'destructive'". parseUnionValues()
turns that into the allowed set, and that set becomes the variants dimension.
A union that contains no literals (string | number) yields an empty set, which
mapToVariant() already handles by leaving that dimension unmapped — the
parser fails closed rather than inventing values.
Beta dependencies are contained, not ignored
Astryx is v0.x and documents that breaking changes may land in any minor
release. Three decisions follow:
Degrade, never throw. Every CLI call resolves to a tagged error. A missing
or broken Astryx install reduces the component list to empty; it does not
propagate into component scanning for the other libraries.
Version-stamped cache. Contracts are cached under the CLI version that
produced them, so an upgrade transparently invalidates rather than serving a
stale enum that would produce wrong code.
Distinguish missing states. The
componentcommand requires@astryxdesign/coreto be present even if the CLI is installed — without itthe call returns
ERR_CORE_NOT_FOUND.probe_astryxreportscliInstalled/coreInstalledseparately and returns the exact installcommand, instead of a generic failure the caller has to interpret.
If you use a different node runtime and the CLI cannot be spawned, set
ASTRYX_NODE_BIN to the interpreter to use.
Writing to the filesystem is the point
save_component is the only tool that mutates anything. Three guarantees:
strips
data-node-idbefore writing (Figma scaffolding, meaningless in code)updates the
index.tsbarrel export so the component is actually importableremember_mappingstores a user-confirmed mapping into a private assetlibrary, so a known component resolves without re-derivation
check_mapping_health detects when a previously mapped component file has been
deleted or moved, so the library degrades visibly instead of silently producing
dead references.
Long-lived process, bounded memory
Compilation is CPU- and network-bound with low per-request cost, so a
per-invocation process would pay Node startup on every tool call. A daemon
holds the cache and is reached over a socket; daemon-client.js handles
reconnection so a dead daemon degrades to a cold compile instead of an error.
Entitlement without a network call
License validation is offline Ed25519 signature checking (license.js) against
keys/public.pem. The private key is never committed or published.
refresh_crl pulls a revocation list so a revoked token stops working without
shipping new code.
Disclosure: the license issuing tools (
tools/keygen.js,
tools/issue-license.js,tools/batch-issue.js) andtools/quota-server.jsare in this repository and in the published npm tarball. They are the
operational side of a self-serve product, not secrets — the signing key is not
here. If that trade-off stops being right, the fix is to move entitlement
server-side, not to hide these files.
Verification status
npm test runs test/smoke.mjs on every push (.github/workflows/test.yml).
It is a smoke suite, not a full test pyramid: it exercises tool routing, tier
selection, and the write path end-to-end. Coverage of the LLM assembly path is
inherently bounded — it needs live Figma files and a provider key, so CI does
not exercise it. Treat the free-tier compile path as the tested surface.
The Astryx contract has its own suite (62 assertions across three files), and the typed-dts contract has a fourth suite:
Test | Covers |
| Union-type parsing and the props → variants projection, including malformed and non-literal input |
| The full parse path against a real CLI capture, including that an out-of-contract variant is rejected |
|
|
|
|
test/astryx-contract-fixtures.mjs is a captured Astryx CLI response (166
components) rather than a hand-written mock, so the tests fail if the upstream
contract shape changes. Regenerate it when bumping the Astryx version.
FAQ
Q: Does it work without Figma API access?
A: Yes — you can pass figmaNode JSON directly to compile_figma_component. But fetch_figma_node needs FIGMA_ACCESS_TOKEN.
Q: How do I get a license?
A: Purchase from the payment link → receive your license token → paste in MCP config. License is validated offline (Ed25519, zero network calls).
Q: Can I share my license across devices?
A: Yes, up to 2 device fingerprints. Contact support for more.
Q: Does it work with Kiro + Figma Power?
A: Yes — smart-figma-mcp complements Kiro's built-in Figma Power. Figma Power reads designs; smart-figma-mcp deterministically writes code to your project. Use both side-by-side.
Q: Does BYOK mode still consume credits?
A: No — when using your own API key, credits are not deducted. Only the quotas service (if enabled) records usage counts. Note: the server does not call an LLM under BYOK either — code generation runs on your host LLM (Cursor / Claude Code / Codex), which is already covered by your own subscription.
Q: My Figma file has no Auto Layout — will it work?
A: The compiler returns SUGGEST_AUTOLAYOUT for complex non-layout nodes. We strongly recommend using our Auto Layoutify Figma plugin for best results.
Platform Support
IDE / Tool | Support |
Cursor | ✅ Full |
Kiro | ✅ Full |
Claude Code | ✅ Full |
Codex CLI | ✅ Full |
Codex IDE extension | ⚠️ See note |
Windsurf | ✅ Full |
VS Code (MCP extension) | ✅ |
Continue.dev | ⚠️ Limited |
Cline | ⚠️ Limited |
Codex is supported via config.toml (TOML, not JSON) — see
IDE Setup for the exact block and two gotchas that produce
confusing failures: a cold npx exceeding the 10s startup timeout, and the IDE
extension not picking up servers that the CLI loads fine
(openai/codex#6465). The CLI is
the reliable path today.
Continue.dev and Cline are Limited because their MCP clients implement the
base protocol but have historically been inconsistent about long-running stdio
servers and tool-result streaming. The limitation is in their clients, not in
this server — if it works for you, it is worth reporting upstream.
Pricing
Tier | Price | Quota | BYOK | Visual Compilation |
Hacker | Free | 10/day | ❌ | ❌ |
Maker | $9/mo | 300/mo | ✅ | ✅ |
Pro | $29/mo | 1,500/mo | ✅ | ✅ |
Early Bird Lifetime | $19 once | Maker plan | ✅ | ✅ |
License
Source available, not open source. The code is published so it can be read,
studied, and evaluated — but you may not redistribute it, build a competing
product from it, or use it under an open source license. See
LICENSE for the granted rights and restrictions. Commercial
licensing is available separately via the
Questions about the license: https://github.com/drake-yuan/smart-figma-mcp/issues
Available Tools
12 toolscache_clearA
Clear all compile caches (L1 memory + L2 disk); use to force a refresh after the data source changes.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
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 usefully discloses that both L1 (memory) and L2 (disk) caches are wiped and implies a cost (cache rebuild), but says nothing about permissions required, whether the clear is reversible, or any latency impact.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with the action and the operational trigger front-loaded; every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, no-output-schema tool the description covers the essential action, scope, and motivation. Only the absence of any permission or side-effect detail for a state-mutating (cache-wiping) operation keeps it from being fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline is 4.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (clear) and resource (compile caches), and even scopes it to both L1 memory and L2 disk. It does not explicitly name a sibling it differs from, but the resource is distinctive enough to separate it from the mapping/component tools in the sibling list.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a concrete trigger condition: 'use to force a refresh after the data source changes.' That is clear when-to-use guidance, though it offers no when-not-to-use or named alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
check_mapping_healthB
Check whether component files referenced by the mapping asset library still exist, and flag stale entries.
| Name | Required | Description | Default |
|---|---|---|---|
| projectRoot | Yes | Absolute path to the project root |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the entire behavioral burden. 'Check' and 'flag' weakly imply a read-only diagnostic, but the description never states that it is non-mutating, whether it repairs anything, what 'stale' means operationally, or how results are surfaced. For a filesystem-touching tool with zero annotation coverage, this leaves key behavior undefined.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that pairs the operation with its result, with no redundancy or filler. Nothing could be removed without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter diagnostic tool with no output schema and no annotations, the description covers the core operation but omits the shape of the result (list of stale entries? count?) and whether any remediation is offered. Adequate but with clear gaps given the absence of structured metadata.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single parameter with 100% schema description coverage ('Absolute path to the project root'), so the schema fully documents it. The description adds no additional meaning about how projectRoot scopes the check, which is the expected baseline when the schema does the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Check'), a specific subject ('component files referenced by the mapping asset library'), and the outcome ('flag stale entries'). This is clearly a diagnostic tool distinguishable from mutation siblings like save_component or remember_mapping, though it never explicitly names or contrasts with them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to run this versus alternatives such as scan_components, export_mappings, or import_mappings, and no mention of prerequisites (e.g., that the mapping library must already be populated). The agent must infer the trigger condition from the purpose statement alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
compile_figma_componentB
Compile a Figma node into a Tailwind + variant-mapping context. Accepts an offline figmaNode JSON or a figmaUrl (live Figma API). In BYOK mode the token bills the user.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | Compile mode: flat compiles only the outer container; recursive compiles the whole subtree (default flat) | |
| figmaUrl | No | Figma design link (https://www.figma.com/design/FILEKEY/...?node-id=NODEID; use either this or figmaNode) | |
| siblings | No | Sibling node list, used to detect responsive breakpoints | |
| figmaNode | No | Figma node JSON exported offline (use either this or figmaUrl) | |
| figmaToken | No | Figma Personal Access Token (takes precedence over the FIGMA_ACCESS_TOKEN env var) | |
| projectRoot | No | Absolute path to the user's project root | |
| styleFormat | No | Output style format: tailwind/css-modules/scss/styled-components (default tailwind) | |
| localComponent | No | Local component metadata (name/importPath/variants) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It does add valuable cost/auth context ('In BYOK mode the token bills the user'), which is genuinely beyond the schema. But it never says whether compiling writes files to disk, mutates project state, or merely returns a mapping, which is the key behavioral unknown for a tool taking a projectRoot.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences with the core purpose front-loaded and no filler. Slightly more efficient than typical, though the third sentence about billing is a fragment that could be folded in.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter tool with no annotations and no output schema, the description should explain what the compile actually produces and whether it persists anything. It covers inputs and billing but leaves the return/persistence semantics unstated.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 8 parameters including the mode and styleFormat defaults and the figmaUrl/figmaNode either-or rule. The description adds no syntax, format, or precedence detail beyond that, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Compile') and resource ('a Figma node') with the output shape named ('Tailwind + variant-mapping context'). It is clear on its own, but it never distinguishes itself from siblings like fetch_figma_node or save_component, which an agent must choose between.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clarifies the two input paths ('offline figmaNode JSON or a figmaUrl (live Figma API)'), which is useful routing guidance. However it gives no when-to-use versus when-not-to-use advice relative to fetch_figma_node or save_component, leaving the sibling selection to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_mappingsA
Export the .smart-figma/mappings.json mapping assets (for team sharing or migration).
| Name | Required | Description | Default |
|---|---|---|---|
| projectRoot | Yes | Absolute path to the project root |
TDQS
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 usefully discloses the produced artifact and its location, which is real behavioral value, but says nothing about whether it overwrites an existing file, what permissions it needs, or whether it touches anything beyond the local mappings file.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the verb first and the qualifier last; nothing is wasted and the artifact path is surfaced immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, no-output-schema tool this is nearly sufficient: it names the artifact produced and the purpose. The only meaningful omission is overwrite/permission behavior, which an agent might want before running an export.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter exists and schema coverage is 100%, so the schema already fully documents projectRoot. The description adds no further meaning about the parameter, which is the expected baseline when the schema does the work.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb 'Export' paired with a concrete resource and even the exact artifact path (.smart-figma/mappings.json), so the agent knows precisely what is produced. It reads as the inverse of the sibling import_mappings, though that relationship is implied rather than named.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The parenthetical '(for team sharing or migration)' hints at the intent, which implies usage, but there is no explicit statement of when to pick this over import_mappings or whether any prerequisites exist. Adequate but leaves the routing decision to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fetch_astryx_contractA
Fetch the authoritative Astryx component contract as JSON: component index (categories + import paths) or, when components is given, the exact props table per component (types, required flags, enum values). Use the enum values to avoid inventing props — this is the machine-readable source of truth, so generated code contains no hallucinated variants. Max 100 components per call.
| Name | Required | Description | Default |
|---|---|---|---|
| refresh | No | Bypass the on-disk contract cache | |
| components | No | Component names to resolve (e.g. ["Button","Badge"]). Omit to get the full component index instead. | |
| projectRoot | Yes | Absolute path to the project root | |
| includeManifest | No | Also include the CLI manifest (commands + global options) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It usefully discloses the 'max 100 components per call' limit and the on-disk cache semantics, but says nothing about permissions, error behavior, or determinism of the returned contract, leaving meaningful gaps for an unannotated tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three compact sentences, front-loaded with what is returned, then why it matters, then the limit. The anti-hallucination rationale is slightly redundant with the 'machine-readable source of truth' clause but still earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 4-param read tool with no output schema and no annotations, the description covers both return modes (index with categories + import paths; props table with types, required flags, enum values) plus the batch limit and caching behavior. Only auth/permission context is missing, a minor gap given the local project-root nature of the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% (all four params documented, including `components`, `refresh`, and `includeManifest`), so the baseline is 3. The description restates the `components`-present/absent behavior already in the schema rather than adding format or syntax detail beyond it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb+resource ('Fetch the authoritative Astryx component contract as JSON') and enumerates the two return shapes: the component index or the per-component props table. It does not name the adjacent siblings (probe_astryx, scan_components) so an agent must infer how it differs from those, which keeps it 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear use context ('use the enum values to avoid inventing props... generated code contains no hallucinated variants') and an implied mode rule ('when `components` is given' vs omit for the index). It stops short of explicit when-not or named alternatives, so no 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
fetch_figma_nodeB
Fetch a design node from the Figma API and normalize it into the compiler input format. Returns structured node data (including Auto Layout info).
| Name | Required | Description | Default |
|---|---|---|---|
| action | No | Fetch node details (node) or file metadata (file_meta) | |
| figmaUrl | Yes | Figma design link | |
| figmaToken | No | Figma Access Token (optional; defaults to the FIGMA_ACCESS_TOKEN env var) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose a meaningful trait: it calls the external Figma API and normalizes the result into compiler input, and it returns Auto Layout info. It does not mention auth requirements, error handling, or rate limits, so coverage is partial rather than complete.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with the core action front-loaded and the return content stated second; no filler. Marginal room to be tighter but effectively sized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a fetch tool with no output schema, the description does convey what comes back (structured node data with Auto Layout), which is the most important missing piece. It omits auth/env behavior and the file_meta branch effects, leaving it adequate but incomplete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the enum (node/file_meta), figmaUrl, and optional figmaToken are already documented in the schema. The description adds no parameter meaning beyond 'design node' loosely implying the node action, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb (fetch) plus resource (design node) plus a transformation step (normalize into compiler input format), so the agent knows this is a read-and-convert operation. It does not, however, differentiate itself from likely-related siblings like compile_figma_component or scan_components.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no when-to-use guidance, no prerequisites, and names no alternatives despite several plausibly adjacent siblings (compile_figma_component, scan_components). Context is only inferable from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
import_mappingsA
Import mapping assets from external JSON and merge them into the local .smart-figma/mappings.json. Existing keys are not overwritten.
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | Exported JSON data (containing a mappings array) | |
| projectRoot | Yes | Absolute path to the project root |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does disclose the critical merge semantics: 'Existing keys are not overwritten.' That tells the agent this is a non-destructive additive import. It stops short of covering error behavior, whether the target file is created if missing, or how nested conflicts resolve.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, zero filler, with the action front-loaded and the key side-effect constraint in the second sentence. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter file-import tool with no output schema and no annotations, the description covers the core action and overwrite policy but leaves gaps: no error semantics, no statement on whether the .smart-figma file is created or must pre-exist, and no explanation of nested-object merge behavior despite the data param being a nested object.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so both parameters are already documented. The description adds only the loose mapping of 'external JSON' to the data parameter; it says nothing about the shape of the mappings array or the projectRoot path contract beyond what the schema states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Import mapping assets from external JSON') plus the exact target file, so the agent knows precisely what happens. It does not explicitly distinguish itself from the sibling export_mappings, though the import direction is implicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the phrase 'from external JSON' – there is no explicit when-to-use, no mention of export_mappings as the counterpart that produces such JSON, and no prerequisites (e.g. project root must already contain a mappings file).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
probe_astryxA
Check whether the Astryx design-system contract is available in a project (CLI + core installed, version). Use this before fetch_astryx_contract. Degrades gracefully when Astryx is absent.
| Name | Required | Description | Default |
|---|---|---|---|
| projectRoot | Yes | Absolute path to the project root |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does useful work: it discloses that the check reports CLI/core installation and version, and that it "degrades gracefully when Astryx is absent" rather than erroring. It does not state that it is read-only or whether it touches the filesystem/network, leaving a small gap for a probe tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste, front-loaded with the purpose before the usage rule and the degradation caveat. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description should ideally characterize the return value; it partially does by naming what is checked (CLI + core installed, version) but does not specify the response shape (boolean vs. object). For a one-parameter probe tool, this is nearly complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single projectRoot parameter is fully documented as an absolute path, so the schema does the heavy lifting. The description adds no syntax, path-format, or default information beyond it, making the baseline 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (check availability) and resource (Astryx design-system contract), plus the precise criteria it verifies: CLI + core installed, version. This clearly separates it from fetch_astryx_contract, which retrieves the contract rather than probing for it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Use this before fetch_astryx_contract" gives an explicit sequencing rule tied to a named sibling, which is strong routing guidance. It stops short of stating when not to call it (e.g., if the contract is already known to be present), so it is clear context without exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
refresh_crlA
Refresh the license revocation list (CRL) from a remote URL and cache it locally to .smart-figma/crl.json.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | Remote CRL URL (optional; defaults to the CRL_URL env var) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose the two most important traits: a network fetch from a remote URL and a local filesystem write to .smart-figma/crl.json. It does not cover auth requirements, overwrite semantics for an existing cache file, or failure behavior when the URL is unreachable.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One sentence, zero waste, front-loaded with the action and resource, then the source and cache destination. Nothing to trim and nothing buried.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-optional-parameter tool with no output schema, the description covers what it does, where it fetches from, and where it writes. Only peripheral details (permissions, failure modes, whether it returns the CRL contents) are absent, which is minor at this complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter already documents the URL and its CRL_URL env-var default, so the schema does the heavy lifting. The description's phrase 'from a remote URL' merely restates the parameter without adding syntax, format, or validation detail beyond it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (refresh) plus the resource (license revocation list / CRL) and even the mechanism and destination (remote URL → local cache at .smart-figma/crl.json). It does not differentiate from any sibling, though none of the listed siblings overlap in function, so the ambiguity risk is low.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied by the verb 'refresh' — an agent can infer you call this when the local CRL is stale or missing, but the description states no explicit trigger, no prerequisites (network access, env var configuration), and names no alternatives. Adequate but with clear gaps.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remember_mappingC
Persist a user-confirmed Figma->local-component mapping as a private asset, forming a switching-cost moat.
| Name | Required | Description | Default |
|---|---|---|---|
| target | Yes | ||
| figmaName | No | ||
| projectRoot | Yes | ||
| figmaComponentKey | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and mostly fails it. It does not say whether writes are idempotent, whether an existing mapping is overwritten, what storage location or permissions apply, or what the response contains; 'private asset' is the only behavioral detail offered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
It is a single front-loaded sentence, which is efficient, but the closing 'forming a switching-cost moat' clause is marketing filler that consumes space without helping invocation. The core statement is tight; the tail is waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
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, no output schema, and a nested object parameter at 0% coverage, the description leaves critical gaps. It states the intent but omits preconditions, overwrite semantics, storage details, and the shape of the nested target, which the schema does not supply either.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across four parameters, including a nested, untyped 'target' object. The description adds no information about any parameter's format, expected structure, or the relationship between figmaComponentKey, figmaName, and target, so an agent cannot construct a valid 'target' payload.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The sentence names a specific verb and resource: persisting a Figma->local-component mapping. The scope ('user-confirmed', 'private asset') helps separate it from siblings like save_component or import_mappings, though the trailing 'switching-cost moat' clause is business framing rather than functional description.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'User-confirmed' hints at a precondition, but there is no explicit when-to-use guidance, no statement of alternatives such as save_component or import_mappings, and no indication of when this should be avoided. The agent must infer the workflow position entirely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_componentC
Deterministic write op: strip data-node-id, write to the exact path, and auto-update the index.ts barrel export.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | ||
| featureDir | No | ||
| projectRoot | Yes | ||
| componentName | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose genuinely useful behavior: the operation is deterministic, mutates the code by stripping data-node-id, and has a side effect on the index.ts barrel. It stops short of stating whether an existing file is overwritten, how the path is resolved from projectRoot/featureDir/componentName, or what happens on failure.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that leads with the operation type and then enumerates the three effects, with no filler. It is efficient, though the terse style contributes to the gaps in parameter and usage detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with zero annotations, no output schema, and 0% parameter coverage, the description is too thin. It never explains path resolution, overwrite semantics, or the expected response, which an agent needs before performing a deterministic write that also edits a barrel file.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and none of the four parameters (code, componentName, projectRoot, featureDir) is explained in the description. The phrase 'the exact path' hints that a path is derived but does not say from which parameters or in what combination, so the description fails to compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a concrete write action with three specific behaviors: stripping data-node-id, writing to an exact path, and updating the index.ts barrel. An agent can tell this is the persistence step for a component file. It does not, however, name or contrast itself with any sibling (e.g., compile_figma_component or scan_components), so differentiation is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use guidance, no prerequisites (does the component need to be compiled first?), and no mention of alternatives among the many siblings. The reader must infer from the name alone that this is the terminal save step in a component-generation pipeline.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scan_componentsB
Auto-scan the project's local component library (shadcn/ui / radix / antd / mui) and extract component names, CVA variant definitions, and import paths.
| Name | Required | Description | Default |
|---|---|---|---|
| projectRoot | Yes | Absolute path to the project root |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries the full burden. It usefully discloses the extraction targets (names, CVA variants, import paths) and is implicitly read-only, but says nothing about side effects, caching (notable given the sibling cache_clear), performance on large projects, or failure behavior.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the verb, scope, and extraction outputs are all delivered economically.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by enumerating the data returned (component names, variant definitions, import paths). For a one-parameter read-style tool with no annotations this is nearly complete, missing only side-effect and prerequisite context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Only one parameter (projectRoot) with 100% schema description coverage, so the schema already documents it fully. The description adds no format or constraint details beyond what the schema provides; baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('scan') and resource ('the project's local component library'), and enumerates what it extracts (component names, CVA variant definitions, import paths). It is easy to distinguish from a save/compile tool, though it never names the relevant siblings (e.g. save_component) to sharpen the boundary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use or when-not-to-use guidance and no stated prerequisites, such as whether this must run before save_component or compile_figma_component. Usage is only implied by the phrase 'auto-scan the project's local component library'.
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.
12 tool updates
v1.1.1- First observed
cache_clear - First observed
check_mapping_health - First observed
compile_figma_component - First observed
export_mappings - First observed
fetch_astryx_contract - First observed
fetch_figma_node - First observed
import_mappings - First observed
probe_astryx - First observed
refresh_crl - First observed
remember_mapping - First observed
save_component - First observed
scan_components
TDQS
Scored across 12 tools
Most tools target distinct resources and actions, and descriptions clarify borderline cases (e.g. probe_astryx before fetch_astryx_contract, remember_mapping vs import_mappings). There is mild overlap around mapping persistence, but nothing severely ambiguous.
Predominantly a consistent verb_noun snake_case pattern (save_component, fetch_figma_node, export_mappings, refresh_crl). Minor deviations come from prefixed domain names (compile_figma_component, fetch_astryx_contract) but the convention is readable and predictable.
12 tools is well within the ideal 3-15 range and each tool maps to a concrete step in the Figma-to-component workflow. No obvious padding.
Covers the core lifecycle: fetch node, compile, save component, scan library, and mapping management (remember/export/import/health). Minor gaps exist, such as no explicit update/delete for components or individual mapping entries, but agents can work around these.
Maintenance
Related MCP Connectors
Build and manage your design system with AI: tokens, themes, components, icons, Figma and code.
Access and maintain design system docs, tokens, components, skills, and contexts across any project.
Live React design-system APIs, patterns, and code validation so AI agents build real UI, not slop.
Serves your design system and coding standards to coding agents, so they stop guessing.
Related MCP Servers
- AlicenseAqualityDmaintenanceConverts Figma designs into production-ready React components with design token extraction, widget registry integration, and micro-frontend module generation.348 npm1MIT
- AlicenseNot gradedqualityDmaintenanceConnects Figma designs to React components using your actual component library, enabling AI tools to generate production-ready code with proper imports.1MIT
- FlicenseAqualityDmaintenanceSyncs design tokens and components from Figma to a Design System codebase, enabling automated generation of React components and Storybook stories.5-
- AlicenseAqualityDmaintenanceConverts Figma designs into structured code context with token-aware styling, enabling AI agents to generate production-level frontend code.19 npmMIT