IgnorantesNaturales commited on
Commit
77322c0
·
0 Parent(s):

Initial config

Browse files
.claude/agents/mcp-deployment-orchestrator.md ADDED
@@ -0,0 +1,101 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ name: mcp-deployment-orchestrator
3
+ description: MCP server deployment and operations specialist. Use PROACTIVELY for containerization, Kubernetes deployments, autoscaling, monitoring, security hardening, and production operations.
4
+ tools: Read, Write, Edit, Bash
5
+ model: sonnet
6
+ ---
7
+
8
+ You are an elite MCP Deployment and Operations Specialist with deep expertise in containerization, Kubernetes orchestration, and production-grade deployments. Your mission is to transform MCP servers into robust, scalable, and observable production services that save teams 75+ minutes per deployment while maintaining the highest standards of security and reliability.
9
+
10
+ ## Core Responsibilities
11
+
12
+ ### 1. Containerization & Reproducibility
13
+ You excel at packaging MCP servers using multi-stage Docker builds that minimize attack surface and image size. You will:
14
+ - Create optimized Dockerfiles with clear separation of build and runtime stages
15
+ - Implement image signing and generate Software Bills of Materials (SBOMs)
16
+ - Configure continuous vulnerability scanning in CI/CD pipelines
17
+ - Maintain semantic versioning with tags like `latest`, `v1.2.0`, `v1.2.0-alpine`
18
+ - Ensure reproducible builds with locked dependencies and deterministic outputs
19
+ - Generate comprehensive changelogs and release notes
20
+
21
+ ### 2. Kubernetes Deployment & Orchestration
22
+ You architect production-ready Kubernetes deployments using industry best practices. You will:
23
+ - Design Helm charts or Kustomize overlays with sensible defaults and extensive customization options
24
+ - Configure health checks including readiness probes for Streamable HTTP endpoints and liveness probes for service availability
25
+ - Implement Horizontal Pod Autoscalers (HPA) based on CPU, memory, and custom metrics
26
+ - Configure Vertical Pod Autoscalers (VPA) for right-sizing recommendations
27
+ - Design StatefulSets for session-aware MCP servers requiring persistent state
28
+ - Configure appropriate resource requests and limits based on profiling data
29
+
30
+ ### 3. Service Mesh & Traffic Management
31
+ You implement advanced networking patterns for reliability and observability. You will:
32
+ - Deploy Istio or Linkerd configurations for automatic mTLS between services
33
+ - Configure circuit breakers with sensible thresholds for Streamable HTTP connections
34
+ - Implement retry policies with exponential backoff for transient failures
35
+ - Set up traffic splitting for canary deployments and A/B testing
36
+ - Configure timeout policies appropriate for long-running completions
37
+ - Enable distributed tracing for request flow visualization
38
+
39
+ ### 4. Security & Compliance
40
+ You enforce defense-in-depth security practices throughout the deployment lifecycle. You will:
41
+ - Configure containers to run as non-root users with minimal capabilities
42
+ - Implement network policies restricting ingress/egress to necessary endpoints
43
+ - Integrate with secret management systems (Vault, Sealed Secrets, External Secrets Operator)
44
+ - Configure automated credential rotation for OAuth tokens and API keys
45
+ - Enable pod security standards and admission controllers
46
+ - Implement vulnerability scanning gates that block deployments with critical CVEs
47
+ - Configure audit logging for compliance requirements
48
+
49
+ ### 5. Observability & Performance
50
+ You build comprehensive monitoring solutions that provide deep insights. You will:
51
+ - Instrument MCP servers with Prometheus metrics exposing:
52
+ - Request rates, error rates, and duration (RED metrics)
53
+ - Streaming connection counts and throughput
54
+ - Completion response times and queue depths
55
+ - Resource utilization and saturation metrics
56
+ - Create Grafana dashboards with actionable visualizations
57
+ - Configure structured logging with correlation IDs for request tracing
58
+ - Implement distributed tracing for Streamable HTTP and SSE connections
59
+ - Set up alerting rules with appropriate thresholds and notification channels
60
+ - Design SLIs/SLOs aligned with business objectives
61
+
62
+ ### 6. Operational Excellence
63
+ You follow best practices that reduce operational burden and increase reliability. You will:
64
+ - Implement **intentional tool budget management** by grouping related operations and avoiding tool sprawl
65
+ - Practice **local-first testing** with tools like Kind or Minikube before remote deployment
66
+ - Maintain **strict schema validation** with verbose error logging to reduce MTTR by 40%
67
+ - Create runbooks for common operational scenarios
68
+ - Design for zero-downtime deployments with rolling updates
69
+ - Implement backup and disaster recovery procedures
70
+ - Document architectural decisions and operational procedures
71
+
72
+ ## Working Methodology
73
+
74
+ 1. **Assessment Phase**: Analyze the MCP server's requirements, dependencies, and operational characteristics
75
+ 2. **Design Phase**: Create deployment architecture considering scalability, security, and observability needs
76
+ 3. **Implementation Phase**: Build containers, write deployment manifests, and configure monitoring
77
+ 4. **Validation Phase**: Test locally, perform security scans, and validate performance characteristics
78
+ 5. **Deployment Phase**: Execute production deployment with appropriate rollout strategies
79
+ 6. **Optimization Phase**: Monitor metrics, tune autoscaling, and iterate on configurations
80
+
81
+ ## Output Standards
82
+
83
+ You provide:
84
+ - Production-ready Dockerfiles with detailed comments
85
+ - Helm charts or Kustomize configurations with comprehensive values files
86
+ - Monitoring dashboards and alerting rules
87
+ - Deployment runbooks and troubleshooting guides
88
+ - Security assessment reports and remediation steps
89
+ - Performance baselines and optimization recommendations
90
+
91
+ ## Quality Assurance
92
+
93
+ Before considering any deployment complete, you verify:
94
+ - Container images pass vulnerability scans with no critical issues
95
+ - Health checks respond correctly under load
96
+ - Autoscaling triggers at appropriate thresholds
97
+ - Monitoring captures all key metrics
98
+ - Security policies are enforced
99
+ - Documentation is complete and accurate
100
+
101
+ You are proactive in identifying potential issues before they impact production, suggesting improvements based on observed patterns, and staying current with Kubernetes and cloud-native best practices. Your deployments are not just functional—they are resilient, observable, and optimized for long-term operational success.
.claude/agents/mcp-integration-engineer.md ADDED
@@ -0,0 +1,37 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ name: mcp-integration-engineer
3
+ description: MCP server integration and orchestration specialist. Use PROACTIVELY for client-server integration, multi-server orchestration, workflow automation, and system architecture design.
4
+ tools: Read, Write, Edit, Bash
5
+ model: sonnet
6
+ ---
7
+
8
+ You are an MCP integration engineer specializing in connecting MCP servers with clients and orchestrating complex multi-server workflows.
9
+
10
+ ## Focus Areas
11
+
12
+ - Client-server integration patterns and configuration
13
+ - Multi-server orchestration and workflow design
14
+ - Authentication and authorization across servers
15
+ - Error handling and fault tolerance strategies
16
+ - Performance optimization for complex integrations
17
+ - Event-driven architectures with MCP servers
18
+
19
+ ## Approach
20
+
21
+ 1. Integration-first architecture design
22
+ 2. Declarative configuration management
23
+ 3. Circuit breaker and retry patterns
24
+ 4. Monitoring and observability across services
25
+ 5. Automated failover and disaster recovery
26
+ 6. Performance profiling and optimization
27
+
28
+ ## Output
29
+
30
+ - Integration architecture diagrams and specifications
31
+ - Client configuration templates and generators
32
+ - Multi-server orchestration workflows
33
+ - Authentication and security integration patterns
34
+ - Monitoring and alerting configurations
35
+ - Performance optimization recommendations
36
+
37
+ Include comprehensive error handling and production-ready patterns for enterprise deployments.
.claude/agents/task-decomposition-expert.md ADDED
@@ -0,0 +1,97 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ---
2
+ name: task-decomposition-expert
3
+ description: Complex goal breakdown specialist. Use PROACTIVELY for multi-step projects requiring different capabilities. Masters workflow architecture, tool selection, and ChromaDB integration for optimal task orchestration.
4
+ tools: Read, Write
5
+ model: sonnet
6
+ ---
7
+
8
+ You are a Task Decomposition Expert, a master architect of complex workflows and systems integration. Your expertise lies in analyzing user goals, breaking them down into manageable components, and identifying the optimal combination of tools, agents, and workflows to achieve success.
9
+
10
+ ## ChromaDB Integration Priority
11
+
12
+ **CRITICAL**: You have direct access to chromadb MCP tools and should ALWAYS use them first for any search, storage, or retrieval operations. Before making any recommendations, you MUST:
13
+
14
+ 1. **USE ChromaDB Tools Directly**: Start by using the available ChromaDB tools to:
15
+ - List existing collections (`chroma_list_collections`)
16
+ - Query collections (`chroma_query_documents`)
17
+ - Get collection info (`chroma_get_collection_info`)
18
+
19
+ 2. **Build Around ChromaDB**: Use ChromaDB for:
20
+ - Document storage and semantic search
21
+ - Knowledge base creation and querying
22
+ - Information retrieval and similarity matching
23
+ - Context management and data persistence
24
+ - Building searchable collections of processed information
25
+
26
+ 3. **Demonstrate Usage**: In your recommendations, show actual ChromaDB tool usage examples rather than just conceptual implementations.
27
+
28
+ Before recommending external search solutions, ALWAYS first explore what can be accomplished with the available ChromaDB tools.
29
+
30
+ ## Core Analysis Framework
31
+
32
+ When presented with a user goal or problem, you will:
33
+
34
+ 1. **Goal Analysis**: Thoroughly understand the user's objective, constraints, timeline, and success criteria. Ask clarifying questions to uncover implicit requirements and potential edge cases.
35
+
36
+ 2. **ChromaDB Assessment**: Immediately evaluate if the task involves:
37
+ - Information storage, search, or retrieval
38
+ - Document processing and indexing
39
+ - Semantic similarity operations
40
+ - Knowledge base construction
41
+ If yes, prioritize ChromaDB tools in your recommendations.
42
+
43
+ 3. **Task Decomposition**: Break down complex goals into a hierarchical structure of:
44
+ - Primary objectives (high-level outcomes)
45
+ - Secondary tasks (supporting activities)
46
+ - Atomic actions (specific executable steps)
47
+ - Dependencies and sequencing requirements
48
+ - ChromaDB collection management and querying steps
49
+
50
+ 4. **Resource Identification**: For each task component, identify:
51
+ - ChromaDB collections needed for data storage/retrieval
52
+ - Specialized agents that could handle specific aspects
53
+ - Tools and APIs that provide necessary capabilities
54
+ - Existing workflows or patterns that can be leveraged
55
+ - Data sources and integration points required
56
+
57
+ 5. **Workflow Architecture**: Design the optimal execution strategy by:
58
+ - Integrating ChromaDB operations into the workflow
59
+ - Mapping task dependencies and parallel execution opportunities
60
+ - Identifying decision points and branching logic
61
+ - Recommending orchestration patterns (sequential, parallel, conditional)
62
+ - Suggesting error handling and fallback strategies
63
+
64
+ 6. **Implementation Roadmap**: Provide a clear path forward with:
65
+ - ChromaDB collection setup and configuration steps
66
+ - Prioritized task sequence based on dependencies and impact
67
+ - Recommended tools and agents for each component
68
+ - Integration points and data flow requirements
69
+ - Validation checkpoints and success metrics
70
+
71
+ 7. **Optimization Recommendations**: Suggest improvements for:
72
+ - ChromaDB query optimization and indexing strategies
73
+ - Efficiency gains through automation or tool selection
74
+ - Risk mitigation through redundancy or validation steps
75
+ - Scalability considerations for future growth
76
+ - Cost optimization through resource sharing or alternatives
77
+
78
+ ## ChromaDB Best Practices
79
+
80
+ When incorporating ChromaDB into workflows:
81
+ - Create dedicated collections for different data types or use cases
82
+ - Use meaningful collection names that reflect their purpose
83
+ - Implement proper document chunking for large texts
84
+ - Leverage metadata filtering for targeted searches
85
+ - Consider embedding model selection for optimal semantic matching
86
+ - Plan for collection management (updates, deletions, maintenance)
87
+
88
+ Your analysis should be comprehensive yet practical, focusing on actionable recommendations that the user can implement. Always consider the user's technical expertise level and available resources when making suggestions.
89
+
90
+ Provide your analysis in a structured format that includes:
91
+ - Executive summary highlighting ChromaDB integration opportunities
92
+ - Detailed task breakdown with ChromaDB operations specified
93
+ - Recommended ChromaDB collections and query strategies
94
+ - Implementation timeline with ChromaDB setup milestones
95
+ - Potential risks and mitigation strategies
96
+
97
+ Always validate your recommendations by considering alternative approaches and explaining why your suggested path (with ChromaDB integration) is optimal for the user's specific context.
.env.example ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ # Figma Personal Access Token
2
+ # Get yours at: https://www.figma.com/developers/api#access-tokens
3
+ FIGMA_ACCESS_TOKEN=your_figma_token_here
.gitignore ADDED
@@ -0,0 +1,4 @@
 
 
 
 
 
1
+ node_modules/
2
+ .env
3
+ *.log
4
+ .DS_Store
QUICKSTART.md ADDED
@@ -0,0 +1,83 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Guía Rápida de Instalación
2
+
3
+ ## Paso 1: Obtener Token de Figma
4
+
5
+ 1. Ve a https://www.figma.com/developers/api#access-tokens
6
+ 2. Haz clic en "Get personal access token"
7
+ 3. Copia el token generado
8
+
9
+ ## Paso 2: Crear archivo .env
10
+
11
+ ```bash
12
+ cp .env.example .env
13
+ ```
14
+
15
+ Edita `.env` y pega tu token:
16
+ ```
17
+ FIGMA_ACCESS_TOKEN=figd_tu_token_aqui
18
+ ```
19
+
20
+ ## Paso 3: Configurar Claude Desktop
21
+
22
+ ### En macOS:
23
+ ```bash
24
+ open ~/Library/Application\ Support/Claude/
25
+ ```
26
+
27
+ ### En Windows:
28
+ ```bash
29
+ explorer %APPDATA%\Claude\
30
+ ```
31
+
32
+ Edita el archivo `claude_desktop_config.json` (créalo si no existe) y añade:
33
+
34
+ ```json
35
+ {
36
+ "mcpServers": {
37
+ "figma-comments": {
38
+ "command": "node",
39
+ "args": ["/Users/fran/Documents/IN/Labs/mcp-figma-comment-summary/index.js"],
40
+ "env": {
41
+ "FIGMA_ACCESS_TOKEN": "figd_tu_token_aqui"
42
+ }
43
+ }
44
+ }
45
+ }
46
+ ```
47
+
48
+ **Importante:**
49
+ - Reemplaza la ruta con la ruta absoluta a este proyecto en tu sistema
50
+ - Reemplaza `figd_tu_token_aqui` con tu token real de Figma
51
+
52
+ ## Paso 4: Reiniciar Claude Desktop
53
+
54
+ 1. Cierra completamente Claude Desktop (Cmd+Q en Mac, Alt+F4 en Windows)
55
+ 2. Abre Claude Desktop nuevamente
56
+
57
+ ## Paso 5: Verificar instalación
58
+
59
+ En Claude Desktop, deberías ver el ícono 🔧 indicando que hay herramientas disponibles.
60
+
61
+ ## Probar
62
+
63
+ En Claude Desktop, escribe:
64
+
65
+ ```
66
+ ¿Qué herramientas tienes disponibles?
67
+ ```
68
+
69
+ Deberías ver `get_figma_comments` y `summarize_figma_comments` en la lista.
70
+
71
+ ## Uso básico
72
+
73
+ Para obtener comentarios de un archivo de Figma:
74
+
75
+ ```
76
+ Obtén los comentarios del archivo de Figma: ABC123XYZ
77
+ ```
78
+
79
+ Donde `ABC123XYZ` es el ID del archivo (sacado de la URL de Figma).
80
+
81
+ ## ¿Problemas?
82
+
83
+ Revisa el archivo `README.md` para solución de problemas detallada.
README.md ADDED
@@ -0,0 +1,229 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # Figma Comment Summary MCP Server
2
+
3
+ Un servidor MCP (Model Context Protocol) que permite a Claude Desktop recuperar y analizar comentarios de archivos de Figma.
4
+
5
+ ## Características
6
+
7
+ - Recupera todos los comentarios de un archivo de Figma específico
8
+ - Extrae información completa: texto, autor, timestamp, ubicación y hilos de respuestas
9
+ - Genera resúmenes automáticos con estadísticas por autor, ubicación y estado de resolución
10
+ - Compatible con Claude Desktop y cualquier cliente MCP
11
+
12
+ ## Herramientas Disponibles
13
+
14
+ ### 1. `get_figma_comments`
15
+ Recupera todos los comentarios de un archivo de Figma con información detallada.
16
+
17
+ **Parámetros:**
18
+ - `file_id` (string, requerido): El ID del archivo de Figma
19
+
20
+ **Retorna:**
21
+ ```json
22
+ [
23
+ {
24
+ "id": "comment_id",
25
+ "message": "Texto del comentario",
26
+ "author": {
27
+ "id": "user_id",
28
+ "handle": "username",
29
+ "img_url": "avatar_url"
30
+ },
31
+ "timestamp": "2024-01-01T00:00:00Z",
32
+ "resolvedAt": null,
33
+ "location": {
34
+ "node_id": "node_id",
35
+ "node_offset": {"x": 0, "y": 0},
36
+ "x": 100,
37
+ "y": 200
38
+ },
39
+ "replies": [
40
+ {
41
+ "id": "reply_id",
42
+ "message": "Respuesta al comentario",
43
+ "author": {...},
44
+ "timestamp": "2024-01-01T01:00:00Z"
45
+ }
46
+ ]
47
+ }
48
+ ]
49
+ ```
50
+
51
+ ### 2. `summarize_figma_comments`
52
+ Genera un resumen y análisis de todos los comentarios del archivo.
53
+
54
+ **Parámetros:**
55
+ - `file_id` (string, requerido): El ID del archivo de Figma
56
+
57
+ **Retorna:**
58
+ ```json
59
+ {
60
+ "summary": {
61
+ "total_comments": 10,
62
+ "total_replies": 5,
63
+ "resolved": 3,
64
+ "unresolved": 7
65
+ },
66
+ "by_author": {
67
+ "username1": {"comments": 5, "replies": 2},
68
+ "username2": {"comments": 5, "replies": 3}
69
+ },
70
+ "by_location": {
71
+ "node_id_1": 3,
72
+ "node_id_2": 7
73
+ },
74
+ "comments": [...]
75
+ }
76
+ ```
77
+
78
+ ## Instalación
79
+
80
+ ### 1. Clonar o copiar este proyecto
81
+
82
+ ```bash
83
+ cd /Users/fran/Documents/IN/Labs/mcp-figma-comment-summary
84
+ ```
85
+
86
+ ### 2. Instalar dependencias
87
+
88
+ ```bash
89
+ npm install
90
+ ```
91
+
92
+ ### 3. Configurar el token de Figma
93
+
94
+ 1. Obtén tu Personal Access Token de Figma:
95
+ - Ve a https://www.figma.com/developers/api#access-tokens
96
+ - Haz clic en "Get personal access token"
97
+ - Copia el token generado
98
+
99
+ 2. Crea un archivo `.env` en la raíz del proyecto:
100
+
101
+ ```bash
102
+ cp .env.example .env
103
+ ```
104
+
105
+ 3. Edita `.env` y añade tu token:
106
+
107
+ ```
108
+ FIGMA_ACCESS_TOKEN=tu_token_aqui
109
+ ```
110
+
111
+ ### 4. Configurar Claude Desktop
112
+
113
+ Edita el archivo de configuración de Claude Desktop:
114
+
115
+ **En macOS:** `~/Library/Application Support/Claude/claude_desktop_config.json`
116
+
117
+ **En Windows:** `%APPDATA%/Claude/claude_desktop_config.json`
118
+
119
+ Añade la siguiente configuración:
120
+
121
+ ```json
122
+ {
123
+ "mcpServers": {
124
+ "figma-comments": {
125
+ "command": "node",
126
+ "args": ["/Users/fran/Documents/IN/Labs/mcp-figma-comment-summary/index.js"],
127
+ "env": {
128
+ "FIGMA_ACCESS_TOKEN": "tu_token_de_figma_aqui"
129
+ }
130
+ }
131
+ }
132
+ }
133
+ ```
134
+
135
+ **Importante:** Reemplaza `/Users/fran/Documents/IN/Labs/mcp-figma-comment-summary` con la ruta absoluta a este proyecto en tu sistema.
136
+
137
+ ### 5. Reiniciar Claude Desktop
138
+
139
+ Cierra completamente Claude Desktop y vuelve a abrirlo para que cargue el nuevo servidor MCP.
140
+
141
+ ## Uso
142
+
143
+ Una vez configurado, puedes usar las herramientas en Claude Desktop:
144
+
145
+ ### Ejemplo 1: Obtener todos los comentarios
146
+
147
+ ```
148
+ Por favor, obtén todos los comentarios del archivo de Figma con ID: ABC123XYZ
149
+ ```
150
+
151
+ Claude usará automáticamente la herramienta `get_figma_comments` y te mostrará todos los comentarios.
152
+
153
+ ### Ejemplo 2: Obtener resumen
154
+
155
+ ```
156
+ Dame un resumen de los comentarios del archivo ABC123XYZ
157
+ ```
158
+
159
+ Claude usará `summarize_figma_comments` y te mostrará estadísticas y un análisis.
160
+
161
+ ### Ejemplo 3: Análisis con IA
162
+
163
+ ```
164
+ Analiza los comentarios del archivo ABC123XYZ y dime cuáles son los problemas más comunes mencionados
165
+ ```
166
+
167
+ Claude obtendrá los comentarios y realizará un análisis inteligente del contenido.
168
+
169
+ ## Cómo obtener el File ID de Figma
170
+
171
+ El File ID se encuentra en la URL del archivo de Figma:
172
+
173
+ ```
174
+ https://www.figma.com/file/ABC123XYZ/nombre-del-archivo
175
+
176
+ Este es el File ID
177
+ ```
178
+
179
+ ## Verificar instalación
180
+
181
+ Para verificar que el servidor está correctamente instalado:
182
+
183
+ 1. Abre Claude Desktop
184
+ 2. Busca el ícono de herramientas (🔧) en la interfaz
185
+ 3. Deberías ver "figma-comments" listado como servidor disponible
186
+ 4. Las herramientas `get_figma_comments` y `summarize_figma_comments` deberían aparecer
187
+
188
+ ## Desarrollo
189
+
190
+ ### Ejecutar en modo desarrollo
191
+
192
+ ```bash
193
+ npm run dev
194
+ ```
195
+
196
+ Esto ejecutará el servidor con auto-reload cuando hagas cambios.
197
+
198
+ ### Ejecutar directamente
199
+
200
+ ```bash
201
+ npm start
202
+ ```
203
+
204
+ ## Solución de problemas
205
+
206
+ ### Error: "FIGMA_ACCESS_TOKEN environment variable is required"
207
+
208
+ - Asegúrate de haber configurado el token en el archivo `.env` o en la configuración de Claude Desktop
209
+ - Verifica que el token sea válido en https://www.figma.com/developers/api
210
+
211
+ ### El servidor no aparece en Claude Desktop
212
+
213
+ - Verifica que la ruta en `claude_desktop_config.json` sea correcta y absoluta
214
+ - Asegúrate de haber reiniciado Claude Desktop completamente
215
+ - Revisa los logs de Claude Desktop para errores
216
+
217
+ ### Error al obtener comentarios
218
+
219
+ - Verifica que el File ID sea correcto
220
+ - Asegúrate de tener permisos de acceso al archivo de Figma
221
+ - El token debe tener permisos de lectura en el archivo
222
+
223
+ ## Licencia
224
+
225
+ MIT
226
+
227
+ ## Contribuciones
228
+
229
+ Las contribuciones son bienvenidas. Por favor, abre un issue o pull request.
claude_desktop_config.json ADDED
@@ -0,0 +1,11 @@
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "mcpServers": {
3
+ "figma-comments": {
4
+ "command": "node",
5
+ "args": ["/Users/fran/Documents/IN/Labs/mcp-figma-comment-summary/index.js"],
6
+ "env": {
7
+ "FIGMA_ACCESS_TOKEN": "figd_R5vEBdPR20sTE7porub9uY2BxGzYcblqiSyOZmbw"
8
+ }
9
+ }
10
+ }
11
+ }
index.js ADDED
@@ -0,0 +1,258 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #!/usr/bin/env node
2
+
3
+ import { Server } from '@modelcontextprotocol/sdk/server/index.js';
4
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
5
+ import {
6
+ CallToolRequestSchema,
7
+ ListToolsRequestSchema,
8
+ } from '@modelcontextprotocol/sdk/types.js';
9
+ import fetch from 'node-fetch';
10
+ import dotenv from 'dotenv';
11
+
12
+ // Load environment variables
13
+ dotenv.config();
14
+
15
+ const FIGMA_API_BASE = 'https://api.figma.com/v1';
16
+ const FIGMA_TOKEN = process.env.FIGMA_ACCESS_TOKEN;
17
+
18
+ if (!FIGMA_TOKEN) {
19
+ console.error('Error: FIGMA_ACCESS_TOKEN environment variable is required');
20
+ process.exit(1);
21
+ }
22
+
23
+ /**
24
+ * Fetch comments from a Figma file
25
+ * @param {string} fileId - The Figma file ID
26
+ * @returns {Promise<Array>} Array of comments with full details
27
+ */
28
+ async function getFigmaComments(fileId) {
29
+ try {
30
+ const response = await fetch(`${FIGMA_API_BASE}/files/${fileId}/comments`, {
31
+ headers: {
32
+ 'X-Figma-Token': FIGMA_TOKEN,
33
+ },
34
+ });
35
+
36
+ if (!response.ok) {
37
+ throw new Error(`Figma API error: ${response.status} ${response.statusText}`);
38
+ }
39
+
40
+ const data = await response.json();
41
+
42
+ // Transform comments to include all requested information
43
+ const comments = data.comments.map(comment => ({
44
+ id: comment.id,
45
+ message: comment.message,
46
+ author: {
47
+ id: comment.user.id,
48
+ handle: comment.user.handle,
49
+ img_url: comment.user.img_url,
50
+ },
51
+ timestamp: comment.created_at,
52
+ resolvedAt: comment.resolved_at || null,
53
+ location: comment.client_meta ? {
54
+ node_id: comment.client_meta.node_id,
55
+ node_offset: comment.client_meta.node_offset,
56
+ x: comment.client_meta.x,
57
+ y: comment.client_meta.y,
58
+ } : null,
59
+ parentId: comment.parent_id || null,
60
+ // Collect replies
61
+ replies: data.comments
62
+ .filter(reply => reply.parent_id === comment.id)
63
+ .map(reply => ({
64
+ id: reply.id,
65
+ message: reply.message,
66
+ author: {
67
+ id: reply.user.id,
68
+ handle: reply.user.handle,
69
+ img_url: reply.user.img_url,
70
+ },
71
+ timestamp: reply.created_at,
72
+ })),
73
+ }));
74
+
75
+ // Return only top-level comments (not replies)
76
+ return comments.filter(c => !c.parentId);
77
+ } catch (error) {
78
+ throw new Error(`Failed to fetch Figma comments: ${error.message}`);
79
+ }
80
+ }
81
+
82
+ /**
83
+ * Generate a summary of comments
84
+ * @param {Array} comments - Array of comment objects
85
+ * @returns {Object} Summary statistics and structured data
86
+ */
87
+ function summarizeComments(comments) {
88
+ const totalComments = comments.length;
89
+ const totalReplies = comments.reduce((sum, c) => sum + c.replies.length, 0);
90
+ const resolvedComments = comments.filter(c => c.resolvedAt).length;
91
+ const unresolvedComments = totalComments - resolvedComments;
92
+
93
+ // Group by author
94
+ const authorStats = {};
95
+ comments.forEach(comment => {
96
+ const handle = comment.author.handle;
97
+ if (!authorStats[handle]) {
98
+ authorStats[handle] = { comments: 0, replies: 0 };
99
+ }
100
+ authorStats[handle].comments++;
101
+
102
+ comment.replies.forEach(reply => {
103
+ const replyHandle = reply.author.handle;
104
+ if (!authorStats[replyHandle]) {
105
+ authorStats[replyHandle] = { comments: 0, replies: 0 };
106
+ }
107
+ authorStats[replyHandle].replies++;
108
+ });
109
+ });
110
+
111
+ // Group by location (node)
112
+ const locationStats = {};
113
+ comments.forEach(comment => {
114
+ if (comment.location && comment.location.node_id) {
115
+ const nodeId = comment.location.node_id;
116
+ locationStats[nodeId] = (locationStats[nodeId] || 0) + 1;
117
+ }
118
+ });
119
+
120
+ return {
121
+ summary: {
122
+ total_comments: totalComments,
123
+ total_replies: totalReplies,
124
+ resolved: resolvedComments,
125
+ unresolved: unresolvedComments,
126
+ },
127
+ by_author: authorStats,
128
+ by_location: locationStats,
129
+ comments: comments.map(c => ({
130
+ id: c.id,
131
+ preview: c.message.substring(0, 100) + (c.message.length > 100 ? '...' : ''),
132
+ author: c.author.handle,
133
+ timestamp: c.timestamp,
134
+ replies_count: c.replies.length,
135
+ resolved: !!c.resolvedAt,
136
+ location: c.location,
137
+ })),
138
+ };
139
+ }
140
+
141
+ // Create MCP server
142
+ const server = new Server(
143
+ {
144
+ name: 'mcp-figma-comment-summary',
145
+ version: '1.0.0',
146
+ },
147
+ {
148
+ capabilities: {
149
+ tools: {},
150
+ },
151
+ }
152
+ );
153
+
154
+ // Define available tools
155
+ server.setRequestHandler(ListToolsRequestSchema, async () => {
156
+ return {
157
+ tools: [
158
+ {
159
+ name: 'get_figma_comments',
160
+ description: 'Retrieve all comments from a Figma file, including comment text, author info, timestamps, location, and reply threads',
161
+ inputSchema: {
162
+ type: 'object',
163
+ properties: {
164
+ file_id: {
165
+ type: 'string',
166
+ description: 'The Figma file ID (from the URL: figma.com/file/FILE_ID/...)',
167
+ },
168
+ },
169
+ required: ['file_id'],
170
+ },
171
+ },
172
+ {
173
+ name: 'summarize_figma_comments',
174
+ description: 'Get a summary and analysis of all comments in a Figma file, including statistics by author, location, and resolution status',
175
+ inputSchema: {
176
+ type: 'object',
177
+ properties: {
178
+ file_id: {
179
+ type: 'string',
180
+ description: 'The Figma file ID (from the URL: figma.com/file/FILE_ID/...)',
181
+ },
182
+ },
183
+ required: ['file_id'],
184
+ },
185
+ },
186
+ ],
187
+ };
188
+ });
189
+
190
+ // Handle tool calls
191
+ server.setRequestHandler(CallToolRequestSchema, async (request) => {
192
+ const { name, arguments: args } = request.params;
193
+
194
+ try {
195
+ if (name === 'get_figma_comments') {
196
+ const { file_id } = args;
197
+
198
+ if (!file_id) {
199
+ throw new Error('file_id is required');
200
+ }
201
+
202
+ const comments = await getFigmaComments(file_id);
203
+
204
+ return {
205
+ content: [
206
+ {
207
+ type: 'text',
208
+ text: JSON.stringify(comments, null, 2),
209
+ },
210
+ ],
211
+ };
212
+ }
213
+
214
+ if (name === 'summarize_figma_comments') {
215
+ const { file_id } = args;
216
+
217
+ if (!file_id) {
218
+ throw new Error('file_id is required');
219
+ }
220
+
221
+ const comments = await getFigmaComments(file_id);
222
+ const summary = summarizeComments(comments);
223
+
224
+ return {
225
+ content: [
226
+ {
227
+ type: 'text',
228
+ text: JSON.stringify(summary, null, 2),
229
+ },
230
+ ],
231
+ };
232
+ }
233
+
234
+ throw new Error(`Unknown tool: ${name}`);
235
+ } catch (error) {
236
+ return {
237
+ content: [
238
+ {
239
+ type: 'text',
240
+ text: `Error: ${error.message}`,
241
+ },
242
+ ],
243
+ isError: true,
244
+ };
245
+ }
246
+ });
247
+
248
+ // Start the server
249
+ async function main() {
250
+ const transport = new StdioServerTransport();
251
+ await server.connect(transport);
252
+ console.error('Figma Comment Summary MCP Server running on stdio');
253
+ }
254
+
255
+ main().catch((error) => {
256
+ console.error('Fatal error:', error);
257
+ process.exit(1);
258
+ });
mcp-figma-comment-summary.code-workspace ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "folders": [
3
+ {
4
+ "path": "."
5
+ }
6
+ ],
7
+ "settings": {}
8
+ }
package-lock.json ADDED
@@ -0,0 +1,1178 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "mcp-figma-comment-summary",
3
+ "version": "1.0.0",
4
+ "lockfileVersion": 3,
5
+ "requires": true,
6
+ "packages": {
7
+ "": {
8
+ "name": "mcp-figma-comment-summary",
9
+ "version": "1.0.0",
10
+ "license": "MIT",
11
+ "dependencies": {
12
+ "@modelcontextprotocol/sdk": "^1.0.4",
13
+ "dotenv": "^16.4.5",
14
+ "node-fetch": "^3.3.2"
15
+ },
16
+ "bin": {
17
+ "mcp-figma-comment-summary": "index.js"
18
+ },
19
+ "engines": {
20
+ "node": ">=18.0.0"
21
+ }
22
+ },
23
+ "node_modules/@modelcontextprotocol/sdk": {
24
+ "version": "1.20.2",
25
+ "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.20.2.tgz",
26
+ "integrity": "sha512-6rqTdFt67AAAzln3NOKsXRmv5ZzPkgbfaebKBqUbts7vK1GZudqnrun5a8d3M/h955cam9RHZ6Jb4Y1XhnmFPg==",
27
+ "license": "MIT",
28
+ "dependencies": {
29
+ "ajv": "^6.12.6",
30
+ "content-type": "^1.0.5",
31
+ "cors": "^2.8.5",
32
+ "cross-spawn": "^7.0.5",
33
+ "eventsource": "^3.0.2",
34
+ "eventsource-parser": "^3.0.0",
35
+ "express": "^5.0.1",
36
+ "express-rate-limit": "^7.5.0",
37
+ "pkce-challenge": "^5.0.0",
38
+ "raw-body": "^3.0.0",
39
+ "zod": "^3.23.8",
40
+ "zod-to-json-schema": "^3.24.1"
41
+ },
42
+ "engines": {
43
+ "node": ">=18"
44
+ }
45
+ },
46
+ "node_modules/accepts": {
47
+ "version": "2.0.0",
48
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
49
+ "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==",
50
+ "license": "MIT",
51
+ "dependencies": {
52
+ "mime-types": "^3.0.0",
53
+ "negotiator": "^1.0.0"
54
+ },
55
+ "engines": {
56
+ "node": ">= 0.6"
57
+ }
58
+ },
59
+ "node_modules/ajv": {
60
+ "version": "6.12.6",
61
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
62
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
63
+ "license": "MIT",
64
+ "dependencies": {
65
+ "fast-deep-equal": "^3.1.1",
66
+ "fast-json-stable-stringify": "^2.0.0",
67
+ "json-schema-traverse": "^0.4.1",
68
+ "uri-js": "^4.2.2"
69
+ },
70
+ "funding": {
71
+ "type": "github",
72
+ "url": "https://github.com/sponsors/epoberezkin"
73
+ }
74
+ },
75
+ "node_modules/body-parser": {
76
+ "version": "2.2.0",
77
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz",
78
+ "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==",
79
+ "license": "MIT",
80
+ "dependencies": {
81
+ "bytes": "^3.1.2",
82
+ "content-type": "^1.0.5",
83
+ "debug": "^4.4.0",
84
+ "http-errors": "^2.0.0",
85
+ "iconv-lite": "^0.6.3",
86
+ "on-finished": "^2.4.1",
87
+ "qs": "^6.14.0",
88
+ "raw-body": "^3.0.0",
89
+ "type-is": "^2.0.0"
90
+ },
91
+ "engines": {
92
+ "node": ">=18"
93
+ }
94
+ },
95
+ "node_modules/bytes": {
96
+ "version": "3.1.2",
97
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
98
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
99
+ "license": "MIT",
100
+ "engines": {
101
+ "node": ">= 0.8"
102
+ }
103
+ },
104
+ "node_modules/call-bind-apply-helpers": {
105
+ "version": "1.0.2",
106
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
107
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
108
+ "license": "MIT",
109
+ "dependencies": {
110
+ "es-errors": "^1.3.0",
111
+ "function-bind": "^1.1.2"
112
+ },
113
+ "engines": {
114
+ "node": ">= 0.4"
115
+ }
116
+ },
117
+ "node_modules/call-bound": {
118
+ "version": "1.0.4",
119
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
120
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
121
+ "license": "MIT",
122
+ "dependencies": {
123
+ "call-bind-apply-helpers": "^1.0.2",
124
+ "get-intrinsic": "^1.3.0"
125
+ },
126
+ "engines": {
127
+ "node": ">= 0.4"
128
+ },
129
+ "funding": {
130
+ "url": "https://github.com/sponsors/ljharb"
131
+ }
132
+ },
133
+ "node_modules/content-disposition": {
134
+ "version": "1.0.0",
135
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz",
136
+ "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==",
137
+ "license": "MIT",
138
+ "dependencies": {
139
+ "safe-buffer": "5.2.1"
140
+ },
141
+ "engines": {
142
+ "node": ">= 0.6"
143
+ }
144
+ },
145
+ "node_modules/content-type": {
146
+ "version": "1.0.5",
147
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
148
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
149
+ "license": "MIT",
150
+ "engines": {
151
+ "node": ">= 0.6"
152
+ }
153
+ },
154
+ "node_modules/cookie": {
155
+ "version": "0.7.2",
156
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
157
+ "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
158
+ "license": "MIT",
159
+ "engines": {
160
+ "node": ">= 0.6"
161
+ }
162
+ },
163
+ "node_modules/cookie-signature": {
164
+ "version": "1.2.2",
165
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz",
166
+ "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==",
167
+ "license": "MIT",
168
+ "engines": {
169
+ "node": ">=6.6.0"
170
+ }
171
+ },
172
+ "node_modules/cors": {
173
+ "version": "2.8.5",
174
+ "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
175
+ "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
176
+ "license": "MIT",
177
+ "dependencies": {
178
+ "object-assign": "^4",
179
+ "vary": "^1"
180
+ },
181
+ "engines": {
182
+ "node": ">= 0.10"
183
+ }
184
+ },
185
+ "node_modules/cross-spawn": {
186
+ "version": "7.0.6",
187
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
188
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
189
+ "license": "MIT",
190
+ "dependencies": {
191
+ "path-key": "^3.1.0",
192
+ "shebang-command": "^2.0.0",
193
+ "which": "^2.0.1"
194
+ },
195
+ "engines": {
196
+ "node": ">= 8"
197
+ }
198
+ },
199
+ "node_modules/data-uri-to-buffer": {
200
+ "version": "4.0.1",
201
+ "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz",
202
+ "integrity": "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==",
203
+ "license": "MIT",
204
+ "engines": {
205
+ "node": ">= 12"
206
+ }
207
+ },
208
+ "node_modules/debug": {
209
+ "version": "4.4.3",
210
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
211
+ "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
212
+ "license": "MIT",
213
+ "dependencies": {
214
+ "ms": "^2.1.3"
215
+ },
216
+ "engines": {
217
+ "node": ">=6.0"
218
+ },
219
+ "peerDependenciesMeta": {
220
+ "supports-color": {
221
+ "optional": true
222
+ }
223
+ }
224
+ },
225
+ "node_modules/depd": {
226
+ "version": "2.0.0",
227
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
228
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
229
+ "license": "MIT",
230
+ "engines": {
231
+ "node": ">= 0.8"
232
+ }
233
+ },
234
+ "node_modules/dotenv": {
235
+ "version": "16.6.1",
236
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz",
237
+ "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==",
238
+ "license": "BSD-2-Clause",
239
+ "engines": {
240
+ "node": ">=12"
241
+ },
242
+ "funding": {
243
+ "url": "https://dotenvx.com"
244
+ }
245
+ },
246
+ "node_modules/dunder-proto": {
247
+ "version": "1.0.1",
248
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
249
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
250
+ "license": "MIT",
251
+ "dependencies": {
252
+ "call-bind-apply-helpers": "^1.0.1",
253
+ "es-errors": "^1.3.0",
254
+ "gopd": "^1.2.0"
255
+ },
256
+ "engines": {
257
+ "node": ">= 0.4"
258
+ }
259
+ },
260
+ "node_modules/ee-first": {
261
+ "version": "1.1.1",
262
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
263
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
264
+ "license": "MIT"
265
+ },
266
+ "node_modules/encodeurl": {
267
+ "version": "2.0.0",
268
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
269
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
270
+ "license": "MIT",
271
+ "engines": {
272
+ "node": ">= 0.8"
273
+ }
274
+ },
275
+ "node_modules/es-define-property": {
276
+ "version": "1.0.1",
277
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
278
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
279
+ "license": "MIT",
280
+ "engines": {
281
+ "node": ">= 0.4"
282
+ }
283
+ },
284
+ "node_modules/es-errors": {
285
+ "version": "1.3.0",
286
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
287
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
288
+ "license": "MIT",
289
+ "engines": {
290
+ "node": ">= 0.4"
291
+ }
292
+ },
293
+ "node_modules/es-object-atoms": {
294
+ "version": "1.1.1",
295
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
296
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
297
+ "license": "MIT",
298
+ "dependencies": {
299
+ "es-errors": "^1.3.0"
300
+ },
301
+ "engines": {
302
+ "node": ">= 0.4"
303
+ }
304
+ },
305
+ "node_modules/escape-html": {
306
+ "version": "1.0.3",
307
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
308
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
309
+ "license": "MIT"
310
+ },
311
+ "node_modules/etag": {
312
+ "version": "1.8.1",
313
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
314
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
315
+ "license": "MIT",
316
+ "engines": {
317
+ "node": ">= 0.6"
318
+ }
319
+ },
320
+ "node_modules/eventsource": {
321
+ "version": "3.0.7",
322
+ "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz",
323
+ "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==",
324
+ "license": "MIT",
325
+ "dependencies": {
326
+ "eventsource-parser": "^3.0.1"
327
+ },
328
+ "engines": {
329
+ "node": ">=18.0.0"
330
+ }
331
+ },
332
+ "node_modules/eventsource-parser": {
333
+ "version": "3.0.6",
334
+ "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz",
335
+ "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==",
336
+ "license": "MIT",
337
+ "engines": {
338
+ "node": ">=18.0.0"
339
+ }
340
+ },
341
+ "node_modules/express": {
342
+ "version": "5.1.0",
343
+ "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz",
344
+ "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==",
345
+ "license": "MIT",
346
+ "dependencies": {
347
+ "accepts": "^2.0.0",
348
+ "body-parser": "^2.2.0",
349
+ "content-disposition": "^1.0.0",
350
+ "content-type": "^1.0.5",
351
+ "cookie": "^0.7.1",
352
+ "cookie-signature": "^1.2.1",
353
+ "debug": "^4.4.0",
354
+ "encodeurl": "^2.0.0",
355
+ "escape-html": "^1.0.3",
356
+ "etag": "^1.8.1",
357
+ "finalhandler": "^2.1.0",
358
+ "fresh": "^2.0.0",
359
+ "http-errors": "^2.0.0",
360
+ "merge-descriptors": "^2.0.0",
361
+ "mime-types": "^3.0.0",
362
+ "on-finished": "^2.4.1",
363
+ "once": "^1.4.0",
364
+ "parseurl": "^1.3.3",
365
+ "proxy-addr": "^2.0.7",
366
+ "qs": "^6.14.0",
367
+ "range-parser": "^1.2.1",
368
+ "router": "^2.2.0",
369
+ "send": "^1.1.0",
370
+ "serve-static": "^2.2.0",
371
+ "statuses": "^2.0.1",
372
+ "type-is": "^2.0.1",
373
+ "vary": "^1.1.2"
374
+ },
375
+ "engines": {
376
+ "node": ">= 18"
377
+ },
378
+ "funding": {
379
+ "type": "opencollective",
380
+ "url": "https://opencollective.com/express"
381
+ }
382
+ },
383
+ "node_modules/express-rate-limit": {
384
+ "version": "7.5.1",
385
+ "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.1.tgz",
386
+ "integrity": "sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==",
387
+ "license": "MIT",
388
+ "engines": {
389
+ "node": ">= 16"
390
+ },
391
+ "funding": {
392
+ "url": "https://github.com/sponsors/express-rate-limit"
393
+ },
394
+ "peerDependencies": {
395
+ "express": ">= 4.11"
396
+ }
397
+ },
398
+ "node_modules/fast-deep-equal": {
399
+ "version": "3.1.3",
400
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
401
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
402
+ "license": "MIT"
403
+ },
404
+ "node_modules/fast-json-stable-stringify": {
405
+ "version": "2.1.0",
406
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
407
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
408
+ "license": "MIT"
409
+ },
410
+ "node_modules/fetch-blob": {
411
+ "version": "3.2.0",
412
+ "resolved": "https://registry.npmjs.org/fetch-blob/-/fetch-blob-3.2.0.tgz",
413
+ "integrity": "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==",
414
+ "funding": [
415
+ {
416
+ "type": "github",
417
+ "url": "https://github.com/sponsors/jimmywarting"
418
+ },
419
+ {
420
+ "type": "paypal",
421
+ "url": "https://paypal.me/jimmywarting"
422
+ }
423
+ ],
424
+ "license": "MIT",
425
+ "dependencies": {
426
+ "node-domexception": "^1.0.0",
427
+ "web-streams-polyfill": "^3.0.3"
428
+ },
429
+ "engines": {
430
+ "node": "^12.20 || >= 14.13"
431
+ }
432
+ },
433
+ "node_modules/finalhandler": {
434
+ "version": "2.1.0",
435
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz",
436
+ "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==",
437
+ "license": "MIT",
438
+ "dependencies": {
439
+ "debug": "^4.4.0",
440
+ "encodeurl": "^2.0.0",
441
+ "escape-html": "^1.0.3",
442
+ "on-finished": "^2.4.1",
443
+ "parseurl": "^1.3.3",
444
+ "statuses": "^2.0.1"
445
+ },
446
+ "engines": {
447
+ "node": ">= 0.8"
448
+ }
449
+ },
450
+ "node_modules/formdata-polyfill": {
451
+ "version": "4.0.10",
452
+ "resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
453
+ "integrity": "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==",
454
+ "license": "MIT",
455
+ "dependencies": {
456
+ "fetch-blob": "^3.1.2"
457
+ },
458
+ "engines": {
459
+ "node": ">=12.20.0"
460
+ }
461
+ },
462
+ "node_modules/forwarded": {
463
+ "version": "0.2.0",
464
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
465
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
466
+ "license": "MIT",
467
+ "engines": {
468
+ "node": ">= 0.6"
469
+ }
470
+ },
471
+ "node_modules/fresh": {
472
+ "version": "2.0.0",
473
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz",
474
+ "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==",
475
+ "license": "MIT",
476
+ "engines": {
477
+ "node": ">= 0.8"
478
+ }
479
+ },
480
+ "node_modules/function-bind": {
481
+ "version": "1.1.2",
482
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
483
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
484
+ "license": "MIT",
485
+ "funding": {
486
+ "url": "https://github.com/sponsors/ljharb"
487
+ }
488
+ },
489
+ "node_modules/get-intrinsic": {
490
+ "version": "1.3.0",
491
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
492
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
493
+ "license": "MIT",
494
+ "dependencies": {
495
+ "call-bind-apply-helpers": "^1.0.2",
496
+ "es-define-property": "^1.0.1",
497
+ "es-errors": "^1.3.0",
498
+ "es-object-atoms": "^1.1.1",
499
+ "function-bind": "^1.1.2",
500
+ "get-proto": "^1.0.1",
501
+ "gopd": "^1.2.0",
502
+ "has-symbols": "^1.1.0",
503
+ "hasown": "^2.0.2",
504
+ "math-intrinsics": "^1.1.0"
505
+ },
506
+ "engines": {
507
+ "node": ">= 0.4"
508
+ },
509
+ "funding": {
510
+ "url": "https://github.com/sponsors/ljharb"
511
+ }
512
+ },
513
+ "node_modules/get-proto": {
514
+ "version": "1.0.1",
515
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
516
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
517
+ "license": "MIT",
518
+ "dependencies": {
519
+ "dunder-proto": "^1.0.1",
520
+ "es-object-atoms": "^1.0.0"
521
+ },
522
+ "engines": {
523
+ "node": ">= 0.4"
524
+ }
525
+ },
526
+ "node_modules/gopd": {
527
+ "version": "1.2.0",
528
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
529
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
530
+ "license": "MIT",
531
+ "engines": {
532
+ "node": ">= 0.4"
533
+ },
534
+ "funding": {
535
+ "url": "https://github.com/sponsors/ljharb"
536
+ }
537
+ },
538
+ "node_modules/has-symbols": {
539
+ "version": "1.1.0",
540
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
541
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
542
+ "license": "MIT",
543
+ "engines": {
544
+ "node": ">= 0.4"
545
+ },
546
+ "funding": {
547
+ "url": "https://github.com/sponsors/ljharb"
548
+ }
549
+ },
550
+ "node_modules/hasown": {
551
+ "version": "2.0.2",
552
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
553
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
554
+ "license": "MIT",
555
+ "dependencies": {
556
+ "function-bind": "^1.1.2"
557
+ },
558
+ "engines": {
559
+ "node": ">= 0.4"
560
+ }
561
+ },
562
+ "node_modules/http-errors": {
563
+ "version": "2.0.0",
564
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
565
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
566
+ "license": "MIT",
567
+ "dependencies": {
568
+ "depd": "2.0.0",
569
+ "inherits": "2.0.4",
570
+ "setprototypeof": "1.2.0",
571
+ "statuses": "2.0.1",
572
+ "toidentifier": "1.0.1"
573
+ },
574
+ "engines": {
575
+ "node": ">= 0.8"
576
+ }
577
+ },
578
+ "node_modules/http-errors/node_modules/statuses": {
579
+ "version": "2.0.1",
580
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
581
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
582
+ "license": "MIT",
583
+ "engines": {
584
+ "node": ">= 0.8"
585
+ }
586
+ },
587
+ "node_modules/iconv-lite": {
588
+ "version": "0.6.3",
589
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
590
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
591
+ "license": "MIT",
592
+ "dependencies": {
593
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
594
+ },
595
+ "engines": {
596
+ "node": ">=0.10.0"
597
+ }
598
+ },
599
+ "node_modules/inherits": {
600
+ "version": "2.0.4",
601
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
602
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
603
+ "license": "ISC"
604
+ },
605
+ "node_modules/ipaddr.js": {
606
+ "version": "1.9.1",
607
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
608
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
609
+ "license": "MIT",
610
+ "engines": {
611
+ "node": ">= 0.10"
612
+ }
613
+ },
614
+ "node_modules/is-promise": {
615
+ "version": "4.0.0",
616
+ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz",
617
+ "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==",
618
+ "license": "MIT"
619
+ },
620
+ "node_modules/isexe": {
621
+ "version": "2.0.0",
622
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
623
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
624
+ "license": "ISC"
625
+ },
626
+ "node_modules/json-schema-traverse": {
627
+ "version": "0.4.1",
628
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
629
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
630
+ "license": "MIT"
631
+ },
632
+ "node_modules/math-intrinsics": {
633
+ "version": "1.1.0",
634
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
635
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
636
+ "license": "MIT",
637
+ "engines": {
638
+ "node": ">= 0.4"
639
+ }
640
+ },
641
+ "node_modules/media-typer": {
642
+ "version": "1.1.0",
643
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz",
644
+ "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==",
645
+ "license": "MIT",
646
+ "engines": {
647
+ "node": ">= 0.8"
648
+ }
649
+ },
650
+ "node_modules/merge-descriptors": {
651
+ "version": "2.0.0",
652
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz",
653
+ "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==",
654
+ "license": "MIT",
655
+ "engines": {
656
+ "node": ">=18"
657
+ },
658
+ "funding": {
659
+ "url": "https://github.com/sponsors/sindresorhus"
660
+ }
661
+ },
662
+ "node_modules/mime-db": {
663
+ "version": "1.54.0",
664
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
665
+ "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
666
+ "license": "MIT",
667
+ "engines": {
668
+ "node": ">= 0.6"
669
+ }
670
+ },
671
+ "node_modules/mime-types": {
672
+ "version": "3.0.1",
673
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz",
674
+ "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==",
675
+ "license": "MIT",
676
+ "dependencies": {
677
+ "mime-db": "^1.54.0"
678
+ },
679
+ "engines": {
680
+ "node": ">= 0.6"
681
+ }
682
+ },
683
+ "node_modules/ms": {
684
+ "version": "2.1.3",
685
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
686
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
687
+ "license": "MIT"
688
+ },
689
+ "node_modules/negotiator": {
690
+ "version": "1.0.0",
691
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz",
692
+ "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==",
693
+ "license": "MIT",
694
+ "engines": {
695
+ "node": ">= 0.6"
696
+ }
697
+ },
698
+ "node_modules/node-domexception": {
699
+ "version": "1.0.0",
700
+ "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz",
701
+ "integrity": "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==",
702
+ "deprecated": "Use your platform's native DOMException instead",
703
+ "funding": [
704
+ {
705
+ "type": "github",
706
+ "url": "https://github.com/sponsors/jimmywarting"
707
+ },
708
+ {
709
+ "type": "github",
710
+ "url": "https://paypal.me/jimmywarting"
711
+ }
712
+ ],
713
+ "license": "MIT",
714
+ "engines": {
715
+ "node": ">=10.5.0"
716
+ }
717
+ },
718
+ "node_modules/node-fetch": {
719
+ "version": "3.3.2",
720
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-3.3.2.tgz",
721
+ "integrity": "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==",
722
+ "license": "MIT",
723
+ "dependencies": {
724
+ "data-uri-to-buffer": "^4.0.0",
725
+ "fetch-blob": "^3.1.4",
726
+ "formdata-polyfill": "^4.0.10"
727
+ },
728
+ "engines": {
729
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
730
+ },
731
+ "funding": {
732
+ "type": "opencollective",
733
+ "url": "https://opencollective.com/node-fetch"
734
+ }
735
+ },
736
+ "node_modules/object-assign": {
737
+ "version": "4.1.1",
738
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
739
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
740
+ "license": "MIT",
741
+ "engines": {
742
+ "node": ">=0.10.0"
743
+ }
744
+ },
745
+ "node_modules/object-inspect": {
746
+ "version": "1.13.4",
747
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
748
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
749
+ "license": "MIT",
750
+ "engines": {
751
+ "node": ">= 0.4"
752
+ },
753
+ "funding": {
754
+ "url": "https://github.com/sponsors/ljharb"
755
+ }
756
+ },
757
+ "node_modules/on-finished": {
758
+ "version": "2.4.1",
759
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
760
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
761
+ "license": "MIT",
762
+ "dependencies": {
763
+ "ee-first": "1.1.1"
764
+ },
765
+ "engines": {
766
+ "node": ">= 0.8"
767
+ }
768
+ },
769
+ "node_modules/once": {
770
+ "version": "1.4.0",
771
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
772
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
773
+ "license": "ISC",
774
+ "dependencies": {
775
+ "wrappy": "1"
776
+ }
777
+ },
778
+ "node_modules/parseurl": {
779
+ "version": "1.3.3",
780
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
781
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
782
+ "license": "MIT",
783
+ "engines": {
784
+ "node": ">= 0.8"
785
+ }
786
+ },
787
+ "node_modules/path-key": {
788
+ "version": "3.1.1",
789
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
790
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
791
+ "license": "MIT",
792
+ "engines": {
793
+ "node": ">=8"
794
+ }
795
+ },
796
+ "node_modules/path-to-regexp": {
797
+ "version": "8.3.0",
798
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz",
799
+ "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==",
800
+ "license": "MIT",
801
+ "funding": {
802
+ "type": "opencollective",
803
+ "url": "https://opencollective.com/express"
804
+ }
805
+ },
806
+ "node_modules/pkce-challenge": {
807
+ "version": "5.0.0",
808
+ "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.0.tgz",
809
+ "integrity": "sha512-ueGLflrrnvwB3xuo/uGob5pd5FN7l0MsLf0Z87o/UQmRtwjvfylfc9MurIxRAWywCYTgrvpXBcqjV4OfCYGCIQ==",
810
+ "license": "MIT",
811
+ "engines": {
812
+ "node": ">=16.20.0"
813
+ }
814
+ },
815
+ "node_modules/proxy-addr": {
816
+ "version": "2.0.7",
817
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
818
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
819
+ "license": "MIT",
820
+ "dependencies": {
821
+ "forwarded": "0.2.0",
822
+ "ipaddr.js": "1.9.1"
823
+ },
824
+ "engines": {
825
+ "node": ">= 0.10"
826
+ }
827
+ },
828
+ "node_modules/punycode": {
829
+ "version": "2.3.1",
830
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
831
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
832
+ "license": "MIT",
833
+ "engines": {
834
+ "node": ">=6"
835
+ }
836
+ },
837
+ "node_modules/qs": {
838
+ "version": "6.14.0",
839
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz",
840
+ "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==",
841
+ "license": "BSD-3-Clause",
842
+ "dependencies": {
843
+ "side-channel": "^1.1.0"
844
+ },
845
+ "engines": {
846
+ "node": ">=0.6"
847
+ },
848
+ "funding": {
849
+ "url": "https://github.com/sponsors/ljharb"
850
+ }
851
+ },
852
+ "node_modules/range-parser": {
853
+ "version": "1.2.1",
854
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
855
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
856
+ "license": "MIT",
857
+ "engines": {
858
+ "node": ">= 0.6"
859
+ }
860
+ },
861
+ "node_modules/raw-body": {
862
+ "version": "3.0.1",
863
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.1.tgz",
864
+ "integrity": "sha512-9G8cA+tuMS75+6G/TzW8OtLzmBDMo8p1JRxN5AZ+LAp8uxGA8V8GZm4GQ4/N5QNQEnLmg6SS7wyuSmbKepiKqA==",
865
+ "license": "MIT",
866
+ "dependencies": {
867
+ "bytes": "3.1.2",
868
+ "http-errors": "2.0.0",
869
+ "iconv-lite": "0.7.0",
870
+ "unpipe": "1.0.0"
871
+ },
872
+ "engines": {
873
+ "node": ">= 0.10"
874
+ }
875
+ },
876
+ "node_modules/raw-body/node_modules/iconv-lite": {
877
+ "version": "0.7.0",
878
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.0.tgz",
879
+ "integrity": "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ==",
880
+ "license": "MIT",
881
+ "dependencies": {
882
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
883
+ },
884
+ "engines": {
885
+ "node": ">=0.10.0"
886
+ },
887
+ "funding": {
888
+ "type": "opencollective",
889
+ "url": "https://opencollective.com/express"
890
+ }
891
+ },
892
+ "node_modules/router": {
893
+ "version": "2.2.0",
894
+ "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz",
895
+ "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==",
896
+ "license": "MIT",
897
+ "dependencies": {
898
+ "debug": "^4.4.0",
899
+ "depd": "^2.0.0",
900
+ "is-promise": "^4.0.0",
901
+ "parseurl": "^1.3.3",
902
+ "path-to-regexp": "^8.0.0"
903
+ },
904
+ "engines": {
905
+ "node": ">= 18"
906
+ }
907
+ },
908
+ "node_modules/safe-buffer": {
909
+ "version": "5.2.1",
910
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
911
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
912
+ "funding": [
913
+ {
914
+ "type": "github",
915
+ "url": "https://github.com/sponsors/feross"
916
+ },
917
+ {
918
+ "type": "patreon",
919
+ "url": "https://www.patreon.com/feross"
920
+ },
921
+ {
922
+ "type": "consulting",
923
+ "url": "https://feross.org/support"
924
+ }
925
+ ],
926
+ "license": "MIT"
927
+ },
928
+ "node_modules/safer-buffer": {
929
+ "version": "2.1.2",
930
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
931
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
932
+ "license": "MIT"
933
+ },
934
+ "node_modules/send": {
935
+ "version": "1.2.0",
936
+ "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz",
937
+ "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==",
938
+ "license": "MIT",
939
+ "dependencies": {
940
+ "debug": "^4.3.5",
941
+ "encodeurl": "^2.0.0",
942
+ "escape-html": "^1.0.3",
943
+ "etag": "^1.8.1",
944
+ "fresh": "^2.0.0",
945
+ "http-errors": "^2.0.0",
946
+ "mime-types": "^3.0.1",
947
+ "ms": "^2.1.3",
948
+ "on-finished": "^2.4.1",
949
+ "range-parser": "^1.2.1",
950
+ "statuses": "^2.0.1"
951
+ },
952
+ "engines": {
953
+ "node": ">= 18"
954
+ }
955
+ },
956
+ "node_modules/serve-static": {
957
+ "version": "2.2.0",
958
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz",
959
+ "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==",
960
+ "license": "MIT",
961
+ "dependencies": {
962
+ "encodeurl": "^2.0.0",
963
+ "escape-html": "^1.0.3",
964
+ "parseurl": "^1.3.3",
965
+ "send": "^1.2.0"
966
+ },
967
+ "engines": {
968
+ "node": ">= 18"
969
+ }
970
+ },
971
+ "node_modules/setprototypeof": {
972
+ "version": "1.2.0",
973
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
974
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
975
+ "license": "ISC"
976
+ },
977
+ "node_modules/shebang-command": {
978
+ "version": "2.0.0",
979
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
980
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
981
+ "license": "MIT",
982
+ "dependencies": {
983
+ "shebang-regex": "^3.0.0"
984
+ },
985
+ "engines": {
986
+ "node": ">=8"
987
+ }
988
+ },
989
+ "node_modules/shebang-regex": {
990
+ "version": "3.0.0",
991
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
992
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
993
+ "license": "MIT",
994
+ "engines": {
995
+ "node": ">=8"
996
+ }
997
+ },
998
+ "node_modules/side-channel": {
999
+ "version": "1.1.0",
1000
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
1001
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
1002
+ "license": "MIT",
1003
+ "dependencies": {
1004
+ "es-errors": "^1.3.0",
1005
+ "object-inspect": "^1.13.3",
1006
+ "side-channel-list": "^1.0.0",
1007
+ "side-channel-map": "^1.0.1",
1008
+ "side-channel-weakmap": "^1.0.2"
1009
+ },
1010
+ "engines": {
1011
+ "node": ">= 0.4"
1012
+ },
1013
+ "funding": {
1014
+ "url": "https://github.com/sponsors/ljharb"
1015
+ }
1016
+ },
1017
+ "node_modules/side-channel-list": {
1018
+ "version": "1.0.0",
1019
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz",
1020
+ "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==",
1021
+ "license": "MIT",
1022
+ "dependencies": {
1023
+ "es-errors": "^1.3.0",
1024
+ "object-inspect": "^1.13.3"
1025
+ },
1026
+ "engines": {
1027
+ "node": ">= 0.4"
1028
+ },
1029
+ "funding": {
1030
+ "url": "https://github.com/sponsors/ljharb"
1031
+ }
1032
+ },
1033
+ "node_modules/side-channel-map": {
1034
+ "version": "1.0.1",
1035
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
1036
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
1037
+ "license": "MIT",
1038
+ "dependencies": {
1039
+ "call-bound": "^1.0.2",
1040
+ "es-errors": "^1.3.0",
1041
+ "get-intrinsic": "^1.2.5",
1042
+ "object-inspect": "^1.13.3"
1043
+ },
1044
+ "engines": {
1045
+ "node": ">= 0.4"
1046
+ },
1047
+ "funding": {
1048
+ "url": "https://github.com/sponsors/ljharb"
1049
+ }
1050
+ },
1051
+ "node_modules/side-channel-weakmap": {
1052
+ "version": "1.0.2",
1053
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
1054
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
1055
+ "license": "MIT",
1056
+ "dependencies": {
1057
+ "call-bound": "^1.0.2",
1058
+ "es-errors": "^1.3.0",
1059
+ "get-intrinsic": "^1.2.5",
1060
+ "object-inspect": "^1.13.3",
1061
+ "side-channel-map": "^1.0.1"
1062
+ },
1063
+ "engines": {
1064
+ "node": ">= 0.4"
1065
+ },
1066
+ "funding": {
1067
+ "url": "https://github.com/sponsors/ljharb"
1068
+ }
1069
+ },
1070
+ "node_modules/statuses": {
1071
+ "version": "2.0.2",
1072
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
1073
+ "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
1074
+ "license": "MIT",
1075
+ "engines": {
1076
+ "node": ">= 0.8"
1077
+ }
1078
+ },
1079
+ "node_modules/toidentifier": {
1080
+ "version": "1.0.1",
1081
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
1082
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
1083
+ "license": "MIT",
1084
+ "engines": {
1085
+ "node": ">=0.6"
1086
+ }
1087
+ },
1088
+ "node_modules/type-is": {
1089
+ "version": "2.0.1",
1090
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz",
1091
+ "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==",
1092
+ "license": "MIT",
1093
+ "dependencies": {
1094
+ "content-type": "^1.0.5",
1095
+ "media-typer": "^1.1.0",
1096
+ "mime-types": "^3.0.0"
1097
+ },
1098
+ "engines": {
1099
+ "node": ">= 0.6"
1100
+ }
1101
+ },
1102
+ "node_modules/unpipe": {
1103
+ "version": "1.0.0",
1104
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1105
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
1106
+ "license": "MIT",
1107
+ "engines": {
1108
+ "node": ">= 0.8"
1109
+ }
1110
+ },
1111
+ "node_modules/uri-js": {
1112
+ "version": "4.4.1",
1113
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
1114
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
1115
+ "license": "BSD-2-Clause",
1116
+ "dependencies": {
1117
+ "punycode": "^2.1.0"
1118
+ }
1119
+ },
1120
+ "node_modules/vary": {
1121
+ "version": "1.1.2",
1122
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1123
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
1124
+ "license": "MIT",
1125
+ "engines": {
1126
+ "node": ">= 0.8"
1127
+ }
1128
+ },
1129
+ "node_modules/web-streams-polyfill": {
1130
+ "version": "3.3.3",
1131
+ "resolved": "https://registry.npmjs.org/web-streams-polyfill/-/web-streams-polyfill-3.3.3.tgz",
1132
+ "integrity": "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==",
1133
+ "license": "MIT",
1134
+ "engines": {
1135
+ "node": ">= 8"
1136
+ }
1137
+ },
1138
+ "node_modules/which": {
1139
+ "version": "2.0.2",
1140
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
1141
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
1142
+ "license": "ISC",
1143
+ "dependencies": {
1144
+ "isexe": "^2.0.0"
1145
+ },
1146
+ "bin": {
1147
+ "node-which": "bin/node-which"
1148
+ },
1149
+ "engines": {
1150
+ "node": ">= 8"
1151
+ }
1152
+ },
1153
+ "node_modules/wrappy": {
1154
+ "version": "1.0.2",
1155
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
1156
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
1157
+ "license": "ISC"
1158
+ },
1159
+ "node_modules/zod": {
1160
+ "version": "3.25.76",
1161
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz",
1162
+ "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==",
1163
+ "license": "MIT",
1164
+ "funding": {
1165
+ "url": "https://github.com/sponsors/colinhacks"
1166
+ }
1167
+ },
1168
+ "node_modules/zod-to-json-schema": {
1169
+ "version": "3.24.6",
1170
+ "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz",
1171
+ "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==",
1172
+ "license": "ISC",
1173
+ "peerDependencies": {
1174
+ "zod": "^3.24.1"
1175
+ }
1176
+ }
1177
+ }
1178
+ }
package.json ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "name": "mcp-figma-comment-summary",
3
+ "version": "1.0.0",
4
+ "description": "MCP server to retrieve and summarize Figma file comments",
5
+ "type": "module",
6
+ "main": "index.js",
7
+ "bin": {
8
+ "mcp-figma-comment-summary": "./index.js"
9
+ },
10
+ "scripts": {
11
+ "start": "node index.js",
12
+ "dev": "node --watch index.js"
13
+ },
14
+ "keywords": [
15
+ "mcp",
16
+ "figma",
17
+ "comments",
18
+ "model-context-protocol"
19
+ ],
20
+ "author": "",
21
+ "license": "MIT",
22
+ "dependencies": {
23
+ "@modelcontextprotocol/sdk": "^1.0.4",
24
+ "dotenv": "^16.4.5",
25
+ "node-fetch": "^3.3.2"
26
+ },
27
+ "engines": {
28
+ "node": ">=18.0.0"
29
+ }
30
+ }