decrease-token-figma
v1.2.1
Published
Local MCP bridge that compresses Figma design context into token-efficient multi-framework web handoffs with screenshots.
Downloads
324
Maintainers
Readme
Figma Cost Optimizer Bridge
Figma Cost Optimizer Bridge is a local MCP server that turns Figma Desktop design context into compact, implementation-ready web handoffs for LLM coding agents.
It sits between an MCP client and the local Figma Desktop MCP endpoint. Instead of forwarding raw get_design_context output full of metadata, absolute coordinates, repeated class strings, and inline SVG, the bridge returns a smaller Markdown handoff with cleaned JSX intermediate skeleton code, design tokens, reusable repeated structures, and a screenshot path. The handoff can target React, Vue, Svelte, or HTML, with Tailwind, styled-components, Emotion, CSS Modules, or inline styles.
The result is lower input-token cost and less context noise while still preserving the information a coding agent needs to build the UI accurately.
Benchmark Snapshot
Latest reproducible fixture: DashStack Dashboard, Figma node 2791-32584, measured on 2026-06-16 with a blind 3-run benchmark (anthropic / claude-sonnet-4-6, temperature 0, one compile-only repair).
| Path | Input chars | Est. text tokens | Image tokens | Total est. tokens | Pixel similarity (mean) | |---|---:|---:|---:|---:|---:| | Official Figma MCP raw | 51,543 | 12,886 | 1,040 | 13,926 | 83.12% | | Bridge handoff | 28,928 | 7,232 | 0 | 7,232 | 84.76% |
Estimated input-token saving: 48.07%, while the bridge arm was +1.65 pp more similar to the reference on average — nearly half the input tokens with no loss of visual accuracy. See the full report in docs/BENCHMARK_RESULTS.md.
Features
- Token-efficient handoffs: removes or compresses noisy Figma metadata, absolute positioning, repeated Tailwind tokens,
data-*attributes, and inline SVG blocks. - Screenshot path mode: saves the screenshot locally and returns its absolute path instead of inlining image data by default.
- Repeated subtree dedupe: converts repeated JSX structures into one component definition plus instance data.
- Shared class extraction: keeps class tokens shared by all instances in the component template and only passes differences as props.
- Default prop values: promotes common slot values to component defaults so repeated instances can omit them.
- Hash cache: reuses previous handoffs when the raw Figma response has not changed.
- Diff handoff: returns only changed lines for previously seen components, with automatic fallback to full handoff when the diff is too large.
- Local component registry: records extracted or scanned project components and suggests reuse in later handoffs.
- Target profiles: generates profile-specific guidance for React, Vue, Svelte, and HTML, plus Tailwind, styled-components, Emotion, CSS Modules, and inline styling.
- Required Ollama pre-analysis: uses local Ollama for color, text, and summary analysis. The MCP server prepares Ollama on startup, and handoff generation fails if analysis cannot run.
- Benchmark harness: measures raw vs bridge input tokens, renders outputs in Playwright, and computes pixel similarity with
pixelmatch.
Install
Install from npm:
npm install -g decrease-token-figma
figma-bridgeInstall directly from GitHub:
npm install -g github:junseo2323/decrease-token-figma
figma-bridgeFor local development:
git clone https://github.com/junseo2323/decrease-token-figma.git
cd decrease-token-figma
npm install
npm run build
npm link
figma-bridgeOllama is prepared automatically when figma-bridge starts. To prepare it manually:
npm run setupMCP Client Configuration
Use this configuration in Claude Desktop, Codex, Cursor, or another MCP client:
{
"mcpServers": {
"figma-cost-optimizer-bridge": {
"command": "npx",
"args": ["-y", "decrease-token-figma"],
"env": {
"FIGMA_BRIDGE_ROOT": "/absolute/path/to/your/app"
}
}
}
}To run the GitHub version directly:
{
"mcpServers": {
"figma-cost-optimizer-bridge": {
"command": "npx",
"args": ["-y", "github:junseo2323/decrease-token-figma"],
"env": {
"FIGMA_BRIDGE_ROOT": "/absolute/path/to/your/app"
}
}
}
}Codex CLI
From the app project you want the bridge to write assets/cache into:
codex mcp add figma-cost-optimizer-bridge \
--env FIGMA_BRIDGE_ROOT="$PWD" \
-- npx -y decrease-token-figma
codex mcp listTo remove it later:
codex mcp remove figma-cost-optimizer-bridgeClaude Code
From the app project you want the bridge to write assets/cache into:
claude mcp add -s local figma-cost-optimizer-bridge \
-e FIGMA_BRIDGE_ROOT="$PWD" \
-- npx -y decrease-token-figma
claude mcp listTo remove it later:
claude mcp remove figma-cost-optimizer-bridgeAfter setup, keep Figma Desktop running with local MCP enabled, select a node, then ask Codex or Claude Code to call get_optimized_figma_handoff.
Avoiding Official Figma MCP Tool Conflicts
Do not register the official figma-mcp server alongside this bridge. If both tools are available, an LLM may choose the raw official get_design_context tool before the optimized bridge handoff.
Use the built-in doctor and migration helper:
figma-bridge doctor
figma-bridge migrate-config --yesdoctor inspects known Claude Desktop, Cursor, workspace MCP, and Codex config locations. migrate-config --yes backs up JSON configs, removes competing official Figma MCP entries, and ensures figma-cost-optimizer-bridge is the Figma MCP server in that config. Codex TOML configs are reported but not rewritten automatically; remove official Figma MCP entries there with the Codex CLI.
When the bridge starts, it also ensures AGENTS.md and CLAUDE.md exist in FIGMA_BRIDGE_ROOT and prepends this guardrail as the first line:
IMPORTANT: For Figma design-to-code work, use only the `figma-cost-optimizer-bridge` MCP server. Do not use or fall back to the official Figma MCP / `figma-mcp` directly.Set FIGMA_BRIDGE_WRITE_AGENT_RULES=0 if you do not want the bridge to update those files.
Requirements
- Figma Desktop is running.
- Figma's local MCP endpoint is available on
127.0.0.1:3845. - A Figma node is selected before requesting a handoff.
FIGMA_BRIDGE_ROOTor the tool argumentprojectRootpoints to the local app project.
MCP Tools
get_optimized_figma_handoff
Fetches the selected Figma node and returns an optimized Markdown handoff plus screenshot information.
| Argument | Values | Default | Description |
|---|---|---|---|
| projectRoot | absolute path | FIGMA_BRIDGE_ROOT or cwd | Project root for assets and cache |
| screenshot | path / inline / none | path | path stores the PNG in cache and returns only its absolute path. inline is for clients without filesystem access |
| mode | auto / full / diff | auto | Return a diff when a previous version exists, otherwise a full handoff |
| force_refresh | boolean | false | Ignore the cache and capture again even if the raw hash matches |
| target | react / vue / svelte / html | react | Target web framework for handoff instructions and code fence |
| styling | tailwind / styled-components / emotion / css-modules / inline | tailwind | Styling system for token conversion guidance |
Compatibility aliases
The bridge also exposes get_design_context and get_figma_context as optimized handoff aliases. These names are intentionally compatible with common Figma MCP workflows, but they return bridge handoff Markdown rather than raw official Figma context.
Escape hatches:
get_raw_figma_context: returns raw Figma selected-node context.get_screenshot/get_figma_screenshot: pass-through screenshot helpers.
sync_component_registry
Scans <projectRoot>/src/components using the target profile's component extensions and updates the local component registry. React scans .tsx/.jsx, Vue scans .vue, Svelte scans .svelte, and HTML scans .html. Later handoffs can use this registry to recommend or enforce component reuse.
Workflow
- Select a node in Figma Desktop.
- The LLM calls
get_optimized_figma_handoff. - The bridge fetches raw design context and a screenshot from the local Figma MCP endpoint.
- Image assets are written to
src/assetsor the configured asset directory. - Raw TSX is cleaned, repeated structures are deduped, and required Ollama analysis is added.
- The LLM implements the UI from the handoff Markdown and screenshot.
Cache Layout
.figma_cache/
nodes/ChatScreen_a3f29c01/
raw.txt
handoff.md
diff.md
screenshot.png
meta.json
registry.json- Unchanged raw responses reuse cached handoffs.
- The two latest versions per component are retained.
mode: autocreates a diff handoff when a previous version is available.
Environment Variables
| Variable | Description |
|---|---|
| FIGMA_BRIDGE_ROOT | Project root for assets and cache |
| FIGMA_BRIDGE_CACHE_DIR | Override cache directory |
| FIGMA_BRIDGE_ASSET_DIR | Override image asset directory |
| FIGMA_BRIDGE_WRITE_AGENT_RULES=0 | Disable automatic AGENTS.md and CLAUDE.md guardrail updates |
| OLLAMA_BIN | Path to a specific Ollama binary |
| FIGMA_BRIDGE_OLLAMA_MODEL | Ollama model to use. Default: llama3.2 |
| FIGMA_BRIDGE_OLLAMA_AUTO_INSTALL=0 | Disable runtime Ollama auto-install |
| FIGMA_BRIDGE_OLLAMA_AUTO_PULL=0 | Disable runtime model download |
npm Scripts
npm run build # TypeScript build
npm test # Unit tests
npm run setup # Install/start Ollama and pull the default model
npm run measure # Estimate token size for .figma_cache/handoff.md
npm run benchmark:capture # Capture a Figma benchmark fixture
npm run benchmark:tokens # Measure raw vs bridge input tokens
npm run benchmark:diff # Render with Vite and compute pixel diff
npm run benchmark:blind # Run blind multi-run LLM benchmark
npm run benchmark:summary # Rebuild blind benchmark summaryReproduce The Benchmark
npm install
npm run build
npx playwright install chromium
# Keep Figma Desktop open, enable local MCP on port 3845,
# and select the target node before capturing.
npm run benchmark:capture -- dashstack-dashboard 2791-32584 WlvYAu5ONnUe7kVcDtmuqk
npm run benchmark:tokens -- dashstack-dashboard
npm run benchmark:diff -- dashstack-dashboardArtifacts are written to:
benchmarks/fixtures/<slug>/
benchmarks/results/<slug>/For a stricter comparison, run the blind benchmark with the same model, temperature, screenshot input, output contract, and compile-repair policy while changing only the text input:
export ANTHROPIC_API_KEY=...
npm run benchmark:blind -- dashstack-dashboard \
--provider anthropic \
--model claude-sonnet-4-5-20250929 \
--runs 5 \
--temperature 0 \
--max-repairs 1 \
--experiment-id sonnet45-t0-r5Runtime Model
This project is not meant to run primarily as a hosted web service. The bridge must access the user's local Figma Desktop selection, local filesystem, and local Ollama server. Use npm or GitHub installation for the actual runtime, and use GitHub Pages for documentation and benchmark reports.
Documentation:
- English Pages: https://junseo2323.github.io/decrease-token-figma/
- Korean Pages: https://junseo2323.github.io/decrease-token-figma/index.ko.html
- Benchmark report: https://junseo2323.github.io/decrease-token-figma/BENCHMARK_RESULTS.html
LLM Implementation Guidelines
- Use the screenshot to decide visual layout, spacing rhythm, and alignment.
- Use the handoff code for exact text, colors, font weights, and design tokens.
- Rename mechanically extracted asset variables to semantic names when implementing.
- Replace inline SVG placeholders with icon components such as
lucide-reactwhen possible.
License
MIT
