Skip to main content
Glama

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

npm version Node ≥ 18

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

cva() call in your source

Parsed from the variant definition by parseCVA()

radix-ui

local .tsx

Primitives + your own wrappers

antd / mui

shipped .d.ts

mui-antd-contract.js reads each <Component>Props type and extracts the literal-union values (alias + OverridableStringUnion aware)

Astryx (Meta)

CLI JSON contract

@astryxdesign/cli — the same machine-readable manifest Meta ships for agents

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-mcp

IDE 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

~/.cursor/mcp.json

Kiro

~/.kiro/mcp.json or .kiro/mcp.json (project-level)

Windsurf

~/.windsurf/mcp.json

{
  "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 registered

Two Codex-specific notes:

  • Startup timeout. A cold npx downloads the package on first run, which
    can exceed the 10s default and surface as a handshake failure. The
    startup_timeout_sec = 30 above avoids it.

  • IDE extension. Servers registered via config.toml work 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 /mcp lists 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_component

Compile Figma node → Tailwind/CSS + variant mapping + assembly context

fetch_figma_node

Fetch raw Figma node via Figma REST API

save_component

Deterministic write: clean data-node-id, save file, update index.ts

remember_mapping

Save user-confirmed mapping → private asset library

scan_components

Auto-scan project component library (shadcn/ui / antd / mui / Astryx)

probe_astryx

Check whether the Astryx contract is available (CLI + core, version)

fetch_astryx_contract

Fetch authoritative Astryx components + props (types, enums, required)

check_mapping_health

Check if mapped component files still exist

export_mappings

Export mapping assets as JSON

import_mappings

Import mapping assets from JSON (merge, non-destructive)

cache_clear

Clear compilation cache

refresh_crl

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

LLM_PROVIDER value

Base URL

OpenAI

openai

https://api.openai.com/v1

Anthropic

anthropic

https://api.anthropic.com/v1

DeepSeek

deepseek

https://api.deepseek.com/v1

Zhipu (GLM)

zhipu

https://open.bigmodel.cn/api/paas/v4

Gemini

gemini

https://generativelanguage.googleapis.com/v1beta

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

< 35

SIMPLE

PURE_DIGITAL — direct math computation

0

35–74

MODERATE

SEMANTIC — coordinate-flow clustering

~1 credit

≥ 75

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

server.js

890

MCP surface, tool routing, Figma REST orchestration

compiler.js

525

Tiered compile strategy, recursive subtree compile

astryx-contract.js

480

Astryx CLI contract adapter, union-type → enum resolution

mui-antd-contract.js

286

antd / mui .d.ts contract adapter, literal-union extraction

mapping.js

404

Variant resolution against the local component library

daemon.js / daemon-client.js

387

Long-lived cache process, socket IPC

figma-client.js / figma-normalizer.js

311

REST fetch + node normalization

license.js / quota.js / byok.js

413

Entitlement, quota accounting, provider routing

cache.js / figma-screenshot.js

309

Compile cache, screenshot fallback

tools/*

336

Key generation, license issuing, quota service

test/smoke.mjs

341

End-to-end smoke coverage

test/astryx-*.mjs

288

Astryx adapter + mapping contract tests (62 assertions)

test/mui-antd-contract.mjs

101

antd / mui .d.ts extraction + zero-hallucination tests

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 the cva() call out of

    the component's .tsx. It is a heuristic over source that happens to be

    reliable because shadcn has a fixed convention.

  • Typed-declaration-derived (antd / mui). mui-antd-contract.js reads the

    library's shipped .d.ts and extracts the literal-union values from each

    <Component>Props type — it resolves named type aliases (type ButtonType = ...)

    and peels mui's OverridableStringUnion<T> wrapper (which otherwise decays to

    string and loses the literals). No cva, no node_modules source scan needed.

  • Contract-derived (Astryx). astryx-contract.js shells out to

    @astryxdesign/cli and reads the component's props table directly. The enum

    values 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 component command requires

    @astryxdesign/core to be present even if the CLI is installed — without it

    the call returns ERR_CORE_NOT_FOUND. probe_astryx reports

    cliInstalled / coreInstalled separately and returns the exact install

    command, 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-id before writing (Figma scaffolding, meaningless in code)

  • updates the index.ts barrel export so the component is actually importable

  • remember_mapping stores a user-confirmed mapping into a private asset

    library, 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) and tools/quota-server.js

are 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

test/astryx-adapter.mjs

Union-type parsing and the props → variants projection, including malformed and non-literal input

test/astryx-e2e.mjs

The full parse path against a real CLI capture, including that an out-of-contract variant is rejected

test/astryx-mapping.mjs

scanLocalComponents integration, determinism, and that a project without Astryx is unaffected

test/mui-antd-contract.mjs

.d.ts literal-union extraction for antd/mui, alias + OverridableStringUnion handling, and that an out-of-contract value is dropped

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

✅

✅

Buy License →


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

purchase page.

Questions about the license: https://github.com/drake-yuan/smart-figma-mcp/issues


Privacy Policy · Terms of Service

Available Tools

12 tools
cache_clearA

Clear all compile caches (L1 memory + L2 disk); use to force a refresh after the data source changes.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectRootYesAbsolute path to the project root

TDQS

B3.1/5.0
Behavior2/5

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

No annotations are provided, so the description carries the 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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
modeNoCompile mode: flat compiles only the outer container; recursive compiles the whole subtree (default flat)
figmaUrlNoFigma design link (https://www.figma.com/design/FILEKEY/...?node-id=NODEID; use either this or figmaNode)
siblingsNoSibling node list, used to detect responsive breakpoints
figmaNodeNoFigma node JSON exported offline (use either this or figmaUrl)
figmaTokenNoFigma Personal Access Token (takes precedence over the FIGMA_ACCESS_TOKEN env var)
projectRootNoAbsolute path to the user's project root
styleFormatNoOutput style format: tailwind/css-modules/scss/styled-components (default tailwind)
localComponentNoLocal component metadata (name/importPath/variants)

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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

Schema description coverage is 100%, so the schema already documents all 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.

Purpose4/5

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.

Usage Guidelines3/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
projectRootYesAbsolute path to the project root

TDQS

A3.6/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
refreshNoBypass the on-disk contract cache
componentsNoComponent names to resolve (e.g. ["Button","Badge"]). Omit to get the full component index instead.
projectRootYesAbsolute path to the project root
includeManifestNoAlso include the CLI manifest (commands + global options)

TDQS

A3.6/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full 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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines4/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
actionNoFetch node details (node) or file metadata (file_meta)
figmaUrlYesFigma design link
figmaTokenNoFigma Access Token (optional; defaults to the FIGMA_ACCESS_TOKEN env var)

TDQS

B3.2/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataYesExported JSON data (containing a mappings array)
projectRootYesAbsolute path to the project root

TDQS

A3.7/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectRootYesAbsolute path to the project root

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoRemote CRL URL (optional; defaults to the CRL_URL env var)

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
targetYes
figmaNameNo
projectRootYes
figmaComponentKeyYes

TDQS

C2.4/5.0
Behavior2/5

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

With no annotations, the description carries the full 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.

Conciseness3/5

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.

Completeness2/5

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

For a mutation tool with no annotations, 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.

Parameters1/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeYes
featureDirNo
projectRootYes
componentNameYes

TDQS

C2.9/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness2/5

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

For a mutation tool with 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.

Parameters2/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
projectRootYesAbsolute path to the project root

TDQS

B3.4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

  1. 12 tool updatesv1.1.1
    • First observedcache_clear
    • First observedcheck_mapping_health
    • First observedcompile_figma_component
    • First observedexport_mappings
    • First observedfetch_astryx_contract
    • First observedfetch_figma_node
    • First observedimport_mappings
    • First observedprobe_astryx
    • First observedrefresh_crl
    • First observedremember_mapping
    • First observedsave_component
    • First observedscan_components

TDQS

B3.4/5.0

Scored across 12 tools

Disambiguation4/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers