Deterministic Figma to Elementor, Gutenberg, Oxygen, Etch and HTML layouts for AI assistants.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Bearer <ready→made key>. Create one at https://api.levels.dev/account (MCP section). Included in ready→made Pro and Lifetime.
Your Figma personal access token (scope: File content, read). Forwarded to Figma for your calls, never stored.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Convert ONE Figma frame into a native WordPress builder layout with ready→made's deterministic spatial engine (same frame → same output, no LLM guessing). Returns the paste-ready payload plus a short instruction on how to paste/import it. Targets: elementor (container JSON for "Paste from other site", or a template file), gutenberg (core block markup), oxygen6, oxygen (Classic), etch, html (self-contained). Convert sections one at a time (hero, features, footer…). A whole page in one call hits the layer limit. Requires a ready→made Pro or Lifetime plan.
Figma frame URL. In Figma: select the frame, right-click → "Copy link to selection". Must carry node-id (or pass `node`).
Node id such as "12:345" or "12-345". Overrides node-id in the URL.
Output format. Default: elementor.
Optional tuning.
Ignore the cached copy of this frame and refetch from Figma. Default false. A frame fetched once is reused for other targets and for its child frames while the file version is unchanged.
A Figma personal access token (figd_…) with the "File content: read" scope. Usually configured once as the x-figma-token header in the MCP client; pass it here only if the header is not set. It is forwarded to Figma for this call and never stored.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http readymade https://api.levels.dev/mcp \ --header 'Authorization: Bearer YOUR_TOKEN' \ --header 'x-figma-token: YOUR_X_FIGMA_TOKEN'
Headers
Authorization (required): Bearer <ready→made key>. Create one at https://api.levels.dev/account (MCP section). Included in ready→made Pro and Lifetime.x-figma-token (required): Your Figma personal access token (scope: File content, read). Forwarded to Figma for your calls, never stored.Convert ONE Figma frame into a native WordPress builder layout with ready→made's deterministic spatial engine (same frame → same output, no LLM guessing). Returns the paste-ready payload plus a short instruction on how to paste/import it. Targets: elementor (container JSON for "Paste from other site", or a template file), gutenberg (core block markup), oxygen6, oxygen (Classic), etch, html (self-contained). Convert sections one at a time (hero, features, footer…). A whole page in one call hits the layer limit. Requires a ready→made Pro or Lifetime plan.
| Argument | Type | Description |
|---|---|---|
| url* | string | Figma frame URL. In Figma: select the frame, right-click → "Copy link to selection". Must carry node-id (or pass `node`). |
| node | string | Node id such as "12:345" or "12-345". Overrides node-id in the URL. |
| target | string | Output format. Default: elementor. |
| options | object | Optional tuning. |
| refresh | boolean | Ignore the cached copy of this frame and refetch from Figma. Default false. A frame fetched once is reused for other targets and for its child frames while the file version is unchanged. |
| figmaToken | string | A Figma personal access token (figd_…) with the "File content: read" scope. Usually configured once as the x-figma-token header in the MCP client; pass it here only if the header is not set. It is forwarded to Figma for this call and never stored. |
{
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"description": "Figma frame URL. In Figma: select the frame, right-click → \"Copy link to selection\". Must carry node-id (or pass `node`)."
},
"node": {
"type": "string",
"description": "Node id such as \"12:345\" or \"12-345\". Overrides node-id in the URL."
},
"target": {
"enum": [
"elementor",
"gutenberg",
"oxygen6",
"oxygen",
"etch",
"html"
],
"type": "string",
"description": "Output format. Default: elementor."
},
"options": {
"type": "object",
"properties": {
"mode": {
"enum": [
"mdl",
"default"
],
"type": "string",
"description": "Layout chain. mdl (default, same as the Figma plugin) nests clusters for editability; default keeps the flatter chain."
},
"title": {
"type": "string",
"description": "Elementor template title (template format only)."
},
"assets": {
"enum": [
"hosted",
"inline",
"none"
],
"type": "string",
"description": "Raster images: hosted (default) = uploaded to api.levels.dev for 24 h and referenced by URL (what Elementor needs; builders copy them into the media library); inline = data URLs up to 1.5 MB (self-contained HTML/Gutenberg); none = skip rasters. SVGs are always inlined."
},
"includeSize": {
"type": "boolean",
"description": "Emit explicit width/height on containers (Oxygen, Oxygen 6, Elementor). Default true."
},
"elementorFormat": {
"enum": [
"paste",
"template"
],
"type": "string",
"description": "Elementor only. paste (default) = clipboard JSON for right-click → \"Paste from other site\" in the editor. template = .json for Templates → Import."
}
},
"description": "Optional tuning.",
"additionalProperties": false
},
"refresh": {
"type": "boolean",
"description": "Ignore the cached copy of this frame and refetch from Figma. Default false. A frame fetched once is reused for other targets and for its child frames while the file version is unchanged."
},
"figmaToken": {
"type": "string",
"description": "A Figma personal access token (figd_…) with the \"File content: read\" scope. Usually configured once as the x-figma-token header in the MCP client; pass it here only if the header is not set. It is forwarded to Figma for this call and never stored."
}
},
"additionalProperties": false
}Outline a Figma file or frame WITHOUT converting: layer tree (names, ids, types, sizes), node count, text/image/vector counts, whether the frame is within the convert limit, and a list of section-sized child frames that are good convert_figma candidates. Use it to pick the right frame when the user gives a whole-file link, or when convert_figma says a frame is too large. Free.
| Argument | Type | Description |
|---|---|---|
| url* | string | Figma URL (https://www.figma.com/design/<fileKey>/…?node-id=<id>) or a bare file key. Without node-id the whole file is outlined. |
| node | string | Node id such as "12:345" or "12-345". Overrides node-id in the URL. |
| depth | integer | Levels of children to include. Default 3. |
| refresh | boolean | Ignore the cached copy of this file and refetch from Figma. Default false. Cached Figma data (7 days, per account) is reused when the file version is unchanged. |
| figmaToken | string | A Figma personal access token (figd_…) with the "File content: read" scope. Usually configured once as the x-figma-token header in the MCP client; pass it here only if the header is not set. It is forwarded to Figma for this call and never stored. |
{
"type": "object",
"required": [
"url"
],
"properties": {
"url": {
"type": "string",
"description": "Figma URL (https://www.figma.com/design/<fileKey>/…?node-id=<id>) or a bare file key. Without node-id the whole file is outlined."
},
"node": {
"type": "string",
"description": "Node id such as \"12:345\" or \"12-345\". Overrides node-id in the URL."
},
"depth": {
"type": "integer",
"maximum": 6,
"minimum": 1,
"description": "Levels of children to include. Default 3."
},
"refresh": {
"type": "boolean",
"description": "Ignore the cached copy of this file and refetch from Figma. Default false. Cached Figma data (7 days, per account) is reused when the file version is unchanged."
},
"figmaToken": {
"type": "string",
"description": "A Figma personal access token (figd_…) with the \"File content: read\" scope. Usually configured once as the x-figma-token header in the MCP client; pass it here only if the header is not set. It is forwarded to Figma for this call and never stored."
}
},
"additionalProperties": false
}List the WordPress builder formats ready→made can emit (Elementor, Gutenberg, Oxygen 6, Oxygen Classic, Etch, plain HTML) with a one-line note on how each output is pasted or imported. Free; call it when unsure which `target` to use.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 9, 2026.
No readOnlyHint / destructiveHint annotations, so clients can't tell a read from a write without asking.
Fix: Add annotations to each tool, e.g. { readOnlyHint: true } for tools that only read.