{
  "markdown": "# Figma MCP\n\nFigma REST API MCP server. 2 tools list the top-level frames in a file and fetch one frame's rendered PNG plus its node JSON and image-fill map into a local output directory.\n\n<!-- mcp-name: io.scalably/figma-mcp -->\n\n## Install\n\nClaude Code:\n\n```bash\nclaude mcp add figma -e FIGMA_TOKEN=your-token -- npx -y @scalably-io/figma-mcp\n```\n\nCodex:\n\n```bash\ncodex mcp add figma --env FIGMA_TOKEN=your-token -- npx -y @scalably-io/figma-mcp\n```\n\nClaude Desktop: download `figma-mcp.mcpb` from the latest GitHub release and open it.\n\n## Setup\n\n1. Create a personal access token at figma.com under account settings, with `file_content:read` scope.\n2. Find the file key in any Figma file URL: it is the segment after `/design/` or `/file/`, for example `https://www.figma.com/design/AbC123xyz/My-file` gives `AbC123xyz`. Both tools take it as `file_key`.\n3. If `FIGMA_TOKEN` is not set the server still starts and lists its tools; every call then fails with `FIGMA_NOT_CONFIGURED` until the token is provided.\n4. `fetch_frame` is the only tool that writes files (so it is not marked read-only); it writes `frame.png`, `node.json`, and `fills.json` into a directory below the configured output root (default `./figma-output`). The other tool is fully read-only.\n\n## Tools (2)\n\n| Tool | What it does |\n|---|---|\n| `list_frames` | List and optionally filter all top-level FRAME nodes in a Figma file, with exact page/name/node-id data, dimensions, and file metadata |\n| `fetch_frame` | Fetch one Figma frame and transactionally write frame.png, node.json, and a normalized image-fill map into a directory below the output root |\n\n## Configuration\n\n| Variable | Required | Purpose |\n|---|---|---|\n| `FIGMA_TOKEN` | yes | Figma personal access token with `file_content:read` |\n| `FIGMA_API_BASE_URL` | no | Override the Figma REST API base URL (default `https://api.figma.com/v1`) |\n| `FIGMA_REQUEST_TIMEOUT_MS` | no | Per-request timeout in milliseconds (default 60000) |\n| `FIGMA_MAX_JSON_BYTES` | no | Upper bound on a Figma JSON response, in bytes (default 104857600) |\n| `FIGMA_MAX_FRAME_BYTES` | no | Upper bound on a downloaded frame PNG, in bytes (default 104857600) |\n| `FIGMA_OUTPUT_ROOT` | no | Directory that every `fetch_frame` output directory must stay below (default `./figma-output`, created on first use) |\n| `FIGMA_ALLOW_HTTP_FOR_TESTS` | no | Test suite only: `1` allows a plain-HTTP loopback API base. Never set it in normal use |\n\n## Reply shape\n\nEvery tool returns plain JSON with `status` (`succeeded`, `partial`, `no_op`), `summary`, `target`, `result`, `proof`, `warnings`, `recovery`. Failures throw a plain error string: `<code>: <message> <hint>`.\n\n## Limits\n\n`fetch_frame` renders through Figma's image API, so very large frames or extreme scale values can exceed the configured JSON or frame byte limits; lower `scale` or split the frame if that happens. `fills.json` URLs are temporary and expire within 14 days.\n\n## Verify\n\nEach release lists the package version, the `.mcpb` sha256 and the production commit it was derived from in CHANGELOG.md. CI runs the tests and a clean install of the packed tarball on every push.\n\n## Privacy Policy\n\nThis server runs locally, on your machine, under your own credentials. It collects no personal data, contains no telemetry, stores nothing persistently beyond the frame bundles you explicitly fetch, and talks only to the vendor API it wraps. No third party, including Scalably, receives your data. Contact: hello@scalably.io. Canonical copy: https://scalably.io/connector-privacy.html\n\n## License\n\nMIT. Copyright Scalably.\n",
  "bytes": 3596,
  "sha": "c0a7c381ec8cf7612a4da753f93f1e432e7be9503c6b20e5e66f7451330b0fc6",
  "repo_slug": "scalably-io/figma-mcp",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_scalably_figma_mcp_2da4fe42/readme"
}