use_figma — Compétence Figma Plugin API
Utilise use_figma MCP pour exécuter du JavaScript dans les fichiers Figma via l'API Plugin. Toute la documentation détaillée se trouve dans references/.
Passe toujours skillNames: "figma-use" lors de l'appel à use_figma. C'est un paramètre de journalisation utilisé pour suivre l'utilisation des compétences — il n'affecte pas l'exécution.
Si la tâche implique de construire ou mettre à jour une page complète, un écran ou une mise en page multi-section dans Figma à partir du code, charge aussi figma-generate-design. Elle fournit le flux de travail pour découvrir les composants du système de design via search_design_system, les importer et assembler les écrans de manière progressive. Les deux compétences fonctionnent ensemble : celle-ci pour les règles API, l'autre pour le flux de construction d'écrans.
Avant toute chose, charge plugin-api-standalone.index.md pour comprendre ce qui est possible. Quand on te demande d'écrire du code Plugin API, utilise ce contexte pour rechercher dans plugin-api-standalone.d.ts les types, méthodes et propriétés pertinents. C'est la source de vérité définitive pour la surface API. C'est un grand fichier de typages, donc ne le charge pas en entier, utilise la recherche pour les sections pertinentes au besoin.
IMPORTANT : Quand tu travailles avec des systèmes de design, commence par working-with-design-systems/wwds.md pour comprendre les concepts clés, processus et directives pour travailler avec les systèmes de design dans Figma. Charge ensuite les références plus spécifiques pour les composants, variables, styles de texte et styles d'effet au besoin.
1. Règles critiques
- Utilise
returnpour renvoyer des données. La valeur retournée est sérialisée en JSON automatiquement (objets, tableaux, chaînes, nombres). NE APPELLE PASfigma.closePlugin()ni n'enverrouille le code dans une IIFE async — c'est géré pour toi. - Écris du JavaScript brut avec
awaitetreturnau niveau supérieur. Le code est automatiquement enveloppé dans un contexte async. N'ENVERROUILLE PAS dans(async () => { ... })(). figma.notify()lève "not implemented" — ne l'utilise jamais 3a.getPluginData()/setPluginData()ne sont pas supportés dansuse_figma— ne les utilise pas. Utilise plutôtgetSharedPluginData()/setSharedPluginData()(ceux-ci SONT supportés), ou suit les ID de nœuds en les retournant et en les passant aux appels suivants.console.log()n'est PAS retourné — utilisereturnpour la sortie- Travaille de manière progressive par petites étapes. Divise les grandes opérations en plusieurs appels
use_figma. Valide après chaque étape. C'est la pratique la plus importante pour éviter les bugs. - Les couleurs sont dans la plage 0–1 (non 0–255) :
{r: 1, g: 0, b: 0}= rouge - Les remplissages/traits sont des tableaux en lecture seule — clone, modifie, réassigne
- La police DOIT être chargée avant toute opération sur du texte :
await figma.loadFontAsync({family, style}) - Les pages se chargent progressivement — utilise
await figma.setCurrentPageAsync(page)pour basculer vers une page et charger son contenu (voir Règles de page ci-dessous) setBoundVariableForPaintretourne une NOUVELLE peinture — doit être capturée et réassignéecreateVariableaccepte la collection comme objet ou chaîne ID (objet préféré)layoutSizingHorizontal/Vertical = 'FILL'DOIT être défini APRÈSparent.appendChild(child)— définir avant append lève une erreur. Même pour'HUG'sur les nœuds non-auto-layout.- Positionne les nouveaux nœuds de niveau supérieur loin de (0,0). Les nœuds ajoutés directement à la page par défaut à (0,0). Scanne
figma.currentPage.childrenpour trouver une position libre (ex. à droite du nœud le plus à droite). Ceci s'applique seulement aux nœuds au niveau de la page — les nœuds imbriqués dans d'autres cadres ou conteneurs auto-layout sont positionnés par leur parent. Voir Gotchas. - En cas d'erreur
use_figma, ARRÊTE. N'essaie PAS de réessayer immédiatement. Les scripts échoués sont atomiques — si un script errore, il n'est pas exécuté du tout et aucun changement n'est apporté au fichier. Lis le message d'erreur attentivement, corrige le script, puis réessaie. Voir Error Recovery. - DOIT retourner TOUS les ID de nœuds créés/modifiés. Quand un script crée de nouveaux nœuds ou en modifie des existants sur le canevas, recueille chaque ID de nœud affecté et les retourne dans un objet structuré (ex.
return { createdNodeIds: [...], mutatedNodeIds: [...] }). C'est essentiel pour que les appels suivants les référencent, les valident ou les nettoient. - Définis toujours
variable.scopesexplicitement lors de la création de variables. La valeur par défautALL_SCOPESpollue chaque sélecteur de propriété — rarement ce que tu veux. Utilise des portées spécifiques comme["FRAME_FILL", "SHAPE_FILL"]pour les arrière-plans,["TEXT_FILL"]pour les couleurs de texte,["GAP"]pour l'espacement, etc. Voir variable-patterns.md pour la liste complète. awaitchaque Promise. Ne laisse jamais une Promise sans attendre — les appels async non attendus (ex.figma.loadFontAsync(...)sansawait, oufigma.setCurrentPageAsync(page)sansawait) s'exécuteront en arrière-plan, causant des défaillances silencieuses ou des conditions de concurrence. Le script peut retourner avant que l'opération async se termine, causant des données manquantes ou des changements partiels.
Pour des exemples détaillés MAUVAIS/CORRECT de chaque règle, voir Gotchas & Common Mistakes.
2. Règles de page (Critiques)
Le contexte de page se réinitialise entre les appels use_figma — figma.currentPage démarre à la première page à chaque fois.
Basculer entre les pages
Utilise await figma.setCurrentPageAsync(page) pour basculer vers une page et charger son contenu. Le setter synchrone figma.currentPage = page lève une erreur dans les environnements use_figma.
// Bascule vers une page spécifique (charge son contenu)
const targetPage = figma.root.children.find((p) => p.name === "My Page");
await figma.setCurrentPageAsync(targetPage);
// targetPage.children est maintenant rempli
// Itère sur toutes les pages
for (const page of figma.root.children) {
await figma.setCurrentPageAsync(page);
// page.children est maintenant chargé — lis ou modifie ici
}
Entre les exécutions de script
figma.currentPage se réinitialise à la première page au début de chaque appel use_figma. Si ton flux de travail s'étend sur plusieurs appels et cible une page non-défaut, appelle await figma.setCurrentPageAsync(page) au début de chaque invocation.
Tu peux appeler use_figma plusieurs fois pour construire progressivement sur l'état du fichier, ou pour récupérer des informations avant d'écrire un autre script. Par exemple, écris un script pour obtenir les métadonnées des nœuds existants, return ces données, puis utilise-les dans un script suivant pour modifier ces nœuds.
3. return est ton canal de sortie
L'agent ne voit QUE la valeur que tu return. Tout le reste est invisible.
- Retourner des IDs (CRITIQUE) : Chaque script qui crée ou modifie des nœuds du canevas DOIT retourner tous les ID affectés — ex.
return { createdNodeIds: [...], mutatedNodeIds: [...] }. C'est une exigence stricte, pas optionnelle. - Signalisation de progression :
return { createdNodeIds: [...], count: 5, errors: [] } - Info d'erreur : Les erreurs levées sont capturées et retournées automatiquement — laisse-les simplement se propager ou lève-les explicitement.
- La sortie
console.log()n'est jamais retournée à l'agent - Retourne toujours des données exploitables (IDs, comptes, statut) afin que les appels suivants puissent référencer les objets créés
4. Mode éditeur
use_figma fonctionne en mode design (editorType "figma", le défaut). FigJam ("figjam") a un ensemble différent de types de nœuds disponibles — la plupart des nœuds de design y sont bloqués.
Disponibles en mode design : Rectangle, Frame, Component, Text, Ellipse, Star, Line, Vector, Polygon, BooleanOperation, Slice, Page, Section, TextPath.
Bloqués en mode design : Sticky, Connector, ShapeWithText, CodeBlock, Slide, SlideRow, Webpage.
5. Flux de travail progressif (Comment éviter les bugs)
La cause la plus courante de bugs est d'essayer de faire trop en un seul appel use_figma. Travaille par petites étapes et valide après chacune.
Le modèle
- Inspecte d'abord. Avant de créer quoi que ce soit, lance une
use_figmaen lecture seule pour découvrir ce qui existe déjà dans le fichier — pages, composants, variables, conventions de nommage. Fais correspondre ce qui y est. - Fais une chose par appel. Crée les variables dans un appel, les composants dans le suivant, compose les mises en page dans un autre. N'essaie pas de construire un écran entier dans un seul script.
- Retourne les IDs de chaque appel. Retourne toujours les IDs des nœuds créés, IDs de variables, IDs de collection dans des objets structurés (ex.
return { createdNodeIds: [...] }). Tu en auras besoin comme entrées des appels suivants. - Valide après chaque étape. Utilise
get_metadatapour vérifier la structure (comptes, noms, hiérarchie, positions). Utiliseget_screenshotaprès les jalons majeurs pour détecter les problèmes visuels. - Corrige avant de continuer. Si la validation révèle un problème, corrige-le avant de procéder à l'étape suivante. Ne construis pas sur une base cassée.
Ordre d'étapes suggéré pour les tâches complexes
Étape 1 : Inspecte le fichier — découvre les pages, composants, variables, conventions existants
Étape 2 : Crée les tokens/variables (si nécessaire)
→ valide avec get_metadata
Étape 3 : Crée les composants individuels
→ valide avec get_metadata + get_screenshot
Étape 4 : Compose les mises en page à partir des instances de composants
→ valide avec get_screenshot
Étape 5 : Vérification finale
Ce qu'il faut valider à chaque étape
| Après... | Vérifier avec get_metadata |
Vérifier avec get_screenshot |
|---|---|---|
| Création de variables | Compte de collections, compte de variables, noms de modes | — |
| Création de composants | Compte d'enfants, noms de variantes, définitions de propriétés | Variantes visibles, non réduites, grille lisible |
| Liaison de variables | Les propriétés des nœuds reflètent les liaisons | Couleurs/tokens résolus correctement |
| Composition de mises en page | Les instances de nœuds ont mainComponent, hiérarchie correcte | Aucun texte coupé/clippé, aucun élément qui se chevauche, espacement correct |
6. Récupération d'erreur et auto-correction
use_figma est atomique — les scripts échoués ne s'exécutent pas. Si un script errore, aucun changement n'est apporté au fichier. Le fichier reste dans le même état qu'avant l'appel. Cela signifie qu'il n'y a pas de nœuds partiels, pas d'éléments orphelins du script échoué, et le réessai après une correction est sûr.
Quand use_figma retourne une erreur
- ARRÊTE. Ne corrige pas immédiatement le code et ne réessaie pas.
- Lis le message d'erreur attentivement. Comprends exactement ce qui s'est mal passé — mauvaise utilisation API, police manquante, valeur de propriété invalide, etc.
- Si l'erreur n'est pas claire, appelle
get_metadataouget_screenshotpour comprendre l'état actuel du fichier. - Corrige le script en fonction du message d'erreur.
- Réessaie le script corrigé.
Modèles courants d'auto-correction
| Message d'erreur | Cause probable | Comment corriger |
|---|---|---|
"not implemented" |
Utilisation de figma.notify() |
Supprime-le — utilise return pour la sortie |
"node must be an auto-layout frame..." |
Défini FILL/HUG avant d'ajouter à un parent auto-layout |
Place appendChild avant layoutSizingX = 'FILL' |
"Setting figma.currentPage is not supported" |
Utilisation du setter de page synchrone | Utilise await figma.setCurrentPageAsync(page) |
| Valeur de propriété hors limites | Canal de couleur > 1 (utilisé 0–255 au lieu de 0–1) | Divise par 255 |
"Cannot read properties of null" |
Le nœud n'existe pas (mauvais ID, mauvaise page) | Vérifiez le contexte de page, vérifiez l'ID |
| Le script se bloque / pas de réponse | Boucle infinie ou promesse non résolue | Vérifie les while(true) ou await manquants ; assure-toi que le code se termine |
"The node with id X does not exist" |
L'instance parent a été implicitement détachée par un detachInstance() enfant, changeant les IDs |
Redécouvre les nœuds par traversal depuis un cadre parent stable (non-instance) |
Quand le script réussit mais le résultat semble faux
- Appelle
get_metadatapour vérifier la correction structurelle (hiérarchie, comptes, positions). - Appelle
get_screenshotpour vérifier la correction visuelle. Cherche bien les textes coupés/clippés (hauteurs de ligne coupant le contenu) et les chevauchements d'éléments — ce sont des phénomènes courants et faciles à manquer. - Identifie la discordance — est-ce structurel (hiérarchie fausse, nœuds manquants) ou visuel (couleurs mauvaises, mise en page cassée, contenu clippé) ?
- Écris un script de correction ciblé qui modifie seulement les parties cassées — ne recréé pas tout.
Pour le flux de travail de validation complet, voir Validation & Error Recovery.
7. Checklist de pré-lancement
Avant de soumettre UN SEUL appel use_figma, vérifie :
- [ ] Le code utilise
returnpour renvoyer les données (PASfigma.closePlugin()) - [ ] Le code n'est PAS enveloppé dans une IIFE async (auto-enveloppé pour toi)
- [ ] La valeur
returninclut des données structurées avec infos exploitables (IDs, comptes) - [ ] AUCUNE utilisation de
figma.notify()n'importe où - [ ] AUCUNE utilisation de
console.log()comme sortie (utilisereturnà la place) - [ ] Toutes les couleurs utilisent la plage 0–1 (non 0–255)
- [ ] Les remplissages/traits sont réassignés comme nouveaux tableaux (non mutés sur place)
- [ ] Les changements de page utilisent
await figma.setCurrentPageAsync(page)(le setter synchrone lève) - [ ]
layoutSizingVertical/Horizontal = 'FILL'est défini APRÈSparent.appendChild(child) - [ ]
loadFontAsync()appelé AVANT tout changement de propriété de texte - [ ]
lineHeight/letterSpacingutilisent le format{unit, value}(pas des nombres nus) - [ ]
resize()est appelé AVANT de définir les modes de dimensionnement (resize les réinitialise à FIXED) - [ ] Pour les flux de travail multi-étapes : les IDs des appels précédents sont passés comme littéraux de chaîne (pas de variables)
- [ ] Les nouveaux nœuds de niveau supérieur sont positionnés loin de (0,0) pour éviter de chevaucher le contenu existant
- [ ] TOUS les IDs de nœuds créés/modifiés sont recueillis et inclus dans la valeur
return - [ ] Chaque appel async (
loadFontAsync,setCurrentPageAsync,importComponentByKeyAsync, etc.) estawaité — pas de Promises feu-et-oubli
8. Découvre les conventions avant de créer
Inspecte toujours le fichier Figma avant de créer quoi que ce soit. Les différents fichiers utilisent différentes conventions de nommage, structures de variables et modèles de composants. Ton code doit correspondre à ce qui y existe déjà, non imposer de nouvelles conventions.
En cas de doute sur une convention (nommage, portée, structure), vérifie d'abord le fichier Figma, puis la base de code de l'utilisateur. Reviens seulement aux modèles courants quand ni l'un ni l'autre n'existe.
Scripts d'inspection rapide
Liste toutes les pages et nœuds de niveau supérieur :
const pages = figma.root.children.map(p => `${p.name} id=${p.id} children=${p.children.length}`);
return pages.join('\n');
Liste les composants existants sur toutes les pages :
const results = [];
for (const page of figma.root.children) {
await figma.setCurrentPageAsync(page);
page.findAll(n => {
if (n.type === 'COMPONENT' || n.type === 'COMPONENT_SET')
results.push(`[${page.name}] ${n.name} (${n.type}) id=${n.id}`);
return false;
});
}
return results.join('\n');
Liste les collections de variables existantes et leurs conventions :
const collections = await figma.variables.getLocalVariableCollectionsAsync();
const results = collections.map(c => ({
name: c.name, id: c.id,
varCount: c.variableIds.length,
modes: c.modes.map(m => m.name)
}));
return results;
9. Docs de référence
Charge-les au besoin en fonction de ce que ta tâche implique :
| Doc | Quand charger | Ce qu'elle couvre |
|---|---|---|
| gotchas.md | Avant tout use_figma |
Chaque piège connu avec exemples de code MAUVAIS/CORRECT |
| common-patterns.md | Besoin d'exemples de code fonctionnant | Échafaudages de scripts : formes, texte, auto-layout, variables, composants, flux de travail multi-étapes |
| plugin-api-patterns.md | Créer/éditer des nœuds | Remplissages, traits, Auto Layout, effets, groupage, clonage, styles |
| api-reference.md | Besoin de la surface API exacte | Création de nœuds, API variables, propriétés core, ce qui fonctionne et ne fonctionne pas |
| validation-and-recovery.md | Écritures multi-étapes ou récupération d'erreur | Flux de travail get_metadata vs get_screenshot, étapes obligatoires de récupération d'erreur |
| component-patterns.md | Créer des composants/variantes | combineAsVariants, propriétés de composants, INSTANCE_SWAP, mise en page de variantes, découverte de composants existants, traversal de métadonnées |
| variable-patterns.md | Créer/lier des variables | Collections, modes, portées, aliasing, modèles de liaison, découverte de variables existantes |
| text-style-patterns.md | Créer/appliquer des styles de texte | Rampes de type, sondage de polices, listage de styles, application de styles aux nœuds |
| effect-style-patterns.md | Créer/appliquer des styles d'effet | Ombres portées, listage de styles, application de styles aux nœuds |
| plugin-api-standalone.index.md | Besoin de comprendre la surface API complète | Index de tous les types, méthodes et propriétés dans l'API Plugin |
| plugin-api-standalone.d.ts | Besoin des signatures de type exactes | Fichier de typages complet — recherche les symboles spécifiques, ne charge pas tout à la fois |
10. Exemples de snippets
Tu verras des snippets tout au long de la documentation. Ces snippets contiennent du code Plugin API utile qui peut être réutilisé. Utilise-les tels quels, ou comme code de démarrage au fur et à mesure. S'il y a des concepts clés qui sont mieux documentés comme snippets génériques, mets-les en évidence et écris sur disque afin de pouvoir les réutiliser à l'avenir.