IgnorantesNaturales commited on
Commit ·
77322c0
0
Parent(s):
Initial config
Browse files- .claude/agents/mcp-deployment-orchestrator.md +101 -0
- .claude/agents/mcp-integration-engineer.md +37 -0
- .claude/agents/task-decomposition-expert.md +97 -0
- .env.example +3 -0
- .gitignore +4 -0
- QUICKSTART.md +83 -0
- README.md +229 -0
- claude_desktop_config.json +11 -0
- index.js +258 -0
- mcp-figma-comment-summary.code-workspace +8 -0
- package-lock.json +1178 -0
- package.json +30 -0
.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 |
+
}
|