.claude/skills/ts-figma-api/SKILL.md
Interact with the Figma REST API to read design files, export assets, extract components, and pull design tokens programmatically. Use when tasks involve automating design handoff, syncing design tokens to code, exporting icons/images from Figma, or building integrations between Figma and development pipelines.
npx skillsauth add eliferjunior/Claude figma-apiInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
The Figma REST API exposes design files as structured JSON. Every frame, component, text node, and style is addressable. Authentication uses personal access tokens or OAuth2.
# .env — Figma personal access token from account settings.
FIGMA_TOKEN=figd_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
FIGMA_FILE_KEY=abc123DEFghiJKL
// src/figma/get-file.ts — Fetch the full Figma file tree.
// Returns a nested document structure with pages, frames, and nodes.
const FIGMA_BASE = "https://api.figma.com/v1";
export async function getFigmaFile(fileKey: string, token: string) {
const res = await fetch(`${FIGMA_BASE}/files/${fileKey}`, {
headers: { "X-Figma-Token": token },
});
if (!res.ok) throw new Error(`Figma API ${res.status}: ${res.statusText}`);
return res.json();
}
// src/figma/export-assets.ts — Export specific nodes as PNG/SVG/PDF.
// Pass node IDs (from the file tree) and desired format.
export async function exportNodes(
fileKey: string,
nodeIds: string[],
format: "png" | "svg" | "pdf",
token: string
) {
const ids = nodeIds.join(",");
const res = await fetch(
`${FIGMA_BASE}/images/${fileKey}?ids=${ids}&format=${format}&scale=2`,
{ headers: { "X-Figma-Token": token } }
);
const data = await res.json();
return data.images; // { nodeId: downloadUrl }
}
// src/figma/extract-tokens.ts — Walk the Figma file tree and pull
// color styles, text styles, and spacing values into a tokens object.
interface DesignTokens {
colors: Record<string, string>;
typography: Record<string, { fontFamily: string; fontSize: number; fontWeight: number }>;
spacing: Record<string, number>;
}
export function extractTokens(figmaFile: any): DesignTokens {
const tokens: DesignTokens = { colors: {}, typography: {}, spacing: {} };
const styles = figmaFile.styles || {};
function walkNode(node: any) {
// Extract fill colors from nodes that reference a style
if (node.styles?.fill && node.fills?.[0]?.color) {
const c = node.fills[0].color;
const hex = rgbaToHex(c.r, c.g, c.b, c.a);
const styleName = styles[node.styles.fill]?.name || node.name;
tokens.colors[styleName] = hex;
}
// Extract text styles
if (node.type === "TEXT" && node.style) {
const s = node.style;
const styleName = styles[node.styles?.text]?.name || node.name;
tokens.typography[styleName] = {
fontFamily: s.fontFamily,
fontSize: s.fontSize,
fontWeight: s.fontWeight,
};
}
if (node.children) node.children.forEach(walkNode);
}
walkNode(figmaFile.document);
return tokens;
}
function rgbaToHex(r: number, g: number, b: number, a: number): string {
const toHex = (v: number) =>
Math.round(v * 255)
.toString(16)
.padStart(2, "0");
return `#${toHex(r)}${toHex(g)}${toHex(b)}${a < 1 ? toHex(a) : ""}`;
}
// src/figma/list-components.ts — Get all published components in a file.
// Useful for building component inventories or icon libraries.
export async function getComponents(fileKey: string, token: string) {
const res = await fetch(`${FIGMA_BASE}/files/${fileKey}/components`, {
headers: { "X-Figma-Token": token },
});
const data = await res.json();
return data.meta.components.map((c: any) => ({
key: c.key,
name: c.name,
description: c.description,
containingFrame: c.containing_frame?.name,
}));
}
// src/figma/webhook.ts — Register a webhook to get notified on file changes.
// Figma sends POST requests when files are updated, comments are added, etc.
export async function createWebhook(
teamId: string,
endpoint: string,
token: string
) {
const res = await fetch(`${FIGMA_BASE}/v2/webhooks`, {
method: "POST",
headers: {
"X-Figma-Token": token,
"Content-Type": "application/json",
},
body: JSON.stringify({
event_type: "FILE_UPDATE",
team_id: teamId,
endpoint,
passcode: "my-secret-passcode",
}),
});
return res.json();
}
development
Expert guidance for Fireworks AI, the platform for running open-source LLMs (Llama, Mixtral, Qwen, etc.) with enterprise-grade speed and reliability. Helps developers integrate Fireworks' inference API, fine-tune models, and deploy custom model endpoints with function calling and structured output support.
development
Convert any website into clean, structured data with Firecrawl — API-first web scraping service. Use when someone asks to "turn a website into markdown", "scrape website for LLM", "Firecrawl", "extract website content as clean text", "crawl and convert to structured data", or "scrape website for RAG". Covers single-page scraping, full-site crawling, structured extraction, and LLM-ready output.
tools
Expert guidance for Firebase, Google's platform for building and scaling web and mobile applications. Helps developers set up authentication, Firestore/Realtime Database, Cloud Functions, hosting, storage, and analytics using Firebase's SDK and CLI.
development
When the user needs to build file upload functionality for a web application. Use when the user mentions "file upload," "image upload," "upload endpoint," "multipart upload," "presigned URL," "S3 upload," "file validation," "upload to cloud storage," or "accept user files." Handles upload endpoints, file validation (type, size, magic bytes), cloud storage integration, and upload status tracking. For image/video processing after upload, see media-transcoder.