|
|
|
""" |
|
🎨 Figma MCP Server - Hébergé sur Hugging Face Spaces |
|
Serveur MCP pour contrôler Figma via Claude/Cursor avec la vraie API REST |
|
""" |
|
import gradio as gr |
|
import asyncio |
|
import json |
|
import logging |
|
from PIL import Image |
|
import base64 |
|
import io |
|
|
|
|
|
logging.basicConfig(level=logging.INFO) |
|
logger = logging.getLogger(__name__) |
|
|
|
|
|
|
|
try: |
|
from tools import * |
|
logger.info("✅ Tous les outils MCP importés avec succès") |
|
except Exception as e: |
|
logger.error(f"❌ Erreur d'import des outils MCP: {e}") |
|
raise |
|
|
|
|
|
|
|
def setup_demo(): |
|
"""Configure l'interface Gradio pour le serveur MCP""" |
|
|
|
with gr.Blocks( |
|
title="🎨 Figma MCP Server", |
|
theme=gr.themes.Soft(), |
|
) as demo: |
|
|
|
gr.Markdown(""" |
|
# 🎨 Figma MCP Server |
|
**Serveur MCP pour contrôler Figma via Claude/Cursor avec l'API REST** |
|
|
|
## 📋 **Instructions de configuration :** |
|
|
|
### 1. **Obtenir un token Figma :** |
|
- Aller sur [Figma Settings > Personal Access Tokens](https://www.figma.com/settings) |
|
- Créer un nouveau token |
|
- Copier le token (commence par `figd_` ou `figc_`) |
|
|
|
### 2. **Obtenir l'ID d'un fichier :** |
|
- Ouvrir votre fichier Figma |
|
- Copier l'ID depuis l'URL : `https://www.figma.com/file/FILE_ID/nom-du-fichier` |
|
|
|
### 3. **Configurer Claude/Cursor :** |
|
```json |
|
{ |
|
"mcpServers": { |
|
"figma": { |
|
"command": "sse", |
|
"args": ["https://aktraiser-sigma.hf.space/gradio_api/mcp/sse"] |
|
} |
|
} |
|
} |
|
``` |
|
""") |
|
|
|
|
|
with gr.Tab("🧪 Test"): |
|
with gr.Row(): |
|
token_input = gr.Textbox( |
|
placeholder="figd_...", |
|
label="Token Figma", |
|
type="password" |
|
) |
|
token_btn = gr.Button("Configurer Token") |
|
|
|
with gr.Row(): |
|
file_input = gr.Textbox( |
|
placeholder="ID du fichier", |
|
label="ID du fichier Figma" |
|
) |
|
file_btn = gr.Button("Configurer Fichier") |
|
|
|
status_output = gr.Textbox(label="Status", lines=3) |
|
|
|
|
|
with gr.Row(): |
|
test_info_btn = gr.Button("📄 Info Fichier") |
|
test_comments_btn = gr.Button("📝 Commentaires") |
|
test_user_btn = gr.Button("👤 Info Utilisateur") |
|
|
|
|
|
with gr.Row(): |
|
test_user_detailed_btn = gr.Button("👤 Profil Détaillé") |
|
test_teams_btn = gr.Button("🏢 Mes Équipes") |
|
test_permissions_btn = gr.Button("🔐 Permissions") |
|
|
|
with gr.Row(): |
|
test_stats_btn = gr.Button("📊 Stats Workspace") |
|
|
|
with gr.Row(): |
|
test_limitations_btn = gr.Button("📚 Limitations API") |
|
|
|
|
|
token_btn.click( |
|
configure_figma_token, |
|
inputs=[token_input], |
|
outputs=[status_output] |
|
) |
|
|
|
file_btn.click( |
|
configure_figma_file_id, |
|
inputs=[file_input], |
|
outputs=[status_output] |
|
) |
|
|
|
test_info_btn.click( |
|
get_figma_file_info, |
|
outputs=[status_output] |
|
) |
|
|
|
test_comments_btn.click( |
|
get_figma_comments, |
|
outputs=[status_output] |
|
) |
|
|
|
test_user_btn.click( |
|
get_figma_user_info, |
|
outputs=[status_output] |
|
) |
|
|
|
test_user_detailed_btn.click( |
|
get_figma_user_detailed_info, |
|
outputs=[status_output] |
|
) |
|
|
|
test_teams_btn.click( |
|
list_figma_user_teams, |
|
outputs=[status_output] |
|
) |
|
|
|
test_permissions_btn.click( |
|
get_figma_current_user_permissions, |
|
outputs=[status_output] |
|
) |
|
|
|
test_stats_btn.click( |
|
get_figma_workspace_usage_stats, |
|
outputs=[status_output] |
|
) |
|
|
|
test_limitations_btn.click( |
|
get_figma_api_limitations_info, |
|
outputs=[status_output] |
|
) |
|
|
|
gr.Markdown(""" |
|
--- |
|
### 🛠️ **Outils MCP disponibles (détection automatique) :** |
|
|
|
**📋 Configuration :** |
|
- `configure_figma_token(token)` - Configure le token d'accès |
|
- `configure_figma_file_id(file_id)` - Configure l'ID du fichier |
|
|
|
**📁 Navigation :** |
|
- `get_figma_file_info()` - Récupère les infos du fichier |
|
- `get_figma_comments()` - Récupère les commentaires |
|
- `get_figma_user_info()` - Info utilisateur connecté |
|
|
|
**👤 Compte utilisateur et équipe :** |
|
- `get_figma_user_detailed_info()` - Informations détaillées de l'utilisateur (profil complet) |
|
- `list_figma_user_teams()` - Liste toutes les équipes de l'utilisateur avec rôles et plans |
|
- `get_figma_team_info(team_id)` - Infos détaillées d'une équipe (plan, limites, stockage) |
|
- `get_figma_current_user_permissions()` - Permissions dans le fichier actuel (via Plugin API) |
|
- `get_figma_workspace_usage_stats()` - Statistiques d'utilisation de l'espace de travail |
|
- `list_figma_team_projects(team_id)` - Projets d'une équipe |
|
- `get_figma_api_limitations_info()` - Explique les limitations API Plugin vs REST |
|
|
|
**🎨 Création d'éléments de base (Figma Design) :** |
|
- `create_figma_rectangle(x, y, width, height, name, color)` - Crée un rectangle |
|
- `create_figma_frame(x, y, width, height, name)` - Crée un frame |
|
- `create_figma_text(x, y, text, name, font_size)` - Crée un texte |
|
|
|
**🟡 FigJam - Éléments de base :** |
|
- `create_figjam_sticky_note(x, y, text, width, height)` - Post-it (défaut: 240×240px) |
|
- `create_figjam_connector_between_elements(element1_name, element2_name, style)` - Connecteur entre éléments |
|
- `create_figjam_shape_with_text(x, y, shape_type, text, width, height)` - Forme avec texte (défaut: 208×208px) |
|
- `create_figjam_table(rows, columns, x, y)` - Tableau interactif |
|
- `create_figjam_code_block(x, y, code, language)` - Bloc de code avec coloration syntaxique |
|
|
|
**📐 FigJam - Zones et organisation :** |
|
- `create_figjam_background_shape(x, y, width, height, color, title, corner_radius)` - Zone de fond rectangulaire |
|
- `create_figjam_organized_zone(title, x, y, width, height, max_stickies)` - Zone avec grille de post-its |
|
- `create_figjam_workshop_template(template_type, x, y)` - Templates d'atelier complets |
|
|
|
**🎭 FigJam - Stickers et réactions :** |
|
- `create_figjam_sticker(x, y, sticker_type, size)` - Stickers/emoji pour réactions |
|
|
|
**🎯 Types disponibles :** |
|
- **Formes:** rectangle, circle, triangle, diamond, star, hexagon |
|
- **Stickers:** thumbs_up, thumbs_down, heart, star, fire, rocket, bulb, warning, check, cross, question, idea, clock, money, target, celebrate, thinking, confused |
|
- **Templates:** retrospective, brainstorm, user_journey |
|
|
|
**💡 Workflow recommandé :** |
|
1. Créer une zone de fond avec `create_figjam_background_shape()` |
|
2. Ajouter des post-its avec `create_figjam_sticky_note()` |
|
3. Connecter les éléments avec `create_figjam_connector_between_elements()` |
|
4. Ajouter des stickers pour les réactions avec `create_figjam_sticker()` |
|
|
|
**✨ Toutes les fonctions génèrent du code JavaScript prêt à utiliser dans un plugin Figma !** |
|
|
|
--- |
|
|
|
## 📚 **Documentation Gradio MCP** |
|
Selon la [documentation officielle](https://www.gradio.app/guides/building-mcp-server-with-gradio) : |
|
- Gradio détecte **automatiquement** toutes les fonctions avec docstrings et type hints |
|
- Il suffit de `mcp_server=True` dans `.launch()` |
|
- Pas besoin d'exposition manuelle des outils |
|
""") |
|
|
|
return demo |
|
|
|
|
|
|
|
if __name__ == "__main__": |
|
try: |
|
demo = setup_demo() |
|
|
|
logger.info("🚀 Démarrage du serveur MCP Figma...") |
|
|
|
|
|
|
|
demo.launch( |
|
mcp_server=True, |
|
server_name="0.0.0.0", |
|
server_port=7860, |
|
share=False, |
|
show_error=True |
|
) |
|
|
|
except Exception as e: |
|
logger.error(f"❌ Erreur lors du lancement: {e}") |
|
raise |