Implement SQLite database with full-text search for n8n node documentation

Major features implemented:
- SQLite storage service with FTS5 for fast node search
- Database rebuild mechanism for bulk node extraction
- MCP tools: search_nodes, extract_all_nodes, get_node_statistics
- Production Docker deployment with persistent storage
- Management scripts for database operations
- Comprehensive test suite for all functionality

Database capabilities:
- Stores node source code and metadata
- Full-text search by node name or content
- No versioning (stores latest only as per requirements)
- Supports complete database rebuilds
- ~4.5MB database with 500+ nodes indexed

Production features:
- Automated deployment script
- Docker Compose production configuration
- Database initialization on first run
- Volume persistence for data
- Management utilities for operations

Documentation:
- Updated README with complete instructions
- Production deployment guide
- Clear troubleshooting section
- API reference for all new tools

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
czlonkowski
2025-06-07 21:12:17 +00:00
parent 0cff8fbe6a
commit 078b67ff35
42 changed files with 33875 additions and 196 deletions

View File

@@ -1,13 +1,22 @@
# MCP Server Configuration
MCP_SERVER_PORT=3000
MCP_SERVER_HOST=localhost
# n8n Configuration
N8N_API_URL=http://localhost:5678
N8N_API_KEY=your-n8n-api-key
N8N_BASIC_AUTH_USER=admin
N8N_BASIC_AUTH_PASSWORD=your-secure-password-here
N8N_HOST=localhost
N8N_API_KEY=your-api-key-here
# MCP Configuration
MCP_LOG_LEVEL=info
NODE_ENV=production
# Database Configuration
NODE_DB_PATH=/app/data/nodes.db
# Optional: External n8n instance
# N8N_API_URL=http://your-n8n-instance:5678
# MCP Server Configuration (if using HTTP transport)
# MCP_SERVER_PORT=3000
# MCP_SERVER_HOST=localhost
# Authentication
MCP_AUTH_TOKEN=your-secure-token
# Logging
LOG_LEVEL=info
# MCP_AUTH_TOKEN=your-secure-token

View File

@@ -1,23 +1,9 @@
# Build stage
FROM node:18-alpine AS builder
WORKDIR /app
# Copy package files
COPY package*.json ./
# Install dependencies
RUN npm ci
# Copy source code
COPY . .
# Build the project
RUN npm run build
# Production stage
FROM node:18-alpine
# Install SQLite (for database management)
RUN apk add --no-cache sqlite
WORKDIR /app
# Copy package files
@@ -26,20 +12,43 @@ COPY package*.json ./
# Install production dependencies only
RUN npm ci --only=production
# Copy built files from builder stage
COPY --from=builder /app/dist ./dist
# Copy built files
COPY dist ./dist
COPY tests ./tests
# Create data directory for SQLite database
RUN mkdir -p /app/data
# Create a non-root user
RUN addgroup -g 1001 -S nodejs && adduser -S nodejs -u 1001
# Change ownership
# Change ownership (including data directory)
RUN chown -R nodejs:nodejs /app
# Switch to non-root user
USER nodejs
# Set environment variable for database location
ENV NODE_DB_PATH=/app/data/nodes.db
# Create a startup script
RUN printf '#!/bin/sh\n\
echo "🚀 Starting n8n-MCP server..."\n\
\n\
# Initialize database if it does not exist\n\
if [ ! -f "$NODE_DB_PATH" ]; then\n\
echo "📦 Initializing database..."\n\
node dist/scripts/rebuild-database.js\n\
fi\n\
\n\
echo "🎯 Database ready, starting MCP server..."\n\
exec node dist/index.js\n' > /app/start.sh && chmod +x /app/start.sh
# Expose the MCP server port (if using HTTP transport)
EXPOSE 3000
# Start the MCP server
CMD ["node", "dist/index.js"]
# Volume for persistent database storage
VOLUME ["/app/data"]
# Start the MCP server with database initialization
CMD ["/bin/sh", "/app/start.sh"]

325
README.md
View File

@@ -1,76 +1,96 @@
# n8n-mcp
# n8n-MCP Integration
Integration between n8n workflow automation and Model Context Protocol (MCP). This project provides:
Complete integration between n8n workflow automation and Model Context Protocol (MCP), enabling bidirectional communication between n8n workflows and AI assistants.
- An MCP server that exposes n8n workflows and operations to AI assistants
- A custom n8n node for connecting to MCP servers from within workflows
## Overview
This project provides two main components:
1. **MCP Server**: Allows AI assistants (like Claude) to interact with n8n workflows, execute them, and explore n8n nodes
2. **n8n Custom Node**: Enables n8n workflows to connect to and use MCP servers
**Important**: The MCP server uses stdio transport and is designed to be invoked by AI assistants like Claude Desktop. It's not a standalone HTTP server but rather a tool that AI assistants can call directly.
## Features
- **MCP Server**: Expose n8n workflows as tools, resources, and prompts for AI assistants
- **n8n Node**: Connect to any MCP server from n8n workflows
- **Bidirectional Integration**: Use AI capabilities in n8n and n8n automation in AI contexts
- **Node Source Extraction**: Extract source code from any n8n node, including AI Agent nodes
- **Authentication**: Secure token-based authentication
- **Flexible Transport**: Support for WebSocket and stdio connections
- **Bidirectional Integration**: n8n workflows can call MCP tools, and MCP servers can execute n8n workflows
- **Node Source Extraction**: Extract and search source code from any n8n node, including AI Agent nodes
- **SQLite Database**: Full-text search for n8n node documentation and source code (500+ nodes indexed)
- **Production Ready**: Docker-based deployment with persistent storage
- **Comprehensive MCP Tools**: 12+ tools for workflow management, node exploration, and database search
- **Custom n8n Node**: Connect to any MCP server from n8n workflows
- **Auto-indexing**: Automatically builds a searchable database of all n8n nodes on first run
## Prerequisites
- Node.js 18+
- Docker and Docker Compose (for production deployment)
- n8n instance with API access enabled
- (Optional) Claude Desktop for MCP integration
## Quick Start
### Prerequisites
- Node.js 18+
- n8n instance with API access enabled
- MCP-compatible AI assistant (Claude, etc.)
### Installation
```bash
# Clone the repository
git clone https://github.com/czlonkowski/n8n-mcp.git
git clone https://github.com/yourusername/n8n-mcp.git
cd n8n-mcp
# Install dependencies
npm install
# Copy environment configuration
# Copy environment template
cp .env.example .env
# Edit .env with your n8n credentials
# Configure your n8n API credentials
# Edit .env with your n8n instance details
```
### Running the MCP Server
```bash
# Build the project
npm run build
# Start the MCP server
npm start
# Initialize the database
npm run db:init
# (Optional) Rebuild database with all nodes
npm run db:rebuild
```
For development:
### Development
```bash
# Run tests
npm test
# Start development server
npm run dev
# Type checking
npm run typecheck
```
### Production Deployment
```bash
# Use the automated deployment script
./scripts/deploy-production.sh
# Or manually with Docker Compose
docker compose -f docker-compose.prod.yml up -d
```
See [Production Deployment Guide](docs/PRODUCTION_DEPLOYMENT.md) for detailed instructions.
## Configuration
### Environment Variables
Create a `.env` file based on `.env.example`:
Environment variables (`.env` file):
```env
# MCP Server Configuration
MCP_SERVER_PORT=3000
MCP_SERVER_HOST=localhost
# n8n Configuration
N8N_API_URL=http://localhost:5678
N8N_API_KEY=your-n8n-api-key
N8N_BASIC_AUTH_USER=admin
N8N_BASIC_AUTH_PASSWORD=your-password
N8N_HOST=localhost
N8N_API_KEY=your-api-key
# Authentication
MCP_AUTH_TOKEN=your-secure-token
# Database
NODE_DB_PATH=/app/data/nodes.db
# Logging
LOG_LEVEL=info
@@ -99,20 +119,32 @@ Add the server to your Claude configuration:
### Available MCP Tools
#### Workflow Management
- `execute_workflow` - Execute an n8n workflow by ID
- `list_workflows` - List all available workflows
- `get_workflow` - Get details of a specific workflow
- `create_workflow` - Create a new workflow
- `update_workflow` - Update an existing workflow
- `delete_workflow` - Delete a workflow
- `list_workflows` - List all workflows with filtering options
- `get_workflow` - Get detailed workflow information
- `create_workflow` - Create new workflows programmatically
- `update_workflow` - Update existing workflows
- `delete_workflow` - Delete workflows
- `get_executions` - Get workflow execution history
- `get_execution_data` - Get detailed execution data
- `get_node_source_code` - Extract source code of any n8n node
#### Node Exploration & Search
- `list_available_nodes` - List all available n8n nodes
- `get_node_source_code` - Extract source code of any n8n node
- `search_nodes` - Search nodes by name or content using full-text search
- `extract_all_nodes` - Extract and index all nodes to database
- `get_node_statistics` - Get database statistics (total nodes, packages, etc.)
### Using the n8n MCP Node
1. Copy the node files to your n8n custom nodes directory
1. Install the node in n8n:
```bash
# Copy to n8n custom nodes directory
cp -r dist/n8n/* ~/.n8n/custom/
# Or use the install script
./scripts/install-n8n-node.sh
```
2. Restart n8n
3. The MCP node will appear in the nodes panel
4. Configure with your MCP server credentials
@@ -139,44 +171,64 @@ Add the server to your Claude configuration:
## Architecture
### Project Structure
### Components
```
n8n-mcp/
├── src/
│ ├── mcp/ # MCP server implementation
│ ├── n8n/ # n8n node implementation
│ ├── utils/ # Shared utilities
│ └── types/ # TypeScript type definitions
├── tests/ # Test files
└── dist/ # Compiled output
1. **MCP Server** (`src/mcp/`): Exposes n8n operations as MCP tools
2. **n8n Custom Node** (`src/n8n/`): Allows n8n to connect to MCP servers
3. **SQLite Storage** (`src/services/`): Persistent storage with full-text search
4. **Bridge Layer** (`src/utils/`): Converts between n8n and MCP formats
### Database Management
The SQLite database stores n8n node documentation and source code with full-text search capabilities:
```bash
# Initialize empty database
npm run db:init
# Rebuild the entire database (indexes all nodes)
npm run db:rebuild
# In production
./scripts/manage-production.sh rebuild-db
# View statistics
./scripts/manage-production.sh db-stats
```
### Key Components
#### Search Examples
- **MCP Server**: Handles MCP protocol requests and translates to n8n API calls
- **n8n API Client**: Manages communication with n8n instance
- **Bridge Layer**: Converts between n8n and MCP data formats
- **Authentication**: Validates tokens and manages access control
```javascript
// Search for nodes by name
await mcp.callTool('search_nodes', { query: 'webhook' })
## Development
// Search in specific package
await mcp.callTool('search_nodes', {
query: 'http',
packageName: 'n8n-nodes-base'
})
### Running Tests
// Get database statistics
await mcp.callTool('get_node_statistics', {})
```
## Testing
### Run All Tests
```bash
npm test
```
### Building
### Test Specific Features
```bash
npm run build
```
# Test node extraction
node tests/test-mcp-extraction.js
### Type Checking
# Test database search
node tests/test-sqlite-search.js
```bash
npm run typecheck
# Test AI Agent extraction
./scripts/test-ai-agent-extraction.sh
```
## API Reference
@@ -201,14 +253,36 @@ Parameters:
Extract source code of any n8n node.
Parameters:
- `nodeType` (string, required): The node type identifier (e.g., `@n8n/n8n-nodes-langchain.Agent`)
- `nodeType` (string, required): The node type identifier (e.g., `n8n-nodes-base.Webhook`)
- `includeCredentials` (boolean, optional): Include credential type definitions if available
#### search_nodes
Search nodes using full-text search in the SQLite database.
Parameters:
- `query` (string, optional): Search term for node names/descriptions
- `packageName` (string, optional): Filter by package name
- `nodeType` (string, optional): Filter by node type pattern
- `hasCredentials` (boolean, optional): Filter nodes with credentials
- `limit` (number, optional): Limit results (default: 20)
#### extract_all_nodes
Extract and index all available nodes to the database.
Parameters:
- `packageFilter` (string, optional): Filter by package name
- `limit` (number, optional): Limit number of nodes to extract
#### get_node_statistics
Get database statistics including total nodes, packages, and size.
No parameters required.
#### list_available_nodes
List all available n8n nodes in the system.
Parameters:
- `category` (string, optional): Filter by category (e.g., AI, Data Transformation)
- `category` (string, optional): Filter by category
- `search` (string, optional): Search term to filter nodes
### MCP Resources
@@ -227,65 +301,88 @@ Parameters:
- `optimize_workflow_prompt` - Optimize workflow performance
- `explain_workflow_prompt` - Explain workflow functionality
## Management
Use the management script for production operations:
```bash
# Check status
./scripts/manage-production.sh status
# View logs
./scripts/manage-production.sh logs
# Create backup
./scripts/manage-production.sh backup
# Update services
./scripts/manage-production.sh update
```
## Troubleshooting
### Common Issues
1. **Connection refused**: Ensure n8n is running and API is enabled
2. **Authentication failed**: Check your API key in .env
3. **Workflow not found**: Verify workflow ID exists in n8n
4. **MCP connection failed**: Check server is running and accessible
1. **MCP server keeps restarting in Docker**
- This is expected behavior. The MCP server uses stdio transport and waits for input from AI assistants.
- For testing, use the development mode or invoke through Claude Desktop.
### Debug Mode
2. **Database not found**
- Run `npm run db:init` to create the database
- Run `npm run db:rebuild` to populate with all nodes
3. **n8n API connection failed**
- Verify n8n is running and accessible
- Check API key in `.env` file
- Ensure n8n API is enabled in settings
4. **Node extraction fails**
- Ensure Docker volume mounts are correct
- Check read permissions on node_modules directory
## Documentation
- [Production Deployment Guide](docs/PRODUCTION_DEPLOYMENT.md)
- [AI Agent Extraction Test](docs/AI_AGENT_EXTRACTION_TEST.md)
## Security
- Token-based authentication for n8n API
- Read-only access to node source files
- Isolated Docker containers
- Persistent volume encryption (optional)
## Project Structure
Enable debug logging:
```env
LOG_LEVEL=debug
```
## Special Features
### AI Agent Node Extraction
The MCP server can extract source code from n8n nodes, particularly useful for AI Agent nodes:
```bash
# Test AI Agent extraction
./scripts/test-ai-agent-extraction.sh
# Or use the standalone test
node tests/test-mcp-extraction.js
```
This feature allows AI assistants to:
- Understand n8n node implementations
- Generate compatible code
- Debug workflow issues
- Create custom variations
### Docker Volumes for Node Access
When running in Docker, mount n8n's node_modules for source extraction:
```yaml
volumes:
- n8n_modules:/usr/local/lib/node_modules/n8n/node_modules:ro
n8n-mcp/
├── src/
│ ├── mcp/ # MCP server implementation
│ ├── n8n/ # n8n custom node
│ ├── services/ # SQLite storage service
│ ├── utils/ # Utilities and helpers
│ └── scripts/ # Database management scripts
├── tests/ # Test suite
├── docs/ # Documentation
├── scripts/ # Deployment and management scripts
└── data/ # SQLite database (created on init)
```
## Contributing
Contributions are welcome! Please:
1. Fork the repository
2. Create a feature branch
3. Make your changes
4. Add tests
3. Add tests for new features
4. Ensure all tests pass
5. Submit a pull request
## License
ISC License - see LICENSE file for details
ISC License
## Support
- Issues: https://github.com/czlonkowski/n8n-mcp/issues
- n8n Documentation: https://docs.n8n.io
- MCP Specification: https://modelcontextprotocol.io
- GitHub Issues: [Report bugs or request features](https://github.com/yourusername/n8n-mcp/issues)
- n8n Community: [n8n.io/community](https://community.n8n.io/)
- MCP Documentation: [modelcontextprotocol.io](https://modelcontextprotocol.io/)

BIN
data/nodes.db Normal file

Binary file not shown.

69
docker-compose.prod.yml Normal file
View File

@@ -0,0 +1,69 @@
version: '3.8'
services:
n8n-mcp:
image: n8n-mcp:production
build:
context: .
dockerfile: Dockerfile
container_name: n8n-mcp-server
restart: unless-stopped
environment:
- NODE_ENV=production
- NODE_DB_PATH=/app/data/nodes.db
- N8N_API_URL=http://n8n:5678
- N8N_API_KEY=${N8N_API_KEY}
- LOG_LEVEL=info
volumes:
- mcp-data:/app/data
- n8n-node-modules:/usr/local/lib/node_modules/n8n/node_modules:ro
networks:
- n8n-network
depends_on:
- n8n
healthcheck:
test: ["CMD", "node", "-e", "require('fs').existsSync('/app/data/nodes.db') || process.exit(1)"]
interval: 30s
timeout: 10s
retries: 3
start_period: 60s
n8n:
image: n8nio/n8n:latest
container_name: n8n
restart: unless-stopped
ports:
- "5678:5678"
environment:
- N8N_BASIC_AUTH_ACTIVE=true
- N8N_BASIC_AUTH_USER=${N8N_BASIC_AUTH_USER}
- N8N_BASIC_AUTH_PASSWORD=${N8N_BASIC_AUTH_PASSWORD}
- N8N_HOST=${N8N_HOST:-localhost}
- N8N_PORT=5678
- N8N_PROTOCOL=http
- NODE_ENV=production
- N8N_METRICS=true
- N8N_CUSTOM_EXTENSIONS=/home/node/.n8n/custom
volumes:
- n8n-data:/home/node/.n8n
- ./dist/n8n:/home/node/.n8n/custom/nodes
networks:
- n8n-network
healthcheck:
test: ["CMD", "wget", "-q", "-O", "-", "http://localhost:5678/healthz"]
interval: 30s
timeout: 10s
retries: 3
start_period: 30s
volumes:
n8n-data:
driver: local
mcp-data:
driver: local
n8n-node-modules:
driver: local
networks:
n8n-network:
driver: bridge

View File

@@ -26,7 +26,7 @@ services:
networks:
- test-network
healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:5678/healthz"]
test: ["CMD", "wget", "--spider", "-q", "http://localhost:5678/"]
interval: 30s
timeout: 10s
retries: 3
@@ -51,8 +51,7 @@ services:
networks:
- test-network
depends_on:
n8n:
condition: service_healthy
- n8n
command: node dist/index.js
networks:

View File

@@ -1,3 +1,7 @@
# Development docker-compose configuration
# For production deployment, use docker-compose.prod.yml
# See docs/PRODUCTION_DEPLOYMENT.md for instructions
version: '3.8'
services:

View File

@@ -0,0 +1,188 @@
# n8n-MCP Implementation Roadmap
## ✅ Completed Features
### 1. Core MCP Server Implementation
- [x] Basic MCP server with stdio transport
- [x] Tool handlers for n8n workflow operations
- [x] Resource handlers for workflow data
- [x] Authentication and error handling
### 2. n8n Integration
- [x] n8n API client for workflow management
- [x] MCP<->n8n data bridge for format conversion
- [x] Workflow execution and monitoring
### 3. Node Source Extraction
- [x] Extract source code from any n8n node
- [x] Handle pnpm directory structures
- [x] Support for AI Agent node extraction
- [x] Bulk extraction capabilities
### 4. Node Storage System
- [x] In-memory storage service
- [x] Search functionality
- [x] Package statistics
- [x] Database export format
## 🚧 Next Implementation Steps
### Phase 1: Database Integration (Priority: High)
1. **Real Database Backend**
- [ ] Add PostgreSQL/SQLite support
- [ ] Implement proper migrations
- [ ] Add connection pooling
- [ ] Transaction support
2. **Enhanced Storage Features**
- [ ] Version tracking for nodes
- [ ] Diff detection for updates
- [ ] Backup/restore functionality
- [ ] Data compression
### Phase 2: Advanced Search & Analysis (Priority: High)
1. **Full-Text Search**
- [ ] Elasticsearch/MeiliSearch integration
- [ ] Code analysis and indexing
- [ ] Semantic search capabilities
- [ ] Search by functionality
2. **Node Analysis**
- [ ] Dependency graph generation
- [ ] Security vulnerability scanning
- [ ] Performance profiling
- [ ] Code quality metrics
### Phase 3: AI Integration (Priority: Medium)
1. **AI-Powered Features**
- [ ] Node recommendation system
- [ ] Workflow generation from descriptions
- [ ] Code explanation generation
- [ ] Automatic documentation
2. **Vector Database**
- [ ] Node embeddings generation
- [ ] Similarity search
- [ ] Clustering similar nodes
- [ ] AI training data export
### Phase 4: n8n Node Development (Priority: Medium)
1. **MCPNode Enhancements**
- [ ] Dynamic tool discovery
- [ ] Streaming responses
- [ ] File upload/download
- [ ] WebSocket support
2. **Custom Node Features**
- [ ] Visual configuration UI
- [ ] Credential management
- [ ] Error handling improvements
- [ ] Performance monitoring
### Phase 5: API & Web Interface (Priority: Low)
1. **REST/GraphQL API**
- [ ] Node search API
- [ ] Statistics dashboard
- [ ] Webhook notifications
- [ ] Rate limiting
2. **Web Dashboard**
- [ ] Node browser interface
- [ ] Code viewer with syntax highlighting
- [ ] Search interface
- [ ] Analytics dashboard
### Phase 6: Production Features (Priority: Low)
1. **Deployment**
- [ ] Kubernetes manifests
- [ ] Helm charts
- [ ] Auto-scaling configuration
- [ ] Health checks
2. **Monitoring**
- [ ] Prometheus metrics
- [ ] Grafana dashboards
- [ ] Log aggregation
- [ ] Alerting rules
## 🎯 Immediate Next Steps
1. **Database Integration** (Week 1-2)
```typescript
// Add to package.json
"typeorm": "^0.3.x",
"pg": "^8.x"
// Create entities/Node.entity.ts
@Entity()
export class Node {
@PrimaryGeneratedColumn('uuid')
id: string;
@Column({ unique: true })
nodeType: string;
@Column('text')
sourceCode: string;
// ... etc
}
```
2. **Add Database MCP Tools** (Week 2)
```typescript
// New tools:
- sync_nodes_to_database
- query_nodes_database
- export_nodes_for_training
```
3. **Create Migration Scripts** (Week 2-3)
```bash
npm run migrate:create -- CreateNodesTable
npm run migrate:run
```
4. **Implement Caching Layer** (Week 3)
- Redis for frequently accessed nodes
- LRU cache for search results
- Invalidation strategies
5. **Add Real-Time Updates** (Week 4)
- WebSocket server for live updates
- Node change notifications
- Workflow execution streaming
## 📊 Success Metrics
- [ ] Extract and store 100% of n8n nodes
- [ ] Search response time < 100ms
- [ ] Support for 10k+ stored nodes
- [ ] 99.9% uptime for MCP server
- [ ] Full-text search accuracy > 90%
## 🔗 Integration Points
1. **n8n Community Store**
- Sync with community nodes
- Version tracking
- Popularity metrics
2. **AI Platforms**
- OpenAI fine-tuning exports
- Anthropic training data
- Local LLM integration
3. **Development Tools**
- VS Code extension
- CLI tools
- SDK libraries
## 📝 Documentation Needs
- [ ] API reference documentation
- [ ] Database schema documentation
- [ ] Search query syntax guide
- [ ] Performance tuning guide
- [ ] Security best practices
This roadmap provides a clear path forward for the n8n-MCP project, with the most critical next step being proper database integration to persist the extracted node data.

View File

@@ -0,0 +1,207 @@
# Production Deployment Guide for n8n-MCP
This guide provides instructions for deploying n8n-MCP in a production environment.
## Prerequisites
- Docker and Docker Compose v2 installed
- Node.js 18+ installed (for building)
- At least 2GB of available RAM
- 1GB of available disk space
## Quick Start
1. **Clone the repository**
```bash
git clone https://github.com/yourusername/n8n-mcp.git
cd n8n-mcp
```
2. **Run the deployment script**
```bash
./scripts/deploy-production.sh
```
This script will:
- Check prerequisites
- Create a secure `.env` file with generated passwords
- Build the project
- Create Docker images
- Start all services
- Initialize the node database
3. **Access n8n**
- URL: `http://localhost:5678`
- Use the credentials displayed during deployment
## Manual Deployment
If you prefer manual deployment:
1. **Create .env file**
```bash
cp .env.example .env
# Edit .env with your configuration
```
2. **Build the project**
```bash
npm install
npm run build
```
3. **Start services**
```bash
docker compose -f docker-compose.prod.yml up -d
```
## Configuration
### Environment Variables
| Variable | Description | Default |
|----------|-------------|---------|
| `N8N_BASIC_AUTH_USER` | n8n admin username | admin |
| `N8N_BASIC_AUTH_PASSWORD` | n8n admin password | (generated) |
| `N8N_HOST` | n8n hostname | localhost |
| `N8N_API_KEY` | API key for n8n access | (generated) |
| `NODE_DB_PATH` | SQLite database path | /app/data/nodes.db |
| `LOG_LEVEL` | Logging level | info |
### Volumes
The deployment creates persistent volumes:
- `n8n-data`: n8n workflows and credentials
- `mcp-data`: MCP node database
- `n8n-node-modules`: Read-only n8n node modules
## Management
Use the management script for common operations:
```bash
# Check service status
./scripts/manage-production.sh status
# View logs
./scripts/manage-production.sh logs
# Rebuild node database
./scripts/manage-production.sh rebuild-db
# Show database statistics
./scripts/manage-production.sh db-stats
# Create backup
./scripts/manage-production.sh backup
# Update services
./scripts/manage-production.sh update
```
## Database Management
### Initial Database Population
The database is automatically populated on first startup. To manually rebuild:
```bash
docker compose -f docker-compose.prod.yml exec n8n-mcp node dist/scripts/rebuild-database.js
```
### Database Queries
Search for nodes:
```bash
docker compose -f docker-compose.prod.yml exec n8n-mcp sqlite3 /app/data/nodes.db \
"SELECT node_type, display_name FROM nodes WHERE name LIKE '%webhook%';"
```
## Security Considerations
1. **Change default passwords**: Always change the generated passwords in production
2. **Use HTTPS**: Configure a reverse proxy (nginx, traefik) for HTTPS
3. **Firewall**: Restrict access to ports 5678
4. **API Keys**: Keep API keys secure and rotate regularly
5. **Backups**: Regular backup of data volumes
## Monitoring
### Health Checks
Both services include health checks:
- n8n: `http://localhost:5678/healthz`
- MCP: Database file existence check
### Logs
View logs for debugging:
```bash
# All services
docker compose -f docker-compose.prod.yml logs -f
# Specific service
docker compose -f docker-compose.prod.yml logs -f n8n-mcp
```
## Troubleshooting
### Database Issues
If the database is corrupted or needs rebuilding:
```bash
# Stop services
docker compose -f docker-compose.prod.yml stop
# Remove database
docker compose -f docker-compose.prod.yml exec n8n-mcp rm /app/data/nodes.db
# Start services (database will rebuild)
docker compose -f docker-compose.prod.yml start
```
### Memory Issues
If services run out of memory, increase Docker memory limits:
```yaml
# In docker-compose.prod.yml
services:
n8n-mcp:
deploy:
resources:
limits:
memory: 1G
```
### Connection Issues
If n8n can't connect to MCP:
1. Check both services are running: `docker compose -f docker-compose.prod.yml ps`
2. Verify network connectivity: `docker compose -f docker-compose.prod.yml exec n8n ping n8n-mcp`
3. Check MCP logs: `docker compose -f docker-compose.prod.yml logs n8n-mcp`
## Scaling
For high-availability deployments:
1. **Database Replication**: Use external SQLite replication or migrate to PostgreSQL
2. **Load Balancing**: Deploy multiple MCP instances behind a load balancer
3. **Caching**: Implement Redis caching for frequently accessed nodes
## Updates
To update to the latest version:
```bash
# Pull latest code
git pull
# Rebuild and restart
./scripts/manage-production.sh update
```
## Support
For issues and questions:
- GitHub Issues: [your-repo-url]/issues
- Documentation: [your-docs-url]

310
package-lock.json generated
View File

@@ -10,6 +10,8 @@
"license": "ISC",
"dependencies": {
"@modelcontextprotocol/sdk": "^1.12.1",
"@types/better-sqlite3": "^7.6.13",
"better-sqlite3": "^11.10.0",
"dotenv": "^16.5.0",
"express": "^5.1.0",
"n8n-core": "^1.14.1",
@@ -4000,6 +4002,15 @@
"@babel/types": "^7.20.7"
}
},
"node_modules/@types/better-sqlite3": {
"version": "7.6.13",
"resolved": "https://registry.npmjs.org/@types/better-sqlite3/-/better-sqlite3-7.6.13.tgz",
"integrity": "sha512-NMv9ASNARoKksWtsq/SHakpYAYnhBrQgGD8zkLYk/jaK8jUGn08CfEdTRgYhMypUQAfzSP8W6gNLe0q19/t4VA==",
"license": "MIT",
"dependencies": {
"@types/node": "*"
}
},
"node_modules/@types/body-parser": {
"version": "1.19.6",
"resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz",
@@ -4894,6 +4905,17 @@
"tweetnacl": "^0.14.3"
}
},
"node_modules/better-sqlite3": {
"version": "11.10.0",
"resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-11.10.0.tgz",
"integrity": "sha512-EwhOpyXiOEL/lKzHz9AW1msWFNzGc/z+LzeB3/jnFJpxu+th2yqvzsSWas1v9jgs9+xiXJcD5A8CJxAG2TaghQ==",
"hasInstallScript": true,
"license": "MIT",
"dependencies": {
"bindings": "^1.5.0",
"prebuild-install": "^7.1.1"
}
},
"node_modules/big-integer": {
"version": "1.6.52",
"resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz",
@@ -4932,6 +4954,15 @@
"integrity": "sha512-rA2CrUl1+6yKrn+XgLs8Hdy18OER1UW146nM+ixzhQXDY+Bd3ySkyIJGwF2a4I45JwbvF1mDL/nWkqBwpOcdBA==",
"peer": true
},
"node_modules/bindings": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
"integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
"license": "MIT",
"dependencies": {
"file-uri-to-path": "1.0.0"
}
},
"node_modules/bl": {
"version": "6.1.0",
"resolved": "https://registry.npmjs.org/bl/-/bl-6.1.0.tgz",
@@ -5155,7 +5186,6 @@
}
],
"license": "MIT",
"peer": true,
"dependencies": {
"base64-js": "^1.3.1",
"ieee754": "^1.1.13"
@@ -5437,6 +5467,12 @@
"fsevents": "~2.3.2"
}
},
"node_modules/chownr": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz",
"integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==",
"license": "ISC"
},
"node_modules/ci-info": {
"version": "3.9.0",
"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
@@ -5890,6 +5926,21 @@
}
}
},
"node_modules/decompress-response": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
"integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
"license": "MIT",
"dependencies": {
"mimic-response": "^3.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/dedent": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/dedent/-/dedent-1.6.0.tgz",
@@ -5933,6 +5984,15 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/deep-extend": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
"integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
"license": "MIT",
"engines": {
"node": ">=4.0.0"
}
},
"node_modules/deepmerge": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
@@ -6014,6 +6074,15 @@
"node": ">= 0.8"
}
},
"node_modules/detect-libc": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz",
"integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==",
"license": "Apache-2.0",
"engines": {
"node": ">=8"
}
},
"node_modules/detect-newline": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
@@ -6257,7 +6326,6 @@
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
"integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
"license": "MIT",
"peer": true,
"dependencies": {
"once": "^1.4.0"
}
@@ -6602,6 +6670,15 @@
"node": ">= 0.8.0"
}
},
"node_modules/expand-template": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz",
"integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==",
"license": "(MIT OR WTFPL)",
"engines": {
"node": ">=6"
}
},
"node_modules/expand-tilde": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz",
@@ -6821,6 +6898,12 @@
"url": "https://github.com/sindresorhus/file-type?sponsor=1"
}
},
"node_modules/file-uri-to-path": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
"integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
"license": "MIT"
},
"node_modules/filelist": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
@@ -7037,6 +7120,12 @@
"node": ">= 0.8"
}
},
"node_modules/fs-constants": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz",
"integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==",
"license": "MIT"
},
"node_modules/fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
@@ -7270,6 +7359,12 @@
"node": ">8.0.0"
}
},
"node_modules/github-from-package": {
"version": "0.0.0",
"resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz",
"integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==",
"license": "MIT"
},
"node_modules/glob": {
"version": "7.2.3",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
@@ -7964,6 +8059,12 @@
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"license": "ISC"
},
"node_modules/ini": {
"version": "1.3.8",
"resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
"integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
"license": "ISC"
},
"node_modules/internal-slot": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz",
@@ -9953,6 +10054,18 @@
"node": ">=6"
}
},
"node_modules/mimic-response": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
"integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
"license": "MIT",
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/minifaker": {
"version": "1.34.1",
"resolved": "https://registry.npmjs.org/minifaker/-/minifaker-1.34.1.tgz",
@@ -9997,7 +10110,6 @@
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
"integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
"license": "MIT",
"peer": true,
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
@@ -10025,6 +10137,12 @@
"node": ">=10"
}
},
"node_modules/mkdirp-classic": {
"version": "0.5.3",
"resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
"integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==",
"license": "MIT"
},
"node_modules/moment": {
"version": "2.30.1",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz",
@@ -10625,6 +10743,12 @@
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
}
},
"node_modules/napi-build-utils": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-2.0.0.tgz",
"integrity": "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA==",
"license": "MIT"
},
"node_modules/native-duplexpair": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/native-duplexpair/-/native-duplexpair-1.0.0.tgz",
@@ -10659,6 +10783,30 @@
"tslib": "^2.0.3"
}
},
"node_modules/node-abi": {
"version": "3.75.0",
"resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.75.0.tgz",
"integrity": "sha512-OhYaY5sDsIka7H7AtijtI9jwGYLyl29eQn/W623DiN/MIv5sUqc4g7BIDThX+gb7di9f6xK02nkp8sdfFWZLTg==",
"license": "MIT",
"dependencies": {
"semver": "^7.3.5"
},
"engines": {
"node": ">=10"
}
},
"node_modules/node-abi/node_modules/semver": {
"version": "7.7.2",
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz",
"integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==",
"license": "ISC",
"bin": {
"semver": "bin/semver.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/node-abort-controller": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz",
@@ -11712,6 +11860,32 @@
"node": ">=0.10.0"
}
},
"node_modules/prebuild-install": {
"version": "7.1.3",
"resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz",
"integrity": "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug==",
"license": "MIT",
"dependencies": {
"detect-libc": "^2.0.0",
"expand-template": "^2.0.3",
"github-from-package": "0.0.0",
"minimist": "^1.2.3",
"mkdirp-classic": "^0.5.3",
"napi-build-utils": "^2.0.0",
"node-abi": "^3.3.0",
"pump": "^3.0.0",
"rc": "^1.2.7",
"simple-get": "^4.0.0",
"tar-fs": "^2.0.0",
"tunnel-agent": "^0.6.0"
},
"bin": {
"prebuild-install": "bin.js"
},
"engines": {
"node": ">=10"
}
},
"node_modules/pretty-bytes": {
"version": "5.6.0",
"resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz",
@@ -11875,6 +12049,16 @@
"dev": true,
"license": "MIT"
},
"node_modules/pump": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz",
"integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==",
"license": "MIT",
"dependencies": {
"end-of-stream": "^1.1.0",
"once": "^1.3.1"
}
},
"node_modules/punycode": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
@@ -12012,6 +12196,30 @@
"node": ">= 0.8"
}
},
"node_modules/rc": {
"version": "1.2.8",
"resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
"integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
"license": "(BSD-2-Clause OR MIT OR Apache-2.0)",
"dependencies": {
"deep-extend": "^0.6.0",
"ini": "~1.3.0",
"minimist": "^1.2.0",
"strip-json-comments": "~2.0.1"
},
"bin": {
"rc": "cli.js"
}
},
"node_modules/rc/node_modules/strip-json-comments": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
"integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==",
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/react-is": {
"version": "18.3.1",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
@@ -12800,6 +13008,51 @@
"dev": true,
"license": "ISC"
},
"node_modules/simple-concat": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz",
"integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "MIT"
},
"node_modules/simple-get": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz",
"integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "MIT",
"dependencies": {
"decompress-response": "^6.0.0",
"once": "^1.3.1",
"simple-concat": "^1.0.0"
}
},
"node_modules/simple-git": {
"version": "3.28.0",
"resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.28.0.tgz",
@@ -13465,6 +13718,45 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/tar-fs": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.3.tgz",
"integrity": "sha512-090nwYJDmlhwFwEW3QQl+vaNnxsO2yVsd45eTKRBzSzu+hlb1w2K9inVq5b0ngXuLVqQ4ApvsUHHnu/zQNkWAg==",
"license": "MIT",
"dependencies": {
"chownr": "^1.1.1",
"mkdirp-classic": "^0.5.2",
"pump": "^3.0.0",
"tar-stream": "^2.1.4"
}
},
"node_modules/tar-stream": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz",
"integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==",
"license": "MIT",
"dependencies": {
"bl": "^4.0.3",
"end-of-stream": "^1.4.1",
"fs-constants": "^1.0.0",
"inherits": "^2.0.3",
"readable-stream": "^3.1.1"
},
"engines": {
"node": ">=6"
}
},
"node_modules/tar-stream/node_modules/bl": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
"integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
"license": "MIT",
"dependencies": {
"buffer": "^5.5.0",
"inherits": "^2.0.4",
"readable-stream": "^3.4.0"
}
},
"node_modules/tarn": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz",
@@ -13922,6 +14214,18 @@
"node": ">=0.6.11 <=0.7.0 || >=0.7.3"
}
},
"node_modules/tunnel-agent": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
"integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==",
"license": "Apache-2.0",
"dependencies": {
"safe-buffer": "^5.0.1"
},
"engines": {
"node": "*"
}
},
"node_modules/tweetnacl": {
"version": "0.14.5",
"resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",

View File

@@ -9,7 +9,9 @@
"start": "node dist/index.js",
"test": "jest",
"lint": "tsc --noEmit",
"typecheck": "tsc --noEmit"
"typecheck": "tsc --noEmit",
"db:rebuild": "node dist/scripts/rebuild-database.js",
"db:init": "node -e \"new (require('./dist/services/sqlite-storage-service').SQLiteStorageService)(); console.log('Database initialized')\""
},
"repository": {
"type": "git",
@@ -34,6 +36,8 @@
},
"dependencies": {
"@modelcontextprotocol/sdk": "^1.12.1",
"@types/better-sqlite3": "^7.6.13",
"better-sqlite3": "^11.10.0",
"dotenv": "^16.5.0",
"express": "^5.1.0",
"n8n-core": "^1.14.1",

66
quick-test.sh Executable file
View File

@@ -0,0 +1,66 @@
#!/bin/bash
echo "🚀 Quick n8n-MCP Node Extraction Test"
echo "===================================="
echo ""
# Start services
echo "1. Starting Docker services..."
docker compose -f docker-compose.test.yml up -d
echo ""
echo "2. Waiting for services to start (30 seconds)..."
sleep 30
echo ""
echo "3. Testing AI Agent node extraction..."
docker compose -f docker-compose.test.yml run --rm n8n-mcp node -e "
const { NodeSourceExtractor } = require('./dist/utils/node-source-extractor');
async function test() {
const extractor = new NodeSourceExtractor();
console.log('\\n🔍 Extracting AI Agent node...');
try {
const result = await extractor.extractNodeSource('@n8n/n8n-nodes-langchain.Agent');
console.log('✅ SUCCESS!');
console.log('📦 Node Type:', result.nodeType);
console.log('📏 Code Size:', result.sourceCode.length, 'bytes');
console.log('📍 Location:', result.location);
console.log('\\n📄 First 200 characters of code:');
console.log(result.sourceCode.substring(0, 200) + '...');
} catch (error) {
console.log('❌ FAILED:', error.message);
}
}
test();
"
echo ""
echo "4. Listing available AI nodes..."
docker compose -f docker-compose.test.yml run --rm n8n-mcp node -e "
const { NodeSourceExtractor } = require('./dist/utils/node-source-extractor');
async function test() {
const extractor = new NodeSourceExtractor();
console.log('\\n📋 Listing AI/LangChain nodes...');
const nodes = await extractor.listAvailableNodes();
const aiNodes = nodes.filter(n => n.location && n.location.includes('langchain'));
console.log('Found', aiNodes.length, 'AI nodes:');
aiNodes.slice(0, 10).forEach(node => {
console.log(' -', node.name);
});
}
test();
"
echo ""
echo "5. Cleaning up..."
docker compose -f docker-compose.test.yml down -v
echo ""
echo "✅ Test complete!"

140
scripts/deploy-production.sh Executable file
View File

@@ -0,0 +1,140 @@
#!/bin/bash
# Production deployment script for n8n-MCP
set -e
echo "🚀 n8n-MCP Production Deployment Script"
echo "======================================"
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# Function to check if command exists
command_exists() {
command -v "$1" >/dev/null 2>&1
}
# Function to generate secure password
generate_password() {
openssl rand -base64 32 | tr -d "=+/" | cut -c1-25
}
# Check prerequisites
echo -e "\n${YELLOW}Checking prerequisites...${NC}"
if ! command_exists docker; then
echo -e "${RED}❌ Docker is not installed. Please install Docker first.${NC}"
exit 1
fi
if ! command_exists docker compose; then
echo -e "${RED}❌ Docker Compose v2 is not installed. Please install Docker Compose v2.${NC}"
exit 1
fi
if ! command_exists node; then
echo -e "${RED}❌ Node.js is not installed. Please install Node.js first.${NC}"
exit 1
fi
echo -e "${GREEN}✅ All prerequisites met${NC}"
# Check for .env file
if [ ! -f .env ]; then
echo -e "\n${YELLOW}Creating .env file...${NC}"
# Generate secure passwords
N8N_BASIC_AUTH_PASSWORD=$(generate_password)
N8N_API_KEY=$(generate_password)
cat > .env << EOF
# n8n Configuration
N8N_BASIC_AUTH_USER=admin
N8N_BASIC_AUTH_PASSWORD=${N8N_BASIC_AUTH_PASSWORD}
N8N_HOST=localhost
N8N_API_KEY=${N8N_API_KEY}
# MCP Configuration
MCP_LOG_LEVEL=info
NODE_ENV=production
EOF
echo -e "${GREEN}✅ Created .env file with secure defaults${NC}"
echo -e "${YELLOW}⚠️ Please note your credentials:${NC}"
echo -e " n8n Username: admin"
echo -e " n8n Password: ${N8N_BASIC_AUTH_PASSWORD}"
echo -e " API Key: ${N8N_API_KEY}"
echo -e "${YELLOW} Save these credentials securely!${NC}"
else
echo -e "${GREEN}✅ Using existing .env file${NC}"
fi
# Build the project
echo -e "\n${YELLOW}Building the project...${NC}"
npm install
npm run build
if [ $? -ne 0 ]; then
echo -e "${RED}❌ Build failed. Please fix the errors and try again.${NC}"
exit 1
fi
echo -e "${GREEN}✅ Build completed successfully${NC}"
# Build Docker image
echo -e "\n${YELLOW}Building Docker image...${NC}"
docker compose -f docker-compose.prod.yml build
if [ $? -ne 0 ]; then
echo -e "${RED}❌ Docker build failed. Please check the logs.${NC}"
exit 1
fi
echo -e "${GREEN}✅ Docker image built successfully${NC}"
# Start services
echo -e "\n${YELLOW}Starting services...${NC}"
docker compose -f docker-compose.prod.yml up -d
if [ $? -ne 0 ]; then
echo -e "${RED}❌ Failed to start services. Please check the logs.${NC}"
exit 1
fi
echo -e "${GREEN}✅ Services started successfully${NC}"
# Wait for services to be healthy
echo -e "\n${YELLOW}Waiting for services to be healthy...${NC}"
sleep 10
# Check service health
N8N_HEALTH=$(docker compose -f docker-compose.prod.yml ps n8n --format json | jq -r '.[0].Health // "unknown"')
MCP_HEALTH=$(docker compose -f docker-compose.prod.yml ps n8n-mcp --format json | jq -r '.[0].Health // "unknown"')
if [ "$N8N_HEALTH" = "healthy" ] && [ "$MCP_HEALTH" = "healthy" ]; then
echo -e "${GREEN}✅ All services are healthy${NC}"
else
echo -e "${YELLOW}⚠️ Services might still be starting up...${NC}"
echo -e " n8n status: $N8N_HEALTH"
echo -e " MCP server status: $MCP_HEALTH"
fi
# Display access information
echo -e "\n${GREEN}🎉 Deployment completed successfully!${NC}"
echo -e "\n${YELLOW}Access Information:${NC}"
echo -e " n8n UI: http://localhost:5678"
echo -e " MCP Server: Running internally (accessible by n8n)"
echo -e "\n${YELLOW}Next Steps:${NC}"
echo -e " 1. Access n8n at http://localhost:5678"
echo -e " 2. Log in with the credentials from .env file"
echo -e " 3. Create a new workflow and add the MCP node"
echo -e " 4. Configure the MCP node to connect to the internal server"
echo -e "\n${YELLOW}Useful Commands:${NC}"
echo -e " View logs: docker compose -f docker-compose.prod.yml logs -f"
echo -e " Stop services: docker compose -f docker-compose.prod.yml down"
echo -e " Rebuild database: docker compose -f docker-compose.prod.yml exec n8n-mcp node dist/scripts/rebuild-database.js"
echo -e " View database stats: docker compose -f docker-compose.prod.yml exec n8n-mcp sqlite3 /app/data/nodes.db 'SELECT COUNT(*) as total_nodes FROM nodes;'"

178
scripts/manage-production.sh Executable file
View File

@@ -0,0 +1,178 @@
#!/bin/bash
# Production management script for n8n-MCP
set -e
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Display usage
usage() {
echo -e "${BLUE}n8n-MCP Production Management Script${NC}"
echo -e "${YELLOW}Usage:${NC} $0 [command]"
echo
echo -e "${YELLOW}Commands:${NC}"
echo " status - Show service status"
echo " logs - View service logs"
echo " start - Start all services"
echo " stop - Stop all services"
echo " restart - Restart all services"
echo " rebuild-db - Rebuild the node database"
echo " db-stats - Show database statistics"
echo " backup - Backup data volumes"
echo " restore - Restore data volumes from backup"
echo " update - Update services to latest versions"
echo " shell - Open shell in MCP container"
echo
exit 1
}
# Check if docker compose file exists
if [ ! -f "docker-compose.prod.yml" ]; then
echo -e "${RED}❌ docker-compose.prod.yml not found. Run this script from the project root.${NC}"
exit 1
fi
# Main command handling
case "$1" in
status)
echo -e "${YELLOW}Service Status:${NC}"
docker compose -f docker-compose.prod.yml ps
;;
logs)
if [ -z "$2" ]; then
docker compose -f docker-compose.prod.yml logs -f --tail=100
else
docker compose -f docker-compose.prod.yml logs -f --tail=100 "$2"
fi
;;
start)
echo -e "${YELLOW}Starting services...${NC}"
docker compose -f docker-compose.prod.yml up -d
echo -e "${GREEN}✅ Services started${NC}"
;;
stop)
echo -e "${YELLOW}Stopping services...${NC}"
docker compose -f docker-compose.prod.yml down
echo -e "${GREEN}✅ Services stopped${NC}"
;;
restart)
echo -e "${YELLOW}Restarting services...${NC}"
docker compose -f docker-compose.prod.yml restart
echo -e "${GREEN}✅ Services restarted${NC}"
;;
rebuild-db)
echo -e "${YELLOW}Rebuilding node database...${NC}"
docker compose -f docker-compose.prod.yml exec n8n-mcp node dist/scripts/rebuild-database.js
;;
db-stats)
echo -e "${YELLOW}Database Statistics:${NC}"
docker compose -f docker-compose.prod.yml exec n8n-mcp sqlite3 /app/data/nodes.db << 'EOF'
.headers on
.mode column
SELECT
COUNT(*) as total_nodes,
COUNT(DISTINCT package_name) as total_packages,
ROUND(SUM(code_length) / 1024.0 / 1024.0, 2) as total_size_mb,
ROUND(AVG(code_length) / 1024.0, 2) as avg_size_kb
FROM nodes;
.print
.print "Top 10 packages by node count:"
SELECT package_name, COUNT(*) as node_count
FROM nodes
GROUP BY package_name
ORDER BY node_count DESC
LIMIT 10;
EOF
;;
backup)
BACKUP_DIR="backups/$(date +%Y%m%d_%H%M%S)"
echo -e "${YELLOW}Creating backup in ${BACKUP_DIR}...${NC}"
mkdir -p "$BACKUP_DIR"
# Stop services for consistent backup
docker compose -f docker-compose.prod.yml stop
# Backup volumes
docker run --rm -v n8n-mcp_n8n-data:/source -v $(pwd)/$BACKUP_DIR:/backup alpine tar czf /backup/n8n-data.tar.gz -C /source .
docker run --rm -v n8n-mcp_mcp-data:/source -v $(pwd)/$BACKUP_DIR:/backup alpine tar czf /backup/mcp-data.tar.gz -C /source .
# Copy .env file
cp .env "$BACKUP_DIR/"
# Restart services
docker compose -f docker-compose.prod.yml start
echo -e "${GREEN}✅ Backup completed in ${BACKUP_DIR}${NC}"
;;
restore)
if [ -z "$2" ]; then
echo -e "${RED}❌ Please specify backup directory (e.g., backups/20240107_120000)${NC}"
exit 1
fi
if [ ! -d "$2" ]; then
echo -e "${RED}❌ Backup directory $2 not found${NC}"
exit 1
fi
echo -e "${YELLOW}⚠️ This will replace all current data! Continue? (y/N)${NC}"
read -r confirm
if [ "$confirm" != "y" ]; then
echo "Restore cancelled"
exit 0
fi
echo -e "${YELLOW}Restoring from $2...${NC}"
# Stop services
docker compose -f docker-compose.prod.yml down
# Restore volumes
docker run --rm -v n8n-mcp_n8n-data:/target -v $(pwd)/$2:/backup alpine tar xzf /backup/n8n-data.tar.gz -C /target
docker run --rm -v n8n-mcp_mcp-data:/target -v $(pwd)/$2:/backup alpine tar xzf /backup/mcp-data.tar.gz -C /target
# Start services
docker compose -f docker-compose.prod.yml up -d
echo -e "${GREEN}✅ Restore completed${NC}"
;;
update)
echo -e "${YELLOW}Updating services...${NC}"
# Pull latest images
docker compose -f docker-compose.prod.yml pull
# Rebuild MCP image
docker compose -f docker-compose.prod.yml build
# Restart with new images
docker compose -f docker-compose.prod.yml up -d
echo -e "${GREEN}✅ Services updated${NC}"
;;
shell)
echo -e "${YELLOW}Opening shell in MCP container...${NC}"
docker compose -f docker-compose.prod.yml exec n8n-mcp /bin/sh
;;
*)
usage
;;
esac

View File

@@ -23,11 +23,11 @@ npm run build
echo
echo "2. Building Docker image..."
docker-compose -f docker-compose.test.yml build
docker compose -f docker-compose.test.yml build
echo
echo "3. Starting test environment..."
docker-compose -f docker-compose.test.yml up -d
docker compose -f docker-compose.test.yml up -d
echo
echo "4. Waiting for services to be ready..."
@@ -36,7 +36,7 @@ sleep 10
# Wait for n8n to be healthy
echo " Waiting for n8n to be ready..."
for i in {1..30}; do
if docker-compose -f docker-compose.test.yml exec n8n wget --spider -q http://localhost:5678/healthz 2>/dev/null; then
if docker compose -f docker-compose.test.yml exec n8n wget --spider -q http://localhost:5678/healthz 2>/dev/null; then
echo -e " ${GREEN}✓ n8n is ready${NC}"
break
fi
@@ -48,7 +48,7 @@ echo
echo "5. Running MCP client test..."
# Create a simple test using the MCP server directly
docker-compose -f docker-compose.test.yml exec n8n-mcp node -e "
docker compose -f docker-compose.test.yml exec n8n-mcp node -e "
const http = require('http');
// Test data
@@ -107,12 +107,12 @@ if (!found) {
echo
echo "6. Alternative test - Direct file system check..."
docker-compose -f docker-compose.test.yml exec n8n find /usr/local/lib/node_modules -name "*Agent*.node.js" -type f 2>/dev/null | head -10 || true
docker compose -f docker-compose.test.yml exec n8n find /usr/local/lib/node_modules -name "*Agent*.node.js" -type f 2>/dev/null | head -10 || true
echo
echo "7. Test using curl to n8n API..."
# Get available node types from n8n
NODE_TYPES=$(docker-compose -f docker-compose.test.yml exec n8n curl -s http://localhost:5678/api/v1/node-types | jq -r '.data[].name' | grep -i agent | head -5) || true
NODE_TYPES=$(docker compose -f docker-compose.test.yml exec n8n curl -s http://localhost:5678/api/v1/node-types | jq -r '.data[].name' | grep -i agent | head -5) || true
if [ -n "$NODE_TYPES" ]; then
echo -e "${GREEN}✓ Found Agent nodes in n8n:${NC}"
@@ -126,7 +126,7 @@ echo "8. Cleanup..."
read -p "Stop test environment? (y/n) " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
docker-compose -f docker-compose.test.yml down
docker compose -f docker-compose.test.yml down
echo -e "${GREEN}✓ Test environment stopped${NC}"
fi

63
src/db/schema.sql Normal file
View File

@@ -0,0 +1,63 @@
-- Main nodes table
CREATE TABLE IF NOT EXISTS nodes (
id INTEGER PRIMARY KEY AUTOINCREMENT,
node_type TEXT UNIQUE NOT NULL,
name TEXT NOT NULL,
package_name TEXT NOT NULL,
display_name TEXT,
description TEXT,
code_hash TEXT NOT NULL,
code_length INTEGER NOT NULL,
source_location TEXT NOT NULL,
source_code TEXT NOT NULL,
credential_code TEXT,
package_info TEXT, -- JSON
has_credentials INTEGER DEFAULT 0,
extracted_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- Indexes for performance
CREATE INDEX IF NOT EXISTS idx_nodes_package_name ON nodes(package_name);
CREATE INDEX IF NOT EXISTS idx_nodes_code_hash ON nodes(code_hash);
CREATE INDEX IF NOT EXISTS idx_nodes_name ON nodes(name);
-- Full Text Search virtual table for node search
CREATE VIRTUAL TABLE IF NOT EXISTS nodes_fts USING fts5(
node_type,
name,
display_name,
description,
package_name,
content=nodes,
content_rowid=id
);
-- Triggers to keep FTS in sync
CREATE TRIGGER IF NOT EXISTS nodes_ai AFTER INSERT ON nodes
BEGIN
INSERT INTO nodes_fts(rowid, node_type, name, display_name, description, package_name)
VALUES (new.id, new.node_type, new.name, new.display_name, new.description, new.package_name);
END;
CREATE TRIGGER IF NOT EXISTS nodes_ad AFTER DELETE ON nodes
BEGIN
DELETE FROM nodes_fts WHERE rowid = old.id;
END;
CREATE TRIGGER IF NOT EXISTS nodes_au AFTER UPDATE ON nodes
BEGIN
DELETE FROM nodes_fts WHERE rowid = old.id;
INSERT INTO nodes_fts(rowid, node_type, name, display_name, description, package_name)
VALUES (new.id, new.node_type, new.name, new.display_name, new.description, new.package_name);
END;
-- Statistics table for metadata
CREATE TABLE IF NOT EXISTS extraction_stats (
id INTEGER PRIMARY KEY AUTOINCREMENT,
total_nodes INTEGER NOT NULL,
total_packages INTEGER NOT NULL,
total_code_size INTEGER NOT NULL,
nodes_with_credentials INTEGER NOT NULL,
extraction_date DATETIME DEFAULT CURRENT_TIMESTAMP
);

View File

@@ -16,15 +16,18 @@ import { N8NApiClient } from '../utils/n8n-client';
import { N8NMCPBridge } from '../utils/bridge';
import { logger } from '../utils/logger';
import { NodeSourceExtractor } from '../utils/node-source-extractor';
import { SQLiteStorageService } from '../services/sqlite-storage-service';
export class N8NMCPServer {
private server: Server;
private n8nClient: N8NApiClient;
private nodeExtractor: NodeSourceExtractor;
private nodeStorage: SQLiteStorageService;
constructor(config: MCPServerConfig, n8nConfig: N8NConfig) {
this.n8nClient = new N8NApiClient(n8nConfig);
this.nodeExtractor = new NodeSourceExtractor();
this.nodeStorage = new SQLiteStorageService();
logger.info('Initializing n8n MCP server', { config, n8nConfig });
this.server = new Server(
{
@@ -161,6 +164,12 @@ export class N8NMCPServer {
return this.getNodeSourceCode(args);
case 'list_available_nodes':
return this.listAvailableNodes(args);
case 'extract_all_nodes':
return this.extractAllNodes(args);
case 'search_nodes':
return this.searchNodes(args);
case 'get_node_statistics':
return this.getNodeStatistics(args);
default:
throw new Error(`Unknown tool: ${name}`);
}
@@ -314,6 +323,107 @@ export class N8NMCPServer {
}
}
private async extractAllNodes(args: any): Promise<any> {
try {
logger.info(`Extracting all nodes`, args);
// Get list of all nodes
const allNodes = await this.nodeExtractor.listAvailableNodes();
let nodesToExtract = allNodes;
// Apply filters
if (args.packageFilter) {
nodesToExtract = nodesToExtract.filter(node =>
node.packageName === args.packageFilter ||
node.location?.includes(args.packageFilter)
);
}
if (args.limit) {
nodesToExtract = nodesToExtract.slice(0, args.limit);
}
logger.info(`Extracting ${nodesToExtract.length} nodes...`);
const extractedNodes = [];
const errors = [];
for (const node of nodesToExtract) {
try {
const nodeType = node.packageName ? `${node.packageName}.${node.name}` : node.name;
const nodeInfo = await this.nodeExtractor.extractNodeSource(nodeType);
await this.nodeStorage.storeNode(nodeInfo);
extractedNodes.push(nodeType);
} catch (error) {
errors.push({
node: node.name,
error: error instanceof Error ? error.message : 'Unknown error'
});
}
}
const stats = await this.nodeStorage.getStatistics();
return {
success: true,
extracted: extractedNodes.length,
failed: errors.length,
totalStored: stats.totalNodes,
errors: errors.slice(0, 10), // Limit error list
statistics: stats
};
} catch (error) {
logger.error(`Failed to extract all nodes`, error);
throw new Error(`Failed to extract all nodes: ${error instanceof Error ? error.message : 'Unknown error'}`);
}
}
private async searchNodes(args: any): Promise<any> {
try {
logger.info(`Searching nodes`, args);
const results = await this.nodeStorage.searchNodes({
query: args.query,
packageName: args.packageName,
hasCredentials: args.hasCredentials,
limit: args.limit || 20
});
return {
nodes: results.map(node => ({
nodeType: node.nodeType,
name: node.name,
packageName: node.packageName,
displayName: node.displayName,
description: node.description,
codeLength: node.codeLength,
hasCredentials: node.hasCredentials,
location: node.sourceLocation
})),
total: results.length
};
} catch (error) {
logger.error(`Failed to search nodes`, error);
throw new Error(`Failed to search nodes: ${error instanceof Error ? error.message : 'Unknown error'}`);
}
}
private async getNodeStatistics(args: any): Promise<any> {
try {
logger.info(`Getting node statistics`);
const stats = await this.nodeStorage.getStatistics();
return {
...stats,
formattedTotalSize: `${(stats.totalCodeSize / 1024 / 1024).toFixed(2)} MB`,
formattedAverageSize: `${(stats.averageNodeSize / 1024).toFixed(2)} KB`
};
} catch (error) {
logger.error(`Failed to get node statistics`, error);
throw new Error(`Failed to get node statistics: ${error instanceof Error ? error.message : 'Unknown error'}`);
}
}
async start(): Promise<void> {
try {
logger.info('Starting n8n MCP server...');

View File

@@ -181,4 +181,55 @@ export const n8nTools: ToolDefinition[] = [
},
},
},
{
name: 'extract_all_nodes',
description: 'Extract and store all available n8n nodes in the database',
inputSchema: {
type: 'object',
properties: {
packageFilter: {
type: 'string',
description: 'Optional package name to filter extraction',
},
limit: {
type: 'number',
description: 'Maximum number of nodes to extract',
},
},
},
},
{
name: 'search_nodes',
description: 'Search for n8n nodes by name, package, or functionality',
inputSchema: {
type: 'object',
properties: {
query: {
type: 'string',
description: 'Search query',
},
packageName: {
type: 'string',
description: 'Filter by package name',
},
hasCredentials: {
type: 'boolean',
description: 'Filter nodes that have credentials',
},
limit: {
type: 'number',
description: 'Maximum results to return',
default: 20,
},
},
},
},
{
name: 'get_node_statistics',
description: 'Get statistics about stored n8n nodes',
inputSchema: {
type: 'object',
properties: {},
},
},
];

View File

@@ -0,0 +1,129 @@
#!/usr/bin/env node
import { NodeSourceExtractor } from '../utils/node-source-extractor';
import { SQLiteStorageService } from '../services/sqlite-storage-service';
import { logger } from '../utils/logger';
import * as path from 'path';
/**
* Rebuild the entire nodes database by extracting all available nodes
*/
async function rebuildDatabase() {
console.log('🔄 Starting database rebuild...\n');
const startTime = Date.now();
const extractor = new NodeSourceExtractor();
const storage = new SQLiteStorageService();
try {
// Step 1: Clear existing database
console.log('1⃣ Clearing existing database...');
await storage.rebuildDatabase();
// Step 2: Get all available nodes
console.log('2⃣ Discovering available nodes...');
const allNodes = await extractor.listAvailableNodes();
console.log(` Found ${allNodes.length} nodes\n`);
// Step 3: Extract and store each node
console.log('3⃣ Extracting and storing nodes...');
let processed = 0;
let stored = 0;
let failed = 0;
const errors: Array<{ node: string; error: string }> = [];
// Process in batches for better performance
const batchSize = 50;
for (let i = 0; i < allNodes.length; i += batchSize) {
const batch = allNodes.slice(i, Math.min(i + batchSize, allNodes.length));
const nodeInfos = [];
for (const node of batch) {
processed++;
try {
const nodeType = node.packageName ? `${node.packageName}.${node.name}` : node.name;
// Show progress
if (processed % 100 === 0) {
const progress = ((processed / allNodes.length) * 100).toFixed(1);
console.log(` Progress: ${processed}/${allNodes.length} (${progress}%)`);
}
const nodeInfo = await extractor.extractNodeSource(nodeType);
nodeInfos.push(nodeInfo);
stored++;
} catch (error) {
failed++;
const errorMsg = error instanceof Error ? error.message : 'Unknown error';
errors.push({
node: node.name,
error: errorMsg
});
// Log first few errors
if (errors.length <= 5) {
logger.debug(`Failed to extract ${node.name}: ${errorMsg}`);
}
}
}
// Bulk store the batch
if (nodeInfos.length > 0) {
await storage.bulkStoreNodes(nodeInfos);
}
}
// Step 4: Save statistics
console.log('\n4⃣ Saving statistics...');
const stats = await storage.getStatistics();
await storage.saveExtractionStats(stats);
// Step 5: Display results
const duration = ((Date.now() - startTime) / 1000).toFixed(2);
console.log('\n✅ Database rebuild completed!\n');
console.log('📊 Results:');
console.log(` Total nodes found: ${allNodes.length}`);
console.log(` Successfully stored: ${stored}`);
console.log(` Failed: ${failed}`);
console.log(` Duration: ${duration}s`);
console.log(` Database size: ${(stats.totalCodeSize / 1024 / 1024).toFixed(2)} MB`);
console.log('\n📦 Package distribution:');
stats.packageDistribution.slice(0, 10).forEach(pkg => {
console.log(` ${pkg.package}: ${pkg.count} nodes`);
});
if (errors.length > 0) {
console.log(`\n⚠ First ${Math.min(5, errors.length)} errors:`);
errors.slice(0, 5).forEach(err => {
console.log(` - ${err.node}: ${err.error}`);
});
if (errors.length > 5) {
console.log(` ... and ${errors.length - 5} more errors`);
}
}
// Close database connection
storage.close();
console.log('\n✨ Database is ready for use!');
} catch (error) {
console.error('\n❌ Database rebuild failed:', error);
storage.close();
process.exit(1);
}
}
// Run if called directly
if (require.main === module) {
rebuildDatabase().catch(error => {
console.error('Fatal error:', error);
process.exit(1);
});
}
export { rebuildDatabase };

View File

@@ -0,0 +1,274 @@
import { NodeSourceInfo } from '../utils/node-source-extractor';
import { logger } from '../utils/logger';
import * as crypto from 'crypto';
export interface StoredNode {
id: string;
nodeType: string;
name: string;
packageName: string;
displayName?: string;
description?: string;
codeHash: string;
codeLength: number;
sourceLocation: string;
hasCredentials: boolean;
extractedAt: Date;
updatedAt: Date;
sourceCode?: string;
credentialCode?: string;
packageInfo?: any;
metadata?: Record<string, any>;
}
export interface NodeSearchQuery {
query?: string;
packageName?: string;
nodeType?: string;
hasCredentials?: boolean;
limit?: number;
offset?: number;
}
export class NodeStorageService {
private nodes: Map<string, StoredNode> = new Map();
private nodesByPackage: Map<string, Set<string>> = new Map();
private searchIndex: Map<string, Set<string>> = new Map();
/**
* Store a node in the database
*/
async storeNode(nodeInfo: NodeSourceInfo): Promise<StoredNode> {
const codeHash = crypto.createHash('sha256').update(nodeInfo.sourceCode).digest('hex');
// Parse display name and description from source if possible
const displayName = this.extractDisplayName(nodeInfo.sourceCode);
const description = this.extractDescription(nodeInfo.sourceCode);
const storedNode: StoredNode = {
id: crypto.randomUUID(),
nodeType: nodeInfo.nodeType,
name: nodeInfo.nodeType.split('.').pop() || nodeInfo.nodeType,
packageName: nodeInfo.nodeType.split('.')[0] || 'unknown',
displayName,
description,
codeHash,
codeLength: nodeInfo.sourceCode.length,
sourceLocation: nodeInfo.location,
hasCredentials: !!nodeInfo.credentialCode,
extractedAt: new Date(),
updatedAt: new Date(),
sourceCode: nodeInfo.sourceCode,
credentialCode: nodeInfo.credentialCode,
packageInfo: nodeInfo.packageInfo,
};
// Store in memory (replace with real DB)
this.nodes.set(nodeInfo.nodeType, storedNode);
// Update package index
if (!this.nodesByPackage.has(storedNode.packageName)) {
this.nodesByPackage.set(storedNode.packageName, new Set());
}
this.nodesByPackage.get(storedNode.packageName)!.add(nodeInfo.nodeType);
// Update search index
this.updateSearchIndex(storedNode);
logger.info(`Stored node: ${nodeInfo.nodeType} (${codeHash.substring(0, 8)}...)`);
return storedNode;
}
/**
* Search for nodes
*/
async searchNodes(query: NodeSearchQuery): Promise<StoredNode[]> {
let results: StoredNode[] = [];
if (query.query) {
// Text search
const searchTerms = query.query.toLowerCase().split(' ');
const matchingNodeTypes = new Set<string>();
for (const term of searchTerms) {
const matches = this.searchIndex.get(term) || new Set();
matches.forEach(nodeType => matchingNodeTypes.add(nodeType));
}
results = Array.from(matchingNodeTypes)
.map(nodeType => this.nodes.get(nodeType)!)
.filter(Boolean);
} else {
// Get all nodes
results = Array.from(this.nodes.values());
}
// Apply filters
if (query.packageName) {
results = results.filter(node => node.packageName === query.packageName);
}
if (query.nodeType) {
results = results.filter(node => node.nodeType.includes(query.nodeType!));
}
if (query.hasCredentials !== undefined) {
results = results.filter(node => node.hasCredentials === query.hasCredentials);
}
// Apply pagination
const offset = query.offset || 0;
const limit = query.limit || 50;
return results.slice(offset, offset + limit);
}
/**
* Get node by type
*/
async getNode(nodeType: string): Promise<StoredNode | null> {
return this.nodes.get(nodeType) || null;
}
/**
* Get all packages
*/
async getPackages(): Promise<Array<{ name: string; nodeCount: number }>> {
return Array.from(this.nodesByPackage.entries()).map(([name, nodes]) => ({
name,
nodeCount: nodes.size,
}));
}
/**
* Bulk store nodes
*/
async bulkStoreNodes(nodeInfos: NodeSourceInfo[]): Promise<{
stored: number;
failed: number;
errors: Array<{ nodeType: string; error: string }>;
}> {
const results = {
stored: 0,
failed: 0,
errors: [] as Array<{ nodeType: string; error: string }>,
};
for (const nodeInfo of nodeInfos) {
try {
await this.storeNode(nodeInfo);
results.stored++;
} catch (error) {
results.failed++;
results.errors.push({
nodeType: nodeInfo.nodeType,
error: error instanceof Error ? error.message : 'Unknown error',
});
}
}
return results;
}
/**
* Generate statistics
*/
async getStatistics(): Promise<{
totalNodes: number;
totalPackages: number;
totalCodeSize: number;
nodesWithCredentials: number;
averageNodeSize: number;
packageDistribution: Array<{ package: string; count: number }>;
}> {
const nodes = Array.from(this.nodes.values());
const totalCodeSize = nodes.reduce((sum, node) => sum + node.codeLength, 0);
const nodesWithCredentials = nodes.filter(node => node.hasCredentials).length;
const packageDistribution = Array.from(this.nodesByPackage.entries())
.map(([pkg, nodeSet]) => ({ package: pkg, count: nodeSet.size }))
.sort((a, b) => b.count - a.count);
return {
totalNodes: nodes.length,
totalPackages: this.nodesByPackage.size,
totalCodeSize,
nodesWithCredentials,
averageNodeSize: nodes.length > 0 ? Math.round(totalCodeSize / nodes.length) : 0,
packageDistribution,
};
}
/**
* Extract display name from source code
*/
private extractDisplayName(sourceCode: string): string | undefined {
const match = sourceCode.match(/displayName:\s*["'`]([^"'`]+)["'`]/);
return match ? match[1] : undefined;
}
/**
* Extract description from source code
*/
private extractDescription(sourceCode: string): string | undefined {
const match = sourceCode.match(/description:\s*["'`]([^"'`]+)["'`]/);
return match ? match[1] : undefined;
}
/**
* Update search index
*/
private updateSearchIndex(node: StoredNode): void {
// Index by name parts
const nameParts = node.name.toLowerCase().split(/(?=[A-Z])|[._-]/).filter(Boolean);
for (const part of nameParts) {
if (!this.searchIndex.has(part)) {
this.searchIndex.set(part, new Set());
}
this.searchIndex.get(part)!.add(node.nodeType);
}
// Index by display name
if (node.displayName) {
const displayParts = node.displayName.toLowerCase().split(/\s+/);
for (const part of displayParts) {
if (!this.searchIndex.has(part)) {
this.searchIndex.set(part, new Set());
}
this.searchIndex.get(part)!.add(node.nodeType);
}
}
// Index by package name
const pkgParts = node.packageName.toLowerCase().split(/[.-]/);
for (const part of pkgParts) {
if (!this.searchIndex.has(part)) {
this.searchIndex.set(part, new Set());
}
this.searchIndex.get(part)!.add(node.nodeType);
}
}
/**
* Export all nodes for database import
*/
async exportForDatabase(): Promise<{
nodes: StoredNode[];
metadata: {
exportedAt: Date;
totalNodes: number;
totalPackages: number;
};
}> {
const nodes = Array.from(this.nodes.values());
return {
nodes,
metadata: {
exportedAt: new Date(),
totalNodes: nodes.length,
totalPackages: this.nodesByPackage.size,
},
};
}
}

View File

@@ -0,0 +1,410 @@
import Database from 'better-sqlite3';
import * as path from 'path';
import * as fs from 'fs';
import * as crypto from 'crypto';
import { NodeSourceInfo } from '../utils/node-source-extractor';
import { StoredNode, NodeSearchQuery } from './node-storage-service';
import { logger } from '../utils/logger';
export class SQLiteStorageService {
private db: Database.Database;
private readonly dbPath: string;
constructor(dbPath?: string) {
this.dbPath = dbPath || process.env.NODE_DB_PATH || path.join(process.cwd(), 'data', 'nodes.db');
// Ensure data directory exists
const dataDir = path.dirname(this.dbPath);
if (!fs.existsSync(dataDir)) {
fs.mkdirSync(dataDir, { recursive: true });
}
this.db = new Database(this.dbPath, {
verbose: process.env.NODE_ENV === 'development' ? (msg: unknown) => logger.debug(String(msg)) : undefined
});
// Enable WAL mode for better performance
this.db.pragma('journal_mode = WAL');
this.initializeDatabase();
}
/**
* Initialize database with schema
*/
private initializeDatabase(): void {
try {
const schema = `
-- Main nodes table
CREATE TABLE IF NOT EXISTS nodes (
id INTEGER PRIMARY KEY AUTOINCREMENT,
node_type TEXT UNIQUE NOT NULL,
name TEXT NOT NULL,
package_name TEXT NOT NULL,
display_name TEXT,
description TEXT,
code_hash TEXT NOT NULL,
code_length INTEGER NOT NULL,
source_location TEXT NOT NULL,
source_code TEXT NOT NULL,
credential_code TEXT,
package_info TEXT, -- JSON
has_credentials INTEGER DEFAULT 0,
extracted_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- Indexes for performance
CREATE INDEX IF NOT EXISTS idx_nodes_package_name ON nodes(package_name);
CREATE INDEX IF NOT EXISTS idx_nodes_code_hash ON nodes(code_hash);
CREATE INDEX IF NOT EXISTS idx_nodes_name ON nodes(name);
-- Full Text Search virtual table for node search
CREATE VIRTUAL TABLE IF NOT EXISTS nodes_fts USING fts5(
node_type,
name,
display_name,
description,
package_name,
content=nodes,
content_rowid=id
);
-- Triggers to keep FTS in sync
CREATE TRIGGER IF NOT EXISTS nodes_ai AFTER INSERT ON nodes
BEGIN
INSERT INTO nodes_fts(rowid, node_type, name, display_name, description, package_name)
VALUES (new.id, new.node_type, new.name, new.display_name, new.description, new.package_name);
END;
CREATE TRIGGER IF NOT EXISTS nodes_ad AFTER DELETE ON nodes
BEGIN
DELETE FROM nodes_fts WHERE rowid = old.id;
END;
CREATE TRIGGER IF NOT EXISTS nodes_au AFTER UPDATE ON nodes
BEGIN
DELETE FROM nodes_fts WHERE rowid = old.id;
INSERT INTO nodes_fts(rowid, node_type, name, display_name, description, package_name)
VALUES (new.id, new.node_type, new.name, new.display_name, new.description, new.package_name);
END;
-- Statistics table for metadata
CREATE TABLE IF NOT EXISTS extraction_stats (
id INTEGER PRIMARY KEY AUTOINCREMENT,
total_nodes INTEGER NOT NULL,
total_packages INTEGER NOT NULL,
total_code_size INTEGER NOT NULL,
nodes_with_credentials INTEGER NOT NULL,
extraction_date DATETIME DEFAULT CURRENT_TIMESTAMP
);
`;
this.db.exec(schema);
logger.info('Database initialized successfully');
} catch (error) {
logger.error('Failed to initialize database:', error);
throw error;
}
}
/**
* Store a node in the database
*/
async storeNode(nodeInfo: NodeSourceInfo): Promise<StoredNode> {
const codeHash = crypto.createHash('sha256').update(nodeInfo.sourceCode).digest('hex');
// Parse display name and description from source
const displayName = this.extractDisplayName(nodeInfo.sourceCode);
const description = this.extractDescription(nodeInfo.sourceCode);
const stmt = this.db.prepare(`
INSERT OR REPLACE INTO nodes (
node_type, name, package_name, display_name, description,
code_hash, code_length, source_location, source_code,
credential_code, package_info, has_credentials,
updated_at
) VALUES (
?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, CURRENT_TIMESTAMP
)
`);
const name = nodeInfo.nodeType.split('.').pop() || nodeInfo.nodeType;
const packageName = nodeInfo.nodeType.split('.')[0] || 'unknown';
const result = stmt.run(
nodeInfo.nodeType,
name,
packageName,
displayName || null,
description || null,
codeHash,
nodeInfo.sourceCode.length,
nodeInfo.location,
nodeInfo.sourceCode,
nodeInfo.credentialCode || null,
nodeInfo.packageInfo ? JSON.stringify(nodeInfo.packageInfo) : null,
nodeInfo.credentialCode ? 1 : 0
);
logger.info(`Stored node: ${nodeInfo.nodeType} (${codeHash.substring(0, 8)}...)`);
return {
id: String(result.lastInsertRowid),
nodeType: nodeInfo.nodeType,
name,
packageName,
displayName,
description,
codeHash,
codeLength: nodeInfo.sourceCode.length,
sourceLocation: nodeInfo.location,
hasCredentials: !!nodeInfo.credentialCode,
extractedAt: new Date(),
updatedAt: new Date(),
sourceCode: nodeInfo.sourceCode,
credentialCode: nodeInfo.credentialCode,
packageInfo: nodeInfo.packageInfo
};
}
/**
* Search for nodes using FTS
*/
async searchNodes(query: NodeSearchQuery): Promise<StoredNode[]> {
let sql = `
SELECT DISTINCT n.*
FROM nodes n
`;
const params: any[] = [];
const conditions: string[] = [];
if (query.query) {
// Use FTS for text search
sql += ` JOIN nodes_fts fts ON n.id = fts.rowid`;
conditions.push(`nodes_fts MATCH ?`);
// Convert search query to FTS syntax (prefix search)
const ftsQuery = query.query.split(' ')
.map(term => `${term}*`)
.join(' ');
params.push(ftsQuery);
}
if (query.packageName) {
conditions.push(`n.package_name = ?`);
params.push(query.packageName);
}
if (query.nodeType) {
conditions.push(`n.node_type LIKE ?`);
params.push(`%${query.nodeType}%`);
}
if (query.hasCredentials !== undefined) {
conditions.push(`n.has_credentials = ?`);
params.push(query.hasCredentials ? 1 : 0);
}
if (conditions.length > 0) {
sql += ` WHERE ${conditions.join(' AND ')}`;
}
sql += ` ORDER BY n.name`;
if (query.limit) {
sql += ` LIMIT ?`;
params.push(query.limit);
if (query.offset) {
sql += ` OFFSET ?`;
params.push(query.offset);
}
}
const stmt = this.db.prepare(sql);
const rows = stmt.all(...params);
return rows.map(row => this.rowToStoredNode(row));
}
/**
* Get node by type
*/
async getNode(nodeType: string): Promise<StoredNode | null> {
const stmt = this.db.prepare(`
SELECT * FROM nodes WHERE node_type = ?
`);
const row = stmt.get(nodeType);
return row ? this.rowToStoredNode(row) : null;
}
/**
* Get all packages
*/
async getPackages(): Promise<Array<{ name: string; nodeCount: number }>> {
const stmt = this.db.prepare(`
SELECT package_name as name, COUNT(*) as nodeCount
FROM nodes
GROUP BY package_name
ORDER BY nodeCount DESC
`);
return stmt.all() as Array<{ name: string; nodeCount: number }>;
}
/**
* Bulk store nodes (used for database rebuild)
*/
async bulkStoreNodes(nodeInfos: NodeSourceInfo[]): Promise<{
stored: number;
failed: number;
errors: Array<{ nodeType: string; error: string }>;
}> {
const results = {
stored: 0,
failed: 0,
errors: [] as Array<{ nodeType: string; error: string }>
};
// Use transaction for bulk insert
const insertMany = this.db.transaction((nodes: NodeSourceInfo[]) => {
for (const nodeInfo of nodes) {
try {
this.storeNode(nodeInfo);
results.stored++;
} catch (error) {
results.failed++;
results.errors.push({
nodeType: nodeInfo.nodeType,
error: error instanceof Error ? error.message : 'Unknown error'
});
}
}
});
insertMany(nodeInfos);
return results;
}
/**
* Get statistics
*/
async getStatistics(): Promise<{
totalNodes: number;
totalPackages: number;
totalCodeSize: number;
nodesWithCredentials: number;
averageNodeSize: number;
packageDistribution: Array<{ package: string; count: number }>;
}> {
const stats = this.db.prepare(`
SELECT
COUNT(*) as totalNodes,
COUNT(DISTINCT package_name) as totalPackages,
SUM(code_length) as totalCodeSize,
SUM(has_credentials) as nodesWithCredentials
FROM nodes
`).get() as any;
const packageDist = this.db.prepare(`
SELECT package_name as package, COUNT(*) as count
FROM nodes
GROUP BY package_name
ORDER BY count DESC
`).all() as Array<{ package: string; count: number }>;
return {
totalNodes: stats.totalNodes || 0,
totalPackages: stats.totalPackages || 0,
totalCodeSize: stats.totalCodeSize || 0,
nodesWithCredentials: stats.nodesWithCredentials || 0,
averageNodeSize: stats.totalNodes > 0 ? Math.round(stats.totalCodeSize / stats.totalNodes) : 0,
packageDistribution: packageDist
};
}
/**
* Rebuild entire database
*/
async rebuildDatabase(): Promise<void> {
logger.info('Starting database rebuild...');
// Clear existing data
this.db.exec('DELETE FROM nodes');
this.db.exec('DELETE FROM extraction_stats');
logger.info('Database cleared for rebuild');
}
/**
* Save extraction statistics
*/
async saveExtractionStats(stats: {
totalNodes: number;
totalPackages: number;
totalCodeSize: number;
nodesWithCredentials: number;
}): Promise<void> {
const stmt = this.db.prepare(`
INSERT INTO extraction_stats (
total_nodes, total_packages, total_code_size, nodes_with_credentials
) VALUES (?, ?, ?, ?)
`);
stmt.run(
stats.totalNodes,
stats.totalPackages,
stats.totalCodeSize,
stats.nodesWithCredentials
);
}
/**
* Close database connection
*/
close(): void {
this.db.close();
}
/**
* Convert database row to StoredNode
*/
private rowToStoredNode(row: any): StoredNode {
return {
id: String(row.id),
nodeType: row.node_type,
name: row.name,
packageName: row.package_name,
displayName: row.display_name,
description: row.description,
codeHash: row.code_hash,
codeLength: row.code_length,
sourceLocation: row.source_location,
hasCredentials: row.has_credentials === 1,
extractedAt: new Date(row.extracted_at),
updatedAt: new Date(row.updated_at),
sourceCode: row.source_code,
credentialCode: row.credential_code,
packageInfo: row.package_info ? JSON.parse(row.package_info) : undefined
};
}
/**
* Extract display name from source code
*/
private extractDisplayName(sourceCode: string): string | undefined {
const match = sourceCode.match(/displayName:\s*["'`]([^"'`]+)["'`]/);
return match ? match[1] : undefined;
}
/**
* Extract description from source code
*/
private extractDescription(sourceCode: string): string | undefined {
const match = sourceCode.match(/description:\s*["'`]([^"'`]+)["'`]/);
return match ? match[1] : undefined;
}
}

View File

@@ -16,7 +16,12 @@ export class NodeSourceExtractor {
'/app/node_modules',
'/home/node/.n8n/custom/nodes',
'./node_modules',
];
// Docker volume paths
'/var/lib/docker/volumes/n8n-mcp_n8n_modules/_data',
'/n8n-modules',
// Common n8n installation paths
process.env.N8N_CUSTOM_EXTENSIONS || '',
].filter(Boolean);
/**
* Extract source code for a specific n8n node
@@ -70,8 +75,8 @@ export class NodeSourceExtractor {
nodeName: string
): Promise<NodeSourceInfo | null> {
try {
// Common patterns for node files
const patterns = [
// First, try standard patterns
const standardPatterns = [
`${packageName}/dist/nodes/${nodeName}/${nodeName}.node.js`,
`${packageName}/dist/nodes/${nodeName}.node.js`,
`${packageName}/nodes/${nodeName}/${nodeName}.node.js`,
@@ -80,39 +85,36 @@ export class NodeSourceExtractor {
`${nodeName}.node.js`,
];
for (const pattern of patterns) {
// Additional patterns for nested node structures (e.g., agents/Agent)
const nestedPatterns = [
`${packageName}/dist/nodes/*/${nodeName}/${nodeName}.node.js`,
`${packageName}/dist/nodes/**/${nodeName}/${nodeName}.node.js`,
`${packageName}/nodes/*/${nodeName}/${nodeName}.node.js`,
`${packageName}/nodes/**/${nodeName}/${nodeName}.node.js`,
];
// Try standard patterns first
for (const pattern of standardPatterns) {
const fullPath = path.join(basePath, pattern);
const result = await this.tryLoadNodeFile(fullPath, packageName, nodeName, basePath);
if (result) return result;
}
// Try nested patterns (with glob-like search)
for (const pattern of nestedPatterns) {
const result = await this.searchWithGlobPattern(basePath, pattern, packageName, nodeName);
if (result) return result;
}
// If basePath contains .pnpm, search in pnpm structure
if (basePath.includes('node_modules')) {
const pnpmPath = path.join(basePath, '.pnpm');
try {
const sourceCode = await fs.readFile(fullPath, 'utf-8');
// Try to find credential file
const credentialPath = fullPath.replace('.node.js', '.credentials.js');
let credentialCode: string | undefined;
try {
credentialCode = await fs.readFile(credentialPath, 'utf-8');
} catch {
// Credential file is optional
}
// Try to get package.json info
const packageJsonPath = path.join(basePath, packageName, 'package.json');
let packageInfo: any;
try {
const packageJson = await fs.readFile(packageJsonPath, 'utf-8');
packageInfo = JSON.parse(packageJson);
} catch {
// Package.json is optional
}
return {
nodeType: `${packageName}.${nodeName}`,
sourceCode,
credentialCode,
packageInfo,
location: fullPath,
};
await fs.access(pnpmPath);
const result = await this.searchInPnpm(pnpmPath, packageName, nodeName);
if (result) return result;
} catch {
// Continue searching
// .pnpm directory doesn't exist
}
}
} catch (error) {
@@ -122,6 +124,172 @@ export class NodeSourceExtractor {
return null;
}
/**
* Search for nodes in pnpm's special directory structure
*/
private async searchInPnpm(
pnpmPath: string,
packageName: string,
nodeName: string
): Promise<NodeSourceInfo | null> {
try {
const entries = await fs.readdir(pnpmPath);
// Filter entries that might contain our package
const packageEntries = entries.filter(entry =>
entry.includes(packageName.replace('/', '+')) ||
entry.includes(packageName)
);
for (const entry of packageEntries) {
const entryPath = path.join(pnpmPath, entry, 'node_modules', packageName);
// Search patterns within the pnpm package directory
const patterns = [
`dist/nodes/${nodeName}/${nodeName}.node.js`,
`dist/nodes/${nodeName}.node.js`,
`dist/nodes/*/${nodeName}/${nodeName}.node.js`,
`dist/nodes/**/${nodeName}/${nodeName}.node.js`,
];
for (const pattern of patterns) {
if (pattern.includes('*')) {
const result = await this.searchWithGlobPattern(entryPath, pattern, packageName, nodeName);
if (result) return result;
} else {
const fullPath = path.join(entryPath, pattern);
const result = await this.tryLoadNodeFile(fullPath, packageName, nodeName, entryPath);
if (result) return result;
}
}
}
} catch (error) {
logger.debug(`Error searching in pnpm directory: ${error}`);
}
return null;
}
/**
* Search for files matching a glob-like pattern
*/
private async searchWithGlobPattern(
basePath: string,
pattern: string,
packageName: string,
nodeName: string
): Promise<NodeSourceInfo | null> {
// Convert glob pattern to regex parts
const parts = pattern.split('/');
const targetFile = `${nodeName}.node.js`;
async function searchDir(currentPath: string, remainingParts: string[]): Promise<string | null> {
if (remainingParts.length === 0) return null;
const part = remainingParts[0];
const isLastPart = remainingParts.length === 1;
try {
if (isLastPart && part === targetFile) {
// Check if file exists
const fullPath = path.join(currentPath, part);
await fs.access(fullPath);
return fullPath;
}
const entries = await fs.readdir(currentPath, { withFileTypes: true });
for (const entry of entries) {
if (!entry.isDirectory() && !isLastPart) continue;
if (part === '*' || part === '**') {
// Match any directory
if (entry.isDirectory()) {
const result = await searchDir(
path.join(currentPath, entry.name),
part === '**' ? remainingParts : remainingParts.slice(1)
);
if (result) return result;
}
} else if (entry.name === part || (isLastPart && entry.name === targetFile)) {
if (isLastPart && entry.isFile()) {
return path.join(currentPath, entry.name);
} else if (!isLastPart && entry.isDirectory()) {
const result = await searchDir(
path.join(currentPath, entry.name),
remainingParts.slice(1)
);
if (result) return result;
}
}
}
} catch {
// Directory doesn't exist or can't be read
}
return null;
}
const foundPath = await searchDir(basePath, parts);
if (foundPath) {
return this.tryLoadNodeFile(foundPath, packageName, nodeName, basePath);
}
return null;
}
/**
* Try to load a node file and its associated files
*/
private async tryLoadNodeFile(
fullPath: string,
packageName: string,
nodeName: string,
packageBasePath: string
): Promise<NodeSourceInfo | null> {
try {
const sourceCode = await fs.readFile(fullPath, 'utf-8');
// Try to find credential file
const credentialPath = fullPath.replace('.node.js', '.credentials.js');
let credentialCode: string | undefined;
try {
credentialCode = await fs.readFile(credentialPath, 'utf-8');
} catch {
// Credential file is optional
}
// Try to get package.json info
let packageInfo: any;
const possiblePackageJsonPaths = [
path.join(packageBasePath, 'package.json'),
path.join(packageBasePath, packageName, 'package.json'),
path.join(path.dirname(path.dirname(fullPath)), 'package.json'),
path.join(path.dirname(path.dirname(path.dirname(fullPath))), 'package.json'),
];
for (const packageJsonPath of possiblePackageJsonPaths) {
try {
const packageJson = await fs.readFile(packageJsonPath, 'utf-8');
packageInfo = JSON.parse(packageJson);
break;
} catch {
// Try next path
}
}
return {
nodeType: `${packageName}.${nodeName}`,
sourceCode,
credentialCode,
packageInfo,
location: fullPath,
};
} catch {
return null;
}
}
/**
* List all available nodes
*/
@@ -183,9 +351,14 @@ export class NodeSourceExtractor {
} catch {
// Skip files we can't read
}
} else if (entry.isDirectory() && entry.name !== 'node_modules') {
// Recursively scan subdirectories
await this.scanDirectoryForNodes(path.join(dirPath, entry.name), nodes, category, search);
} else if (entry.isDirectory()) {
// Special handling for .pnpm directories
if (entry.name === '.pnpm') {
await this.scanPnpmDirectory(path.join(dirPath, entry.name), nodes, category, search);
} else if (entry.name !== 'node_modules') {
// Recursively scan subdirectories
await this.scanDirectoryForNodes(path.join(dirPath, entry.name), nodes, category, search);
}
}
}
} catch (error) {
@@ -193,6 +366,32 @@ export class NodeSourceExtractor {
}
}
/**
* Scan pnpm directory structure for nodes
*/
private async scanPnpmDirectory(
pnpmPath: string,
nodes: any[],
category?: string,
search?: string
): Promise<void> {
try {
const entries = await fs.readdir(pnpmPath);
for (const entry of entries) {
const entryPath = path.join(pnpmPath, entry, 'node_modules');
try {
await fs.access(entryPath);
await this.scanDirectoryForNodes(entryPath, nodes, category, search);
} catch {
// Skip if node_modules doesn't exist
}
}
} catch (error) {
logger.debug(`Error scanning pnpm directory ${pnpmPath}: ${error}`);
}
}
/**
* Extract AI Agent node specifically
*/

50
test-extraction.js Executable file
View File

@@ -0,0 +1,50 @@
#!/usr/bin/env node
// Simple test to verify node extraction works
const { NodeSourceExtractor } = require('./dist/utils/node-source-extractor');
async function testExtraction() {
const extractor = new NodeSourceExtractor();
console.log('🧪 Testing n8n Node Extraction\n');
// Test cases
const testNodes = [
'n8n-nodes-base.Function',
'n8n-nodes-base.Webhook',
'@n8n/n8n-nodes-langchain.Agent'
];
for (const nodeType of testNodes) {
console.log(`\n📦 Testing: ${nodeType}`);
console.log('-'.repeat(40));
try {
const result = await extractor.extractNodeSource(nodeType);
console.log('✅ Success!');
console.log(` Size: ${result.sourceCode.length} bytes`);
console.log(` Location: ${result.location}`);
console.log(` Has package info: ${result.packageInfo ? 'Yes' : 'No'}`);
if (result.packageInfo) {
console.log(` Package: ${result.packageInfo.name} v${result.packageInfo.version}`);
}
} catch (error) {
console.log('❌ Failed:', error.message);
}
}
console.log('\n\n📋 Listing available nodes...');
const allNodes = await extractor.listAvailableNodes();
console.log(`Found ${allNodes.length} total nodes`);
// Show first 5
console.log('\nFirst 5 nodes:');
allNodes.slice(0, 5).forEach(node => {
console.log(` - ${node.name} (${node.displayName || 'no display name'})`);
});
}
testExtraction().catch(console.error);

View File

@@ -0,0 +1,484 @@
#!/usr/bin/env node
/**
* Comprehensive test suite for n8n node extraction functionality
* Tests all aspects of node extraction for database storage
*/
const fs = require('fs').promises;
const path = require('path');
const crypto = require('crypto');
// Import our components
const { NodeSourceExtractor } = require('../dist/utils/node-source-extractor');
const { N8NMCPServer } = require('../dist/mcp/server');
// Test configuration
const TEST_RESULTS_DIR = path.join(__dirname, 'test-results');
const EXTRACTED_NODES_FILE = path.join(TEST_RESULTS_DIR, 'extracted-nodes.json');
const TEST_SUMMARY_FILE = path.join(TEST_RESULTS_DIR, 'test-summary.json');
// Create results directory
async function ensureTestDir() {
try {
await fs.mkdir(TEST_RESULTS_DIR, { recursive: true });
} catch (error) {
console.error('Failed to create test directory:', error);
}
}
// Test results tracking
const testResults = {
totalTests: 0,
passed: 0,
failed: 0,
startTime: new Date(),
endTime: null,
tests: [],
extractedNodes: [],
databaseSchema: null
};
// Helper function to run a test
async function runTest(name, testFn) {
console.log(`\n📋 Running: ${name}`);
testResults.totalTests++;
const testResult = {
name,
status: 'pending',
startTime: new Date(),
endTime: null,
error: null,
details: {}
};
try {
const result = await testFn();
testResult.status = 'passed';
testResult.details = result;
testResults.passed++;
console.log(`✅ PASSED: ${name}`);
} catch (error) {
testResult.status = 'failed';
testResult.error = error.message;
testResults.failed++;
console.error(`❌ FAILED: ${name}`);
console.error(` Error: ${error.message}`);
if (process.env.DEBUG) {
console.error(error.stack);
}
}
testResult.endTime = new Date();
testResults.tests.push(testResult);
return testResult;
}
// Test 1: Basic extraction functionality
async function testBasicExtraction() {
const extractor = new NodeSourceExtractor();
// Test a known node
const testNodes = [
'@n8n/n8n-nodes-langchain.Agent',
'n8n-nodes-base.Function',
'n8n-nodes-base.Webhook'
];
const results = [];
for (const nodeType of testNodes) {
try {
console.log(` - Extracting ${nodeType}...`);
const nodeInfo = await extractor.extractNodeSource(nodeType);
results.push({
nodeType,
extracted: true,
codeLength: nodeInfo.sourceCode.length,
hasCredentials: !!nodeInfo.credentialCode,
hasPackageInfo: !!nodeInfo.packageInfo,
location: nodeInfo.location
});
console.log(` ✓ Extracted: ${nodeInfo.sourceCode.length} bytes`);
} catch (error) {
results.push({
nodeType,
extracted: false,
error: error.message
});
console.log(` ✗ Failed: ${error.message}`);
}
}
// At least one should succeed
const successCount = results.filter(r => r.extracted).length;
if (successCount === 0) {
throw new Error('No nodes could be extracted');
}
return { results, successCount, totalTested: testNodes.length };
}
// Test 2: List available nodes
async function testListAvailableNodes() {
const extractor = new NodeSourceExtractor();
console.log(' - Listing all available nodes...');
const nodes = await extractor.listAvailableNodes();
console.log(` - Found ${nodes.length} nodes`);
// Group by package
const nodesByPackage = {};
nodes.forEach(node => {
const pkg = node.packageName || 'unknown';
if (!nodesByPackage[pkg]) {
nodesByPackage[pkg] = [];
}
nodesByPackage[pkg].push(node.name);
});
// Show summary
console.log(' - Node distribution by package:');
Object.entries(nodesByPackage).forEach(([pkg, nodeList]) => {
console.log(` ${pkg}: ${nodeList.length} nodes`);
});
if (nodes.length === 0) {
throw new Error('No nodes found');
}
return {
totalNodes: nodes.length,
packages: Object.keys(nodesByPackage),
nodesByPackage,
sampleNodes: nodes.slice(0, 5)
};
}
// Test 3: Bulk extraction simulation
async function testBulkExtraction() {
const extractor = new NodeSourceExtractor();
// First get list of nodes
const allNodes = await extractor.listAvailableNodes();
// Limit to a reasonable number for testing
const nodesToExtract = allNodes.slice(0, 10);
console.log(` - Testing bulk extraction of ${nodesToExtract.length} nodes...`);
const extractionResults = [];
const startTime = Date.now();
for (const node of nodesToExtract) {
const nodeType = node.packageName ? `${node.packageName}.${node.name}` : node.name;
try {
const nodeInfo = await extractor.extractNodeSource(nodeType);
// Calculate hash for deduplication
const codeHash = crypto.createHash('sha256').update(nodeInfo.sourceCode).digest('hex');
const extractedData = {
nodeType,
name: node.name,
packageName: node.packageName,
codeLength: nodeInfo.sourceCode.length,
codeHash,
hasCredentials: !!nodeInfo.credentialCode,
hasPackageInfo: !!nodeInfo.packageInfo,
location: nodeInfo.location,
extractedAt: new Date().toISOString()
};
extractionResults.push({
success: true,
data: extractedData
});
// Store for database simulation
testResults.extractedNodes.push({
...extractedData,
sourceCode: nodeInfo.sourceCode,
credentialCode: nodeInfo.credentialCode,
packageInfo: nodeInfo.packageInfo
});
} catch (error) {
extractionResults.push({
success: false,
nodeType,
error: error.message
});
}
}
const endTime = Date.now();
const successCount = extractionResults.filter(r => r.success).length;
console.log(` - Extraction completed in ${endTime - startTime}ms`);
console.log(` - Success rate: ${successCount}/${nodesToExtract.length} (${(successCount/nodesToExtract.length*100).toFixed(1)}%)`);
return {
totalAttempted: nodesToExtract.length,
successCount,
failureCount: nodesToExtract.length - successCount,
timeElapsed: endTime - startTime,
results: extractionResults
};
}
// Test 4: Database schema simulation
async function testDatabaseSchema() {
console.log(' - Simulating database schema for extracted nodes...');
// Define a schema that would work for storing extracted nodes
const schema = {
tables: {
nodes: {
columns: {
id: 'UUID PRIMARY KEY',
node_type: 'VARCHAR(255) UNIQUE NOT NULL',
name: 'VARCHAR(255) NOT NULL',
package_name: 'VARCHAR(255)',
display_name: 'VARCHAR(255)',
description: 'TEXT',
version: 'VARCHAR(50)',
code_hash: 'VARCHAR(64) NOT NULL',
code_length: 'INTEGER NOT NULL',
source_location: 'TEXT',
extracted_at: 'TIMESTAMP NOT NULL',
updated_at: 'TIMESTAMP'
},
indexes: ['node_type', 'package_name', 'code_hash']
},
node_source_code: {
columns: {
id: 'UUID PRIMARY KEY',
node_id: 'UUID REFERENCES nodes(id)',
source_code: 'TEXT NOT NULL',
compiled_code: 'TEXT',
source_map: 'TEXT'
}
},
node_credentials: {
columns: {
id: 'UUID PRIMARY KEY',
node_id: 'UUID REFERENCES nodes(id)',
credential_type: 'VARCHAR(255) NOT NULL',
credential_code: 'TEXT NOT NULL',
required_fields: 'JSONB'
}
},
node_metadata: {
columns: {
id: 'UUID PRIMARY KEY',
node_id: 'UUID REFERENCES nodes(id)',
package_info: 'JSONB',
dependencies: 'JSONB',
icon: 'TEXT',
categories: 'TEXT[]',
documentation_url: 'TEXT'
}
}
}
};
// Validate that our extracted data fits the schema
const sampleNode = testResults.extractedNodes[0];
if (sampleNode) {
console.log(' - Validating extracted data against schema...');
// Simulate database record
const dbRecord = {
nodes: {
id: crypto.randomUUID(),
node_type: sampleNode.nodeType,
name: sampleNode.name,
package_name: sampleNode.packageName,
code_hash: sampleNode.codeHash,
code_length: sampleNode.codeLength,
source_location: sampleNode.location,
extracted_at: new Date()
},
node_source_code: {
source_code: sampleNode.sourceCode
},
node_credentials: sampleNode.credentialCode ? {
credential_code: sampleNode.credentialCode
} : null,
node_metadata: {
package_info: sampleNode.packageInfo
}
};
console.log(' - Sample database record created successfully');
}
testResults.databaseSchema = schema;
return {
schemaValid: true,
tablesCount: Object.keys(schema.tables).length,
estimatedStoragePerNode: sampleNode ? sampleNode.codeLength + 1024 : 0 // code + metadata overhead
};
}
// Test 5: Error handling
async function testErrorHandling() {
const extractor = new NodeSourceExtractor();
const errorTests = [
{
name: 'Non-existent node',
nodeType: 'non-existent-package.FakeNode',
expectedError: 'not found'
},
{
name: 'Invalid node type format',
nodeType: '',
expectedError: 'invalid'
},
{
name: 'Malformed package name',
nodeType: '@invalid@package.Node',
expectedError: 'not found'
}
];
const results = [];
for (const test of errorTests) {
try {
console.log(` - Testing: ${test.name}`);
await extractor.extractNodeSource(test.nodeType);
results.push({
...test,
passed: false,
error: 'Expected error but extraction succeeded'
});
} catch (error) {
const passed = error.message.toLowerCase().includes(test.expectedError);
results.push({
...test,
passed,
actualError: error.message
});
console.log(` ${passed ? '✓' : '✗'} Got expected error type`);
}
}
const passedCount = results.filter(r => r.passed).length;
return {
totalTests: errorTests.length,
passed: passedCount,
results
};
}
// Test 6: MCP server integration
async function testMCPServerIntegration() {
console.log(' - Testing MCP server tool handlers...');
const config = {
port: 3000,
host: '0.0.0.0',
authToken: 'test-token'
};
const n8nConfig = {
apiUrl: 'http://localhost:5678',
apiKey: 'test-key'
};
// Note: We can't fully test the server without running it,
// but we can verify the handlers are set up correctly
const server = new N8NMCPServer(config, n8nConfig);
// Verify the server instance is created
if (!server) {
throw new Error('Failed to create MCP server instance');
}
console.log(' - MCP server instance created successfully');
return {
serverCreated: true,
config
};
}
// Main test runner
async function runAllTests() {
console.log('=== Comprehensive n8n Node Extraction Test Suite ===\n');
console.log('This test suite validates the extraction of n8n nodes for database storage.\n');
await ensureTestDir();
// Update todo status
console.log('Starting test execution...\n');
// Run all tests
await runTest('Basic Node Extraction', testBasicExtraction);
await runTest('List Available Nodes', testListAvailableNodes);
await runTest('Bulk Node Extraction', testBulkExtraction);
await runTest('Database Schema Validation', testDatabaseSchema);
await runTest('Error Handling', testErrorHandling);
await runTest('MCP Server Integration', testMCPServerIntegration);
// Calculate final results
testResults.endTime = new Date();
const duration = (testResults.endTime - testResults.startTime) / 1000;
// Save extracted nodes data
if (testResults.extractedNodes.length > 0) {
await fs.writeFile(
EXTRACTED_NODES_FILE,
JSON.stringify(testResults.extractedNodes, null, 2)
);
console.log(`\n📁 Extracted nodes saved to: ${EXTRACTED_NODES_FILE}`);
}
// Save test summary
const summary = {
...testResults,
extractedNodes: testResults.extractedNodes.length // Just count, not full data
};
await fs.writeFile(
TEST_SUMMARY_FILE,
JSON.stringify(summary, null, 2)
);
// Print summary
console.log('\n' + '='.repeat(60));
console.log('TEST SUMMARY');
console.log('='.repeat(60));
console.log(`Total Tests: ${testResults.totalTests}`);
console.log(`Passed: ${testResults.passed}`);
console.log(`Failed: ${testResults.failed}`);
console.log(`Duration: ${duration.toFixed(2)}s`);
console.log(`Nodes Extracted: ${testResults.extractedNodes.length}`);
if (testResults.databaseSchema) {
console.log('\nDatabase Schema:');
console.log(`- Tables: ${Object.keys(testResults.databaseSchema.tables).join(', ')}`);
console.log(`- Ready for bulk storage: YES`);
}
console.log('\n' + '='.repeat(60));
// Exit with appropriate code
process.exit(testResults.failed > 0 ? 1 : 0);
}
// Handle errors
process.on('unhandledRejection', (error) => {
console.error('\n💥 Unhandled error:', error);
process.exit(1);
});
// Run tests
runAllTests();

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,34 @@
-- Auto-generated SQL for n8n nodes
-- Node: n8n-nodes-base.Function
INSERT INTO nodes (node_type, name, package_name, code_hash, code_length, source_location, has_credentials)
VALUES ('n8n-nodes-base.Function', 'Function', 'n8n-nodes-base', 'd68f1ab94b190161e2ec2c56ec6631f6c3992826557c100ec578efff5de96a70', 7449, 'node_modules/n8n-nodes-base/dist/nodes/Function/Function.node.js', false);
-- Node: n8n-nodes-base.Webhook
INSERT INTO nodes (node_type, name, package_name, code_hash, code_length, source_location, has_credentials)
VALUES ('n8n-nodes-base.Webhook', 'Webhook', 'n8n-nodes-base', '143d6bbdce335c5a9204112b2c1e8b92e4061d75ba3cb23301845f6fed9e6c71', 10667, 'node_modules/n8n-nodes-base/dist/nodes/Webhook/Webhook.node.js', false);
-- Node: n8n-nodes-base.HttpRequest
INSERT INTO nodes (node_type, name, package_name, code_hash, code_length, source_location, has_credentials)
VALUES ('n8n-nodes-base.HttpRequest', 'HttpRequest', 'n8n-nodes-base', '5b5e2328474b7e85361c940dfe942e167b3f0057f38062f56d6b693f0a7ffe7e', 1343, 'node_modules/n8n-nodes-base/dist/nodes/HttpRequest/HttpRequest.node.js', false);
-- Node: n8n-nodes-base.If
INSERT INTO nodes (node_type, name, package_name, code_hash, code_length, source_location, has_credentials)
VALUES ('n8n-nodes-base.If', 'If', 'n8n-nodes-base', '7910ed9177a946b76f04ca847defb81226c37c698e4cdb63913f038c6c257ee1', 20533, 'node_modules/n8n-nodes-base/dist/nodes/If/If.node.js', false);
-- Node: n8n-nodes-base.SplitInBatches
INSERT INTO nodes (node_type, name, package_name, code_hash, code_length, source_location, has_credentials)
VALUES ('n8n-nodes-base.SplitInBatches', 'SplitInBatches', 'n8n-nodes-base', 'c751422a11e30bf361a6c4803376289740a40434aeb77f90e18cd4dd7ba5c019', 1135, 'node_modules/n8n-nodes-base/dist/nodes/SplitInBatches/SplitInBatches.node.js', false);
-- Node: n8n-nodes-base.Airtable
INSERT INTO nodes (node_type, name, package_name, code_hash, code_length, source_location, has_credentials)
VALUES ('n8n-nodes-base.Airtable', 'Airtable', 'n8n-nodes-base', '2d67e72931697178946f5127b43e954649c4c5e7ad9e29764796404ae96e7db5', 936, 'node_modules/n8n-nodes-base/dist/nodes/Airtable/Airtable.node.js', false);
-- Node: n8n-nodes-base.Slack
INSERT INTO nodes (node_type, name, package_name, code_hash, code_length, source_location, has_credentials)
VALUES ('n8n-nodes-base.Slack', 'Slack', 'n8n-nodes-base', '0ed10d0646f3c595406359edfa2c293dac41991cee59ad4fb3ccf2bb70eca6fc', 1007, 'node_modules/n8n-nodes-base/dist/nodes/Slack/Slack.node.js', false);
-- Node: n8n-nodes-base.Discord
INSERT INTO nodes (node_type, name, package_name, code_hash, code_length, source_location, has_credentials)
VALUES ('n8n-nodes-base.Discord', 'Discord', 'n8n-nodes-base', '4995f9ca5c5b57d2486c2e320cc7505238e7f2260861f7e321b44b45ccabeb00', 10049, 'node_modules/n8n-nodes-base/dist/nodes/Discord/Discord.node.js', false);

View File

@@ -0,0 +1,896 @@
{
"node_type": "n8n-nodes-base.Airtable",
"name": "Airtable",
"package_name": "n8n-nodes-base",
"code_hash": "2d67e72931697178946f5127b43e954649c4c5e7ad9e29764796404ae96e7db5",
"code_length": 936,
"source_location": "node_modules/n8n-nodes-base/dist/nodes/Airtable/Airtable.node.js",
"has_credentials": false,
"source_code": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Airtable = void 0;\nconst n8n_workflow_1 = require(\"n8n-workflow\");\nconst AirtableV1_node_1 = require(\"./v1/AirtableV1.node\");\nconst AirtableV2_node_1 = require(\"./v2/AirtableV2.node\");\nclass Airtable extends n8n_workflow_1.VersionedNodeType {\n constructor() {\n const baseDescription = {\n displayName: 'Airtable',\n name: 'airtable',\n icon: 'file:airtable.svg',\n group: ['input'],\n description: 'Read, update, write and delete data from Airtable',\n defaultVersion: 2,\n };\n const nodeVersions = {\n 1: new AirtableV1_node_1.AirtableV1(baseDescription),\n 2: new AirtableV2_node_1.AirtableV2(baseDescription),\n };\n super(nodeVersions, baseDescription);\n }\n}\nexports.Airtable = Airtable;\n//# sourceMappingURL=Airtable.node.js.map",
"package_info": {
"name": "n8n-nodes-base",
"version": "1.14.1",
"description": "Base nodes of n8n",
"license": "SEE LICENSE IN LICENSE.md",
"homepage": "https://n8n.io",
"author": {
"name": "Jan Oberhauser",
"email": "jan@n8n.io"
},
"main": "index.js",
"repository": {
"type": "git",
"url": "git+https://github.com/n8n-io/n8n.git"
},
"files": [
"dist"
],
"n8n": {
"credentials": [
"dist/credentials/ActionNetworkApi.credentials.js",
"dist/credentials/ActiveCampaignApi.credentials.js",
"dist/credentials/AcuitySchedulingApi.credentials.js",
"dist/credentials/AcuitySchedulingOAuth2Api.credentials.js",
"dist/credentials/AdaloApi.credentials.js",
"dist/credentials/AffinityApi.credentials.js",
"dist/credentials/AgileCrmApi.credentials.js",
"dist/credentials/AirtableApi.credentials.js",
"dist/credentials/AirtableOAuth2Api.credentials.js",
"dist/credentials/AirtableTokenApi.credentials.js",
"dist/credentials/AlienVaultApi.credentials.js",
"dist/credentials/Amqp.credentials.js",
"dist/credentials/ApiTemplateIoApi.credentials.js",
"dist/credentials/AsanaApi.credentials.js",
"dist/credentials/AsanaOAuth2Api.credentials.js",
"dist/credentials/Auth0ManagementApi.credentials.js",
"dist/credentials/AutomizyApi.credentials.js",
"dist/credentials/AutopilotApi.credentials.js",
"dist/credentials/Aws.credentials.js",
"dist/credentials/BambooHrApi.credentials.js",
"dist/credentials/BannerbearApi.credentials.js",
"dist/credentials/BaserowApi.credentials.js",
"dist/credentials/BeeminderApi.credentials.js",
"dist/credentials/BitbucketApi.credentials.js",
"dist/credentials/BitlyApi.credentials.js",
"dist/credentials/BitlyOAuth2Api.credentials.js",
"dist/credentials/BitwardenApi.credentials.js",
"dist/credentials/BoxOAuth2Api.credentials.js",
"dist/credentials/BrandfetchApi.credentials.js",
"dist/credentials/BubbleApi.credentials.js",
"dist/credentials/CalApi.credentials.js",
"dist/credentials/CalendlyApi.credentials.js",
"dist/credentials/CarbonBlackApi.credentials.js",
"dist/credentials/ChargebeeApi.credentials.js",
"dist/credentials/CircleCiApi.credentials.js",
"dist/credentials/CiscoMerakiApi.credentials.js",
"dist/credentials/CiscoSecureEndpointApi.credentials.js",
"dist/credentials/CiscoWebexOAuth2Api.credentials.js",
"dist/credentials/CiscoUmbrellaApi.credentials.js",
"dist/credentials/CitrixAdcApi.credentials.js",
"dist/credentials/CloudflareApi.credentials.js",
"dist/credentials/ClearbitApi.credentials.js",
"dist/credentials/ClickUpApi.credentials.js",
"dist/credentials/ClickUpOAuth2Api.credentials.js",
"dist/credentials/ClockifyApi.credentials.js",
"dist/credentials/CockpitApi.credentials.js",
"dist/credentials/CodaApi.credentials.js",
"dist/credentials/ContentfulApi.credentials.js",
"dist/credentials/ConvertKitApi.credentials.js",
"dist/credentials/CopperApi.credentials.js",
"dist/credentials/CortexApi.credentials.js",
"dist/credentials/CrateDb.credentials.js",
"dist/credentials/CrowdStrikeOAuth2Api.credentials.js",
"dist/credentials/CrowdDevApi.credentials.js",
"dist/credentials/CustomerIoApi.credentials.js",
"dist/credentials/DeepLApi.credentials.js",
"dist/credentials/DemioApi.credentials.js",
"dist/credentials/DhlApi.credentials.js",
"dist/credentials/DiscourseApi.credentials.js",
"dist/credentials/DisqusApi.credentials.js",
"dist/credentials/DriftApi.credentials.js",
"dist/credentials/DriftOAuth2Api.credentials.js",
"dist/credentials/DropboxApi.credentials.js",
"dist/credentials/DropboxOAuth2Api.credentials.js",
"dist/credentials/DropcontactApi.credentials.js",
"dist/credentials/EgoiApi.credentials.js",
"dist/credentials/ElasticsearchApi.credentials.js",
"dist/credentials/ElasticSecurityApi.credentials.js",
"dist/credentials/EmeliaApi.credentials.js",
"dist/credentials/ERPNextApi.credentials.js",
"dist/credentials/EventbriteApi.credentials.js",
"dist/credentials/EventbriteOAuth2Api.credentials.js",
"dist/credentials/F5BigIpApi.credentials.js",
"dist/credentials/FacebookGraphApi.credentials.js",
"dist/credentials/FacebookGraphAppApi.credentials.js",
"dist/credentials/FacebookLeadAdsOAuth2Api.credentials.js",
"dist/credentials/FigmaApi.credentials.js",
"dist/credentials/FileMaker.credentials.js",
"dist/credentials/FlowApi.credentials.js",
"dist/credentials/FormIoApi.credentials.js",
"dist/credentials/FormstackApi.credentials.js",
"dist/credentials/FormstackOAuth2Api.credentials.js",
"dist/credentials/FortiGateApi.credentials.js",
"dist/credentials/FreshdeskApi.credentials.js",
"dist/credentials/FreshserviceApi.credentials.js",
"dist/credentials/FreshworksCrmApi.credentials.js",
"dist/credentials/Ftp.credentials.js",
"dist/credentials/GetResponseApi.credentials.js",
"dist/credentials/GetResponseOAuth2Api.credentials.js",
"dist/credentials/GhostAdminApi.credentials.js",
"dist/credentials/GhostContentApi.credentials.js",
"dist/credentials/GithubApi.credentials.js",
"dist/credentials/GithubOAuth2Api.credentials.js",
"dist/credentials/GitlabApi.credentials.js",
"dist/credentials/GitlabOAuth2Api.credentials.js",
"dist/credentials/GitPassword.credentials.js",
"dist/credentials/GmailOAuth2Api.credentials.js",
"dist/credentials/GoogleAdsOAuth2Api.credentials.js",
"dist/credentials/GoogleAnalyticsOAuth2Api.credentials.js",
"dist/credentials/GoogleApi.credentials.js",
"dist/credentials/GoogleBigQueryOAuth2Api.credentials.js",
"dist/credentials/GoogleBooksOAuth2Api.credentials.js",
"dist/credentials/GoogleCalendarOAuth2Api.credentials.js",
"dist/credentials/GoogleCloudNaturalLanguageOAuth2Api.credentials.js",
"dist/credentials/GoogleCloudStorageOAuth2Api.credentials.js",
"dist/credentials/GoogleContactsOAuth2Api.credentials.js",
"dist/credentials/GoogleDocsOAuth2Api.credentials.js",
"dist/credentials/GoogleDriveOAuth2Api.credentials.js",
"dist/credentials/GoogleFirebaseCloudFirestoreOAuth2Api.credentials.js",
"dist/credentials/GoogleFirebaseRealtimeDatabaseOAuth2Api.credentials.js",
"dist/credentials/GoogleOAuth2Api.credentials.js",
"dist/credentials/GooglePerspectiveOAuth2Api.credentials.js",
"dist/credentials/GoogleSheetsOAuth2Api.credentials.js",
"dist/credentials/GoogleSheetsTriggerOAuth2Api.credentials.js",
"dist/credentials/GoogleSlidesOAuth2Api.credentials.js",
"dist/credentials/GoogleTasksOAuth2Api.credentials.js",
"dist/credentials/GoogleTranslateOAuth2Api.credentials.js",
"dist/credentials/GotifyApi.credentials.js",
"dist/credentials/GoToWebinarOAuth2Api.credentials.js",
"dist/credentials/GristApi.credentials.js",
"dist/credentials/GrafanaApi.credentials.js",
"dist/credentials/GSuiteAdminOAuth2Api.credentials.js",
"dist/credentials/GumroadApi.credentials.js",
"dist/credentials/HaloPSAApi.credentials.js",
"dist/credentials/HarvestApi.credentials.js",
"dist/credentials/HarvestOAuth2Api.credentials.js",
"dist/credentials/HelpScoutOAuth2Api.credentials.js",
"dist/credentials/HighLevelApi.credentials.js",
"dist/credentials/HomeAssistantApi.credentials.js",
"dist/credentials/HttpBasicAuth.credentials.js",
"dist/credentials/HttpDigestAuth.credentials.js",
"dist/credentials/HttpHeaderAuth.credentials.js",
"dist/credentials/HttpCustomAuth.credentials.js",
"dist/credentials/HttpQueryAuth.credentials.js",
"dist/credentials/HubspotApi.credentials.js",
"dist/credentials/HubspotAppToken.credentials.js",
"dist/credentials/HubspotDeveloperApi.credentials.js",
"dist/credentials/HubspotOAuth2Api.credentials.js",
"dist/credentials/HumanticAiApi.credentials.js",
"dist/credentials/HunterApi.credentials.js",
"dist/credentials/HybridAnalysisApi.credentials.js",
"dist/credentials/Imap.credentials.js",
"dist/credentials/ImpervaWafApi.credentials.js",
"dist/credentials/IntercomApi.credentials.js",
"dist/credentials/InvoiceNinjaApi.credentials.js",
"dist/credentials/IterableApi.credentials.js",
"dist/credentials/JenkinsApi.credentials.js",
"dist/credentials/JiraSoftwareCloudApi.credentials.js",
"dist/credentials/JiraSoftwareServerApi.credentials.js",
"dist/credentials/JotFormApi.credentials.js",
"dist/credentials/Kafka.credentials.js",
"dist/credentials/KeapOAuth2Api.credentials.js",
"dist/credentials/KibanaApi.credentials.js",
"dist/credentials/KitemakerApi.credentials.js",
"dist/credentials/KoBoToolboxApi.credentials.js",
"dist/credentials/Ldap.credentials.js",
"dist/credentials/LemlistApi.credentials.js",
"dist/credentials/LinearApi.credentials.js",
"dist/credentials/LinearOAuth2Api.credentials.js",
"dist/credentials/LineNotifyOAuth2Api.credentials.js",
"dist/credentials/LingvaNexApi.credentials.js",
"dist/credentials/LinkedInOAuth2Api.credentials.js",
"dist/credentials/LoneScaleApi.credentials.js",
"dist/credentials/Magento2Api.credentials.js",
"dist/credentials/MailcheckApi.credentials.js",
"dist/credentials/MailchimpApi.credentials.js",
"dist/credentials/MailchimpOAuth2Api.credentials.js",
"dist/credentials/MailerLiteApi.credentials.js",
"dist/credentials/MailgunApi.credentials.js",
"dist/credentials/MailjetEmailApi.credentials.js",
"dist/credentials/MailjetSmsApi.credentials.js",
"dist/credentials/MandrillApi.credentials.js",
"dist/credentials/MarketstackApi.credentials.js",
"dist/credentials/MatrixApi.credentials.js",
"dist/credentials/MattermostApi.credentials.js",
"dist/credentials/MauticApi.credentials.js",
"dist/credentials/MauticOAuth2Api.credentials.js",
"dist/credentials/MediumApi.credentials.js",
"dist/credentials/MediumOAuth2Api.credentials.js",
"dist/credentials/MetabaseApi.credentials.js",
"dist/credentials/MessageBirdApi.credentials.js",
"dist/credentials/MetabaseApi.credentials.js",
"dist/credentials/MicrosoftDynamicsOAuth2Api.credentials.js",
"dist/credentials/MicrosoftEntraOAuth2Api.credentials.js",
"dist/credentials/MicrosoftExcelOAuth2Api.credentials.js",
"dist/credentials/MicrosoftGraphSecurityOAuth2Api.credentials.js",
"dist/credentials/MicrosoftOAuth2Api.credentials.js",
"dist/credentials/MicrosoftOneDriveOAuth2Api.credentials.js",
"dist/credentials/MicrosoftOutlookOAuth2Api.credentials.js",
"dist/credentials/MicrosoftSql.credentials.js",
"dist/credentials/MicrosoftTeamsOAuth2Api.credentials.js",
"dist/credentials/MicrosoftToDoOAuth2Api.credentials.js",
"dist/credentials/MindeeInvoiceApi.credentials.js",
"dist/credentials/MindeeReceiptApi.credentials.js",
"dist/credentials/MispApi.credentials.js",
"dist/credentials/MistApi.credentials.js",
"dist/credentials/MoceanApi.credentials.js",
"dist/credentials/MondayComApi.credentials.js",
"dist/credentials/MondayComOAuth2Api.credentials.js",
"dist/credentials/MongoDb.credentials.js",
"dist/credentials/MonicaCrmApi.credentials.js",
"dist/credentials/Mqtt.credentials.js",
"dist/credentials/Msg91Api.credentials.js",
"dist/credentials/MySql.credentials.js",
"dist/credentials/N8nApi.credentials.js",
"dist/credentials/NasaApi.credentials.js",
"dist/credentials/NetlifyApi.credentials.js",
"dist/credentials/NextCloudApi.credentials.js",
"dist/credentials/NextCloudOAuth2Api.credentials.js",
"dist/credentials/NocoDb.credentials.js",
"dist/credentials/NocoDbApiToken.credentials.js",
"dist/credentials/NotionApi.credentials.js",
"dist/credentials/NotionOAuth2Api.credentials.js",
"dist/credentials/NpmApi.credentials.js",
"dist/credentials/OAuth1Api.credentials.js",
"dist/credentials/OAuth2Api.credentials.js",
"dist/credentials/OdooApi.credentials.js",
"dist/credentials/OktaApi.credentials.js",
"dist/credentials/OneSimpleApi.credentials.js",
"dist/credentials/OnfleetApi.credentials.js",
"dist/credentials/OpenAiApi.credentials.js",
"dist/credentials/OpenCTIApi.credentials.js",
"dist/credentials/OpenWeatherMapApi.credentials.js",
"dist/credentials/OrbitApi.credentials.js",
"dist/credentials/OuraApi.credentials.js",
"dist/credentials/PaddleApi.credentials.js",
"dist/credentials/PagerDutyApi.credentials.js",
"dist/credentials/PagerDutyOAuth2Api.credentials.js",
"dist/credentials/PayPalApi.credentials.js",
"dist/credentials/PeekalinkApi.credentials.js",
"dist/credentials/PhantombusterApi.credentials.js",
"dist/credentials/PhilipsHueOAuth2Api.credentials.js",
"dist/credentials/PipedriveApi.credentials.js",
"dist/credentials/PipedriveOAuth2Api.credentials.js",
"dist/credentials/PlivoApi.credentials.js",
"dist/credentials/Postgres.credentials.js",
"dist/credentials/PostHogApi.credentials.js",
"dist/credentials/PostmarkApi.credentials.js",
"dist/credentials/ProfitWellApi.credentials.js",
"dist/credentials/PushbulletOAuth2Api.credentials.js",
"dist/credentials/PushcutApi.credentials.js",
"dist/credentials/PushoverApi.credentials.js",
"dist/credentials/QRadarApi.credentials.js",
"dist/credentials/QualysApi.credentials.js",
"dist/credentials/QuestDb.credentials.js",
"dist/credentials/QuickBaseApi.credentials.js",
"dist/credentials/QuickBooksOAuth2Api.credentials.js",
"dist/credentials/RabbitMQ.credentials.js",
"dist/credentials/RaindropOAuth2Api.credentials.js",
"dist/credentials/RecordedFutureApi.credentials.js",
"dist/credentials/RedditOAuth2Api.credentials.js",
"dist/credentials/Redis.credentials.js",
"dist/credentials/RocketchatApi.credentials.js",
"dist/credentials/RundeckApi.credentials.js",
"dist/credentials/S3.credentials.js",
"dist/credentials/SalesforceJwtApi.credentials.js",
"dist/credentials/SalesforceOAuth2Api.credentials.js",
"dist/credentials/SalesmateApi.credentials.js",
"dist/credentials/SeaTableApi.credentials.js",
"dist/credentials/SecurityScorecardApi.credentials.js",
"dist/credentials/SegmentApi.credentials.js",
"dist/credentials/SekoiaApi.credentials.js",
"dist/credentials/SendGridApi.credentials.js",
"dist/credentials/BrevoApi.credentials.js",
"dist/credentials/SendyApi.credentials.js",
"dist/credentials/SentryIoApi.credentials.js",
"dist/credentials/SentryIoOAuth2Api.credentials.js",
"dist/credentials/SentryIoServerApi.credentials.js",
"dist/credentials/ServiceNowOAuth2Api.credentials.js",
"dist/credentials/ServiceNowBasicApi.credentials.js",
"dist/credentials/Sftp.credentials.js",
"dist/credentials/ShopifyApi.credentials.js",
"dist/credentials/ShopifyAccessTokenApi.credentials.js",
"dist/credentials/ShopifyOAuth2Api.credentials.js",
"dist/credentials/Signl4Api.credentials.js",
"dist/credentials/SlackApi.credentials.js",
"dist/credentials/SlackOAuth2Api.credentials.js",
"dist/credentials/Sms77Api.credentials.js",
"dist/credentials/Smtp.credentials.js",
"dist/credentials/Snowflake.credentials.js",
"dist/credentials/SplunkApi.credentials.js",
"dist/credentials/SpontitApi.credentials.js",
"dist/credentials/SpotifyOAuth2Api.credentials.js",
"dist/credentials/ShufflerApi.credentials.js",
"dist/credentials/SshPassword.credentials.js",
"dist/credentials/SshPrivateKey.credentials.js",
"dist/credentials/StackbyApi.credentials.js",
"dist/credentials/StoryblokContentApi.credentials.js",
"dist/credentials/StoryblokManagementApi.credentials.js",
"dist/credentials/StrapiApi.credentials.js",
"dist/credentials/StrapiTokenApi.credentials.js",
"dist/credentials/StravaOAuth2Api.credentials.js",
"dist/credentials/StripeApi.credentials.js",
"dist/credentials/SupabaseApi.credentials.js",
"dist/credentials/SurveyMonkeyApi.credentials.js",
"dist/credentials/SurveyMonkeyOAuth2Api.credentials.js",
"dist/credentials/SyncroMspApi.credentials.js",
"dist/credentials/TaigaApi.credentials.js",
"dist/credentials/TapfiliateApi.credentials.js",
"dist/credentials/TelegramApi.credentials.js",
"dist/credentials/TheHiveProjectApi.credentials.js",
"dist/credentials/TheHiveApi.credentials.js",
"dist/credentials/TimescaleDb.credentials.js",
"dist/credentials/TodoistApi.credentials.js",
"dist/credentials/TodoistOAuth2Api.credentials.js",
"dist/credentials/TogglApi.credentials.js",
"dist/credentials/TotpApi.credentials.js",
"dist/credentials/TravisCiApi.credentials.js",
"dist/credentials/TrellixEpoApi.credentials.js",
"dist/credentials/TrelloApi.credentials.js",
"dist/credentials/TwakeCloudApi.credentials.js",
"dist/credentials/TwakeServerApi.credentials.js",
"dist/credentials/TwilioApi.credentials.js",
"dist/credentials/TwistOAuth2Api.credentials.js",
"dist/credentials/TwitterOAuth1Api.credentials.js",
"dist/credentials/TwitterOAuth2Api.credentials.js",
"dist/credentials/TypeformApi.credentials.js",
"dist/credentials/TypeformOAuth2Api.credentials.js",
"dist/credentials/UnleashedSoftwareApi.credentials.js",
"dist/credentials/UpleadApi.credentials.js",
"dist/credentials/UProcApi.credentials.js",
"dist/credentials/UptimeRobotApi.credentials.js",
"dist/credentials/UrlScanIoApi.credentials.js",
"dist/credentials/VeroApi.credentials.js",
"dist/credentials/VirusTotalApi.credentials.js",
"dist/credentials/VonageApi.credentials.js",
"dist/credentials/VenafiTlsProtectCloudApi.credentials.js",
"dist/credentials/VenafiTlsProtectDatacenterApi.credentials.js",
"dist/credentials/WebflowApi.credentials.js",
"dist/credentials/WebflowOAuth2Api.credentials.js",
"dist/credentials/WekanApi.credentials.js",
"dist/credentials/WhatsAppApi.credentials.js",
"dist/credentials/WiseApi.credentials.js",
"dist/credentials/WooCommerceApi.credentials.js",
"dist/credentials/WordpressApi.credentials.js",
"dist/credentials/WorkableApi.credentials.js",
"dist/credentials/WufooApi.credentials.js",
"dist/credentials/XeroOAuth2Api.credentials.js",
"dist/credentials/YourlsApi.credentials.js",
"dist/credentials/YouTubeOAuth2Api.credentials.js",
"dist/credentials/ZammadBasicAuthApi.credentials.js",
"dist/credentials/ZammadTokenAuthApi.credentials.js",
"dist/credentials/ZendeskApi.credentials.js",
"dist/credentials/ZendeskOAuth2Api.credentials.js",
"dist/credentials/ZohoOAuth2Api.credentials.js",
"dist/credentials/ZoomApi.credentials.js",
"dist/credentials/ZoomOAuth2Api.credentials.js",
"dist/credentials/ZscalerZiaApi.credentials.js",
"dist/credentials/ZulipApi.credentials.js"
],
"nodes": [
"dist/nodes/ActionNetwork/ActionNetwork.node.js",
"dist/nodes/ActiveCampaign/ActiveCampaign.node.js",
"dist/nodes/ActiveCampaign/ActiveCampaignTrigger.node.js",
"dist/nodes/AcuityScheduling/AcuitySchedulingTrigger.node.js",
"dist/nodes/Adalo/Adalo.node.js",
"dist/nodes/Affinity/Affinity.node.js",
"dist/nodes/Affinity/AffinityTrigger.node.js",
"dist/nodes/AgileCrm/AgileCrm.node.js",
"dist/nodes/Airtable/Airtable.node.js",
"dist/nodes/Airtable/AirtableTrigger.node.js",
"dist/nodes/Amqp/Amqp.node.js",
"dist/nodes/Amqp/AmqpTrigger.node.js",
"dist/nodes/ApiTemplateIo/ApiTemplateIo.node.js",
"dist/nodes/Asana/Asana.node.js",
"dist/nodes/Asana/AsanaTrigger.node.js",
"dist/nodes/Automizy/Automizy.node.js",
"dist/nodes/Autopilot/Autopilot.node.js",
"dist/nodes/Autopilot/AutopilotTrigger.node.js",
"dist/nodes/Aws/AwsLambda.node.js",
"dist/nodes/Aws/AwsSns.node.js",
"dist/nodes/Aws/AwsSnsTrigger.node.js",
"dist/nodes/Aws/CertificateManager/AwsCertificateManager.node.js",
"dist/nodes/Aws/Comprehend/AwsComprehend.node.js",
"dist/nodes/Aws/DynamoDB/AwsDynamoDB.node.js",
"dist/nodes/Aws/ELB/AwsElb.node.js",
"dist/nodes/Aws/Rekognition/AwsRekognition.node.js",
"dist/nodes/Aws/S3/AwsS3.node.js",
"dist/nodes/Aws/SES/AwsSes.node.js",
"dist/nodes/Aws/SQS/AwsSqs.node.js",
"dist/nodes/Aws/Textract/AwsTextract.node.js",
"dist/nodes/Aws/Transcribe/AwsTranscribe.node.js",
"dist/nodes/BambooHr/BambooHr.node.js",
"dist/nodes/Bannerbear/Bannerbear.node.js",
"dist/nodes/Baserow/Baserow.node.js",
"dist/nodes/Beeminder/Beeminder.node.js",
"dist/nodes/Bitbucket/BitbucketTrigger.node.js",
"dist/nodes/Bitly/Bitly.node.js",
"dist/nodes/Bitwarden/Bitwarden.node.js",
"dist/nodes/Box/Box.node.js",
"dist/nodes/Box/BoxTrigger.node.js",
"dist/nodes/Brandfetch/Brandfetch.node.js",
"dist/nodes/Bubble/Bubble.node.js",
"dist/nodes/Cal/CalTrigger.node.js",
"dist/nodes/Calendly/CalendlyTrigger.node.js",
"dist/nodes/Chargebee/Chargebee.node.js",
"dist/nodes/Chargebee/ChargebeeTrigger.node.js",
"dist/nodes/CircleCi/CircleCi.node.js",
"dist/nodes/Cisco/Webex/CiscoWebex.node.js",
"dist/nodes/Citrix/ADC/CitrixAdc.node.js",
"dist/nodes/Cisco/Webex/CiscoWebexTrigger.node.js",
"dist/nodes/Cloudflare/Cloudflare.node.js",
"dist/nodes/Clearbit/Clearbit.node.js",
"dist/nodes/ClickUp/ClickUp.node.js",
"dist/nodes/ClickUp/ClickUpTrigger.node.js",
"dist/nodes/Clockify/Clockify.node.js",
"dist/nodes/Clockify/ClockifyTrigger.node.js",
"dist/nodes/Cockpit/Cockpit.node.js",
"dist/nodes/Coda/Coda.node.js",
"dist/nodes/Code/Code.node.js",
"dist/nodes/CoinGecko/CoinGecko.node.js",
"dist/nodes/CompareDatasets/CompareDatasets.node.js",
"dist/nodes/Compression/Compression.node.js",
"dist/nodes/Contentful/Contentful.node.js",
"dist/nodes/ConvertKit/ConvertKit.node.js",
"dist/nodes/ConvertKit/ConvertKitTrigger.node.js",
"dist/nodes/Copper/Copper.node.js",
"dist/nodes/Copper/CopperTrigger.node.js",
"dist/nodes/Cortex/Cortex.node.js",
"dist/nodes/CrateDb/CrateDb.node.js",
"dist/nodes/Cron/Cron.node.js",
"dist/nodes/CrowdDev/CrowdDev.node.js",
"dist/nodes/CrowdDev/CrowdDevTrigger.node.js",
"dist/nodes/Crypto/Crypto.node.js",
"dist/nodes/CustomerIo/CustomerIo.node.js",
"dist/nodes/CustomerIo/CustomerIoTrigger.node.js",
"dist/nodes/DateTime/DateTime.node.js",
"dist/nodes/DebugHelper/DebugHelper.node.js",
"dist/nodes/DeepL/DeepL.node.js",
"dist/nodes/Demio/Demio.node.js",
"dist/nodes/Dhl/Dhl.node.js",
"dist/nodes/Discord/Discord.node.js",
"dist/nodes/Discourse/Discourse.node.js",
"dist/nodes/Disqus/Disqus.node.js",
"dist/nodes/Drift/Drift.node.js",
"dist/nodes/Dropbox/Dropbox.node.js",
"dist/nodes/Dropcontact/Dropcontact.node.js",
"dist/nodes/EditImage/EditImage.node.js",
"dist/nodes/E2eTest/E2eTest.node.js",
"dist/nodes/Egoi/Egoi.node.js",
"dist/nodes/Elastic/Elasticsearch/Elasticsearch.node.js",
"dist/nodes/Elastic/ElasticSecurity/ElasticSecurity.node.js",
"dist/nodes/EmailReadImap/EmailReadImap.node.js",
"dist/nodes/EmailSend/EmailSend.node.js",
"dist/nodes/Emelia/Emelia.node.js",
"dist/nodes/Emelia/EmeliaTrigger.node.js",
"dist/nodes/ERPNext/ERPNext.node.js",
"dist/nodes/ErrorTrigger/ErrorTrigger.node.js",
"dist/nodes/Eventbrite/EventbriteTrigger.node.js",
"dist/nodes/ExecuteCommand/ExecuteCommand.node.js",
"dist/nodes/ExecuteWorkflow/ExecuteWorkflow.node.js",
"dist/nodes/ExecuteWorkflowTrigger/ExecuteWorkflowTrigger.node.js",
"dist/nodes/ExecutionData/ExecutionData.node.js",
"dist/nodes/Facebook/FacebookGraphApi.node.js",
"dist/nodes/Facebook/FacebookTrigger.node.js",
"dist/nodes/FacebookLeadAds/FacebookLeadAdsTrigger.node.js",
"dist/nodes/Figma/FigmaTrigger.node.js",
"dist/nodes/FileMaker/FileMaker.node.js",
"dist/nodes/Filter/Filter.node.js",
"dist/nodes/Flow/Flow.node.js",
"dist/nodes/Flow/FlowTrigger.node.js",
"dist/nodes/Form/FormTrigger.node.js",
"dist/nodes/FormIo/FormIoTrigger.node.js",
"dist/nodes/Formstack/FormstackTrigger.node.js",
"dist/nodes/Freshdesk/Freshdesk.node.js",
"dist/nodes/Freshservice/Freshservice.node.js",
"dist/nodes/FreshworksCrm/FreshworksCrm.node.js",
"dist/nodes/Ftp/Ftp.node.js",
"dist/nodes/Function/Function.node.js",
"dist/nodes/FunctionItem/FunctionItem.node.js",
"dist/nodes/GetResponse/GetResponse.node.js",
"dist/nodes/GetResponse/GetResponseTrigger.node.js",
"dist/nodes/Ghost/Ghost.node.js",
"dist/nodes/Git/Git.node.js",
"dist/nodes/Github/Github.node.js",
"dist/nodes/Github/GithubTrigger.node.js",
"dist/nodes/Gitlab/Gitlab.node.js",
"dist/nodes/Gitlab/GitlabTrigger.node.js",
"dist/nodes/Google/Ads/GoogleAds.node.js",
"dist/nodes/Google/Analytics/GoogleAnalytics.node.js",
"dist/nodes/Google/BigQuery/GoogleBigQuery.node.js",
"dist/nodes/Google/Books/GoogleBooks.node.js",
"dist/nodes/Google/Calendar/GoogleCalendar.node.js",
"dist/nodes/Google/Calendar/GoogleCalendarTrigger.node.js",
"dist/nodes/Google/Chat/GoogleChat.node.js",
"dist/nodes/Google/CloudNaturalLanguage/GoogleCloudNaturalLanguage.node.js",
"dist/nodes/Google/CloudStorage/GoogleCloudStorage.node.js",
"dist/nodes/Google/Contacts/GoogleContacts.node.js",
"dist/nodes/Google/Docs/GoogleDocs.node.js",
"dist/nodes/Google/Drive/GoogleDrive.node.js",
"dist/nodes/Google/Drive/GoogleDriveTrigger.node.js",
"dist/nodes/Google/Firebase/CloudFirestore/GoogleFirebaseCloudFirestore.node.js",
"dist/nodes/Google/Firebase/RealtimeDatabase/GoogleFirebaseRealtimeDatabase.node.js",
"dist/nodes/Google/Gmail/Gmail.node.js",
"dist/nodes/Google/Gmail/GmailTrigger.node.js",
"dist/nodes/Google/GSuiteAdmin/GSuiteAdmin.node.js",
"dist/nodes/Google/Perspective/GooglePerspective.node.js",
"dist/nodes/Google/Sheet/GoogleSheets.node.js",
"dist/nodes/Google/Sheet/GoogleSheetsTrigger.node.js",
"dist/nodes/Google/Slides/GoogleSlides.node.js",
"dist/nodes/Google/Task/GoogleTasks.node.js",
"dist/nodes/Google/Translate/GoogleTranslate.node.js",
"dist/nodes/Google/YouTube/YouTube.node.js",
"dist/nodes/Gotify/Gotify.node.js",
"dist/nodes/GoToWebinar/GoToWebinar.node.js",
"dist/nodes/Grafana/Grafana.node.js",
"dist/nodes/GraphQL/GraphQL.node.js",
"dist/nodes/Grist/Grist.node.js",
"dist/nodes/Gumroad/GumroadTrigger.node.js",
"dist/nodes/HackerNews/HackerNews.node.js",
"dist/nodes/HaloPSA/HaloPSA.node.js",
"dist/nodes/Harvest/Harvest.node.js",
"dist/nodes/HelpScout/HelpScout.node.js",
"dist/nodes/HelpScout/HelpScoutTrigger.node.js",
"dist/nodes/HighLevel/HighLevel.node.js",
"dist/nodes/HomeAssistant/HomeAssistant.node.js",
"dist/nodes/HtmlExtract/HtmlExtract.node.js",
"dist/nodes/Html/Html.node.js",
"dist/nodes/HttpRequest/HttpRequest.node.js",
"dist/nodes/Hubspot/Hubspot.node.js",
"dist/nodes/Hubspot/HubspotTrigger.node.js",
"dist/nodes/HumanticAI/HumanticAi.node.js",
"dist/nodes/Hunter/Hunter.node.js",
"dist/nodes/ICalendar/ICalendar.node.js",
"dist/nodes/If/If.node.js",
"dist/nodes/Intercom/Intercom.node.js",
"dist/nodes/Interval/Interval.node.js",
"dist/nodes/InvoiceNinja/InvoiceNinja.node.js",
"dist/nodes/InvoiceNinja/InvoiceNinjaTrigger.node.js",
"dist/nodes/ItemLists/ItemLists.node.js",
"dist/nodes/Iterable/Iterable.node.js",
"dist/nodes/Jenkins/Jenkins.node.js",
"dist/nodes/Jira/Jira.node.js",
"dist/nodes/Jira/JiraTrigger.node.js",
"dist/nodes/JotForm/JotFormTrigger.node.js",
"dist/nodes/Kafka/Kafka.node.js",
"dist/nodes/Kafka/KafkaTrigger.node.js",
"dist/nodes/Keap/Keap.node.js",
"dist/nodes/Keap/KeapTrigger.node.js",
"dist/nodes/Kitemaker/Kitemaker.node.js",
"dist/nodes/KoBoToolbox/KoBoToolbox.node.js",
"dist/nodes/KoBoToolbox/KoBoToolboxTrigger.node.js",
"dist/nodes/Ldap/Ldap.node.js",
"dist/nodes/Lemlist/Lemlist.node.js",
"dist/nodes/Lemlist/LemlistTrigger.node.js",
"dist/nodes/Line/Line.node.js",
"dist/nodes/Linear/Linear.node.js",
"dist/nodes/Linear/LinearTrigger.node.js",
"dist/nodes/LingvaNex/LingvaNex.node.js",
"dist/nodes/LinkedIn/LinkedIn.node.js",
"dist/nodes/LocalFileTrigger/LocalFileTrigger.node.js",
"dist/nodes/LoneScale/LoneScaleTrigger.node.js",
"dist/nodes/LoneScale/LoneScale.node.js",
"dist/nodes/Magento/Magento2.node.js",
"dist/nodes/Mailcheck/Mailcheck.node.js",
"dist/nodes/Mailchimp/Mailchimp.node.js",
"dist/nodes/Mailchimp/MailchimpTrigger.node.js",
"dist/nodes/MailerLite/MailerLite.node.js",
"dist/nodes/MailerLite/MailerLiteTrigger.node.js",
"dist/nodes/Mailgun/Mailgun.node.js",
"dist/nodes/Mailjet/Mailjet.node.js",
"dist/nodes/Mailjet/MailjetTrigger.node.js",
"dist/nodes/Mandrill/Mandrill.node.js",
"dist/nodes/ManualTrigger/ManualTrigger.node.js",
"dist/nodes/Markdown/Markdown.node.js",
"dist/nodes/Marketstack/Marketstack.node.js",
"dist/nodes/Matrix/Matrix.node.js",
"dist/nodes/Mattermost/Mattermost.node.js",
"dist/nodes/Mautic/Mautic.node.js",
"dist/nodes/Mautic/MauticTrigger.node.js",
"dist/nodes/Medium/Medium.node.js",
"dist/nodes/Merge/Merge.node.js",
"dist/nodes/MessageBird/MessageBird.node.js",
"dist/nodes/Metabase/Metabase.node.js",
"dist/nodes/Microsoft/Dynamics/MicrosoftDynamicsCrm.node.js",
"dist/nodes/Microsoft/Excel/MicrosoftExcel.node.js",
"dist/nodes/Microsoft/GraphSecurity/MicrosoftGraphSecurity.node.js",
"dist/nodes/Microsoft/OneDrive/MicrosoftOneDrive.node.js",
"dist/nodes/Microsoft/Outlook/MicrosoftOutlook.node.js",
"dist/nodes/Microsoft/Sql/MicrosoftSql.node.js",
"dist/nodes/Microsoft/Teams/MicrosoftTeams.node.js",
"dist/nodes/Microsoft/ToDo/MicrosoftToDo.node.js",
"dist/nodes/Mindee/Mindee.node.js",
"dist/nodes/Misp/Misp.node.js",
"dist/nodes/Mocean/Mocean.node.js",
"dist/nodes/MondayCom/MondayCom.node.js",
"dist/nodes/MongoDb/MongoDb.node.js",
"dist/nodes/MonicaCrm/MonicaCrm.node.js",
"dist/nodes/MoveBinaryData/MoveBinaryData.node.js",
"dist/nodes/MQTT/Mqtt.node.js",
"dist/nodes/MQTT/MqttTrigger.node.js",
"dist/nodes/Msg91/Msg91.node.js",
"dist/nodes/MySql/MySql.node.js",
"dist/nodes/N8n/N8n.node.js",
"dist/nodes/N8nTrainingCustomerDatastore/N8nTrainingCustomerDatastore.node.js",
"dist/nodes/N8nTrainingCustomerMessenger/N8nTrainingCustomerMessenger.node.js",
"dist/nodes/N8nTrigger/N8nTrigger.node.js",
"dist/nodes/Nasa/Nasa.node.js",
"dist/nodes/Netlify/Netlify.node.js",
"dist/nodes/Netlify/NetlifyTrigger.node.js",
"dist/nodes/NextCloud/NextCloud.node.js",
"dist/nodes/NocoDB/NocoDB.node.js",
"dist/nodes/Brevo/Brevo.node.js",
"dist/nodes/Brevo/BrevoTrigger.node.js",
"dist/nodes/StickyNote/StickyNote.node.js",
"dist/nodes/NoOp/NoOp.node.js",
"dist/nodes/Onfleet/Onfleet.node.js",
"dist/nodes/Onfleet/OnfleetTrigger.node.js",
"dist/nodes/Notion/Notion.node.js",
"dist/nodes/Notion/NotionTrigger.node.js",
"dist/nodes/Npm/Npm.node.js",
"dist/nodes/Odoo/Odoo.node.js",
"dist/nodes/OneSimpleApi/OneSimpleApi.node.js",
"dist/nodes/OpenAi/OpenAi.node.js",
"dist/nodes/OpenThesaurus/OpenThesaurus.node.js",
"dist/nodes/OpenWeatherMap/OpenWeatherMap.node.js",
"dist/nodes/Orbit/Orbit.node.js",
"dist/nodes/Oura/Oura.node.js",
"dist/nodes/Paddle/Paddle.node.js",
"dist/nodes/PagerDuty/PagerDuty.node.js",
"dist/nodes/PayPal/PayPal.node.js",
"dist/nodes/PayPal/PayPalTrigger.node.js",
"dist/nodes/Peekalink/Peekalink.node.js",
"dist/nodes/Phantombuster/Phantombuster.node.js",
"dist/nodes/PhilipsHue/PhilipsHue.node.js",
"dist/nodes/Pipedrive/Pipedrive.node.js",
"dist/nodes/Pipedrive/PipedriveTrigger.node.js",
"dist/nodes/Plivo/Plivo.node.js",
"dist/nodes/PostBin/PostBin.node.js",
"dist/nodes/Postgres/Postgres.node.js",
"dist/nodes/Postgres/PostgresTrigger.node.js",
"dist/nodes/PostHog/PostHog.node.js",
"dist/nodes/Postmark/PostmarkTrigger.node.js",
"dist/nodes/ProfitWell/ProfitWell.node.js",
"dist/nodes/Pushbullet/Pushbullet.node.js",
"dist/nodes/Pushcut/Pushcut.node.js",
"dist/nodes/Pushcut/PushcutTrigger.node.js",
"dist/nodes/Pushover/Pushover.node.js",
"dist/nodes/QuestDb/QuestDb.node.js",
"dist/nodes/QuickBase/QuickBase.node.js",
"dist/nodes/QuickBooks/QuickBooks.node.js",
"dist/nodes/QuickChart/QuickChart.node.js",
"dist/nodes/RabbitMQ/RabbitMQ.node.js",
"dist/nodes/RabbitMQ/RabbitMQTrigger.node.js",
"dist/nodes/Raindrop/Raindrop.node.js",
"dist/nodes/ReadBinaryFile/ReadBinaryFile.node.js",
"dist/nodes/ReadBinaryFiles/ReadBinaryFiles.node.js",
"dist/nodes/ReadPdf/ReadPDF.node.js",
"dist/nodes/Reddit/Reddit.node.js",
"dist/nodes/Redis/Redis.node.js",
"dist/nodes/Redis/RedisTrigger.node.js",
"dist/nodes/RenameKeys/RenameKeys.node.js",
"dist/nodes/RespondToWebhook/RespondToWebhook.node.js",
"dist/nodes/Rocketchat/Rocketchat.node.js",
"dist/nodes/RssFeedRead/RssFeedRead.node.js",
"dist/nodes/RssFeedRead/RssFeedReadTrigger.node.js",
"dist/nodes/Rundeck/Rundeck.node.js",
"dist/nodes/S3/S3.node.js",
"dist/nodes/Salesforce/Salesforce.node.js",
"dist/nodes/Salesmate/Salesmate.node.js",
"dist/nodes/Schedule/ScheduleTrigger.node.js",
"dist/nodes/SeaTable/SeaTable.node.js",
"dist/nodes/SeaTable/SeaTableTrigger.node.js",
"dist/nodes/SecurityScorecard/SecurityScorecard.node.js",
"dist/nodes/Segment/Segment.node.js",
"dist/nodes/SendGrid/SendGrid.node.js",
"dist/nodes/Sendy/Sendy.node.js",
"dist/nodes/SentryIo/SentryIo.node.js",
"dist/nodes/ServiceNow/ServiceNow.node.js",
"dist/nodes/Set/Set.node.js",
"dist/nodes/Shopify/Shopify.node.js",
"dist/nodes/Shopify/ShopifyTrigger.node.js",
"dist/nodes/Signl4/Signl4.node.js",
"dist/nodes/Slack/Slack.node.js",
"dist/nodes/Sms77/Sms77.node.js",
"dist/nodes/Snowflake/Snowflake.node.js",
"dist/nodes/SplitInBatches/SplitInBatches.node.js",
"dist/nodes/Splunk/Splunk.node.js",
"dist/nodes/Spontit/Spontit.node.js",
"dist/nodes/Spotify/Spotify.node.js",
"dist/nodes/SpreadsheetFile/SpreadsheetFile.node.js",
"dist/nodes/SseTrigger/SseTrigger.node.js",
"dist/nodes/Ssh/Ssh.node.js",
"dist/nodes/Stackby/Stackby.node.js",
"dist/nodes/Start/Start.node.js",
"dist/nodes/StopAndError/StopAndError.node.js",
"dist/nodes/Storyblok/Storyblok.node.js",
"dist/nodes/Strapi/Strapi.node.js",
"dist/nodes/Strava/Strava.node.js",
"dist/nodes/Strava/StravaTrigger.node.js",
"dist/nodes/Stripe/Stripe.node.js",
"dist/nodes/Stripe/StripeTrigger.node.js",
"dist/nodes/Supabase/Supabase.node.js",
"dist/nodes/SurveyMonkey/SurveyMonkeyTrigger.node.js",
"dist/nodes/Switch/Switch.node.js",
"dist/nodes/SyncroMSP/SyncroMsp.node.js",
"dist/nodes/Taiga/Taiga.node.js",
"dist/nodes/Taiga/TaigaTrigger.node.js",
"dist/nodes/Tapfiliate/Tapfiliate.node.js",
"dist/nodes/Telegram/Telegram.node.js",
"dist/nodes/Telegram/TelegramTrigger.node.js",
"dist/nodes/TheHiveProject/TheHiveProject.node.js",
"dist/nodes/TheHiveProject/TheHiveProjectTrigger.node.js",
"dist/nodes/TheHive/TheHive.node.js",
"dist/nodes/TheHive/TheHiveTrigger.node.js",
"dist/nodes/TimescaleDb/TimescaleDb.node.js",
"dist/nodes/Todoist/Todoist.node.js",
"dist/nodes/Toggl/TogglTrigger.node.js",
"dist/nodes/Totp/Totp.node.js",
"dist/nodes/TravisCi/TravisCi.node.js",
"dist/nodes/Trello/Trello.node.js",
"dist/nodes/Trello/TrelloTrigger.node.js",
"dist/nodes/Twake/Twake.node.js",
"dist/nodes/Twilio/Twilio.node.js",
"dist/nodes/Twist/Twist.node.js",
"dist/nodes/Twitter/Twitter.node.js",
"dist/nodes/Typeform/TypeformTrigger.node.js",
"dist/nodes/UnleashedSoftware/UnleashedSoftware.node.js",
"dist/nodes/Uplead/Uplead.node.js",
"dist/nodes/UProc/UProc.node.js",
"dist/nodes/UptimeRobot/UptimeRobot.node.js",
"dist/nodes/UrlScanIo/UrlScanIo.node.js",
"dist/nodes/Vero/Vero.node.js",
"dist/nodes/Venafi/ProtectCloud/VenafiTlsProtectCloud.node.js",
"dist/nodes/Venafi/ProtectCloud/VenafiTlsProtectCloudTrigger.node.js",
"dist/nodes/Venafi/Datacenter/VenafiTlsProtectDatacenter.node.js",
"dist/nodes/Vonage/Vonage.node.js",
"dist/nodes/Wait/Wait.node.js",
"dist/nodes/Webflow/Webflow.node.js",
"dist/nodes/Webflow/WebflowTrigger.node.js",
"dist/nodes/Webhook/Webhook.node.js",
"dist/nodes/Wekan/Wekan.node.js",
"dist/nodes/WhatsApp/WhatsApp.node.js",
"dist/nodes/Wise/Wise.node.js",
"dist/nodes/Wise/WiseTrigger.node.js",
"dist/nodes/WooCommerce/WooCommerce.node.js",
"dist/nodes/WooCommerce/WooCommerceTrigger.node.js",
"dist/nodes/Wordpress/Wordpress.node.js",
"dist/nodes/Workable/WorkableTrigger.node.js",
"dist/nodes/WorkflowTrigger/WorkflowTrigger.node.js",
"dist/nodes/WriteBinaryFile/WriteBinaryFile.node.js",
"dist/nodes/Wufoo/WufooTrigger.node.js",
"dist/nodes/Xero/Xero.node.js",
"dist/nodes/Xml/Xml.node.js",
"dist/nodes/Yourls/Yourls.node.js",
"dist/nodes/Zammad/Zammad.node.js",
"dist/nodes/Zendesk/Zendesk.node.js",
"dist/nodes/Zendesk/ZendeskTrigger.node.js",
"dist/nodes/Zoho/ZohoCrm.node.js",
"dist/nodes/Zoom/Zoom.node.js",
"dist/nodes/Zulip/Zulip.node.js"
]
},
"devDependencies": {
"@types/amqplib": "^0.10.1",
"@types/aws4": "^1.5.1",
"@types/basic-auth": "^1.1.3",
"@types/cheerio": "^0.22.15",
"@types/cron": "~1.7.1",
"@types/eventsource": "^1.1.2",
"@types/express": "^4.17.6",
"@types/gm": "^1.25.0",
"@types/imap-simple": "^4.2.0",
"@types/js-nacl": "^1.3.0",
"@types/jsonwebtoken": "^9.0.1",
"@types/lodash": "^4.14.195",
"@types/lossless-json": "^1.0.0",
"@types/mailparser": "^2.7.3",
"@types/mime-types": "^2.1.0",
"@types/mssql": "^6.0.2",
"@types/node-ssh": "^7.0.1",
"@types/nodemailer": "^6.4.0",
"@types/promise-ftp": "^1.3.4",
"@types/redis": "^2.8.11",
"@types/request-promise-native": "~1.0.15",
"@types/rfc2047": "^2.0.1",
"@types/showdown": "^1.9.4",
"@types/snowflake-sdk": "^1.6.12",
"@types/ssh2-sftp-client": "^5.1.0",
"@types/tmp": "^0.2.0",
"@types/uuid": "^8.3.2",
"@types/xml2js": "^0.4.11",
"eslint-plugin-n8n-nodes-base": "^1.16.0",
"gulp": "^4.0.0",
"n8n-core": "1.14.1"
},
"dependencies": {
"@kafkajs/confluent-schema-registry": "1.0.6",
"@n8n/vm2": "^3.9.20",
"amqplib": "^0.10.3",
"aws4": "^1.8.0",
"basic-auth": "^2.0.1",
"change-case": "^4.1.1",
"cheerio": "1.0.0-rc.6",
"chokidar": "3.5.2",
"cron": "~1.7.2",
"csv-parse": "^5.5.0",
"currency-codes": "^2.1.0",
"eventsource": "^2.0.2",
"fast-glob": "^3.2.5",
"fflate": "^0.7.0",
"get-system-fonts": "^2.0.2",
"gm": "^1.25.0",
"iconv-lite": "^0.6.2",
"ics": "^2.27.0",
"imap-simple": "^4.3.0",
"isbot": "^3.6.13",
"iso-639-1": "^2.1.3",
"js-nacl": "^1.4.0",
"jsonwebtoken": "^9.0.0",
"kafkajs": "^1.14.0",
"ldapts": "^4.2.6",
"lodash": "^4.17.21",
"lossless-json": "^1.0.4",
"luxon": "^3.3.0",
"mailparser": "^3.2.0",
"minifaker": "^1.34.1",
"moment": "~2.29.2",
"moment-timezone": "^0.5.28",
"mongodb": "^4.17.1",
"mqtt": "^5.0.2",
"mssql": "^8.1.2",
"mysql2": "~2.3.0",
"nanoid": "^3.3.6",
"node-html-markdown": "^1.1.3",
"node-ssh": "^12.0.0",
"nodemailer": "^6.7.1",
"otpauth": "^9.1.1",
"pdfjs-dist": "^2.16.105",
"pg": "^8.3.0",
"pg-promise": "^10.5.8",
"pretty-bytes": "^5.6.0",
"promise-ftp": "^1.3.5",
"pyodide": "^0.23.4",
"redis": "^3.1.1",
"rfc2047": "^4.0.1",
"rhea": "^1.0.11",
"rss-parser": "^3.7.0",
"semver": "^7.5.4",
"showdown": "^2.0.3",
"simple-git": "^3.17.0",
"snowflake-sdk": "^1.8.0",
"ssh2-sftp-client": "^7.0.0",
"tmp-promise": "^3.0.2",
"typedi": "^0.10.0",
"uuid": "^8.3.2",
"xlsx": "https://cdn.sheetjs.com/xlsx-0.19.3/xlsx-0.19.3.tgz",
"xml2js": "^0.5.0",
"n8n-workflow": "1.14.1"
},
"scripts": {
"clean": "rimraf dist .turbo",
"dev": "pnpm watch",
"typecheck": "tsc",
"build": "tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json && gulp build:icons && gulp build:translations && pnpm build:metadata",
"build:translations": "gulp build:translations",
"build:metadata": "pnpm n8n-generate-known && pnpm n8n-generate-ui-types",
"format": "prettier --write . --ignore-path ../../.prettierignore",
"lint": "eslint . --quiet && node ./scripts/validate-load-options-methods.js",
"lintfix": "eslint . --fix",
"watch": "tsc-watch -p tsconfig.build.json --onCompilationComplete \"tsc-alias -p tsconfig.build.json\" --onSuccess \"pnpm n8n-generate-ui-types\"",
"test": "jest"
}
},
"extraction_time_ms": 5,
"extracted_at": "2025-06-07T17:49:22.782Z"
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,896 @@
{
"node_type": "n8n-nodes-base.HttpRequest",
"name": "HttpRequest",
"package_name": "n8n-nodes-base",
"code_hash": "5b5e2328474b7e85361c940dfe942e167b3f0057f38062f56d6b693f0a7ffe7e",
"code_length": 1343,
"source_location": "node_modules/n8n-nodes-base/dist/nodes/HttpRequest/HttpRequest.node.js",
"has_credentials": false,
"source_code": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.HttpRequest = void 0;\nconst n8n_workflow_1 = require(\"n8n-workflow\");\nconst HttpRequestV1_node_1 = require(\"./V1/HttpRequestV1.node\");\nconst HttpRequestV2_node_1 = require(\"./V2/HttpRequestV2.node\");\nconst HttpRequestV3_node_1 = require(\"./V3/HttpRequestV3.node\");\nclass HttpRequest extends n8n_workflow_1.VersionedNodeType {\n constructor() {\n const baseDescription = {\n displayName: 'HTTP Request',\n name: 'httpRequest',\n icon: 'fa:at',\n group: ['output'],\n subtitle: '={{$parameter[\"requestMethod\"] + \": \" + $parameter[\"url\"]}}',\n description: 'Makes an HTTP request and returns the response data',\n defaultVersion: 4.1,\n };\n const nodeVersions = {\n 1: new HttpRequestV1_node_1.HttpRequestV1(baseDescription),\n 2: new HttpRequestV2_node_1.HttpRequestV2(baseDescription),\n 3: new HttpRequestV3_node_1.HttpRequestV3(baseDescription),\n 4: new HttpRequestV3_node_1.HttpRequestV3(baseDescription),\n 4.1: new HttpRequestV3_node_1.HttpRequestV3(baseDescription),\n };\n super(nodeVersions, baseDescription);\n }\n}\nexports.HttpRequest = HttpRequest;\n//# sourceMappingURL=HttpRequest.node.js.map",
"package_info": {
"name": "n8n-nodes-base",
"version": "1.14.1",
"description": "Base nodes of n8n",
"license": "SEE LICENSE IN LICENSE.md",
"homepage": "https://n8n.io",
"author": {
"name": "Jan Oberhauser",
"email": "jan@n8n.io"
},
"main": "index.js",
"repository": {
"type": "git",
"url": "git+https://github.com/n8n-io/n8n.git"
},
"files": [
"dist"
],
"n8n": {
"credentials": [
"dist/credentials/ActionNetworkApi.credentials.js",
"dist/credentials/ActiveCampaignApi.credentials.js",
"dist/credentials/AcuitySchedulingApi.credentials.js",
"dist/credentials/AcuitySchedulingOAuth2Api.credentials.js",
"dist/credentials/AdaloApi.credentials.js",
"dist/credentials/AffinityApi.credentials.js",
"dist/credentials/AgileCrmApi.credentials.js",
"dist/credentials/AirtableApi.credentials.js",
"dist/credentials/AirtableOAuth2Api.credentials.js",
"dist/credentials/AirtableTokenApi.credentials.js",
"dist/credentials/AlienVaultApi.credentials.js",
"dist/credentials/Amqp.credentials.js",
"dist/credentials/ApiTemplateIoApi.credentials.js",
"dist/credentials/AsanaApi.credentials.js",
"dist/credentials/AsanaOAuth2Api.credentials.js",
"dist/credentials/Auth0ManagementApi.credentials.js",
"dist/credentials/AutomizyApi.credentials.js",
"dist/credentials/AutopilotApi.credentials.js",
"dist/credentials/Aws.credentials.js",
"dist/credentials/BambooHrApi.credentials.js",
"dist/credentials/BannerbearApi.credentials.js",
"dist/credentials/BaserowApi.credentials.js",
"dist/credentials/BeeminderApi.credentials.js",
"dist/credentials/BitbucketApi.credentials.js",
"dist/credentials/BitlyApi.credentials.js",
"dist/credentials/BitlyOAuth2Api.credentials.js",
"dist/credentials/BitwardenApi.credentials.js",
"dist/credentials/BoxOAuth2Api.credentials.js",
"dist/credentials/BrandfetchApi.credentials.js",
"dist/credentials/BubbleApi.credentials.js",
"dist/credentials/CalApi.credentials.js",
"dist/credentials/CalendlyApi.credentials.js",
"dist/credentials/CarbonBlackApi.credentials.js",
"dist/credentials/ChargebeeApi.credentials.js",
"dist/credentials/CircleCiApi.credentials.js",
"dist/credentials/CiscoMerakiApi.credentials.js",
"dist/credentials/CiscoSecureEndpointApi.credentials.js",
"dist/credentials/CiscoWebexOAuth2Api.credentials.js",
"dist/credentials/CiscoUmbrellaApi.credentials.js",
"dist/credentials/CitrixAdcApi.credentials.js",
"dist/credentials/CloudflareApi.credentials.js",
"dist/credentials/ClearbitApi.credentials.js",
"dist/credentials/ClickUpApi.credentials.js",
"dist/credentials/ClickUpOAuth2Api.credentials.js",
"dist/credentials/ClockifyApi.credentials.js",
"dist/credentials/CockpitApi.credentials.js",
"dist/credentials/CodaApi.credentials.js",
"dist/credentials/ContentfulApi.credentials.js",
"dist/credentials/ConvertKitApi.credentials.js",
"dist/credentials/CopperApi.credentials.js",
"dist/credentials/CortexApi.credentials.js",
"dist/credentials/CrateDb.credentials.js",
"dist/credentials/CrowdStrikeOAuth2Api.credentials.js",
"dist/credentials/CrowdDevApi.credentials.js",
"dist/credentials/CustomerIoApi.credentials.js",
"dist/credentials/DeepLApi.credentials.js",
"dist/credentials/DemioApi.credentials.js",
"dist/credentials/DhlApi.credentials.js",
"dist/credentials/DiscourseApi.credentials.js",
"dist/credentials/DisqusApi.credentials.js",
"dist/credentials/DriftApi.credentials.js",
"dist/credentials/DriftOAuth2Api.credentials.js",
"dist/credentials/DropboxApi.credentials.js",
"dist/credentials/DropboxOAuth2Api.credentials.js",
"dist/credentials/DropcontactApi.credentials.js",
"dist/credentials/EgoiApi.credentials.js",
"dist/credentials/ElasticsearchApi.credentials.js",
"dist/credentials/ElasticSecurityApi.credentials.js",
"dist/credentials/EmeliaApi.credentials.js",
"dist/credentials/ERPNextApi.credentials.js",
"dist/credentials/EventbriteApi.credentials.js",
"dist/credentials/EventbriteOAuth2Api.credentials.js",
"dist/credentials/F5BigIpApi.credentials.js",
"dist/credentials/FacebookGraphApi.credentials.js",
"dist/credentials/FacebookGraphAppApi.credentials.js",
"dist/credentials/FacebookLeadAdsOAuth2Api.credentials.js",
"dist/credentials/FigmaApi.credentials.js",
"dist/credentials/FileMaker.credentials.js",
"dist/credentials/FlowApi.credentials.js",
"dist/credentials/FormIoApi.credentials.js",
"dist/credentials/FormstackApi.credentials.js",
"dist/credentials/FormstackOAuth2Api.credentials.js",
"dist/credentials/FortiGateApi.credentials.js",
"dist/credentials/FreshdeskApi.credentials.js",
"dist/credentials/FreshserviceApi.credentials.js",
"dist/credentials/FreshworksCrmApi.credentials.js",
"dist/credentials/Ftp.credentials.js",
"dist/credentials/GetResponseApi.credentials.js",
"dist/credentials/GetResponseOAuth2Api.credentials.js",
"dist/credentials/GhostAdminApi.credentials.js",
"dist/credentials/GhostContentApi.credentials.js",
"dist/credentials/GithubApi.credentials.js",
"dist/credentials/GithubOAuth2Api.credentials.js",
"dist/credentials/GitlabApi.credentials.js",
"dist/credentials/GitlabOAuth2Api.credentials.js",
"dist/credentials/GitPassword.credentials.js",
"dist/credentials/GmailOAuth2Api.credentials.js",
"dist/credentials/GoogleAdsOAuth2Api.credentials.js",
"dist/credentials/GoogleAnalyticsOAuth2Api.credentials.js",
"dist/credentials/GoogleApi.credentials.js",
"dist/credentials/GoogleBigQueryOAuth2Api.credentials.js",
"dist/credentials/GoogleBooksOAuth2Api.credentials.js",
"dist/credentials/GoogleCalendarOAuth2Api.credentials.js",
"dist/credentials/GoogleCloudNaturalLanguageOAuth2Api.credentials.js",
"dist/credentials/GoogleCloudStorageOAuth2Api.credentials.js",
"dist/credentials/GoogleContactsOAuth2Api.credentials.js",
"dist/credentials/GoogleDocsOAuth2Api.credentials.js",
"dist/credentials/GoogleDriveOAuth2Api.credentials.js",
"dist/credentials/GoogleFirebaseCloudFirestoreOAuth2Api.credentials.js",
"dist/credentials/GoogleFirebaseRealtimeDatabaseOAuth2Api.credentials.js",
"dist/credentials/GoogleOAuth2Api.credentials.js",
"dist/credentials/GooglePerspectiveOAuth2Api.credentials.js",
"dist/credentials/GoogleSheetsOAuth2Api.credentials.js",
"dist/credentials/GoogleSheetsTriggerOAuth2Api.credentials.js",
"dist/credentials/GoogleSlidesOAuth2Api.credentials.js",
"dist/credentials/GoogleTasksOAuth2Api.credentials.js",
"dist/credentials/GoogleTranslateOAuth2Api.credentials.js",
"dist/credentials/GotifyApi.credentials.js",
"dist/credentials/GoToWebinarOAuth2Api.credentials.js",
"dist/credentials/GristApi.credentials.js",
"dist/credentials/GrafanaApi.credentials.js",
"dist/credentials/GSuiteAdminOAuth2Api.credentials.js",
"dist/credentials/GumroadApi.credentials.js",
"dist/credentials/HaloPSAApi.credentials.js",
"dist/credentials/HarvestApi.credentials.js",
"dist/credentials/HarvestOAuth2Api.credentials.js",
"dist/credentials/HelpScoutOAuth2Api.credentials.js",
"dist/credentials/HighLevelApi.credentials.js",
"dist/credentials/HomeAssistantApi.credentials.js",
"dist/credentials/HttpBasicAuth.credentials.js",
"dist/credentials/HttpDigestAuth.credentials.js",
"dist/credentials/HttpHeaderAuth.credentials.js",
"dist/credentials/HttpCustomAuth.credentials.js",
"dist/credentials/HttpQueryAuth.credentials.js",
"dist/credentials/HubspotApi.credentials.js",
"dist/credentials/HubspotAppToken.credentials.js",
"dist/credentials/HubspotDeveloperApi.credentials.js",
"dist/credentials/HubspotOAuth2Api.credentials.js",
"dist/credentials/HumanticAiApi.credentials.js",
"dist/credentials/HunterApi.credentials.js",
"dist/credentials/HybridAnalysisApi.credentials.js",
"dist/credentials/Imap.credentials.js",
"dist/credentials/ImpervaWafApi.credentials.js",
"dist/credentials/IntercomApi.credentials.js",
"dist/credentials/InvoiceNinjaApi.credentials.js",
"dist/credentials/IterableApi.credentials.js",
"dist/credentials/JenkinsApi.credentials.js",
"dist/credentials/JiraSoftwareCloudApi.credentials.js",
"dist/credentials/JiraSoftwareServerApi.credentials.js",
"dist/credentials/JotFormApi.credentials.js",
"dist/credentials/Kafka.credentials.js",
"dist/credentials/KeapOAuth2Api.credentials.js",
"dist/credentials/KibanaApi.credentials.js",
"dist/credentials/KitemakerApi.credentials.js",
"dist/credentials/KoBoToolboxApi.credentials.js",
"dist/credentials/Ldap.credentials.js",
"dist/credentials/LemlistApi.credentials.js",
"dist/credentials/LinearApi.credentials.js",
"dist/credentials/LinearOAuth2Api.credentials.js",
"dist/credentials/LineNotifyOAuth2Api.credentials.js",
"dist/credentials/LingvaNexApi.credentials.js",
"dist/credentials/LinkedInOAuth2Api.credentials.js",
"dist/credentials/LoneScaleApi.credentials.js",
"dist/credentials/Magento2Api.credentials.js",
"dist/credentials/MailcheckApi.credentials.js",
"dist/credentials/MailchimpApi.credentials.js",
"dist/credentials/MailchimpOAuth2Api.credentials.js",
"dist/credentials/MailerLiteApi.credentials.js",
"dist/credentials/MailgunApi.credentials.js",
"dist/credentials/MailjetEmailApi.credentials.js",
"dist/credentials/MailjetSmsApi.credentials.js",
"dist/credentials/MandrillApi.credentials.js",
"dist/credentials/MarketstackApi.credentials.js",
"dist/credentials/MatrixApi.credentials.js",
"dist/credentials/MattermostApi.credentials.js",
"dist/credentials/MauticApi.credentials.js",
"dist/credentials/MauticOAuth2Api.credentials.js",
"dist/credentials/MediumApi.credentials.js",
"dist/credentials/MediumOAuth2Api.credentials.js",
"dist/credentials/MetabaseApi.credentials.js",
"dist/credentials/MessageBirdApi.credentials.js",
"dist/credentials/MetabaseApi.credentials.js",
"dist/credentials/MicrosoftDynamicsOAuth2Api.credentials.js",
"dist/credentials/MicrosoftEntraOAuth2Api.credentials.js",
"dist/credentials/MicrosoftExcelOAuth2Api.credentials.js",
"dist/credentials/MicrosoftGraphSecurityOAuth2Api.credentials.js",
"dist/credentials/MicrosoftOAuth2Api.credentials.js",
"dist/credentials/MicrosoftOneDriveOAuth2Api.credentials.js",
"dist/credentials/MicrosoftOutlookOAuth2Api.credentials.js",
"dist/credentials/MicrosoftSql.credentials.js",
"dist/credentials/MicrosoftTeamsOAuth2Api.credentials.js",
"dist/credentials/MicrosoftToDoOAuth2Api.credentials.js",
"dist/credentials/MindeeInvoiceApi.credentials.js",
"dist/credentials/MindeeReceiptApi.credentials.js",
"dist/credentials/MispApi.credentials.js",
"dist/credentials/MistApi.credentials.js",
"dist/credentials/MoceanApi.credentials.js",
"dist/credentials/MondayComApi.credentials.js",
"dist/credentials/MondayComOAuth2Api.credentials.js",
"dist/credentials/MongoDb.credentials.js",
"dist/credentials/MonicaCrmApi.credentials.js",
"dist/credentials/Mqtt.credentials.js",
"dist/credentials/Msg91Api.credentials.js",
"dist/credentials/MySql.credentials.js",
"dist/credentials/N8nApi.credentials.js",
"dist/credentials/NasaApi.credentials.js",
"dist/credentials/NetlifyApi.credentials.js",
"dist/credentials/NextCloudApi.credentials.js",
"dist/credentials/NextCloudOAuth2Api.credentials.js",
"dist/credentials/NocoDb.credentials.js",
"dist/credentials/NocoDbApiToken.credentials.js",
"dist/credentials/NotionApi.credentials.js",
"dist/credentials/NotionOAuth2Api.credentials.js",
"dist/credentials/NpmApi.credentials.js",
"dist/credentials/OAuth1Api.credentials.js",
"dist/credentials/OAuth2Api.credentials.js",
"dist/credentials/OdooApi.credentials.js",
"dist/credentials/OktaApi.credentials.js",
"dist/credentials/OneSimpleApi.credentials.js",
"dist/credentials/OnfleetApi.credentials.js",
"dist/credentials/OpenAiApi.credentials.js",
"dist/credentials/OpenCTIApi.credentials.js",
"dist/credentials/OpenWeatherMapApi.credentials.js",
"dist/credentials/OrbitApi.credentials.js",
"dist/credentials/OuraApi.credentials.js",
"dist/credentials/PaddleApi.credentials.js",
"dist/credentials/PagerDutyApi.credentials.js",
"dist/credentials/PagerDutyOAuth2Api.credentials.js",
"dist/credentials/PayPalApi.credentials.js",
"dist/credentials/PeekalinkApi.credentials.js",
"dist/credentials/PhantombusterApi.credentials.js",
"dist/credentials/PhilipsHueOAuth2Api.credentials.js",
"dist/credentials/PipedriveApi.credentials.js",
"dist/credentials/PipedriveOAuth2Api.credentials.js",
"dist/credentials/PlivoApi.credentials.js",
"dist/credentials/Postgres.credentials.js",
"dist/credentials/PostHogApi.credentials.js",
"dist/credentials/PostmarkApi.credentials.js",
"dist/credentials/ProfitWellApi.credentials.js",
"dist/credentials/PushbulletOAuth2Api.credentials.js",
"dist/credentials/PushcutApi.credentials.js",
"dist/credentials/PushoverApi.credentials.js",
"dist/credentials/QRadarApi.credentials.js",
"dist/credentials/QualysApi.credentials.js",
"dist/credentials/QuestDb.credentials.js",
"dist/credentials/QuickBaseApi.credentials.js",
"dist/credentials/QuickBooksOAuth2Api.credentials.js",
"dist/credentials/RabbitMQ.credentials.js",
"dist/credentials/RaindropOAuth2Api.credentials.js",
"dist/credentials/RecordedFutureApi.credentials.js",
"dist/credentials/RedditOAuth2Api.credentials.js",
"dist/credentials/Redis.credentials.js",
"dist/credentials/RocketchatApi.credentials.js",
"dist/credentials/RundeckApi.credentials.js",
"dist/credentials/S3.credentials.js",
"dist/credentials/SalesforceJwtApi.credentials.js",
"dist/credentials/SalesforceOAuth2Api.credentials.js",
"dist/credentials/SalesmateApi.credentials.js",
"dist/credentials/SeaTableApi.credentials.js",
"dist/credentials/SecurityScorecardApi.credentials.js",
"dist/credentials/SegmentApi.credentials.js",
"dist/credentials/SekoiaApi.credentials.js",
"dist/credentials/SendGridApi.credentials.js",
"dist/credentials/BrevoApi.credentials.js",
"dist/credentials/SendyApi.credentials.js",
"dist/credentials/SentryIoApi.credentials.js",
"dist/credentials/SentryIoOAuth2Api.credentials.js",
"dist/credentials/SentryIoServerApi.credentials.js",
"dist/credentials/ServiceNowOAuth2Api.credentials.js",
"dist/credentials/ServiceNowBasicApi.credentials.js",
"dist/credentials/Sftp.credentials.js",
"dist/credentials/ShopifyApi.credentials.js",
"dist/credentials/ShopifyAccessTokenApi.credentials.js",
"dist/credentials/ShopifyOAuth2Api.credentials.js",
"dist/credentials/Signl4Api.credentials.js",
"dist/credentials/SlackApi.credentials.js",
"dist/credentials/SlackOAuth2Api.credentials.js",
"dist/credentials/Sms77Api.credentials.js",
"dist/credentials/Smtp.credentials.js",
"dist/credentials/Snowflake.credentials.js",
"dist/credentials/SplunkApi.credentials.js",
"dist/credentials/SpontitApi.credentials.js",
"dist/credentials/SpotifyOAuth2Api.credentials.js",
"dist/credentials/ShufflerApi.credentials.js",
"dist/credentials/SshPassword.credentials.js",
"dist/credentials/SshPrivateKey.credentials.js",
"dist/credentials/StackbyApi.credentials.js",
"dist/credentials/StoryblokContentApi.credentials.js",
"dist/credentials/StoryblokManagementApi.credentials.js",
"dist/credentials/StrapiApi.credentials.js",
"dist/credentials/StrapiTokenApi.credentials.js",
"dist/credentials/StravaOAuth2Api.credentials.js",
"dist/credentials/StripeApi.credentials.js",
"dist/credentials/SupabaseApi.credentials.js",
"dist/credentials/SurveyMonkeyApi.credentials.js",
"dist/credentials/SurveyMonkeyOAuth2Api.credentials.js",
"dist/credentials/SyncroMspApi.credentials.js",
"dist/credentials/TaigaApi.credentials.js",
"dist/credentials/TapfiliateApi.credentials.js",
"dist/credentials/TelegramApi.credentials.js",
"dist/credentials/TheHiveProjectApi.credentials.js",
"dist/credentials/TheHiveApi.credentials.js",
"dist/credentials/TimescaleDb.credentials.js",
"dist/credentials/TodoistApi.credentials.js",
"dist/credentials/TodoistOAuth2Api.credentials.js",
"dist/credentials/TogglApi.credentials.js",
"dist/credentials/TotpApi.credentials.js",
"dist/credentials/TravisCiApi.credentials.js",
"dist/credentials/TrellixEpoApi.credentials.js",
"dist/credentials/TrelloApi.credentials.js",
"dist/credentials/TwakeCloudApi.credentials.js",
"dist/credentials/TwakeServerApi.credentials.js",
"dist/credentials/TwilioApi.credentials.js",
"dist/credentials/TwistOAuth2Api.credentials.js",
"dist/credentials/TwitterOAuth1Api.credentials.js",
"dist/credentials/TwitterOAuth2Api.credentials.js",
"dist/credentials/TypeformApi.credentials.js",
"dist/credentials/TypeformOAuth2Api.credentials.js",
"dist/credentials/UnleashedSoftwareApi.credentials.js",
"dist/credentials/UpleadApi.credentials.js",
"dist/credentials/UProcApi.credentials.js",
"dist/credentials/UptimeRobotApi.credentials.js",
"dist/credentials/UrlScanIoApi.credentials.js",
"dist/credentials/VeroApi.credentials.js",
"dist/credentials/VirusTotalApi.credentials.js",
"dist/credentials/VonageApi.credentials.js",
"dist/credentials/VenafiTlsProtectCloudApi.credentials.js",
"dist/credentials/VenafiTlsProtectDatacenterApi.credentials.js",
"dist/credentials/WebflowApi.credentials.js",
"dist/credentials/WebflowOAuth2Api.credentials.js",
"dist/credentials/WekanApi.credentials.js",
"dist/credentials/WhatsAppApi.credentials.js",
"dist/credentials/WiseApi.credentials.js",
"dist/credentials/WooCommerceApi.credentials.js",
"dist/credentials/WordpressApi.credentials.js",
"dist/credentials/WorkableApi.credentials.js",
"dist/credentials/WufooApi.credentials.js",
"dist/credentials/XeroOAuth2Api.credentials.js",
"dist/credentials/YourlsApi.credentials.js",
"dist/credentials/YouTubeOAuth2Api.credentials.js",
"dist/credentials/ZammadBasicAuthApi.credentials.js",
"dist/credentials/ZammadTokenAuthApi.credentials.js",
"dist/credentials/ZendeskApi.credentials.js",
"dist/credentials/ZendeskOAuth2Api.credentials.js",
"dist/credentials/ZohoOAuth2Api.credentials.js",
"dist/credentials/ZoomApi.credentials.js",
"dist/credentials/ZoomOAuth2Api.credentials.js",
"dist/credentials/ZscalerZiaApi.credentials.js",
"dist/credentials/ZulipApi.credentials.js"
],
"nodes": [
"dist/nodes/ActionNetwork/ActionNetwork.node.js",
"dist/nodes/ActiveCampaign/ActiveCampaign.node.js",
"dist/nodes/ActiveCampaign/ActiveCampaignTrigger.node.js",
"dist/nodes/AcuityScheduling/AcuitySchedulingTrigger.node.js",
"dist/nodes/Adalo/Adalo.node.js",
"dist/nodes/Affinity/Affinity.node.js",
"dist/nodes/Affinity/AffinityTrigger.node.js",
"dist/nodes/AgileCrm/AgileCrm.node.js",
"dist/nodes/Airtable/Airtable.node.js",
"dist/nodes/Airtable/AirtableTrigger.node.js",
"dist/nodes/Amqp/Amqp.node.js",
"dist/nodes/Amqp/AmqpTrigger.node.js",
"dist/nodes/ApiTemplateIo/ApiTemplateIo.node.js",
"dist/nodes/Asana/Asana.node.js",
"dist/nodes/Asana/AsanaTrigger.node.js",
"dist/nodes/Automizy/Automizy.node.js",
"dist/nodes/Autopilot/Autopilot.node.js",
"dist/nodes/Autopilot/AutopilotTrigger.node.js",
"dist/nodes/Aws/AwsLambda.node.js",
"dist/nodes/Aws/AwsSns.node.js",
"dist/nodes/Aws/AwsSnsTrigger.node.js",
"dist/nodes/Aws/CertificateManager/AwsCertificateManager.node.js",
"dist/nodes/Aws/Comprehend/AwsComprehend.node.js",
"dist/nodes/Aws/DynamoDB/AwsDynamoDB.node.js",
"dist/nodes/Aws/ELB/AwsElb.node.js",
"dist/nodes/Aws/Rekognition/AwsRekognition.node.js",
"dist/nodes/Aws/S3/AwsS3.node.js",
"dist/nodes/Aws/SES/AwsSes.node.js",
"dist/nodes/Aws/SQS/AwsSqs.node.js",
"dist/nodes/Aws/Textract/AwsTextract.node.js",
"dist/nodes/Aws/Transcribe/AwsTranscribe.node.js",
"dist/nodes/BambooHr/BambooHr.node.js",
"dist/nodes/Bannerbear/Bannerbear.node.js",
"dist/nodes/Baserow/Baserow.node.js",
"dist/nodes/Beeminder/Beeminder.node.js",
"dist/nodes/Bitbucket/BitbucketTrigger.node.js",
"dist/nodes/Bitly/Bitly.node.js",
"dist/nodes/Bitwarden/Bitwarden.node.js",
"dist/nodes/Box/Box.node.js",
"dist/nodes/Box/BoxTrigger.node.js",
"dist/nodes/Brandfetch/Brandfetch.node.js",
"dist/nodes/Bubble/Bubble.node.js",
"dist/nodes/Cal/CalTrigger.node.js",
"dist/nodes/Calendly/CalendlyTrigger.node.js",
"dist/nodes/Chargebee/Chargebee.node.js",
"dist/nodes/Chargebee/ChargebeeTrigger.node.js",
"dist/nodes/CircleCi/CircleCi.node.js",
"dist/nodes/Cisco/Webex/CiscoWebex.node.js",
"dist/nodes/Citrix/ADC/CitrixAdc.node.js",
"dist/nodes/Cisco/Webex/CiscoWebexTrigger.node.js",
"dist/nodes/Cloudflare/Cloudflare.node.js",
"dist/nodes/Clearbit/Clearbit.node.js",
"dist/nodes/ClickUp/ClickUp.node.js",
"dist/nodes/ClickUp/ClickUpTrigger.node.js",
"dist/nodes/Clockify/Clockify.node.js",
"dist/nodes/Clockify/ClockifyTrigger.node.js",
"dist/nodes/Cockpit/Cockpit.node.js",
"dist/nodes/Coda/Coda.node.js",
"dist/nodes/Code/Code.node.js",
"dist/nodes/CoinGecko/CoinGecko.node.js",
"dist/nodes/CompareDatasets/CompareDatasets.node.js",
"dist/nodes/Compression/Compression.node.js",
"dist/nodes/Contentful/Contentful.node.js",
"dist/nodes/ConvertKit/ConvertKit.node.js",
"dist/nodes/ConvertKit/ConvertKitTrigger.node.js",
"dist/nodes/Copper/Copper.node.js",
"dist/nodes/Copper/CopperTrigger.node.js",
"dist/nodes/Cortex/Cortex.node.js",
"dist/nodes/CrateDb/CrateDb.node.js",
"dist/nodes/Cron/Cron.node.js",
"dist/nodes/CrowdDev/CrowdDev.node.js",
"dist/nodes/CrowdDev/CrowdDevTrigger.node.js",
"dist/nodes/Crypto/Crypto.node.js",
"dist/nodes/CustomerIo/CustomerIo.node.js",
"dist/nodes/CustomerIo/CustomerIoTrigger.node.js",
"dist/nodes/DateTime/DateTime.node.js",
"dist/nodes/DebugHelper/DebugHelper.node.js",
"dist/nodes/DeepL/DeepL.node.js",
"dist/nodes/Demio/Demio.node.js",
"dist/nodes/Dhl/Dhl.node.js",
"dist/nodes/Discord/Discord.node.js",
"dist/nodes/Discourse/Discourse.node.js",
"dist/nodes/Disqus/Disqus.node.js",
"dist/nodes/Drift/Drift.node.js",
"dist/nodes/Dropbox/Dropbox.node.js",
"dist/nodes/Dropcontact/Dropcontact.node.js",
"dist/nodes/EditImage/EditImage.node.js",
"dist/nodes/E2eTest/E2eTest.node.js",
"dist/nodes/Egoi/Egoi.node.js",
"dist/nodes/Elastic/Elasticsearch/Elasticsearch.node.js",
"dist/nodes/Elastic/ElasticSecurity/ElasticSecurity.node.js",
"dist/nodes/EmailReadImap/EmailReadImap.node.js",
"dist/nodes/EmailSend/EmailSend.node.js",
"dist/nodes/Emelia/Emelia.node.js",
"dist/nodes/Emelia/EmeliaTrigger.node.js",
"dist/nodes/ERPNext/ERPNext.node.js",
"dist/nodes/ErrorTrigger/ErrorTrigger.node.js",
"dist/nodes/Eventbrite/EventbriteTrigger.node.js",
"dist/nodes/ExecuteCommand/ExecuteCommand.node.js",
"dist/nodes/ExecuteWorkflow/ExecuteWorkflow.node.js",
"dist/nodes/ExecuteWorkflowTrigger/ExecuteWorkflowTrigger.node.js",
"dist/nodes/ExecutionData/ExecutionData.node.js",
"dist/nodes/Facebook/FacebookGraphApi.node.js",
"dist/nodes/Facebook/FacebookTrigger.node.js",
"dist/nodes/FacebookLeadAds/FacebookLeadAdsTrigger.node.js",
"dist/nodes/Figma/FigmaTrigger.node.js",
"dist/nodes/FileMaker/FileMaker.node.js",
"dist/nodes/Filter/Filter.node.js",
"dist/nodes/Flow/Flow.node.js",
"dist/nodes/Flow/FlowTrigger.node.js",
"dist/nodes/Form/FormTrigger.node.js",
"dist/nodes/FormIo/FormIoTrigger.node.js",
"dist/nodes/Formstack/FormstackTrigger.node.js",
"dist/nodes/Freshdesk/Freshdesk.node.js",
"dist/nodes/Freshservice/Freshservice.node.js",
"dist/nodes/FreshworksCrm/FreshworksCrm.node.js",
"dist/nodes/Ftp/Ftp.node.js",
"dist/nodes/Function/Function.node.js",
"dist/nodes/FunctionItem/FunctionItem.node.js",
"dist/nodes/GetResponse/GetResponse.node.js",
"dist/nodes/GetResponse/GetResponseTrigger.node.js",
"dist/nodes/Ghost/Ghost.node.js",
"dist/nodes/Git/Git.node.js",
"dist/nodes/Github/Github.node.js",
"dist/nodes/Github/GithubTrigger.node.js",
"dist/nodes/Gitlab/Gitlab.node.js",
"dist/nodes/Gitlab/GitlabTrigger.node.js",
"dist/nodes/Google/Ads/GoogleAds.node.js",
"dist/nodes/Google/Analytics/GoogleAnalytics.node.js",
"dist/nodes/Google/BigQuery/GoogleBigQuery.node.js",
"dist/nodes/Google/Books/GoogleBooks.node.js",
"dist/nodes/Google/Calendar/GoogleCalendar.node.js",
"dist/nodes/Google/Calendar/GoogleCalendarTrigger.node.js",
"dist/nodes/Google/Chat/GoogleChat.node.js",
"dist/nodes/Google/CloudNaturalLanguage/GoogleCloudNaturalLanguage.node.js",
"dist/nodes/Google/CloudStorage/GoogleCloudStorage.node.js",
"dist/nodes/Google/Contacts/GoogleContacts.node.js",
"dist/nodes/Google/Docs/GoogleDocs.node.js",
"dist/nodes/Google/Drive/GoogleDrive.node.js",
"dist/nodes/Google/Drive/GoogleDriveTrigger.node.js",
"dist/nodes/Google/Firebase/CloudFirestore/GoogleFirebaseCloudFirestore.node.js",
"dist/nodes/Google/Firebase/RealtimeDatabase/GoogleFirebaseRealtimeDatabase.node.js",
"dist/nodes/Google/Gmail/Gmail.node.js",
"dist/nodes/Google/Gmail/GmailTrigger.node.js",
"dist/nodes/Google/GSuiteAdmin/GSuiteAdmin.node.js",
"dist/nodes/Google/Perspective/GooglePerspective.node.js",
"dist/nodes/Google/Sheet/GoogleSheets.node.js",
"dist/nodes/Google/Sheet/GoogleSheetsTrigger.node.js",
"dist/nodes/Google/Slides/GoogleSlides.node.js",
"dist/nodes/Google/Task/GoogleTasks.node.js",
"dist/nodes/Google/Translate/GoogleTranslate.node.js",
"dist/nodes/Google/YouTube/YouTube.node.js",
"dist/nodes/Gotify/Gotify.node.js",
"dist/nodes/GoToWebinar/GoToWebinar.node.js",
"dist/nodes/Grafana/Grafana.node.js",
"dist/nodes/GraphQL/GraphQL.node.js",
"dist/nodes/Grist/Grist.node.js",
"dist/nodes/Gumroad/GumroadTrigger.node.js",
"dist/nodes/HackerNews/HackerNews.node.js",
"dist/nodes/HaloPSA/HaloPSA.node.js",
"dist/nodes/Harvest/Harvest.node.js",
"dist/nodes/HelpScout/HelpScout.node.js",
"dist/nodes/HelpScout/HelpScoutTrigger.node.js",
"dist/nodes/HighLevel/HighLevel.node.js",
"dist/nodes/HomeAssistant/HomeAssistant.node.js",
"dist/nodes/HtmlExtract/HtmlExtract.node.js",
"dist/nodes/Html/Html.node.js",
"dist/nodes/HttpRequest/HttpRequest.node.js",
"dist/nodes/Hubspot/Hubspot.node.js",
"dist/nodes/Hubspot/HubspotTrigger.node.js",
"dist/nodes/HumanticAI/HumanticAi.node.js",
"dist/nodes/Hunter/Hunter.node.js",
"dist/nodes/ICalendar/ICalendar.node.js",
"dist/nodes/If/If.node.js",
"dist/nodes/Intercom/Intercom.node.js",
"dist/nodes/Interval/Interval.node.js",
"dist/nodes/InvoiceNinja/InvoiceNinja.node.js",
"dist/nodes/InvoiceNinja/InvoiceNinjaTrigger.node.js",
"dist/nodes/ItemLists/ItemLists.node.js",
"dist/nodes/Iterable/Iterable.node.js",
"dist/nodes/Jenkins/Jenkins.node.js",
"dist/nodes/Jira/Jira.node.js",
"dist/nodes/Jira/JiraTrigger.node.js",
"dist/nodes/JotForm/JotFormTrigger.node.js",
"dist/nodes/Kafka/Kafka.node.js",
"dist/nodes/Kafka/KafkaTrigger.node.js",
"dist/nodes/Keap/Keap.node.js",
"dist/nodes/Keap/KeapTrigger.node.js",
"dist/nodes/Kitemaker/Kitemaker.node.js",
"dist/nodes/KoBoToolbox/KoBoToolbox.node.js",
"dist/nodes/KoBoToolbox/KoBoToolboxTrigger.node.js",
"dist/nodes/Ldap/Ldap.node.js",
"dist/nodes/Lemlist/Lemlist.node.js",
"dist/nodes/Lemlist/LemlistTrigger.node.js",
"dist/nodes/Line/Line.node.js",
"dist/nodes/Linear/Linear.node.js",
"dist/nodes/Linear/LinearTrigger.node.js",
"dist/nodes/LingvaNex/LingvaNex.node.js",
"dist/nodes/LinkedIn/LinkedIn.node.js",
"dist/nodes/LocalFileTrigger/LocalFileTrigger.node.js",
"dist/nodes/LoneScale/LoneScaleTrigger.node.js",
"dist/nodes/LoneScale/LoneScale.node.js",
"dist/nodes/Magento/Magento2.node.js",
"dist/nodes/Mailcheck/Mailcheck.node.js",
"dist/nodes/Mailchimp/Mailchimp.node.js",
"dist/nodes/Mailchimp/MailchimpTrigger.node.js",
"dist/nodes/MailerLite/MailerLite.node.js",
"dist/nodes/MailerLite/MailerLiteTrigger.node.js",
"dist/nodes/Mailgun/Mailgun.node.js",
"dist/nodes/Mailjet/Mailjet.node.js",
"dist/nodes/Mailjet/MailjetTrigger.node.js",
"dist/nodes/Mandrill/Mandrill.node.js",
"dist/nodes/ManualTrigger/ManualTrigger.node.js",
"dist/nodes/Markdown/Markdown.node.js",
"dist/nodes/Marketstack/Marketstack.node.js",
"dist/nodes/Matrix/Matrix.node.js",
"dist/nodes/Mattermost/Mattermost.node.js",
"dist/nodes/Mautic/Mautic.node.js",
"dist/nodes/Mautic/MauticTrigger.node.js",
"dist/nodes/Medium/Medium.node.js",
"dist/nodes/Merge/Merge.node.js",
"dist/nodes/MessageBird/MessageBird.node.js",
"dist/nodes/Metabase/Metabase.node.js",
"dist/nodes/Microsoft/Dynamics/MicrosoftDynamicsCrm.node.js",
"dist/nodes/Microsoft/Excel/MicrosoftExcel.node.js",
"dist/nodes/Microsoft/GraphSecurity/MicrosoftGraphSecurity.node.js",
"dist/nodes/Microsoft/OneDrive/MicrosoftOneDrive.node.js",
"dist/nodes/Microsoft/Outlook/MicrosoftOutlook.node.js",
"dist/nodes/Microsoft/Sql/MicrosoftSql.node.js",
"dist/nodes/Microsoft/Teams/MicrosoftTeams.node.js",
"dist/nodes/Microsoft/ToDo/MicrosoftToDo.node.js",
"dist/nodes/Mindee/Mindee.node.js",
"dist/nodes/Misp/Misp.node.js",
"dist/nodes/Mocean/Mocean.node.js",
"dist/nodes/MondayCom/MondayCom.node.js",
"dist/nodes/MongoDb/MongoDb.node.js",
"dist/nodes/MonicaCrm/MonicaCrm.node.js",
"dist/nodes/MoveBinaryData/MoveBinaryData.node.js",
"dist/nodes/MQTT/Mqtt.node.js",
"dist/nodes/MQTT/MqttTrigger.node.js",
"dist/nodes/Msg91/Msg91.node.js",
"dist/nodes/MySql/MySql.node.js",
"dist/nodes/N8n/N8n.node.js",
"dist/nodes/N8nTrainingCustomerDatastore/N8nTrainingCustomerDatastore.node.js",
"dist/nodes/N8nTrainingCustomerMessenger/N8nTrainingCustomerMessenger.node.js",
"dist/nodes/N8nTrigger/N8nTrigger.node.js",
"dist/nodes/Nasa/Nasa.node.js",
"dist/nodes/Netlify/Netlify.node.js",
"dist/nodes/Netlify/NetlifyTrigger.node.js",
"dist/nodes/NextCloud/NextCloud.node.js",
"dist/nodes/NocoDB/NocoDB.node.js",
"dist/nodes/Brevo/Brevo.node.js",
"dist/nodes/Brevo/BrevoTrigger.node.js",
"dist/nodes/StickyNote/StickyNote.node.js",
"dist/nodes/NoOp/NoOp.node.js",
"dist/nodes/Onfleet/Onfleet.node.js",
"dist/nodes/Onfleet/OnfleetTrigger.node.js",
"dist/nodes/Notion/Notion.node.js",
"dist/nodes/Notion/NotionTrigger.node.js",
"dist/nodes/Npm/Npm.node.js",
"dist/nodes/Odoo/Odoo.node.js",
"dist/nodes/OneSimpleApi/OneSimpleApi.node.js",
"dist/nodes/OpenAi/OpenAi.node.js",
"dist/nodes/OpenThesaurus/OpenThesaurus.node.js",
"dist/nodes/OpenWeatherMap/OpenWeatherMap.node.js",
"dist/nodes/Orbit/Orbit.node.js",
"dist/nodes/Oura/Oura.node.js",
"dist/nodes/Paddle/Paddle.node.js",
"dist/nodes/PagerDuty/PagerDuty.node.js",
"dist/nodes/PayPal/PayPal.node.js",
"dist/nodes/PayPal/PayPalTrigger.node.js",
"dist/nodes/Peekalink/Peekalink.node.js",
"dist/nodes/Phantombuster/Phantombuster.node.js",
"dist/nodes/PhilipsHue/PhilipsHue.node.js",
"dist/nodes/Pipedrive/Pipedrive.node.js",
"dist/nodes/Pipedrive/PipedriveTrigger.node.js",
"dist/nodes/Plivo/Plivo.node.js",
"dist/nodes/PostBin/PostBin.node.js",
"dist/nodes/Postgres/Postgres.node.js",
"dist/nodes/Postgres/PostgresTrigger.node.js",
"dist/nodes/PostHog/PostHog.node.js",
"dist/nodes/Postmark/PostmarkTrigger.node.js",
"dist/nodes/ProfitWell/ProfitWell.node.js",
"dist/nodes/Pushbullet/Pushbullet.node.js",
"dist/nodes/Pushcut/Pushcut.node.js",
"dist/nodes/Pushcut/PushcutTrigger.node.js",
"dist/nodes/Pushover/Pushover.node.js",
"dist/nodes/QuestDb/QuestDb.node.js",
"dist/nodes/QuickBase/QuickBase.node.js",
"dist/nodes/QuickBooks/QuickBooks.node.js",
"dist/nodes/QuickChart/QuickChart.node.js",
"dist/nodes/RabbitMQ/RabbitMQ.node.js",
"dist/nodes/RabbitMQ/RabbitMQTrigger.node.js",
"dist/nodes/Raindrop/Raindrop.node.js",
"dist/nodes/ReadBinaryFile/ReadBinaryFile.node.js",
"dist/nodes/ReadBinaryFiles/ReadBinaryFiles.node.js",
"dist/nodes/ReadPdf/ReadPDF.node.js",
"dist/nodes/Reddit/Reddit.node.js",
"dist/nodes/Redis/Redis.node.js",
"dist/nodes/Redis/RedisTrigger.node.js",
"dist/nodes/RenameKeys/RenameKeys.node.js",
"dist/nodes/RespondToWebhook/RespondToWebhook.node.js",
"dist/nodes/Rocketchat/Rocketchat.node.js",
"dist/nodes/RssFeedRead/RssFeedRead.node.js",
"dist/nodes/RssFeedRead/RssFeedReadTrigger.node.js",
"dist/nodes/Rundeck/Rundeck.node.js",
"dist/nodes/S3/S3.node.js",
"dist/nodes/Salesforce/Salesforce.node.js",
"dist/nodes/Salesmate/Salesmate.node.js",
"dist/nodes/Schedule/ScheduleTrigger.node.js",
"dist/nodes/SeaTable/SeaTable.node.js",
"dist/nodes/SeaTable/SeaTableTrigger.node.js",
"dist/nodes/SecurityScorecard/SecurityScorecard.node.js",
"dist/nodes/Segment/Segment.node.js",
"dist/nodes/SendGrid/SendGrid.node.js",
"dist/nodes/Sendy/Sendy.node.js",
"dist/nodes/SentryIo/SentryIo.node.js",
"dist/nodes/ServiceNow/ServiceNow.node.js",
"dist/nodes/Set/Set.node.js",
"dist/nodes/Shopify/Shopify.node.js",
"dist/nodes/Shopify/ShopifyTrigger.node.js",
"dist/nodes/Signl4/Signl4.node.js",
"dist/nodes/Slack/Slack.node.js",
"dist/nodes/Sms77/Sms77.node.js",
"dist/nodes/Snowflake/Snowflake.node.js",
"dist/nodes/SplitInBatches/SplitInBatches.node.js",
"dist/nodes/Splunk/Splunk.node.js",
"dist/nodes/Spontit/Spontit.node.js",
"dist/nodes/Spotify/Spotify.node.js",
"dist/nodes/SpreadsheetFile/SpreadsheetFile.node.js",
"dist/nodes/SseTrigger/SseTrigger.node.js",
"dist/nodes/Ssh/Ssh.node.js",
"dist/nodes/Stackby/Stackby.node.js",
"dist/nodes/Start/Start.node.js",
"dist/nodes/StopAndError/StopAndError.node.js",
"dist/nodes/Storyblok/Storyblok.node.js",
"dist/nodes/Strapi/Strapi.node.js",
"dist/nodes/Strava/Strava.node.js",
"dist/nodes/Strava/StravaTrigger.node.js",
"dist/nodes/Stripe/Stripe.node.js",
"dist/nodes/Stripe/StripeTrigger.node.js",
"dist/nodes/Supabase/Supabase.node.js",
"dist/nodes/SurveyMonkey/SurveyMonkeyTrigger.node.js",
"dist/nodes/Switch/Switch.node.js",
"dist/nodes/SyncroMSP/SyncroMsp.node.js",
"dist/nodes/Taiga/Taiga.node.js",
"dist/nodes/Taiga/TaigaTrigger.node.js",
"dist/nodes/Tapfiliate/Tapfiliate.node.js",
"dist/nodes/Telegram/Telegram.node.js",
"dist/nodes/Telegram/TelegramTrigger.node.js",
"dist/nodes/TheHiveProject/TheHiveProject.node.js",
"dist/nodes/TheHiveProject/TheHiveProjectTrigger.node.js",
"dist/nodes/TheHive/TheHive.node.js",
"dist/nodes/TheHive/TheHiveTrigger.node.js",
"dist/nodes/TimescaleDb/TimescaleDb.node.js",
"dist/nodes/Todoist/Todoist.node.js",
"dist/nodes/Toggl/TogglTrigger.node.js",
"dist/nodes/Totp/Totp.node.js",
"dist/nodes/TravisCi/TravisCi.node.js",
"dist/nodes/Trello/Trello.node.js",
"dist/nodes/Trello/TrelloTrigger.node.js",
"dist/nodes/Twake/Twake.node.js",
"dist/nodes/Twilio/Twilio.node.js",
"dist/nodes/Twist/Twist.node.js",
"dist/nodes/Twitter/Twitter.node.js",
"dist/nodes/Typeform/TypeformTrigger.node.js",
"dist/nodes/UnleashedSoftware/UnleashedSoftware.node.js",
"dist/nodes/Uplead/Uplead.node.js",
"dist/nodes/UProc/UProc.node.js",
"dist/nodes/UptimeRobot/UptimeRobot.node.js",
"dist/nodes/UrlScanIo/UrlScanIo.node.js",
"dist/nodes/Vero/Vero.node.js",
"dist/nodes/Venafi/ProtectCloud/VenafiTlsProtectCloud.node.js",
"dist/nodes/Venafi/ProtectCloud/VenafiTlsProtectCloudTrigger.node.js",
"dist/nodes/Venafi/Datacenter/VenafiTlsProtectDatacenter.node.js",
"dist/nodes/Vonage/Vonage.node.js",
"dist/nodes/Wait/Wait.node.js",
"dist/nodes/Webflow/Webflow.node.js",
"dist/nodes/Webflow/WebflowTrigger.node.js",
"dist/nodes/Webhook/Webhook.node.js",
"dist/nodes/Wekan/Wekan.node.js",
"dist/nodes/WhatsApp/WhatsApp.node.js",
"dist/nodes/Wise/Wise.node.js",
"dist/nodes/Wise/WiseTrigger.node.js",
"dist/nodes/WooCommerce/WooCommerce.node.js",
"dist/nodes/WooCommerce/WooCommerceTrigger.node.js",
"dist/nodes/Wordpress/Wordpress.node.js",
"dist/nodes/Workable/WorkableTrigger.node.js",
"dist/nodes/WorkflowTrigger/WorkflowTrigger.node.js",
"dist/nodes/WriteBinaryFile/WriteBinaryFile.node.js",
"dist/nodes/Wufoo/WufooTrigger.node.js",
"dist/nodes/Xero/Xero.node.js",
"dist/nodes/Xml/Xml.node.js",
"dist/nodes/Yourls/Yourls.node.js",
"dist/nodes/Zammad/Zammad.node.js",
"dist/nodes/Zendesk/Zendesk.node.js",
"dist/nodes/Zendesk/ZendeskTrigger.node.js",
"dist/nodes/Zoho/ZohoCrm.node.js",
"dist/nodes/Zoom/Zoom.node.js",
"dist/nodes/Zulip/Zulip.node.js"
]
},
"devDependencies": {
"@types/amqplib": "^0.10.1",
"@types/aws4": "^1.5.1",
"@types/basic-auth": "^1.1.3",
"@types/cheerio": "^0.22.15",
"@types/cron": "~1.7.1",
"@types/eventsource": "^1.1.2",
"@types/express": "^4.17.6",
"@types/gm": "^1.25.0",
"@types/imap-simple": "^4.2.0",
"@types/js-nacl": "^1.3.0",
"@types/jsonwebtoken": "^9.0.1",
"@types/lodash": "^4.14.195",
"@types/lossless-json": "^1.0.0",
"@types/mailparser": "^2.7.3",
"@types/mime-types": "^2.1.0",
"@types/mssql": "^6.0.2",
"@types/node-ssh": "^7.0.1",
"@types/nodemailer": "^6.4.0",
"@types/promise-ftp": "^1.3.4",
"@types/redis": "^2.8.11",
"@types/request-promise-native": "~1.0.15",
"@types/rfc2047": "^2.0.1",
"@types/showdown": "^1.9.4",
"@types/snowflake-sdk": "^1.6.12",
"@types/ssh2-sftp-client": "^5.1.0",
"@types/tmp": "^0.2.0",
"@types/uuid": "^8.3.2",
"@types/xml2js": "^0.4.11",
"eslint-plugin-n8n-nodes-base": "^1.16.0",
"gulp": "^4.0.0",
"n8n-core": "1.14.1"
},
"dependencies": {
"@kafkajs/confluent-schema-registry": "1.0.6",
"@n8n/vm2": "^3.9.20",
"amqplib": "^0.10.3",
"aws4": "^1.8.0",
"basic-auth": "^2.0.1",
"change-case": "^4.1.1",
"cheerio": "1.0.0-rc.6",
"chokidar": "3.5.2",
"cron": "~1.7.2",
"csv-parse": "^5.5.0",
"currency-codes": "^2.1.0",
"eventsource": "^2.0.2",
"fast-glob": "^3.2.5",
"fflate": "^0.7.0",
"get-system-fonts": "^2.0.2",
"gm": "^1.25.0",
"iconv-lite": "^0.6.2",
"ics": "^2.27.0",
"imap-simple": "^4.3.0",
"isbot": "^3.6.13",
"iso-639-1": "^2.1.3",
"js-nacl": "^1.4.0",
"jsonwebtoken": "^9.0.0",
"kafkajs": "^1.14.0",
"ldapts": "^4.2.6",
"lodash": "^4.17.21",
"lossless-json": "^1.0.4",
"luxon": "^3.3.0",
"mailparser": "^3.2.0",
"minifaker": "^1.34.1",
"moment": "~2.29.2",
"moment-timezone": "^0.5.28",
"mongodb": "^4.17.1",
"mqtt": "^5.0.2",
"mssql": "^8.1.2",
"mysql2": "~2.3.0",
"nanoid": "^3.3.6",
"node-html-markdown": "^1.1.3",
"node-ssh": "^12.0.0",
"nodemailer": "^6.7.1",
"otpauth": "^9.1.1",
"pdfjs-dist": "^2.16.105",
"pg": "^8.3.0",
"pg-promise": "^10.5.8",
"pretty-bytes": "^5.6.0",
"promise-ftp": "^1.3.5",
"pyodide": "^0.23.4",
"redis": "^3.1.1",
"rfc2047": "^4.0.1",
"rhea": "^1.0.11",
"rss-parser": "^3.7.0",
"semver": "^7.5.4",
"showdown": "^2.0.3",
"simple-git": "^3.17.0",
"snowflake-sdk": "^1.8.0",
"ssh2-sftp-client": "^7.0.0",
"tmp-promise": "^3.0.2",
"typedi": "^0.10.0",
"uuid": "^8.3.2",
"xlsx": "https://cdn.sheetjs.com/xlsx-0.19.3/xlsx-0.19.3.tgz",
"xml2js": "^0.5.0",
"n8n-workflow": "1.14.1"
},
"scripts": {
"clean": "rimraf dist .turbo",
"dev": "pnpm watch",
"typecheck": "tsc",
"build": "tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json && gulp build:icons && gulp build:translations && pnpm build:metadata",
"build:translations": "gulp build:translations",
"build:metadata": "pnpm n8n-generate-known && pnpm n8n-generate-ui-types",
"format": "prettier --write . --ignore-path ../../.prettierignore",
"lint": "eslint . --quiet && node ./scripts/validate-load-options-methods.js",
"lintfix": "eslint . --fix",
"watch": "tsc-watch -p tsconfig.build.json --onCompilationComplete \"tsc-alias -p tsconfig.build.json\" --onSuccess \"pnpm n8n-generate-ui-types\"",
"test": "jest"
}
},
"extraction_time_ms": 7,
"extracted_at": "2025-06-07T17:49:22.717Z"
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,896 @@
{
"node_type": "n8n-nodes-base.Slack",
"name": "Slack",
"package_name": "n8n-nodes-base",
"code_hash": "0ed10d0646f3c595406359edfa2c293dac41991cee59ad4fb3ccf2bb70eca6fc",
"code_length": 1007,
"source_location": "node_modules/n8n-nodes-base/dist/nodes/Slack/Slack.node.js",
"has_credentials": false,
"source_code": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Slack = void 0;\nconst n8n_workflow_1 = require(\"n8n-workflow\");\nconst SlackV1_node_1 = require(\"./V1/SlackV1.node\");\nconst SlackV2_node_1 = require(\"./V2/SlackV2.node\");\nclass Slack extends n8n_workflow_1.VersionedNodeType {\n constructor() {\n const baseDescription = {\n displayName: 'Slack',\n name: 'slack',\n icon: 'file:slack.svg',\n group: ['output'],\n subtitle: '={{$parameter[\"operation\"] + \": \" + $parameter[\"resource\"]}}',\n description: 'Consume Slack API',\n defaultVersion: 2.1,\n };\n const nodeVersions = {\n 1: new SlackV1_node_1.SlackV1(baseDescription),\n 2: new SlackV2_node_1.SlackV2(baseDescription),\n 2.1: new SlackV2_node_1.SlackV2(baseDescription),\n };\n super(nodeVersions, baseDescription);\n }\n}\nexports.Slack = Slack;\n//# sourceMappingURL=Slack.node.js.map",
"package_info": {
"name": "n8n-nodes-base",
"version": "1.14.1",
"description": "Base nodes of n8n",
"license": "SEE LICENSE IN LICENSE.md",
"homepage": "https://n8n.io",
"author": {
"name": "Jan Oberhauser",
"email": "jan@n8n.io"
},
"main": "index.js",
"repository": {
"type": "git",
"url": "git+https://github.com/n8n-io/n8n.git"
},
"files": [
"dist"
],
"n8n": {
"credentials": [
"dist/credentials/ActionNetworkApi.credentials.js",
"dist/credentials/ActiveCampaignApi.credentials.js",
"dist/credentials/AcuitySchedulingApi.credentials.js",
"dist/credentials/AcuitySchedulingOAuth2Api.credentials.js",
"dist/credentials/AdaloApi.credentials.js",
"dist/credentials/AffinityApi.credentials.js",
"dist/credentials/AgileCrmApi.credentials.js",
"dist/credentials/AirtableApi.credentials.js",
"dist/credentials/AirtableOAuth2Api.credentials.js",
"dist/credentials/AirtableTokenApi.credentials.js",
"dist/credentials/AlienVaultApi.credentials.js",
"dist/credentials/Amqp.credentials.js",
"dist/credentials/ApiTemplateIoApi.credentials.js",
"dist/credentials/AsanaApi.credentials.js",
"dist/credentials/AsanaOAuth2Api.credentials.js",
"dist/credentials/Auth0ManagementApi.credentials.js",
"dist/credentials/AutomizyApi.credentials.js",
"dist/credentials/AutopilotApi.credentials.js",
"dist/credentials/Aws.credentials.js",
"dist/credentials/BambooHrApi.credentials.js",
"dist/credentials/BannerbearApi.credentials.js",
"dist/credentials/BaserowApi.credentials.js",
"dist/credentials/BeeminderApi.credentials.js",
"dist/credentials/BitbucketApi.credentials.js",
"dist/credentials/BitlyApi.credentials.js",
"dist/credentials/BitlyOAuth2Api.credentials.js",
"dist/credentials/BitwardenApi.credentials.js",
"dist/credentials/BoxOAuth2Api.credentials.js",
"dist/credentials/BrandfetchApi.credentials.js",
"dist/credentials/BubbleApi.credentials.js",
"dist/credentials/CalApi.credentials.js",
"dist/credentials/CalendlyApi.credentials.js",
"dist/credentials/CarbonBlackApi.credentials.js",
"dist/credentials/ChargebeeApi.credentials.js",
"dist/credentials/CircleCiApi.credentials.js",
"dist/credentials/CiscoMerakiApi.credentials.js",
"dist/credentials/CiscoSecureEndpointApi.credentials.js",
"dist/credentials/CiscoWebexOAuth2Api.credentials.js",
"dist/credentials/CiscoUmbrellaApi.credentials.js",
"dist/credentials/CitrixAdcApi.credentials.js",
"dist/credentials/CloudflareApi.credentials.js",
"dist/credentials/ClearbitApi.credentials.js",
"dist/credentials/ClickUpApi.credentials.js",
"dist/credentials/ClickUpOAuth2Api.credentials.js",
"dist/credentials/ClockifyApi.credentials.js",
"dist/credentials/CockpitApi.credentials.js",
"dist/credentials/CodaApi.credentials.js",
"dist/credentials/ContentfulApi.credentials.js",
"dist/credentials/ConvertKitApi.credentials.js",
"dist/credentials/CopperApi.credentials.js",
"dist/credentials/CortexApi.credentials.js",
"dist/credentials/CrateDb.credentials.js",
"dist/credentials/CrowdStrikeOAuth2Api.credentials.js",
"dist/credentials/CrowdDevApi.credentials.js",
"dist/credentials/CustomerIoApi.credentials.js",
"dist/credentials/DeepLApi.credentials.js",
"dist/credentials/DemioApi.credentials.js",
"dist/credentials/DhlApi.credentials.js",
"dist/credentials/DiscourseApi.credentials.js",
"dist/credentials/DisqusApi.credentials.js",
"dist/credentials/DriftApi.credentials.js",
"dist/credentials/DriftOAuth2Api.credentials.js",
"dist/credentials/DropboxApi.credentials.js",
"dist/credentials/DropboxOAuth2Api.credentials.js",
"dist/credentials/DropcontactApi.credentials.js",
"dist/credentials/EgoiApi.credentials.js",
"dist/credentials/ElasticsearchApi.credentials.js",
"dist/credentials/ElasticSecurityApi.credentials.js",
"dist/credentials/EmeliaApi.credentials.js",
"dist/credentials/ERPNextApi.credentials.js",
"dist/credentials/EventbriteApi.credentials.js",
"dist/credentials/EventbriteOAuth2Api.credentials.js",
"dist/credentials/F5BigIpApi.credentials.js",
"dist/credentials/FacebookGraphApi.credentials.js",
"dist/credentials/FacebookGraphAppApi.credentials.js",
"dist/credentials/FacebookLeadAdsOAuth2Api.credentials.js",
"dist/credentials/FigmaApi.credentials.js",
"dist/credentials/FileMaker.credentials.js",
"dist/credentials/FlowApi.credentials.js",
"dist/credentials/FormIoApi.credentials.js",
"dist/credentials/FormstackApi.credentials.js",
"dist/credentials/FormstackOAuth2Api.credentials.js",
"dist/credentials/FortiGateApi.credentials.js",
"dist/credentials/FreshdeskApi.credentials.js",
"dist/credentials/FreshserviceApi.credentials.js",
"dist/credentials/FreshworksCrmApi.credentials.js",
"dist/credentials/Ftp.credentials.js",
"dist/credentials/GetResponseApi.credentials.js",
"dist/credentials/GetResponseOAuth2Api.credentials.js",
"dist/credentials/GhostAdminApi.credentials.js",
"dist/credentials/GhostContentApi.credentials.js",
"dist/credentials/GithubApi.credentials.js",
"dist/credentials/GithubOAuth2Api.credentials.js",
"dist/credentials/GitlabApi.credentials.js",
"dist/credentials/GitlabOAuth2Api.credentials.js",
"dist/credentials/GitPassword.credentials.js",
"dist/credentials/GmailOAuth2Api.credentials.js",
"dist/credentials/GoogleAdsOAuth2Api.credentials.js",
"dist/credentials/GoogleAnalyticsOAuth2Api.credentials.js",
"dist/credentials/GoogleApi.credentials.js",
"dist/credentials/GoogleBigQueryOAuth2Api.credentials.js",
"dist/credentials/GoogleBooksOAuth2Api.credentials.js",
"dist/credentials/GoogleCalendarOAuth2Api.credentials.js",
"dist/credentials/GoogleCloudNaturalLanguageOAuth2Api.credentials.js",
"dist/credentials/GoogleCloudStorageOAuth2Api.credentials.js",
"dist/credentials/GoogleContactsOAuth2Api.credentials.js",
"dist/credentials/GoogleDocsOAuth2Api.credentials.js",
"dist/credentials/GoogleDriveOAuth2Api.credentials.js",
"dist/credentials/GoogleFirebaseCloudFirestoreOAuth2Api.credentials.js",
"dist/credentials/GoogleFirebaseRealtimeDatabaseOAuth2Api.credentials.js",
"dist/credentials/GoogleOAuth2Api.credentials.js",
"dist/credentials/GooglePerspectiveOAuth2Api.credentials.js",
"dist/credentials/GoogleSheetsOAuth2Api.credentials.js",
"dist/credentials/GoogleSheetsTriggerOAuth2Api.credentials.js",
"dist/credentials/GoogleSlidesOAuth2Api.credentials.js",
"dist/credentials/GoogleTasksOAuth2Api.credentials.js",
"dist/credentials/GoogleTranslateOAuth2Api.credentials.js",
"dist/credentials/GotifyApi.credentials.js",
"dist/credentials/GoToWebinarOAuth2Api.credentials.js",
"dist/credentials/GristApi.credentials.js",
"dist/credentials/GrafanaApi.credentials.js",
"dist/credentials/GSuiteAdminOAuth2Api.credentials.js",
"dist/credentials/GumroadApi.credentials.js",
"dist/credentials/HaloPSAApi.credentials.js",
"dist/credentials/HarvestApi.credentials.js",
"dist/credentials/HarvestOAuth2Api.credentials.js",
"dist/credentials/HelpScoutOAuth2Api.credentials.js",
"dist/credentials/HighLevelApi.credentials.js",
"dist/credentials/HomeAssistantApi.credentials.js",
"dist/credentials/HttpBasicAuth.credentials.js",
"dist/credentials/HttpDigestAuth.credentials.js",
"dist/credentials/HttpHeaderAuth.credentials.js",
"dist/credentials/HttpCustomAuth.credentials.js",
"dist/credentials/HttpQueryAuth.credentials.js",
"dist/credentials/HubspotApi.credentials.js",
"dist/credentials/HubspotAppToken.credentials.js",
"dist/credentials/HubspotDeveloperApi.credentials.js",
"dist/credentials/HubspotOAuth2Api.credentials.js",
"dist/credentials/HumanticAiApi.credentials.js",
"dist/credentials/HunterApi.credentials.js",
"dist/credentials/HybridAnalysisApi.credentials.js",
"dist/credentials/Imap.credentials.js",
"dist/credentials/ImpervaWafApi.credentials.js",
"dist/credentials/IntercomApi.credentials.js",
"dist/credentials/InvoiceNinjaApi.credentials.js",
"dist/credentials/IterableApi.credentials.js",
"dist/credentials/JenkinsApi.credentials.js",
"dist/credentials/JiraSoftwareCloudApi.credentials.js",
"dist/credentials/JiraSoftwareServerApi.credentials.js",
"dist/credentials/JotFormApi.credentials.js",
"dist/credentials/Kafka.credentials.js",
"dist/credentials/KeapOAuth2Api.credentials.js",
"dist/credentials/KibanaApi.credentials.js",
"dist/credentials/KitemakerApi.credentials.js",
"dist/credentials/KoBoToolboxApi.credentials.js",
"dist/credentials/Ldap.credentials.js",
"dist/credentials/LemlistApi.credentials.js",
"dist/credentials/LinearApi.credentials.js",
"dist/credentials/LinearOAuth2Api.credentials.js",
"dist/credentials/LineNotifyOAuth2Api.credentials.js",
"dist/credentials/LingvaNexApi.credentials.js",
"dist/credentials/LinkedInOAuth2Api.credentials.js",
"dist/credentials/LoneScaleApi.credentials.js",
"dist/credentials/Magento2Api.credentials.js",
"dist/credentials/MailcheckApi.credentials.js",
"dist/credentials/MailchimpApi.credentials.js",
"dist/credentials/MailchimpOAuth2Api.credentials.js",
"dist/credentials/MailerLiteApi.credentials.js",
"dist/credentials/MailgunApi.credentials.js",
"dist/credentials/MailjetEmailApi.credentials.js",
"dist/credentials/MailjetSmsApi.credentials.js",
"dist/credentials/MandrillApi.credentials.js",
"dist/credentials/MarketstackApi.credentials.js",
"dist/credentials/MatrixApi.credentials.js",
"dist/credentials/MattermostApi.credentials.js",
"dist/credentials/MauticApi.credentials.js",
"dist/credentials/MauticOAuth2Api.credentials.js",
"dist/credentials/MediumApi.credentials.js",
"dist/credentials/MediumOAuth2Api.credentials.js",
"dist/credentials/MetabaseApi.credentials.js",
"dist/credentials/MessageBirdApi.credentials.js",
"dist/credentials/MetabaseApi.credentials.js",
"dist/credentials/MicrosoftDynamicsOAuth2Api.credentials.js",
"dist/credentials/MicrosoftEntraOAuth2Api.credentials.js",
"dist/credentials/MicrosoftExcelOAuth2Api.credentials.js",
"dist/credentials/MicrosoftGraphSecurityOAuth2Api.credentials.js",
"dist/credentials/MicrosoftOAuth2Api.credentials.js",
"dist/credentials/MicrosoftOneDriveOAuth2Api.credentials.js",
"dist/credentials/MicrosoftOutlookOAuth2Api.credentials.js",
"dist/credentials/MicrosoftSql.credentials.js",
"dist/credentials/MicrosoftTeamsOAuth2Api.credentials.js",
"dist/credentials/MicrosoftToDoOAuth2Api.credentials.js",
"dist/credentials/MindeeInvoiceApi.credentials.js",
"dist/credentials/MindeeReceiptApi.credentials.js",
"dist/credentials/MispApi.credentials.js",
"dist/credentials/MistApi.credentials.js",
"dist/credentials/MoceanApi.credentials.js",
"dist/credentials/MondayComApi.credentials.js",
"dist/credentials/MondayComOAuth2Api.credentials.js",
"dist/credentials/MongoDb.credentials.js",
"dist/credentials/MonicaCrmApi.credentials.js",
"dist/credentials/Mqtt.credentials.js",
"dist/credentials/Msg91Api.credentials.js",
"dist/credentials/MySql.credentials.js",
"dist/credentials/N8nApi.credentials.js",
"dist/credentials/NasaApi.credentials.js",
"dist/credentials/NetlifyApi.credentials.js",
"dist/credentials/NextCloudApi.credentials.js",
"dist/credentials/NextCloudOAuth2Api.credentials.js",
"dist/credentials/NocoDb.credentials.js",
"dist/credentials/NocoDbApiToken.credentials.js",
"dist/credentials/NotionApi.credentials.js",
"dist/credentials/NotionOAuth2Api.credentials.js",
"dist/credentials/NpmApi.credentials.js",
"dist/credentials/OAuth1Api.credentials.js",
"dist/credentials/OAuth2Api.credentials.js",
"dist/credentials/OdooApi.credentials.js",
"dist/credentials/OktaApi.credentials.js",
"dist/credentials/OneSimpleApi.credentials.js",
"dist/credentials/OnfleetApi.credentials.js",
"dist/credentials/OpenAiApi.credentials.js",
"dist/credentials/OpenCTIApi.credentials.js",
"dist/credentials/OpenWeatherMapApi.credentials.js",
"dist/credentials/OrbitApi.credentials.js",
"dist/credentials/OuraApi.credentials.js",
"dist/credentials/PaddleApi.credentials.js",
"dist/credentials/PagerDutyApi.credentials.js",
"dist/credentials/PagerDutyOAuth2Api.credentials.js",
"dist/credentials/PayPalApi.credentials.js",
"dist/credentials/PeekalinkApi.credentials.js",
"dist/credentials/PhantombusterApi.credentials.js",
"dist/credentials/PhilipsHueOAuth2Api.credentials.js",
"dist/credentials/PipedriveApi.credentials.js",
"dist/credentials/PipedriveOAuth2Api.credentials.js",
"dist/credentials/PlivoApi.credentials.js",
"dist/credentials/Postgres.credentials.js",
"dist/credentials/PostHogApi.credentials.js",
"dist/credentials/PostmarkApi.credentials.js",
"dist/credentials/ProfitWellApi.credentials.js",
"dist/credentials/PushbulletOAuth2Api.credentials.js",
"dist/credentials/PushcutApi.credentials.js",
"dist/credentials/PushoverApi.credentials.js",
"dist/credentials/QRadarApi.credentials.js",
"dist/credentials/QualysApi.credentials.js",
"dist/credentials/QuestDb.credentials.js",
"dist/credentials/QuickBaseApi.credentials.js",
"dist/credentials/QuickBooksOAuth2Api.credentials.js",
"dist/credentials/RabbitMQ.credentials.js",
"dist/credentials/RaindropOAuth2Api.credentials.js",
"dist/credentials/RecordedFutureApi.credentials.js",
"dist/credentials/RedditOAuth2Api.credentials.js",
"dist/credentials/Redis.credentials.js",
"dist/credentials/RocketchatApi.credentials.js",
"dist/credentials/RundeckApi.credentials.js",
"dist/credentials/S3.credentials.js",
"dist/credentials/SalesforceJwtApi.credentials.js",
"dist/credentials/SalesforceOAuth2Api.credentials.js",
"dist/credentials/SalesmateApi.credentials.js",
"dist/credentials/SeaTableApi.credentials.js",
"dist/credentials/SecurityScorecardApi.credentials.js",
"dist/credentials/SegmentApi.credentials.js",
"dist/credentials/SekoiaApi.credentials.js",
"dist/credentials/SendGridApi.credentials.js",
"dist/credentials/BrevoApi.credentials.js",
"dist/credentials/SendyApi.credentials.js",
"dist/credentials/SentryIoApi.credentials.js",
"dist/credentials/SentryIoOAuth2Api.credentials.js",
"dist/credentials/SentryIoServerApi.credentials.js",
"dist/credentials/ServiceNowOAuth2Api.credentials.js",
"dist/credentials/ServiceNowBasicApi.credentials.js",
"dist/credentials/Sftp.credentials.js",
"dist/credentials/ShopifyApi.credentials.js",
"dist/credentials/ShopifyAccessTokenApi.credentials.js",
"dist/credentials/ShopifyOAuth2Api.credentials.js",
"dist/credentials/Signl4Api.credentials.js",
"dist/credentials/SlackApi.credentials.js",
"dist/credentials/SlackOAuth2Api.credentials.js",
"dist/credentials/Sms77Api.credentials.js",
"dist/credentials/Smtp.credentials.js",
"dist/credentials/Snowflake.credentials.js",
"dist/credentials/SplunkApi.credentials.js",
"dist/credentials/SpontitApi.credentials.js",
"dist/credentials/SpotifyOAuth2Api.credentials.js",
"dist/credentials/ShufflerApi.credentials.js",
"dist/credentials/SshPassword.credentials.js",
"dist/credentials/SshPrivateKey.credentials.js",
"dist/credentials/StackbyApi.credentials.js",
"dist/credentials/StoryblokContentApi.credentials.js",
"dist/credentials/StoryblokManagementApi.credentials.js",
"dist/credentials/StrapiApi.credentials.js",
"dist/credentials/StrapiTokenApi.credentials.js",
"dist/credentials/StravaOAuth2Api.credentials.js",
"dist/credentials/StripeApi.credentials.js",
"dist/credentials/SupabaseApi.credentials.js",
"dist/credentials/SurveyMonkeyApi.credentials.js",
"dist/credentials/SurveyMonkeyOAuth2Api.credentials.js",
"dist/credentials/SyncroMspApi.credentials.js",
"dist/credentials/TaigaApi.credentials.js",
"dist/credentials/TapfiliateApi.credentials.js",
"dist/credentials/TelegramApi.credentials.js",
"dist/credentials/TheHiveProjectApi.credentials.js",
"dist/credentials/TheHiveApi.credentials.js",
"dist/credentials/TimescaleDb.credentials.js",
"dist/credentials/TodoistApi.credentials.js",
"dist/credentials/TodoistOAuth2Api.credentials.js",
"dist/credentials/TogglApi.credentials.js",
"dist/credentials/TotpApi.credentials.js",
"dist/credentials/TravisCiApi.credentials.js",
"dist/credentials/TrellixEpoApi.credentials.js",
"dist/credentials/TrelloApi.credentials.js",
"dist/credentials/TwakeCloudApi.credentials.js",
"dist/credentials/TwakeServerApi.credentials.js",
"dist/credentials/TwilioApi.credentials.js",
"dist/credentials/TwistOAuth2Api.credentials.js",
"dist/credentials/TwitterOAuth1Api.credentials.js",
"dist/credentials/TwitterOAuth2Api.credentials.js",
"dist/credentials/TypeformApi.credentials.js",
"dist/credentials/TypeformOAuth2Api.credentials.js",
"dist/credentials/UnleashedSoftwareApi.credentials.js",
"dist/credentials/UpleadApi.credentials.js",
"dist/credentials/UProcApi.credentials.js",
"dist/credentials/UptimeRobotApi.credentials.js",
"dist/credentials/UrlScanIoApi.credentials.js",
"dist/credentials/VeroApi.credentials.js",
"dist/credentials/VirusTotalApi.credentials.js",
"dist/credentials/VonageApi.credentials.js",
"dist/credentials/VenafiTlsProtectCloudApi.credentials.js",
"dist/credentials/VenafiTlsProtectDatacenterApi.credentials.js",
"dist/credentials/WebflowApi.credentials.js",
"dist/credentials/WebflowOAuth2Api.credentials.js",
"dist/credentials/WekanApi.credentials.js",
"dist/credentials/WhatsAppApi.credentials.js",
"dist/credentials/WiseApi.credentials.js",
"dist/credentials/WooCommerceApi.credentials.js",
"dist/credentials/WordpressApi.credentials.js",
"dist/credentials/WorkableApi.credentials.js",
"dist/credentials/WufooApi.credentials.js",
"dist/credentials/XeroOAuth2Api.credentials.js",
"dist/credentials/YourlsApi.credentials.js",
"dist/credentials/YouTubeOAuth2Api.credentials.js",
"dist/credentials/ZammadBasicAuthApi.credentials.js",
"dist/credentials/ZammadTokenAuthApi.credentials.js",
"dist/credentials/ZendeskApi.credentials.js",
"dist/credentials/ZendeskOAuth2Api.credentials.js",
"dist/credentials/ZohoOAuth2Api.credentials.js",
"dist/credentials/ZoomApi.credentials.js",
"dist/credentials/ZoomOAuth2Api.credentials.js",
"dist/credentials/ZscalerZiaApi.credentials.js",
"dist/credentials/ZulipApi.credentials.js"
],
"nodes": [
"dist/nodes/ActionNetwork/ActionNetwork.node.js",
"dist/nodes/ActiveCampaign/ActiveCampaign.node.js",
"dist/nodes/ActiveCampaign/ActiveCampaignTrigger.node.js",
"dist/nodes/AcuityScheduling/AcuitySchedulingTrigger.node.js",
"dist/nodes/Adalo/Adalo.node.js",
"dist/nodes/Affinity/Affinity.node.js",
"dist/nodes/Affinity/AffinityTrigger.node.js",
"dist/nodes/AgileCrm/AgileCrm.node.js",
"dist/nodes/Airtable/Airtable.node.js",
"dist/nodes/Airtable/AirtableTrigger.node.js",
"dist/nodes/Amqp/Amqp.node.js",
"dist/nodes/Amqp/AmqpTrigger.node.js",
"dist/nodes/ApiTemplateIo/ApiTemplateIo.node.js",
"dist/nodes/Asana/Asana.node.js",
"dist/nodes/Asana/AsanaTrigger.node.js",
"dist/nodes/Automizy/Automizy.node.js",
"dist/nodes/Autopilot/Autopilot.node.js",
"dist/nodes/Autopilot/AutopilotTrigger.node.js",
"dist/nodes/Aws/AwsLambda.node.js",
"dist/nodes/Aws/AwsSns.node.js",
"dist/nodes/Aws/AwsSnsTrigger.node.js",
"dist/nodes/Aws/CertificateManager/AwsCertificateManager.node.js",
"dist/nodes/Aws/Comprehend/AwsComprehend.node.js",
"dist/nodes/Aws/DynamoDB/AwsDynamoDB.node.js",
"dist/nodes/Aws/ELB/AwsElb.node.js",
"dist/nodes/Aws/Rekognition/AwsRekognition.node.js",
"dist/nodes/Aws/S3/AwsS3.node.js",
"dist/nodes/Aws/SES/AwsSes.node.js",
"dist/nodes/Aws/SQS/AwsSqs.node.js",
"dist/nodes/Aws/Textract/AwsTextract.node.js",
"dist/nodes/Aws/Transcribe/AwsTranscribe.node.js",
"dist/nodes/BambooHr/BambooHr.node.js",
"dist/nodes/Bannerbear/Bannerbear.node.js",
"dist/nodes/Baserow/Baserow.node.js",
"dist/nodes/Beeminder/Beeminder.node.js",
"dist/nodes/Bitbucket/BitbucketTrigger.node.js",
"dist/nodes/Bitly/Bitly.node.js",
"dist/nodes/Bitwarden/Bitwarden.node.js",
"dist/nodes/Box/Box.node.js",
"dist/nodes/Box/BoxTrigger.node.js",
"dist/nodes/Brandfetch/Brandfetch.node.js",
"dist/nodes/Bubble/Bubble.node.js",
"dist/nodes/Cal/CalTrigger.node.js",
"dist/nodes/Calendly/CalendlyTrigger.node.js",
"dist/nodes/Chargebee/Chargebee.node.js",
"dist/nodes/Chargebee/ChargebeeTrigger.node.js",
"dist/nodes/CircleCi/CircleCi.node.js",
"dist/nodes/Cisco/Webex/CiscoWebex.node.js",
"dist/nodes/Citrix/ADC/CitrixAdc.node.js",
"dist/nodes/Cisco/Webex/CiscoWebexTrigger.node.js",
"dist/nodes/Cloudflare/Cloudflare.node.js",
"dist/nodes/Clearbit/Clearbit.node.js",
"dist/nodes/ClickUp/ClickUp.node.js",
"dist/nodes/ClickUp/ClickUpTrigger.node.js",
"dist/nodes/Clockify/Clockify.node.js",
"dist/nodes/Clockify/ClockifyTrigger.node.js",
"dist/nodes/Cockpit/Cockpit.node.js",
"dist/nodes/Coda/Coda.node.js",
"dist/nodes/Code/Code.node.js",
"dist/nodes/CoinGecko/CoinGecko.node.js",
"dist/nodes/CompareDatasets/CompareDatasets.node.js",
"dist/nodes/Compression/Compression.node.js",
"dist/nodes/Contentful/Contentful.node.js",
"dist/nodes/ConvertKit/ConvertKit.node.js",
"dist/nodes/ConvertKit/ConvertKitTrigger.node.js",
"dist/nodes/Copper/Copper.node.js",
"dist/nodes/Copper/CopperTrigger.node.js",
"dist/nodes/Cortex/Cortex.node.js",
"dist/nodes/CrateDb/CrateDb.node.js",
"dist/nodes/Cron/Cron.node.js",
"dist/nodes/CrowdDev/CrowdDev.node.js",
"dist/nodes/CrowdDev/CrowdDevTrigger.node.js",
"dist/nodes/Crypto/Crypto.node.js",
"dist/nodes/CustomerIo/CustomerIo.node.js",
"dist/nodes/CustomerIo/CustomerIoTrigger.node.js",
"dist/nodes/DateTime/DateTime.node.js",
"dist/nodes/DebugHelper/DebugHelper.node.js",
"dist/nodes/DeepL/DeepL.node.js",
"dist/nodes/Demio/Demio.node.js",
"dist/nodes/Dhl/Dhl.node.js",
"dist/nodes/Discord/Discord.node.js",
"dist/nodes/Discourse/Discourse.node.js",
"dist/nodes/Disqus/Disqus.node.js",
"dist/nodes/Drift/Drift.node.js",
"dist/nodes/Dropbox/Dropbox.node.js",
"dist/nodes/Dropcontact/Dropcontact.node.js",
"dist/nodes/EditImage/EditImage.node.js",
"dist/nodes/E2eTest/E2eTest.node.js",
"dist/nodes/Egoi/Egoi.node.js",
"dist/nodes/Elastic/Elasticsearch/Elasticsearch.node.js",
"dist/nodes/Elastic/ElasticSecurity/ElasticSecurity.node.js",
"dist/nodes/EmailReadImap/EmailReadImap.node.js",
"dist/nodes/EmailSend/EmailSend.node.js",
"dist/nodes/Emelia/Emelia.node.js",
"dist/nodes/Emelia/EmeliaTrigger.node.js",
"dist/nodes/ERPNext/ERPNext.node.js",
"dist/nodes/ErrorTrigger/ErrorTrigger.node.js",
"dist/nodes/Eventbrite/EventbriteTrigger.node.js",
"dist/nodes/ExecuteCommand/ExecuteCommand.node.js",
"dist/nodes/ExecuteWorkflow/ExecuteWorkflow.node.js",
"dist/nodes/ExecuteWorkflowTrigger/ExecuteWorkflowTrigger.node.js",
"dist/nodes/ExecutionData/ExecutionData.node.js",
"dist/nodes/Facebook/FacebookGraphApi.node.js",
"dist/nodes/Facebook/FacebookTrigger.node.js",
"dist/nodes/FacebookLeadAds/FacebookLeadAdsTrigger.node.js",
"dist/nodes/Figma/FigmaTrigger.node.js",
"dist/nodes/FileMaker/FileMaker.node.js",
"dist/nodes/Filter/Filter.node.js",
"dist/nodes/Flow/Flow.node.js",
"dist/nodes/Flow/FlowTrigger.node.js",
"dist/nodes/Form/FormTrigger.node.js",
"dist/nodes/FormIo/FormIoTrigger.node.js",
"dist/nodes/Formstack/FormstackTrigger.node.js",
"dist/nodes/Freshdesk/Freshdesk.node.js",
"dist/nodes/Freshservice/Freshservice.node.js",
"dist/nodes/FreshworksCrm/FreshworksCrm.node.js",
"dist/nodes/Ftp/Ftp.node.js",
"dist/nodes/Function/Function.node.js",
"dist/nodes/FunctionItem/FunctionItem.node.js",
"dist/nodes/GetResponse/GetResponse.node.js",
"dist/nodes/GetResponse/GetResponseTrigger.node.js",
"dist/nodes/Ghost/Ghost.node.js",
"dist/nodes/Git/Git.node.js",
"dist/nodes/Github/Github.node.js",
"dist/nodes/Github/GithubTrigger.node.js",
"dist/nodes/Gitlab/Gitlab.node.js",
"dist/nodes/Gitlab/GitlabTrigger.node.js",
"dist/nodes/Google/Ads/GoogleAds.node.js",
"dist/nodes/Google/Analytics/GoogleAnalytics.node.js",
"dist/nodes/Google/BigQuery/GoogleBigQuery.node.js",
"dist/nodes/Google/Books/GoogleBooks.node.js",
"dist/nodes/Google/Calendar/GoogleCalendar.node.js",
"dist/nodes/Google/Calendar/GoogleCalendarTrigger.node.js",
"dist/nodes/Google/Chat/GoogleChat.node.js",
"dist/nodes/Google/CloudNaturalLanguage/GoogleCloudNaturalLanguage.node.js",
"dist/nodes/Google/CloudStorage/GoogleCloudStorage.node.js",
"dist/nodes/Google/Contacts/GoogleContacts.node.js",
"dist/nodes/Google/Docs/GoogleDocs.node.js",
"dist/nodes/Google/Drive/GoogleDrive.node.js",
"dist/nodes/Google/Drive/GoogleDriveTrigger.node.js",
"dist/nodes/Google/Firebase/CloudFirestore/GoogleFirebaseCloudFirestore.node.js",
"dist/nodes/Google/Firebase/RealtimeDatabase/GoogleFirebaseRealtimeDatabase.node.js",
"dist/nodes/Google/Gmail/Gmail.node.js",
"dist/nodes/Google/Gmail/GmailTrigger.node.js",
"dist/nodes/Google/GSuiteAdmin/GSuiteAdmin.node.js",
"dist/nodes/Google/Perspective/GooglePerspective.node.js",
"dist/nodes/Google/Sheet/GoogleSheets.node.js",
"dist/nodes/Google/Sheet/GoogleSheetsTrigger.node.js",
"dist/nodes/Google/Slides/GoogleSlides.node.js",
"dist/nodes/Google/Task/GoogleTasks.node.js",
"dist/nodes/Google/Translate/GoogleTranslate.node.js",
"dist/nodes/Google/YouTube/YouTube.node.js",
"dist/nodes/Gotify/Gotify.node.js",
"dist/nodes/GoToWebinar/GoToWebinar.node.js",
"dist/nodes/Grafana/Grafana.node.js",
"dist/nodes/GraphQL/GraphQL.node.js",
"dist/nodes/Grist/Grist.node.js",
"dist/nodes/Gumroad/GumroadTrigger.node.js",
"dist/nodes/HackerNews/HackerNews.node.js",
"dist/nodes/HaloPSA/HaloPSA.node.js",
"dist/nodes/Harvest/Harvest.node.js",
"dist/nodes/HelpScout/HelpScout.node.js",
"dist/nodes/HelpScout/HelpScoutTrigger.node.js",
"dist/nodes/HighLevel/HighLevel.node.js",
"dist/nodes/HomeAssistant/HomeAssistant.node.js",
"dist/nodes/HtmlExtract/HtmlExtract.node.js",
"dist/nodes/Html/Html.node.js",
"dist/nodes/HttpRequest/HttpRequest.node.js",
"dist/nodes/Hubspot/Hubspot.node.js",
"dist/nodes/Hubspot/HubspotTrigger.node.js",
"dist/nodes/HumanticAI/HumanticAi.node.js",
"dist/nodes/Hunter/Hunter.node.js",
"dist/nodes/ICalendar/ICalendar.node.js",
"dist/nodes/If/If.node.js",
"dist/nodes/Intercom/Intercom.node.js",
"dist/nodes/Interval/Interval.node.js",
"dist/nodes/InvoiceNinja/InvoiceNinja.node.js",
"dist/nodes/InvoiceNinja/InvoiceNinjaTrigger.node.js",
"dist/nodes/ItemLists/ItemLists.node.js",
"dist/nodes/Iterable/Iterable.node.js",
"dist/nodes/Jenkins/Jenkins.node.js",
"dist/nodes/Jira/Jira.node.js",
"dist/nodes/Jira/JiraTrigger.node.js",
"dist/nodes/JotForm/JotFormTrigger.node.js",
"dist/nodes/Kafka/Kafka.node.js",
"dist/nodes/Kafka/KafkaTrigger.node.js",
"dist/nodes/Keap/Keap.node.js",
"dist/nodes/Keap/KeapTrigger.node.js",
"dist/nodes/Kitemaker/Kitemaker.node.js",
"dist/nodes/KoBoToolbox/KoBoToolbox.node.js",
"dist/nodes/KoBoToolbox/KoBoToolboxTrigger.node.js",
"dist/nodes/Ldap/Ldap.node.js",
"dist/nodes/Lemlist/Lemlist.node.js",
"dist/nodes/Lemlist/LemlistTrigger.node.js",
"dist/nodes/Line/Line.node.js",
"dist/nodes/Linear/Linear.node.js",
"dist/nodes/Linear/LinearTrigger.node.js",
"dist/nodes/LingvaNex/LingvaNex.node.js",
"dist/nodes/LinkedIn/LinkedIn.node.js",
"dist/nodes/LocalFileTrigger/LocalFileTrigger.node.js",
"dist/nodes/LoneScale/LoneScaleTrigger.node.js",
"dist/nodes/LoneScale/LoneScale.node.js",
"dist/nodes/Magento/Magento2.node.js",
"dist/nodes/Mailcheck/Mailcheck.node.js",
"dist/nodes/Mailchimp/Mailchimp.node.js",
"dist/nodes/Mailchimp/MailchimpTrigger.node.js",
"dist/nodes/MailerLite/MailerLite.node.js",
"dist/nodes/MailerLite/MailerLiteTrigger.node.js",
"dist/nodes/Mailgun/Mailgun.node.js",
"dist/nodes/Mailjet/Mailjet.node.js",
"dist/nodes/Mailjet/MailjetTrigger.node.js",
"dist/nodes/Mandrill/Mandrill.node.js",
"dist/nodes/ManualTrigger/ManualTrigger.node.js",
"dist/nodes/Markdown/Markdown.node.js",
"dist/nodes/Marketstack/Marketstack.node.js",
"dist/nodes/Matrix/Matrix.node.js",
"dist/nodes/Mattermost/Mattermost.node.js",
"dist/nodes/Mautic/Mautic.node.js",
"dist/nodes/Mautic/MauticTrigger.node.js",
"dist/nodes/Medium/Medium.node.js",
"dist/nodes/Merge/Merge.node.js",
"dist/nodes/MessageBird/MessageBird.node.js",
"dist/nodes/Metabase/Metabase.node.js",
"dist/nodes/Microsoft/Dynamics/MicrosoftDynamicsCrm.node.js",
"dist/nodes/Microsoft/Excel/MicrosoftExcel.node.js",
"dist/nodes/Microsoft/GraphSecurity/MicrosoftGraphSecurity.node.js",
"dist/nodes/Microsoft/OneDrive/MicrosoftOneDrive.node.js",
"dist/nodes/Microsoft/Outlook/MicrosoftOutlook.node.js",
"dist/nodes/Microsoft/Sql/MicrosoftSql.node.js",
"dist/nodes/Microsoft/Teams/MicrosoftTeams.node.js",
"dist/nodes/Microsoft/ToDo/MicrosoftToDo.node.js",
"dist/nodes/Mindee/Mindee.node.js",
"dist/nodes/Misp/Misp.node.js",
"dist/nodes/Mocean/Mocean.node.js",
"dist/nodes/MondayCom/MondayCom.node.js",
"dist/nodes/MongoDb/MongoDb.node.js",
"dist/nodes/MonicaCrm/MonicaCrm.node.js",
"dist/nodes/MoveBinaryData/MoveBinaryData.node.js",
"dist/nodes/MQTT/Mqtt.node.js",
"dist/nodes/MQTT/MqttTrigger.node.js",
"dist/nodes/Msg91/Msg91.node.js",
"dist/nodes/MySql/MySql.node.js",
"dist/nodes/N8n/N8n.node.js",
"dist/nodes/N8nTrainingCustomerDatastore/N8nTrainingCustomerDatastore.node.js",
"dist/nodes/N8nTrainingCustomerMessenger/N8nTrainingCustomerMessenger.node.js",
"dist/nodes/N8nTrigger/N8nTrigger.node.js",
"dist/nodes/Nasa/Nasa.node.js",
"dist/nodes/Netlify/Netlify.node.js",
"dist/nodes/Netlify/NetlifyTrigger.node.js",
"dist/nodes/NextCloud/NextCloud.node.js",
"dist/nodes/NocoDB/NocoDB.node.js",
"dist/nodes/Brevo/Brevo.node.js",
"dist/nodes/Brevo/BrevoTrigger.node.js",
"dist/nodes/StickyNote/StickyNote.node.js",
"dist/nodes/NoOp/NoOp.node.js",
"dist/nodes/Onfleet/Onfleet.node.js",
"dist/nodes/Onfleet/OnfleetTrigger.node.js",
"dist/nodes/Notion/Notion.node.js",
"dist/nodes/Notion/NotionTrigger.node.js",
"dist/nodes/Npm/Npm.node.js",
"dist/nodes/Odoo/Odoo.node.js",
"dist/nodes/OneSimpleApi/OneSimpleApi.node.js",
"dist/nodes/OpenAi/OpenAi.node.js",
"dist/nodes/OpenThesaurus/OpenThesaurus.node.js",
"dist/nodes/OpenWeatherMap/OpenWeatherMap.node.js",
"dist/nodes/Orbit/Orbit.node.js",
"dist/nodes/Oura/Oura.node.js",
"dist/nodes/Paddle/Paddle.node.js",
"dist/nodes/PagerDuty/PagerDuty.node.js",
"dist/nodes/PayPal/PayPal.node.js",
"dist/nodes/PayPal/PayPalTrigger.node.js",
"dist/nodes/Peekalink/Peekalink.node.js",
"dist/nodes/Phantombuster/Phantombuster.node.js",
"dist/nodes/PhilipsHue/PhilipsHue.node.js",
"dist/nodes/Pipedrive/Pipedrive.node.js",
"dist/nodes/Pipedrive/PipedriveTrigger.node.js",
"dist/nodes/Plivo/Plivo.node.js",
"dist/nodes/PostBin/PostBin.node.js",
"dist/nodes/Postgres/Postgres.node.js",
"dist/nodes/Postgres/PostgresTrigger.node.js",
"dist/nodes/PostHog/PostHog.node.js",
"dist/nodes/Postmark/PostmarkTrigger.node.js",
"dist/nodes/ProfitWell/ProfitWell.node.js",
"dist/nodes/Pushbullet/Pushbullet.node.js",
"dist/nodes/Pushcut/Pushcut.node.js",
"dist/nodes/Pushcut/PushcutTrigger.node.js",
"dist/nodes/Pushover/Pushover.node.js",
"dist/nodes/QuestDb/QuestDb.node.js",
"dist/nodes/QuickBase/QuickBase.node.js",
"dist/nodes/QuickBooks/QuickBooks.node.js",
"dist/nodes/QuickChart/QuickChart.node.js",
"dist/nodes/RabbitMQ/RabbitMQ.node.js",
"dist/nodes/RabbitMQ/RabbitMQTrigger.node.js",
"dist/nodes/Raindrop/Raindrop.node.js",
"dist/nodes/ReadBinaryFile/ReadBinaryFile.node.js",
"dist/nodes/ReadBinaryFiles/ReadBinaryFiles.node.js",
"dist/nodes/ReadPdf/ReadPDF.node.js",
"dist/nodes/Reddit/Reddit.node.js",
"dist/nodes/Redis/Redis.node.js",
"dist/nodes/Redis/RedisTrigger.node.js",
"dist/nodes/RenameKeys/RenameKeys.node.js",
"dist/nodes/RespondToWebhook/RespondToWebhook.node.js",
"dist/nodes/Rocketchat/Rocketchat.node.js",
"dist/nodes/RssFeedRead/RssFeedRead.node.js",
"dist/nodes/RssFeedRead/RssFeedReadTrigger.node.js",
"dist/nodes/Rundeck/Rundeck.node.js",
"dist/nodes/S3/S3.node.js",
"dist/nodes/Salesforce/Salesforce.node.js",
"dist/nodes/Salesmate/Salesmate.node.js",
"dist/nodes/Schedule/ScheduleTrigger.node.js",
"dist/nodes/SeaTable/SeaTable.node.js",
"dist/nodes/SeaTable/SeaTableTrigger.node.js",
"dist/nodes/SecurityScorecard/SecurityScorecard.node.js",
"dist/nodes/Segment/Segment.node.js",
"dist/nodes/SendGrid/SendGrid.node.js",
"dist/nodes/Sendy/Sendy.node.js",
"dist/nodes/SentryIo/SentryIo.node.js",
"dist/nodes/ServiceNow/ServiceNow.node.js",
"dist/nodes/Set/Set.node.js",
"dist/nodes/Shopify/Shopify.node.js",
"dist/nodes/Shopify/ShopifyTrigger.node.js",
"dist/nodes/Signl4/Signl4.node.js",
"dist/nodes/Slack/Slack.node.js",
"dist/nodes/Sms77/Sms77.node.js",
"dist/nodes/Snowflake/Snowflake.node.js",
"dist/nodes/SplitInBatches/SplitInBatches.node.js",
"dist/nodes/Splunk/Splunk.node.js",
"dist/nodes/Spontit/Spontit.node.js",
"dist/nodes/Spotify/Spotify.node.js",
"dist/nodes/SpreadsheetFile/SpreadsheetFile.node.js",
"dist/nodes/SseTrigger/SseTrigger.node.js",
"dist/nodes/Ssh/Ssh.node.js",
"dist/nodes/Stackby/Stackby.node.js",
"dist/nodes/Start/Start.node.js",
"dist/nodes/StopAndError/StopAndError.node.js",
"dist/nodes/Storyblok/Storyblok.node.js",
"dist/nodes/Strapi/Strapi.node.js",
"dist/nodes/Strava/Strava.node.js",
"dist/nodes/Strava/StravaTrigger.node.js",
"dist/nodes/Stripe/Stripe.node.js",
"dist/nodes/Stripe/StripeTrigger.node.js",
"dist/nodes/Supabase/Supabase.node.js",
"dist/nodes/SurveyMonkey/SurveyMonkeyTrigger.node.js",
"dist/nodes/Switch/Switch.node.js",
"dist/nodes/SyncroMSP/SyncroMsp.node.js",
"dist/nodes/Taiga/Taiga.node.js",
"dist/nodes/Taiga/TaigaTrigger.node.js",
"dist/nodes/Tapfiliate/Tapfiliate.node.js",
"dist/nodes/Telegram/Telegram.node.js",
"dist/nodes/Telegram/TelegramTrigger.node.js",
"dist/nodes/TheHiveProject/TheHiveProject.node.js",
"dist/nodes/TheHiveProject/TheHiveProjectTrigger.node.js",
"dist/nodes/TheHive/TheHive.node.js",
"dist/nodes/TheHive/TheHiveTrigger.node.js",
"dist/nodes/TimescaleDb/TimescaleDb.node.js",
"dist/nodes/Todoist/Todoist.node.js",
"dist/nodes/Toggl/TogglTrigger.node.js",
"dist/nodes/Totp/Totp.node.js",
"dist/nodes/TravisCi/TravisCi.node.js",
"dist/nodes/Trello/Trello.node.js",
"dist/nodes/Trello/TrelloTrigger.node.js",
"dist/nodes/Twake/Twake.node.js",
"dist/nodes/Twilio/Twilio.node.js",
"dist/nodes/Twist/Twist.node.js",
"dist/nodes/Twitter/Twitter.node.js",
"dist/nodes/Typeform/TypeformTrigger.node.js",
"dist/nodes/UnleashedSoftware/UnleashedSoftware.node.js",
"dist/nodes/Uplead/Uplead.node.js",
"dist/nodes/UProc/UProc.node.js",
"dist/nodes/UptimeRobot/UptimeRobot.node.js",
"dist/nodes/UrlScanIo/UrlScanIo.node.js",
"dist/nodes/Vero/Vero.node.js",
"dist/nodes/Venafi/ProtectCloud/VenafiTlsProtectCloud.node.js",
"dist/nodes/Venafi/ProtectCloud/VenafiTlsProtectCloudTrigger.node.js",
"dist/nodes/Venafi/Datacenter/VenafiTlsProtectDatacenter.node.js",
"dist/nodes/Vonage/Vonage.node.js",
"dist/nodes/Wait/Wait.node.js",
"dist/nodes/Webflow/Webflow.node.js",
"dist/nodes/Webflow/WebflowTrigger.node.js",
"dist/nodes/Webhook/Webhook.node.js",
"dist/nodes/Wekan/Wekan.node.js",
"dist/nodes/WhatsApp/WhatsApp.node.js",
"dist/nodes/Wise/Wise.node.js",
"dist/nodes/Wise/WiseTrigger.node.js",
"dist/nodes/WooCommerce/WooCommerce.node.js",
"dist/nodes/WooCommerce/WooCommerceTrigger.node.js",
"dist/nodes/Wordpress/Wordpress.node.js",
"dist/nodes/Workable/WorkableTrigger.node.js",
"dist/nodes/WorkflowTrigger/WorkflowTrigger.node.js",
"dist/nodes/WriteBinaryFile/WriteBinaryFile.node.js",
"dist/nodes/Wufoo/WufooTrigger.node.js",
"dist/nodes/Xero/Xero.node.js",
"dist/nodes/Xml/Xml.node.js",
"dist/nodes/Yourls/Yourls.node.js",
"dist/nodes/Zammad/Zammad.node.js",
"dist/nodes/Zendesk/Zendesk.node.js",
"dist/nodes/Zendesk/ZendeskTrigger.node.js",
"dist/nodes/Zoho/ZohoCrm.node.js",
"dist/nodes/Zoom/Zoom.node.js",
"dist/nodes/Zulip/Zulip.node.js"
]
},
"devDependencies": {
"@types/amqplib": "^0.10.1",
"@types/aws4": "^1.5.1",
"@types/basic-auth": "^1.1.3",
"@types/cheerio": "^0.22.15",
"@types/cron": "~1.7.1",
"@types/eventsource": "^1.1.2",
"@types/express": "^4.17.6",
"@types/gm": "^1.25.0",
"@types/imap-simple": "^4.2.0",
"@types/js-nacl": "^1.3.0",
"@types/jsonwebtoken": "^9.0.1",
"@types/lodash": "^4.14.195",
"@types/lossless-json": "^1.0.0",
"@types/mailparser": "^2.7.3",
"@types/mime-types": "^2.1.0",
"@types/mssql": "^6.0.2",
"@types/node-ssh": "^7.0.1",
"@types/nodemailer": "^6.4.0",
"@types/promise-ftp": "^1.3.4",
"@types/redis": "^2.8.11",
"@types/request-promise-native": "~1.0.15",
"@types/rfc2047": "^2.0.1",
"@types/showdown": "^1.9.4",
"@types/snowflake-sdk": "^1.6.12",
"@types/ssh2-sftp-client": "^5.1.0",
"@types/tmp": "^0.2.0",
"@types/uuid": "^8.3.2",
"@types/xml2js": "^0.4.11",
"eslint-plugin-n8n-nodes-base": "^1.16.0",
"gulp": "^4.0.0",
"n8n-core": "1.14.1"
},
"dependencies": {
"@kafkajs/confluent-schema-registry": "1.0.6",
"@n8n/vm2": "^3.9.20",
"amqplib": "^0.10.3",
"aws4": "^1.8.0",
"basic-auth": "^2.0.1",
"change-case": "^4.1.1",
"cheerio": "1.0.0-rc.6",
"chokidar": "3.5.2",
"cron": "~1.7.2",
"csv-parse": "^5.5.0",
"currency-codes": "^2.1.0",
"eventsource": "^2.0.2",
"fast-glob": "^3.2.5",
"fflate": "^0.7.0",
"get-system-fonts": "^2.0.2",
"gm": "^1.25.0",
"iconv-lite": "^0.6.2",
"ics": "^2.27.0",
"imap-simple": "^4.3.0",
"isbot": "^3.6.13",
"iso-639-1": "^2.1.3",
"js-nacl": "^1.4.0",
"jsonwebtoken": "^9.0.0",
"kafkajs": "^1.14.0",
"ldapts": "^4.2.6",
"lodash": "^4.17.21",
"lossless-json": "^1.0.4",
"luxon": "^3.3.0",
"mailparser": "^3.2.0",
"minifaker": "^1.34.1",
"moment": "~2.29.2",
"moment-timezone": "^0.5.28",
"mongodb": "^4.17.1",
"mqtt": "^5.0.2",
"mssql": "^8.1.2",
"mysql2": "~2.3.0",
"nanoid": "^3.3.6",
"node-html-markdown": "^1.1.3",
"node-ssh": "^12.0.0",
"nodemailer": "^6.7.1",
"otpauth": "^9.1.1",
"pdfjs-dist": "^2.16.105",
"pg": "^8.3.0",
"pg-promise": "^10.5.8",
"pretty-bytes": "^5.6.0",
"promise-ftp": "^1.3.5",
"pyodide": "^0.23.4",
"redis": "^3.1.1",
"rfc2047": "^4.0.1",
"rhea": "^1.0.11",
"rss-parser": "^3.7.0",
"semver": "^7.5.4",
"showdown": "^2.0.3",
"simple-git": "^3.17.0",
"snowflake-sdk": "^1.8.0",
"ssh2-sftp-client": "^7.0.0",
"tmp-promise": "^3.0.2",
"typedi": "^0.10.0",
"uuid": "^8.3.2",
"xlsx": "https://cdn.sheetjs.com/xlsx-0.19.3/xlsx-0.19.3.tgz",
"xml2js": "^0.5.0",
"n8n-workflow": "1.14.1"
},
"scripts": {
"clean": "rimraf dist .turbo",
"dev": "pnpm watch",
"typecheck": "tsc",
"build": "tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json && gulp build:icons && gulp build:translations && pnpm build:metadata",
"build:translations": "gulp build:translations",
"build:metadata": "pnpm n8n-generate-known && pnpm n8n-generate-ui-types",
"format": "prettier --write . --ignore-path ../../.prettierignore",
"lint": "eslint . --quiet && node ./scripts/validate-load-options-methods.js",
"lintfix": "eslint . --fix",
"watch": "tsc-watch -p tsconfig.build.json --onCompilationComplete \"tsc-alias -p tsconfig.build.json\" --onSuccess \"pnpm n8n-generate-ui-types\"",
"test": "jest"
}
},
"extraction_time_ms": 4,
"extracted_at": "2025-06-07T17:49:22.884Z"
}

View File

@@ -0,0 +1,896 @@
{
"node_type": "n8n-nodes-base.SplitInBatches",
"name": "SplitInBatches",
"package_name": "n8n-nodes-base",
"code_hash": "c751422a11e30bf361a6c4803376289740a40434aeb77f90e18cd4dd7ba5c019",
"code_length": 1135,
"source_location": "node_modules/n8n-nodes-base/dist/nodes/SplitInBatches/SplitInBatches.node.js",
"has_credentials": false,
"source_code": "\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SplitInBatches = void 0;\nconst n8n_workflow_1 = require(\"n8n-workflow\");\nconst SplitInBatchesV1_node_1 = require(\"./v1/SplitInBatchesV1.node\");\nconst SplitInBatchesV2_node_1 = require(\"./v2/SplitInBatchesV2.node\");\nconst SplitInBatchesV3_node_1 = require(\"./v3/SplitInBatchesV3.node\");\nclass SplitInBatches extends n8n_workflow_1.VersionedNodeType {\n constructor() {\n const baseDescription = {\n displayName: 'Split In Batches',\n name: 'splitInBatches',\n icon: 'fa:th-large',\n group: ['organization'],\n description: 'Split data into batches and iterate over each batch',\n defaultVersion: 3,\n };\n const nodeVersions = {\n 1: new SplitInBatchesV1_node_1.SplitInBatchesV1(),\n 2: new SplitInBatchesV2_node_1.SplitInBatchesV2(),\n 3: new SplitInBatchesV3_node_1.SplitInBatchesV3(),\n };\n super(nodeVersions, baseDescription);\n }\n}\nexports.SplitInBatches = SplitInBatches;\n//# sourceMappingURL=SplitInBatches.node.js.map",
"package_info": {
"name": "n8n-nodes-base",
"version": "1.14.1",
"description": "Base nodes of n8n",
"license": "SEE LICENSE IN LICENSE.md",
"homepage": "https://n8n.io",
"author": {
"name": "Jan Oberhauser",
"email": "jan@n8n.io"
},
"main": "index.js",
"repository": {
"type": "git",
"url": "git+https://github.com/n8n-io/n8n.git"
},
"files": [
"dist"
],
"n8n": {
"credentials": [
"dist/credentials/ActionNetworkApi.credentials.js",
"dist/credentials/ActiveCampaignApi.credentials.js",
"dist/credentials/AcuitySchedulingApi.credentials.js",
"dist/credentials/AcuitySchedulingOAuth2Api.credentials.js",
"dist/credentials/AdaloApi.credentials.js",
"dist/credentials/AffinityApi.credentials.js",
"dist/credentials/AgileCrmApi.credentials.js",
"dist/credentials/AirtableApi.credentials.js",
"dist/credentials/AirtableOAuth2Api.credentials.js",
"dist/credentials/AirtableTokenApi.credentials.js",
"dist/credentials/AlienVaultApi.credentials.js",
"dist/credentials/Amqp.credentials.js",
"dist/credentials/ApiTemplateIoApi.credentials.js",
"dist/credentials/AsanaApi.credentials.js",
"dist/credentials/AsanaOAuth2Api.credentials.js",
"dist/credentials/Auth0ManagementApi.credentials.js",
"dist/credentials/AutomizyApi.credentials.js",
"dist/credentials/AutopilotApi.credentials.js",
"dist/credentials/Aws.credentials.js",
"dist/credentials/BambooHrApi.credentials.js",
"dist/credentials/BannerbearApi.credentials.js",
"dist/credentials/BaserowApi.credentials.js",
"dist/credentials/BeeminderApi.credentials.js",
"dist/credentials/BitbucketApi.credentials.js",
"dist/credentials/BitlyApi.credentials.js",
"dist/credentials/BitlyOAuth2Api.credentials.js",
"dist/credentials/BitwardenApi.credentials.js",
"dist/credentials/BoxOAuth2Api.credentials.js",
"dist/credentials/BrandfetchApi.credentials.js",
"dist/credentials/BubbleApi.credentials.js",
"dist/credentials/CalApi.credentials.js",
"dist/credentials/CalendlyApi.credentials.js",
"dist/credentials/CarbonBlackApi.credentials.js",
"dist/credentials/ChargebeeApi.credentials.js",
"dist/credentials/CircleCiApi.credentials.js",
"dist/credentials/CiscoMerakiApi.credentials.js",
"dist/credentials/CiscoSecureEndpointApi.credentials.js",
"dist/credentials/CiscoWebexOAuth2Api.credentials.js",
"dist/credentials/CiscoUmbrellaApi.credentials.js",
"dist/credentials/CitrixAdcApi.credentials.js",
"dist/credentials/CloudflareApi.credentials.js",
"dist/credentials/ClearbitApi.credentials.js",
"dist/credentials/ClickUpApi.credentials.js",
"dist/credentials/ClickUpOAuth2Api.credentials.js",
"dist/credentials/ClockifyApi.credentials.js",
"dist/credentials/CockpitApi.credentials.js",
"dist/credentials/CodaApi.credentials.js",
"dist/credentials/ContentfulApi.credentials.js",
"dist/credentials/ConvertKitApi.credentials.js",
"dist/credentials/CopperApi.credentials.js",
"dist/credentials/CortexApi.credentials.js",
"dist/credentials/CrateDb.credentials.js",
"dist/credentials/CrowdStrikeOAuth2Api.credentials.js",
"dist/credentials/CrowdDevApi.credentials.js",
"dist/credentials/CustomerIoApi.credentials.js",
"dist/credentials/DeepLApi.credentials.js",
"dist/credentials/DemioApi.credentials.js",
"dist/credentials/DhlApi.credentials.js",
"dist/credentials/DiscourseApi.credentials.js",
"dist/credentials/DisqusApi.credentials.js",
"dist/credentials/DriftApi.credentials.js",
"dist/credentials/DriftOAuth2Api.credentials.js",
"dist/credentials/DropboxApi.credentials.js",
"dist/credentials/DropboxOAuth2Api.credentials.js",
"dist/credentials/DropcontactApi.credentials.js",
"dist/credentials/EgoiApi.credentials.js",
"dist/credentials/ElasticsearchApi.credentials.js",
"dist/credentials/ElasticSecurityApi.credentials.js",
"dist/credentials/EmeliaApi.credentials.js",
"dist/credentials/ERPNextApi.credentials.js",
"dist/credentials/EventbriteApi.credentials.js",
"dist/credentials/EventbriteOAuth2Api.credentials.js",
"dist/credentials/F5BigIpApi.credentials.js",
"dist/credentials/FacebookGraphApi.credentials.js",
"dist/credentials/FacebookGraphAppApi.credentials.js",
"dist/credentials/FacebookLeadAdsOAuth2Api.credentials.js",
"dist/credentials/FigmaApi.credentials.js",
"dist/credentials/FileMaker.credentials.js",
"dist/credentials/FlowApi.credentials.js",
"dist/credentials/FormIoApi.credentials.js",
"dist/credentials/FormstackApi.credentials.js",
"dist/credentials/FormstackOAuth2Api.credentials.js",
"dist/credentials/FortiGateApi.credentials.js",
"dist/credentials/FreshdeskApi.credentials.js",
"dist/credentials/FreshserviceApi.credentials.js",
"dist/credentials/FreshworksCrmApi.credentials.js",
"dist/credentials/Ftp.credentials.js",
"dist/credentials/GetResponseApi.credentials.js",
"dist/credentials/GetResponseOAuth2Api.credentials.js",
"dist/credentials/GhostAdminApi.credentials.js",
"dist/credentials/GhostContentApi.credentials.js",
"dist/credentials/GithubApi.credentials.js",
"dist/credentials/GithubOAuth2Api.credentials.js",
"dist/credentials/GitlabApi.credentials.js",
"dist/credentials/GitlabOAuth2Api.credentials.js",
"dist/credentials/GitPassword.credentials.js",
"dist/credentials/GmailOAuth2Api.credentials.js",
"dist/credentials/GoogleAdsOAuth2Api.credentials.js",
"dist/credentials/GoogleAnalyticsOAuth2Api.credentials.js",
"dist/credentials/GoogleApi.credentials.js",
"dist/credentials/GoogleBigQueryOAuth2Api.credentials.js",
"dist/credentials/GoogleBooksOAuth2Api.credentials.js",
"dist/credentials/GoogleCalendarOAuth2Api.credentials.js",
"dist/credentials/GoogleCloudNaturalLanguageOAuth2Api.credentials.js",
"dist/credentials/GoogleCloudStorageOAuth2Api.credentials.js",
"dist/credentials/GoogleContactsOAuth2Api.credentials.js",
"dist/credentials/GoogleDocsOAuth2Api.credentials.js",
"dist/credentials/GoogleDriveOAuth2Api.credentials.js",
"dist/credentials/GoogleFirebaseCloudFirestoreOAuth2Api.credentials.js",
"dist/credentials/GoogleFirebaseRealtimeDatabaseOAuth2Api.credentials.js",
"dist/credentials/GoogleOAuth2Api.credentials.js",
"dist/credentials/GooglePerspectiveOAuth2Api.credentials.js",
"dist/credentials/GoogleSheetsOAuth2Api.credentials.js",
"dist/credentials/GoogleSheetsTriggerOAuth2Api.credentials.js",
"dist/credentials/GoogleSlidesOAuth2Api.credentials.js",
"dist/credentials/GoogleTasksOAuth2Api.credentials.js",
"dist/credentials/GoogleTranslateOAuth2Api.credentials.js",
"dist/credentials/GotifyApi.credentials.js",
"dist/credentials/GoToWebinarOAuth2Api.credentials.js",
"dist/credentials/GristApi.credentials.js",
"dist/credentials/GrafanaApi.credentials.js",
"dist/credentials/GSuiteAdminOAuth2Api.credentials.js",
"dist/credentials/GumroadApi.credentials.js",
"dist/credentials/HaloPSAApi.credentials.js",
"dist/credentials/HarvestApi.credentials.js",
"dist/credentials/HarvestOAuth2Api.credentials.js",
"dist/credentials/HelpScoutOAuth2Api.credentials.js",
"dist/credentials/HighLevelApi.credentials.js",
"dist/credentials/HomeAssistantApi.credentials.js",
"dist/credentials/HttpBasicAuth.credentials.js",
"dist/credentials/HttpDigestAuth.credentials.js",
"dist/credentials/HttpHeaderAuth.credentials.js",
"dist/credentials/HttpCustomAuth.credentials.js",
"dist/credentials/HttpQueryAuth.credentials.js",
"dist/credentials/HubspotApi.credentials.js",
"dist/credentials/HubspotAppToken.credentials.js",
"dist/credentials/HubspotDeveloperApi.credentials.js",
"dist/credentials/HubspotOAuth2Api.credentials.js",
"dist/credentials/HumanticAiApi.credentials.js",
"dist/credentials/HunterApi.credentials.js",
"dist/credentials/HybridAnalysisApi.credentials.js",
"dist/credentials/Imap.credentials.js",
"dist/credentials/ImpervaWafApi.credentials.js",
"dist/credentials/IntercomApi.credentials.js",
"dist/credentials/InvoiceNinjaApi.credentials.js",
"dist/credentials/IterableApi.credentials.js",
"dist/credentials/JenkinsApi.credentials.js",
"dist/credentials/JiraSoftwareCloudApi.credentials.js",
"dist/credentials/JiraSoftwareServerApi.credentials.js",
"dist/credentials/JotFormApi.credentials.js",
"dist/credentials/Kafka.credentials.js",
"dist/credentials/KeapOAuth2Api.credentials.js",
"dist/credentials/KibanaApi.credentials.js",
"dist/credentials/KitemakerApi.credentials.js",
"dist/credentials/KoBoToolboxApi.credentials.js",
"dist/credentials/Ldap.credentials.js",
"dist/credentials/LemlistApi.credentials.js",
"dist/credentials/LinearApi.credentials.js",
"dist/credentials/LinearOAuth2Api.credentials.js",
"dist/credentials/LineNotifyOAuth2Api.credentials.js",
"dist/credentials/LingvaNexApi.credentials.js",
"dist/credentials/LinkedInOAuth2Api.credentials.js",
"dist/credentials/LoneScaleApi.credentials.js",
"dist/credentials/Magento2Api.credentials.js",
"dist/credentials/MailcheckApi.credentials.js",
"dist/credentials/MailchimpApi.credentials.js",
"dist/credentials/MailchimpOAuth2Api.credentials.js",
"dist/credentials/MailerLiteApi.credentials.js",
"dist/credentials/MailgunApi.credentials.js",
"dist/credentials/MailjetEmailApi.credentials.js",
"dist/credentials/MailjetSmsApi.credentials.js",
"dist/credentials/MandrillApi.credentials.js",
"dist/credentials/MarketstackApi.credentials.js",
"dist/credentials/MatrixApi.credentials.js",
"dist/credentials/MattermostApi.credentials.js",
"dist/credentials/MauticApi.credentials.js",
"dist/credentials/MauticOAuth2Api.credentials.js",
"dist/credentials/MediumApi.credentials.js",
"dist/credentials/MediumOAuth2Api.credentials.js",
"dist/credentials/MetabaseApi.credentials.js",
"dist/credentials/MessageBirdApi.credentials.js",
"dist/credentials/MetabaseApi.credentials.js",
"dist/credentials/MicrosoftDynamicsOAuth2Api.credentials.js",
"dist/credentials/MicrosoftEntraOAuth2Api.credentials.js",
"dist/credentials/MicrosoftExcelOAuth2Api.credentials.js",
"dist/credentials/MicrosoftGraphSecurityOAuth2Api.credentials.js",
"dist/credentials/MicrosoftOAuth2Api.credentials.js",
"dist/credentials/MicrosoftOneDriveOAuth2Api.credentials.js",
"dist/credentials/MicrosoftOutlookOAuth2Api.credentials.js",
"dist/credentials/MicrosoftSql.credentials.js",
"dist/credentials/MicrosoftTeamsOAuth2Api.credentials.js",
"dist/credentials/MicrosoftToDoOAuth2Api.credentials.js",
"dist/credentials/MindeeInvoiceApi.credentials.js",
"dist/credentials/MindeeReceiptApi.credentials.js",
"dist/credentials/MispApi.credentials.js",
"dist/credentials/MistApi.credentials.js",
"dist/credentials/MoceanApi.credentials.js",
"dist/credentials/MondayComApi.credentials.js",
"dist/credentials/MondayComOAuth2Api.credentials.js",
"dist/credentials/MongoDb.credentials.js",
"dist/credentials/MonicaCrmApi.credentials.js",
"dist/credentials/Mqtt.credentials.js",
"dist/credentials/Msg91Api.credentials.js",
"dist/credentials/MySql.credentials.js",
"dist/credentials/N8nApi.credentials.js",
"dist/credentials/NasaApi.credentials.js",
"dist/credentials/NetlifyApi.credentials.js",
"dist/credentials/NextCloudApi.credentials.js",
"dist/credentials/NextCloudOAuth2Api.credentials.js",
"dist/credentials/NocoDb.credentials.js",
"dist/credentials/NocoDbApiToken.credentials.js",
"dist/credentials/NotionApi.credentials.js",
"dist/credentials/NotionOAuth2Api.credentials.js",
"dist/credentials/NpmApi.credentials.js",
"dist/credentials/OAuth1Api.credentials.js",
"dist/credentials/OAuth2Api.credentials.js",
"dist/credentials/OdooApi.credentials.js",
"dist/credentials/OktaApi.credentials.js",
"dist/credentials/OneSimpleApi.credentials.js",
"dist/credentials/OnfleetApi.credentials.js",
"dist/credentials/OpenAiApi.credentials.js",
"dist/credentials/OpenCTIApi.credentials.js",
"dist/credentials/OpenWeatherMapApi.credentials.js",
"dist/credentials/OrbitApi.credentials.js",
"dist/credentials/OuraApi.credentials.js",
"dist/credentials/PaddleApi.credentials.js",
"dist/credentials/PagerDutyApi.credentials.js",
"dist/credentials/PagerDutyOAuth2Api.credentials.js",
"dist/credentials/PayPalApi.credentials.js",
"dist/credentials/PeekalinkApi.credentials.js",
"dist/credentials/PhantombusterApi.credentials.js",
"dist/credentials/PhilipsHueOAuth2Api.credentials.js",
"dist/credentials/PipedriveApi.credentials.js",
"dist/credentials/PipedriveOAuth2Api.credentials.js",
"dist/credentials/PlivoApi.credentials.js",
"dist/credentials/Postgres.credentials.js",
"dist/credentials/PostHogApi.credentials.js",
"dist/credentials/PostmarkApi.credentials.js",
"dist/credentials/ProfitWellApi.credentials.js",
"dist/credentials/PushbulletOAuth2Api.credentials.js",
"dist/credentials/PushcutApi.credentials.js",
"dist/credentials/PushoverApi.credentials.js",
"dist/credentials/QRadarApi.credentials.js",
"dist/credentials/QualysApi.credentials.js",
"dist/credentials/QuestDb.credentials.js",
"dist/credentials/QuickBaseApi.credentials.js",
"dist/credentials/QuickBooksOAuth2Api.credentials.js",
"dist/credentials/RabbitMQ.credentials.js",
"dist/credentials/RaindropOAuth2Api.credentials.js",
"dist/credentials/RecordedFutureApi.credentials.js",
"dist/credentials/RedditOAuth2Api.credentials.js",
"dist/credentials/Redis.credentials.js",
"dist/credentials/RocketchatApi.credentials.js",
"dist/credentials/RundeckApi.credentials.js",
"dist/credentials/S3.credentials.js",
"dist/credentials/SalesforceJwtApi.credentials.js",
"dist/credentials/SalesforceOAuth2Api.credentials.js",
"dist/credentials/SalesmateApi.credentials.js",
"dist/credentials/SeaTableApi.credentials.js",
"dist/credentials/SecurityScorecardApi.credentials.js",
"dist/credentials/SegmentApi.credentials.js",
"dist/credentials/SekoiaApi.credentials.js",
"dist/credentials/SendGridApi.credentials.js",
"dist/credentials/BrevoApi.credentials.js",
"dist/credentials/SendyApi.credentials.js",
"dist/credentials/SentryIoApi.credentials.js",
"dist/credentials/SentryIoOAuth2Api.credentials.js",
"dist/credentials/SentryIoServerApi.credentials.js",
"dist/credentials/ServiceNowOAuth2Api.credentials.js",
"dist/credentials/ServiceNowBasicApi.credentials.js",
"dist/credentials/Sftp.credentials.js",
"dist/credentials/ShopifyApi.credentials.js",
"dist/credentials/ShopifyAccessTokenApi.credentials.js",
"dist/credentials/ShopifyOAuth2Api.credentials.js",
"dist/credentials/Signl4Api.credentials.js",
"dist/credentials/SlackApi.credentials.js",
"dist/credentials/SlackOAuth2Api.credentials.js",
"dist/credentials/Sms77Api.credentials.js",
"dist/credentials/Smtp.credentials.js",
"dist/credentials/Snowflake.credentials.js",
"dist/credentials/SplunkApi.credentials.js",
"dist/credentials/SpontitApi.credentials.js",
"dist/credentials/SpotifyOAuth2Api.credentials.js",
"dist/credentials/ShufflerApi.credentials.js",
"dist/credentials/SshPassword.credentials.js",
"dist/credentials/SshPrivateKey.credentials.js",
"dist/credentials/StackbyApi.credentials.js",
"dist/credentials/StoryblokContentApi.credentials.js",
"dist/credentials/StoryblokManagementApi.credentials.js",
"dist/credentials/StrapiApi.credentials.js",
"dist/credentials/StrapiTokenApi.credentials.js",
"dist/credentials/StravaOAuth2Api.credentials.js",
"dist/credentials/StripeApi.credentials.js",
"dist/credentials/SupabaseApi.credentials.js",
"dist/credentials/SurveyMonkeyApi.credentials.js",
"dist/credentials/SurveyMonkeyOAuth2Api.credentials.js",
"dist/credentials/SyncroMspApi.credentials.js",
"dist/credentials/TaigaApi.credentials.js",
"dist/credentials/TapfiliateApi.credentials.js",
"dist/credentials/TelegramApi.credentials.js",
"dist/credentials/TheHiveProjectApi.credentials.js",
"dist/credentials/TheHiveApi.credentials.js",
"dist/credentials/TimescaleDb.credentials.js",
"dist/credentials/TodoistApi.credentials.js",
"dist/credentials/TodoistOAuth2Api.credentials.js",
"dist/credentials/TogglApi.credentials.js",
"dist/credentials/TotpApi.credentials.js",
"dist/credentials/TravisCiApi.credentials.js",
"dist/credentials/TrellixEpoApi.credentials.js",
"dist/credentials/TrelloApi.credentials.js",
"dist/credentials/TwakeCloudApi.credentials.js",
"dist/credentials/TwakeServerApi.credentials.js",
"dist/credentials/TwilioApi.credentials.js",
"dist/credentials/TwistOAuth2Api.credentials.js",
"dist/credentials/TwitterOAuth1Api.credentials.js",
"dist/credentials/TwitterOAuth2Api.credentials.js",
"dist/credentials/TypeformApi.credentials.js",
"dist/credentials/TypeformOAuth2Api.credentials.js",
"dist/credentials/UnleashedSoftwareApi.credentials.js",
"dist/credentials/UpleadApi.credentials.js",
"dist/credentials/UProcApi.credentials.js",
"dist/credentials/UptimeRobotApi.credentials.js",
"dist/credentials/UrlScanIoApi.credentials.js",
"dist/credentials/VeroApi.credentials.js",
"dist/credentials/VirusTotalApi.credentials.js",
"dist/credentials/VonageApi.credentials.js",
"dist/credentials/VenafiTlsProtectCloudApi.credentials.js",
"dist/credentials/VenafiTlsProtectDatacenterApi.credentials.js",
"dist/credentials/WebflowApi.credentials.js",
"dist/credentials/WebflowOAuth2Api.credentials.js",
"dist/credentials/WekanApi.credentials.js",
"dist/credentials/WhatsAppApi.credentials.js",
"dist/credentials/WiseApi.credentials.js",
"dist/credentials/WooCommerceApi.credentials.js",
"dist/credentials/WordpressApi.credentials.js",
"dist/credentials/WorkableApi.credentials.js",
"dist/credentials/WufooApi.credentials.js",
"dist/credentials/XeroOAuth2Api.credentials.js",
"dist/credentials/YourlsApi.credentials.js",
"dist/credentials/YouTubeOAuth2Api.credentials.js",
"dist/credentials/ZammadBasicAuthApi.credentials.js",
"dist/credentials/ZammadTokenAuthApi.credentials.js",
"dist/credentials/ZendeskApi.credentials.js",
"dist/credentials/ZendeskOAuth2Api.credentials.js",
"dist/credentials/ZohoOAuth2Api.credentials.js",
"dist/credentials/ZoomApi.credentials.js",
"dist/credentials/ZoomOAuth2Api.credentials.js",
"dist/credentials/ZscalerZiaApi.credentials.js",
"dist/credentials/ZulipApi.credentials.js"
],
"nodes": [
"dist/nodes/ActionNetwork/ActionNetwork.node.js",
"dist/nodes/ActiveCampaign/ActiveCampaign.node.js",
"dist/nodes/ActiveCampaign/ActiveCampaignTrigger.node.js",
"dist/nodes/AcuityScheduling/AcuitySchedulingTrigger.node.js",
"dist/nodes/Adalo/Adalo.node.js",
"dist/nodes/Affinity/Affinity.node.js",
"dist/nodes/Affinity/AffinityTrigger.node.js",
"dist/nodes/AgileCrm/AgileCrm.node.js",
"dist/nodes/Airtable/Airtable.node.js",
"dist/nodes/Airtable/AirtableTrigger.node.js",
"dist/nodes/Amqp/Amqp.node.js",
"dist/nodes/Amqp/AmqpTrigger.node.js",
"dist/nodes/ApiTemplateIo/ApiTemplateIo.node.js",
"dist/nodes/Asana/Asana.node.js",
"dist/nodes/Asana/AsanaTrigger.node.js",
"dist/nodes/Automizy/Automizy.node.js",
"dist/nodes/Autopilot/Autopilot.node.js",
"dist/nodes/Autopilot/AutopilotTrigger.node.js",
"dist/nodes/Aws/AwsLambda.node.js",
"dist/nodes/Aws/AwsSns.node.js",
"dist/nodes/Aws/AwsSnsTrigger.node.js",
"dist/nodes/Aws/CertificateManager/AwsCertificateManager.node.js",
"dist/nodes/Aws/Comprehend/AwsComprehend.node.js",
"dist/nodes/Aws/DynamoDB/AwsDynamoDB.node.js",
"dist/nodes/Aws/ELB/AwsElb.node.js",
"dist/nodes/Aws/Rekognition/AwsRekognition.node.js",
"dist/nodes/Aws/S3/AwsS3.node.js",
"dist/nodes/Aws/SES/AwsSes.node.js",
"dist/nodes/Aws/SQS/AwsSqs.node.js",
"dist/nodes/Aws/Textract/AwsTextract.node.js",
"dist/nodes/Aws/Transcribe/AwsTranscribe.node.js",
"dist/nodes/BambooHr/BambooHr.node.js",
"dist/nodes/Bannerbear/Bannerbear.node.js",
"dist/nodes/Baserow/Baserow.node.js",
"dist/nodes/Beeminder/Beeminder.node.js",
"dist/nodes/Bitbucket/BitbucketTrigger.node.js",
"dist/nodes/Bitly/Bitly.node.js",
"dist/nodes/Bitwarden/Bitwarden.node.js",
"dist/nodes/Box/Box.node.js",
"dist/nodes/Box/BoxTrigger.node.js",
"dist/nodes/Brandfetch/Brandfetch.node.js",
"dist/nodes/Bubble/Bubble.node.js",
"dist/nodes/Cal/CalTrigger.node.js",
"dist/nodes/Calendly/CalendlyTrigger.node.js",
"dist/nodes/Chargebee/Chargebee.node.js",
"dist/nodes/Chargebee/ChargebeeTrigger.node.js",
"dist/nodes/CircleCi/CircleCi.node.js",
"dist/nodes/Cisco/Webex/CiscoWebex.node.js",
"dist/nodes/Citrix/ADC/CitrixAdc.node.js",
"dist/nodes/Cisco/Webex/CiscoWebexTrigger.node.js",
"dist/nodes/Cloudflare/Cloudflare.node.js",
"dist/nodes/Clearbit/Clearbit.node.js",
"dist/nodes/ClickUp/ClickUp.node.js",
"dist/nodes/ClickUp/ClickUpTrigger.node.js",
"dist/nodes/Clockify/Clockify.node.js",
"dist/nodes/Clockify/ClockifyTrigger.node.js",
"dist/nodes/Cockpit/Cockpit.node.js",
"dist/nodes/Coda/Coda.node.js",
"dist/nodes/Code/Code.node.js",
"dist/nodes/CoinGecko/CoinGecko.node.js",
"dist/nodes/CompareDatasets/CompareDatasets.node.js",
"dist/nodes/Compression/Compression.node.js",
"dist/nodes/Contentful/Contentful.node.js",
"dist/nodes/ConvertKit/ConvertKit.node.js",
"dist/nodes/ConvertKit/ConvertKitTrigger.node.js",
"dist/nodes/Copper/Copper.node.js",
"dist/nodes/Copper/CopperTrigger.node.js",
"dist/nodes/Cortex/Cortex.node.js",
"dist/nodes/CrateDb/CrateDb.node.js",
"dist/nodes/Cron/Cron.node.js",
"dist/nodes/CrowdDev/CrowdDev.node.js",
"dist/nodes/CrowdDev/CrowdDevTrigger.node.js",
"dist/nodes/Crypto/Crypto.node.js",
"dist/nodes/CustomerIo/CustomerIo.node.js",
"dist/nodes/CustomerIo/CustomerIoTrigger.node.js",
"dist/nodes/DateTime/DateTime.node.js",
"dist/nodes/DebugHelper/DebugHelper.node.js",
"dist/nodes/DeepL/DeepL.node.js",
"dist/nodes/Demio/Demio.node.js",
"dist/nodes/Dhl/Dhl.node.js",
"dist/nodes/Discord/Discord.node.js",
"dist/nodes/Discourse/Discourse.node.js",
"dist/nodes/Disqus/Disqus.node.js",
"dist/nodes/Drift/Drift.node.js",
"dist/nodes/Dropbox/Dropbox.node.js",
"dist/nodes/Dropcontact/Dropcontact.node.js",
"dist/nodes/EditImage/EditImage.node.js",
"dist/nodes/E2eTest/E2eTest.node.js",
"dist/nodes/Egoi/Egoi.node.js",
"dist/nodes/Elastic/Elasticsearch/Elasticsearch.node.js",
"dist/nodes/Elastic/ElasticSecurity/ElasticSecurity.node.js",
"dist/nodes/EmailReadImap/EmailReadImap.node.js",
"dist/nodes/EmailSend/EmailSend.node.js",
"dist/nodes/Emelia/Emelia.node.js",
"dist/nodes/Emelia/EmeliaTrigger.node.js",
"dist/nodes/ERPNext/ERPNext.node.js",
"dist/nodes/ErrorTrigger/ErrorTrigger.node.js",
"dist/nodes/Eventbrite/EventbriteTrigger.node.js",
"dist/nodes/ExecuteCommand/ExecuteCommand.node.js",
"dist/nodes/ExecuteWorkflow/ExecuteWorkflow.node.js",
"dist/nodes/ExecuteWorkflowTrigger/ExecuteWorkflowTrigger.node.js",
"dist/nodes/ExecutionData/ExecutionData.node.js",
"dist/nodes/Facebook/FacebookGraphApi.node.js",
"dist/nodes/Facebook/FacebookTrigger.node.js",
"dist/nodes/FacebookLeadAds/FacebookLeadAdsTrigger.node.js",
"dist/nodes/Figma/FigmaTrigger.node.js",
"dist/nodes/FileMaker/FileMaker.node.js",
"dist/nodes/Filter/Filter.node.js",
"dist/nodes/Flow/Flow.node.js",
"dist/nodes/Flow/FlowTrigger.node.js",
"dist/nodes/Form/FormTrigger.node.js",
"dist/nodes/FormIo/FormIoTrigger.node.js",
"dist/nodes/Formstack/FormstackTrigger.node.js",
"dist/nodes/Freshdesk/Freshdesk.node.js",
"dist/nodes/Freshservice/Freshservice.node.js",
"dist/nodes/FreshworksCrm/FreshworksCrm.node.js",
"dist/nodes/Ftp/Ftp.node.js",
"dist/nodes/Function/Function.node.js",
"dist/nodes/FunctionItem/FunctionItem.node.js",
"dist/nodes/GetResponse/GetResponse.node.js",
"dist/nodes/GetResponse/GetResponseTrigger.node.js",
"dist/nodes/Ghost/Ghost.node.js",
"dist/nodes/Git/Git.node.js",
"dist/nodes/Github/Github.node.js",
"dist/nodes/Github/GithubTrigger.node.js",
"dist/nodes/Gitlab/Gitlab.node.js",
"dist/nodes/Gitlab/GitlabTrigger.node.js",
"dist/nodes/Google/Ads/GoogleAds.node.js",
"dist/nodes/Google/Analytics/GoogleAnalytics.node.js",
"dist/nodes/Google/BigQuery/GoogleBigQuery.node.js",
"dist/nodes/Google/Books/GoogleBooks.node.js",
"dist/nodes/Google/Calendar/GoogleCalendar.node.js",
"dist/nodes/Google/Calendar/GoogleCalendarTrigger.node.js",
"dist/nodes/Google/Chat/GoogleChat.node.js",
"dist/nodes/Google/CloudNaturalLanguage/GoogleCloudNaturalLanguage.node.js",
"dist/nodes/Google/CloudStorage/GoogleCloudStorage.node.js",
"dist/nodes/Google/Contacts/GoogleContacts.node.js",
"dist/nodes/Google/Docs/GoogleDocs.node.js",
"dist/nodes/Google/Drive/GoogleDrive.node.js",
"dist/nodes/Google/Drive/GoogleDriveTrigger.node.js",
"dist/nodes/Google/Firebase/CloudFirestore/GoogleFirebaseCloudFirestore.node.js",
"dist/nodes/Google/Firebase/RealtimeDatabase/GoogleFirebaseRealtimeDatabase.node.js",
"dist/nodes/Google/Gmail/Gmail.node.js",
"dist/nodes/Google/Gmail/GmailTrigger.node.js",
"dist/nodes/Google/GSuiteAdmin/GSuiteAdmin.node.js",
"dist/nodes/Google/Perspective/GooglePerspective.node.js",
"dist/nodes/Google/Sheet/GoogleSheets.node.js",
"dist/nodes/Google/Sheet/GoogleSheetsTrigger.node.js",
"dist/nodes/Google/Slides/GoogleSlides.node.js",
"dist/nodes/Google/Task/GoogleTasks.node.js",
"dist/nodes/Google/Translate/GoogleTranslate.node.js",
"dist/nodes/Google/YouTube/YouTube.node.js",
"dist/nodes/Gotify/Gotify.node.js",
"dist/nodes/GoToWebinar/GoToWebinar.node.js",
"dist/nodes/Grafana/Grafana.node.js",
"dist/nodes/GraphQL/GraphQL.node.js",
"dist/nodes/Grist/Grist.node.js",
"dist/nodes/Gumroad/GumroadTrigger.node.js",
"dist/nodes/HackerNews/HackerNews.node.js",
"dist/nodes/HaloPSA/HaloPSA.node.js",
"dist/nodes/Harvest/Harvest.node.js",
"dist/nodes/HelpScout/HelpScout.node.js",
"dist/nodes/HelpScout/HelpScoutTrigger.node.js",
"dist/nodes/HighLevel/HighLevel.node.js",
"dist/nodes/HomeAssistant/HomeAssistant.node.js",
"dist/nodes/HtmlExtract/HtmlExtract.node.js",
"dist/nodes/Html/Html.node.js",
"dist/nodes/HttpRequest/HttpRequest.node.js",
"dist/nodes/Hubspot/Hubspot.node.js",
"dist/nodes/Hubspot/HubspotTrigger.node.js",
"dist/nodes/HumanticAI/HumanticAi.node.js",
"dist/nodes/Hunter/Hunter.node.js",
"dist/nodes/ICalendar/ICalendar.node.js",
"dist/nodes/If/If.node.js",
"dist/nodes/Intercom/Intercom.node.js",
"dist/nodes/Interval/Interval.node.js",
"dist/nodes/InvoiceNinja/InvoiceNinja.node.js",
"dist/nodes/InvoiceNinja/InvoiceNinjaTrigger.node.js",
"dist/nodes/ItemLists/ItemLists.node.js",
"dist/nodes/Iterable/Iterable.node.js",
"dist/nodes/Jenkins/Jenkins.node.js",
"dist/nodes/Jira/Jira.node.js",
"dist/nodes/Jira/JiraTrigger.node.js",
"dist/nodes/JotForm/JotFormTrigger.node.js",
"dist/nodes/Kafka/Kafka.node.js",
"dist/nodes/Kafka/KafkaTrigger.node.js",
"dist/nodes/Keap/Keap.node.js",
"dist/nodes/Keap/KeapTrigger.node.js",
"dist/nodes/Kitemaker/Kitemaker.node.js",
"dist/nodes/KoBoToolbox/KoBoToolbox.node.js",
"dist/nodes/KoBoToolbox/KoBoToolboxTrigger.node.js",
"dist/nodes/Ldap/Ldap.node.js",
"dist/nodes/Lemlist/Lemlist.node.js",
"dist/nodes/Lemlist/LemlistTrigger.node.js",
"dist/nodes/Line/Line.node.js",
"dist/nodes/Linear/Linear.node.js",
"dist/nodes/Linear/LinearTrigger.node.js",
"dist/nodes/LingvaNex/LingvaNex.node.js",
"dist/nodes/LinkedIn/LinkedIn.node.js",
"dist/nodes/LocalFileTrigger/LocalFileTrigger.node.js",
"dist/nodes/LoneScale/LoneScaleTrigger.node.js",
"dist/nodes/LoneScale/LoneScale.node.js",
"dist/nodes/Magento/Magento2.node.js",
"dist/nodes/Mailcheck/Mailcheck.node.js",
"dist/nodes/Mailchimp/Mailchimp.node.js",
"dist/nodes/Mailchimp/MailchimpTrigger.node.js",
"dist/nodes/MailerLite/MailerLite.node.js",
"dist/nodes/MailerLite/MailerLiteTrigger.node.js",
"dist/nodes/Mailgun/Mailgun.node.js",
"dist/nodes/Mailjet/Mailjet.node.js",
"dist/nodes/Mailjet/MailjetTrigger.node.js",
"dist/nodes/Mandrill/Mandrill.node.js",
"dist/nodes/ManualTrigger/ManualTrigger.node.js",
"dist/nodes/Markdown/Markdown.node.js",
"dist/nodes/Marketstack/Marketstack.node.js",
"dist/nodes/Matrix/Matrix.node.js",
"dist/nodes/Mattermost/Mattermost.node.js",
"dist/nodes/Mautic/Mautic.node.js",
"dist/nodes/Mautic/MauticTrigger.node.js",
"dist/nodes/Medium/Medium.node.js",
"dist/nodes/Merge/Merge.node.js",
"dist/nodes/MessageBird/MessageBird.node.js",
"dist/nodes/Metabase/Metabase.node.js",
"dist/nodes/Microsoft/Dynamics/MicrosoftDynamicsCrm.node.js",
"dist/nodes/Microsoft/Excel/MicrosoftExcel.node.js",
"dist/nodes/Microsoft/GraphSecurity/MicrosoftGraphSecurity.node.js",
"dist/nodes/Microsoft/OneDrive/MicrosoftOneDrive.node.js",
"dist/nodes/Microsoft/Outlook/MicrosoftOutlook.node.js",
"dist/nodes/Microsoft/Sql/MicrosoftSql.node.js",
"dist/nodes/Microsoft/Teams/MicrosoftTeams.node.js",
"dist/nodes/Microsoft/ToDo/MicrosoftToDo.node.js",
"dist/nodes/Mindee/Mindee.node.js",
"dist/nodes/Misp/Misp.node.js",
"dist/nodes/Mocean/Mocean.node.js",
"dist/nodes/MondayCom/MondayCom.node.js",
"dist/nodes/MongoDb/MongoDb.node.js",
"dist/nodes/MonicaCrm/MonicaCrm.node.js",
"dist/nodes/MoveBinaryData/MoveBinaryData.node.js",
"dist/nodes/MQTT/Mqtt.node.js",
"dist/nodes/MQTT/MqttTrigger.node.js",
"dist/nodes/Msg91/Msg91.node.js",
"dist/nodes/MySql/MySql.node.js",
"dist/nodes/N8n/N8n.node.js",
"dist/nodes/N8nTrainingCustomerDatastore/N8nTrainingCustomerDatastore.node.js",
"dist/nodes/N8nTrainingCustomerMessenger/N8nTrainingCustomerMessenger.node.js",
"dist/nodes/N8nTrigger/N8nTrigger.node.js",
"dist/nodes/Nasa/Nasa.node.js",
"dist/nodes/Netlify/Netlify.node.js",
"dist/nodes/Netlify/NetlifyTrigger.node.js",
"dist/nodes/NextCloud/NextCloud.node.js",
"dist/nodes/NocoDB/NocoDB.node.js",
"dist/nodes/Brevo/Brevo.node.js",
"dist/nodes/Brevo/BrevoTrigger.node.js",
"dist/nodes/StickyNote/StickyNote.node.js",
"dist/nodes/NoOp/NoOp.node.js",
"dist/nodes/Onfleet/Onfleet.node.js",
"dist/nodes/Onfleet/OnfleetTrigger.node.js",
"dist/nodes/Notion/Notion.node.js",
"dist/nodes/Notion/NotionTrigger.node.js",
"dist/nodes/Npm/Npm.node.js",
"dist/nodes/Odoo/Odoo.node.js",
"dist/nodes/OneSimpleApi/OneSimpleApi.node.js",
"dist/nodes/OpenAi/OpenAi.node.js",
"dist/nodes/OpenThesaurus/OpenThesaurus.node.js",
"dist/nodes/OpenWeatherMap/OpenWeatherMap.node.js",
"dist/nodes/Orbit/Orbit.node.js",
"dist/nodes/Oura/Oura.node.js",
"dist/nodes/Paddle/Paddle.node.js",
"dist/nodes/PagerDuty/PagerDuty.node.js",
"dist/nodes/PayPal/PayPal.node.js",
"dist/nodes/PayPal/PayPalTrigger.node.js",
"dist/nodes/Peekalink/Peekalink.node.js",
"dist/nodes/Phantombuster/Phantombuster.node.js",
"dist/nodes/PhilipsHue/PhilipsHue.node.js",
"dist/nodes/Pipedrive/Pipedrive.node.js",
"dist/nodes/Pipedrive/PipedriveTrigger.node.js",
"dist/nodes/Plivo/Plivo.node.js",
"dist/nodes/PostBin/PostBin.node.js",
"dist/nodes/Postgres/Postgres.node.js",
"dist/nodes/Postgres/PostgresTrigger.node.js",
"dist/nodes/PostHog/PostHog.node.js",
"dist/nodes/Postmark/PostmarkTrigger.node.js",
"dist/nodes/ProfitWell/ProfitWell.node.js",
"dist/nodes/Pushbullet/Pushbullet.node.js",
"dist/nodes/Pushcut/Pushcut.node.js",
"dist/nodes/Pushcut/PushcutTrigger.node.js",
"dist/nodes/Pushover/Pushover.node.js",
"dist/nodes/QuestDb/QuestDb.node.js",
"dist/nodes/QuickBase/QuickBase.node.js",
"dist/nodes/QuickBooks/QuickBooks.node.js",
"dist/nodes/QuickChart/QuickChart.node.js",
"dist/nodes/RabbitMQ/RabbitMQ.node.js",
"dist/nodes/RabbitMQ/RabbitMQTrigger.node.js",
"dist/nodes/Raindrop/Raindrop.node.js",
"dist/nodes/ReadBinaryFile/ReadBinaryFile.node.js",
"dist/nodes/ReadBinaryFiles/ReadBinaryFiles.node.js",
"dist/nodes/ReadPdf/ReadPDF.node.js",
"dist/nodes/Reddit/Reddit.node.js",
"dist/nodes/Redis/Redis.node.js",
"dist/nodes/Redis/RedisTrigger.node.js",
"dist/nodes/RenameKeys/RenameKeys.node.js",
"dist/nodes/RespondToWebhook/RespondToWebhook.node.js",
"dist/nodes/Rocketchat/Rocketchat.node.js",
"dist/nodes/RssFeedRead/RssFeedRead.node.js",
"dist/nodes/RssFeedRead/RssFeedReadTrigger.node.js",
"dist/nodes/Rundeck/Rundeck.node.js",
"dist/nodes/S3/S3.node.js",
"dist/nodes/Salesforce/Salesforce.node.js",
"dist/nodes/Salesmate/Salesmate.node.js",
"dist/nodes/Schedule/ScheduleTrigger.node.js",
"dist/nodes/SeaTable/SeaTable.node.js",
"dist/nodes/SeaTable/SeaTableTrigger.node.js",
"dist/nodes/SecurityScorecard/SecurityScorecard.node.js",
"dist/nodes/Segment/Segment.node.js",
"dist/nodes/SendGrid/SendGrid.node.js",
"dist/nodes/Sendy/Sendy.node.js",
"dist/nodes/SentryIo/SentryIo.node.js",
"dist/nodes/ServiceNow/ServiceNow.node.js",
"dist/nodes/Set/Set.node.js",
"dist/nodes/Shopify/Shopify.node.js",
"dist/nodes/Shopify/ShopifyTrigger.node.js",
"dist/nodes/Signl4/Signl4.node.js",
"dist/nodes/Slack/Slack.node.js",
"dist/nodes/Sms77/Sms77.node.js",
"dist/nodes/Snowflake/Snowflake.node.js",
"dist/nodes/SplitInBatches/SplitInBatches.node.js",
"dist/nodes/Splunk/Splunk.node.js",
"dist/nodes/Spontit/Spontit.node.js",
"dist/nodes/Spotify/Spotify.node.js",
"dist/nodes/SpreadsheetFile/SpreadsheetFile.node.js",
"dist/nodes/SseTrigger/SseTrigger.node.js",
"dist/nodes/Ssh/Ssh.node.js",
"dist/nodes/Stackby/Stackby.node.js",
"dist/nodes/Start/Start.node.js",
"dist/nodes/StopAndError/StopAndError.node.js",
"dist/nodes/Storyblok/Storyblok.node.js",
"dist/nodes/Strapi/Strapi.node.js",
"dist/nodes/Strava/Strava.node.js",
"dist/nodes/Strava/StravaTrigger.node.js",
"dist/nodes/Stripe/Stripe.node.js",
"dist/nodes/Stripe/StripeTrigger.node.js",
"dist/nodes/Supabase/Supabase.node.js",
"dist/nodes/SurveyMonkey/SurveyMonkeyTrigger.node.js",
"dist/nodes/Switch/Switch.node.js",
"dist/nodes/SyncroMSP/SyncroMsp.node.js",
"dist/nodes/Taiga/Taiga.node.js",
"dist/nodes/Taiga/TaigaTrigger.node.js",
"dist/nodes/Tapfiliate/Tapfiliate.node.js",
"dist/nodes/Telegram/Telegram.node.js",
"dist/nodes/Telegram/TelegramTrigger.node.js",
"dist/nodes/TheHiveProject/TheHiveProject.node.js",
"dist/nodes/TheHiveProject/TheHiveProjectTrigger.node.js",
"dist/nodes/TheHive/TheHive.node.js",
"dist/nodes/TheHive/TheHiveTrigger.node.js",
"dist/nodes/TimescaleDb/TimescaleDb.node.js",
"dist/nodes/Todoist/Todoist.node.js",
"dist/nodes/Toggl/TogglTrigger.node.js",
"dist/nodes/Totp/Totp.node.js",
"dist/nodes/TravisCi/TravisCi.node.js",
"dist/nodes/Trello/Trello.node.js",
"dist/nodes/Trello/TrelloTrigger.node.js",
"dist/nodes/Twake/Twake.node.js",
"dist/nodes/Twilio/Twilio.node.js",
"dist/nodes/Twist/Twist.node.js",
"dist/nodes/Twitter/Twitter.node.js",
"dist/nodes/Typeform/TypeformTrigger.node.js",
"dist/nodes/UnleashedSoftware/UnleashedSoftware.node.js",
"dist/nodes/Uplead/Uplead.node.js",
"dist/nodes/UProc/UProc.node.js",
"dist/nodes/UptimeRobot/UptimeRobot.node.js",
"dist/nodes/UrlScanIo/UrlScanIo.node.js",
"dist/nodes/Vero/Vero.node.js",
"dist/nodes/Venafi/ProtectCloud/VenafiTlsProtectCloud.node.js",
"dist/nodes/Venafi/ProtectCloud/VenafiTlsProtectCloudTrigger.node.js",
"dist/nodes/Venafi/Datacenter/VenafiTlsProtectDatacenter.node.js",
"dist/nodes/Vonage/Vonage.node.js",
"dist/nodes/Wait/Wait.node.js",
"dist/nodes/Webflow/Webflow.node.js",
"dist/nodes/Webflow/WebflowTrigger.node.js",
"dist/nodes/Webhook/Webhook.node.js",
"dist/nodes/Wekan/Wekan.node.js",
"dist/nodes/WhatsApp/WhatsApp.node.js",
"dist/nodes/Wise/Wise.node.js",
"dist/nodes/Wise/WiseTrigger.node.js",
"dist/nodes/WooCommerce/WooCommerce.node.js",
"dist/nodes/WooCommerce/WooCommerceTrigger.node.js",
"dist/nodes/Wordpress/Wordpress.node.js",
"dist/nodes/Workable/WorkableTrigger.node.js",
"dist/nodes/WorkflowTrigger/WorkflowTrigger.node.js",
"dist/nodes/WriteBinaryFile/WriteBinaryFile.node.js",
"dist/nodes/Wufoo/WufooTrigger.node.js",
"dist/nodes/Xero/Xero.node.js",
"dist/nodes/Xml/Xml.node.js",
"dist/nodes/Yourls/Yourls.node.js",
"dist/nodes/Zammad/Zammad.node.js",
"dist/nodes/Zendesk/Zendesk.node.js",
"dist/nodes/Zendesk/ZendeskTrigger.node.js",
"dist/nodes/Zoho/ZohoCrm.node.js",
"dist/nodes/Zoom/Zoom.node.js",
"dist/nodes/Zulip/Zulip.node.js"
]
},
"devDependencies": {
"@types/amqplib": "^0.10.1",
"@types/aws4": "^1.5.1",
"@types/basic-auth": "^1.1.3",
"@types/cheerio": "^0.22.15",
"@types/cron": "~1.7.1",
"@types/eventsource": "^1.1.2",
"@types/express": "^4.17.6",
"@types/gm": "^1.25.0",
"@types/imap-simple": "^4.2.0",
"@types/js-nacl": "^1.3.0",
"@types/jsonwebtoken": "^9.0.1",
"@types/lodash": "^4.14.195",
"@types/lossless-json": "^1.0.0",
"@types/mailparser": "^2.7.3",
"@types/mime-types": "^2.1.0",
"@types/mssql": "^6.0.2",
"@types/node-ssh": "^7.0.1",
"@types/nodemailer": "^6.4.0",
"@types/promise-ftp": "^1.3.4",
"@types/redis": "^2.8.11",
"@types/request-promise-native": "~1.0.15",
"@types/rfc2047": "^2.0.1",
"@types/showdown": "^1.9.4",
"@types/snowflake-sdk": "^1.6.12",
"@types/ssh2-sftp-client": "^5.1.0",
"@types/tmp": "^0.2.0",
"@types/uuid": "^8.3.2",
"@types/xml2js": "^0.4.11",
"eslint-plugin-n8n-nodes-base": "^1.16.0",
"gulp": "^4.0.0",
"n8n-core": "1.14.1"
},
"dependencies": {
"@kafkajs/confluent-schema-registry": "1.0.6",
"@n8n/vm2": "^3.9.20",
"amqplib": "^0.10.3",
"aws4": "^1.8.0",
"basic-auth": "^2.0.1",
"change-case": "^4.1.1",
"cheerio": "1.0.0-rc.6",
"chokidar": "3.5.2",
"cron": "~1.7.2",
"csv-parse": "^5.5.0",
"currency-codes": "^2.1.0",
"eventsource": "^2.0.2",
"fast-glob": "^3.2.5",
"fflate": "^0.7.0",
"get-system-fonts": "^2.0.2",
"gm": "^1.25.0",
"iconv-lite": "^0.6.2",
"ics": "^2.27.0",
"imap-simple": "^4.3.0",
"isbot": "^3.6.13",
"iso-639-1": "^2.1.3",
"js-nacl": "^1.4.0",
"jsonwebtoken": "^9.0.0",
"kafkajs": "^1.14.0",
"ldapts": "^4.2.6",
"lodash": "^4.17.21",
"lossless-json": "^1.0.4",
"luxon": "^3.3.0",
"mailparser": "^3.2.0",
"minifaker": "^1.34.1",
"moment": "~2.29.2",
"moment-timezone": "^0.5.28",
"mongodb": "^4.17.1",
"mqtt": "^5.0.2",
"mssql": "^8.1.2",
"mysql2": "~2.3.0",
"nanoid": "^3.3.6",
"node-html-markdown": "^1.1.3",
"node-ssh": "^12.0.0",
"nodemailer": "^6.7.1",
"otpauth": "^9.1.1",
"pdfjs-dist": "^2.16.105",
"pg": "^8.3.0",
"pg-promise": "^10.5.8",
"pretty-bytes": "^5.6.0",
"promise-ftp": "^1.3.5",
"pyodide": "^0.23.4",
"redis": "^3.1.1",
"rfc2047": "^4.0.1",
"rhea": "^1.0.11",
"rss-parser": "^3.7.0",
"semver": "^7.5.4",
"showdown": "^2.0.3",
"simple-git": "^3.17.0",
"snowflake-sdk": "^1.8.0",
"ssh2-sftp-client": "^7.0.0",
"tmp-promise": "^3.0.2",
"typedi": "^0.10.0",
"uuid": "^8.3.2",
"xlsx": "https://cdn.sheetjs.com/xlsx-0.19.3/xlsx-0.19.3.tgz",
"xml2js": "^0.5.0",
"n8n-workflow": "1.14.1"
},
"scripts": {
"clean": "rimraf dist .turbo",
"dev": "pnpm watch",
"typecheck": "tsc",
"build": "tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json && gulp build:icons && gulp build:translations && pnpm build:metadata",
"build:translations": "gulp build:translations",
"build:metadata": "pnpm n8n-generate-known && pnpm n8n-generate-ui-types",
"format": "prettier --write . --ignore-path ../../.prettierignore",
"lint": "eslint . --quiet && node ./scripts/validate-load-options-methods.js",
"lintfix": "eslint . --fix",
"watch": "tsc-watch -p tsconfig.build.json --onCompilationComplete \"tsc-alias -p tsconfig.build.json\" --onSuccess \"pnpm n8n-generate-ui-types\"",
"test": "jest"
}
},
"extraction_time_ms": 5,
"extracted_at": "2025-06-07T17:49:22.730Z"
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

282
tests/test-database-extraction.js Executable file
View File

@@ -0,0 +1,282 @@
#!/usr/bin/env node
/**
* Test node extraction for database storage
* Focus on extracting known nodes with proper structure for DB storage
*/
const fs = require('fs').promises;
const path = require('path');
const crypto = require('crypto');
// Import our extractor
const { NodeSourceExtractor } = require('../dist/utils/node-source-extractor');
// Known n8n nodes to test
const KNOWN_NODES = [
// Core nodes
{ type: 'n8n-nodes-base.Function', package: 'n8n-nodes-base', name: 'Function' },
{ type: 'n8n-nodes-base.Webhook', package: 'n8n-nodes-base', name: 'Webhook' },
{ type: 'n8n-nodes-base.HttpRequest', package: 'n8n-nodes-base', name: 'HttpRequest' },
{ type: 'n8n-nodes-base.If', package: 'n8n-nodes-base', name: 'If' },
{ type: 'n8n-nodes-base.SplitInBatches', package: 'n8n-nodes-base', name: 'SplitInBatches' },
// AI nodes
{ type: '@n8n/n8n-nodes-langchain.Agent', package: '@n8n/n8n-nodes-langchain', name: 'Agent' },
{ type: '@n8n/n8n-nodes-langchain.OpenAiAssistant', package: '@n8n/n8n-nodes-langchain', name: 'OpenAiAssistant' },
{ type: '@n8n/n8n-nodes-langchain.ChainLlm', package: '@n8n/n8n-nodes-langchain', name: 'ChainLlm' },
// Integration nodes
{ type: 'n8n-nodes-base.Airtable', package: 'n8n-nodes-base', name: 'Airtable' },
{ type: 'n8n-nodes-base.GoogleSheets', package: 'n8n-nodes-base', name: 'GoogleSheets' },
{ type: 'n8n-nodes-base.Slack', package: 'n8n-nodes-base', name: 'Slack' },
{ type: 'n8n-nodes-base.Discord', package: 'n8n-nodes-base', name: 'Discord' },
];
// Database schema for storing nodes
const DB_SCHEMA = `
-- Main nodes table
CREATE TABLE IF NOT EXISTS nodes (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
node_type VARCHAR(255) UNIQUE NOT NULL,
name VARCHAR(255) NOT NULL,
package_name VARCHAR(255) NOT NULL,
display_name VARCHAR(255),
description TEXT,
version VARCHAR(50),
code_hash VARCHAR(64) NOT NULL,
code_length INTEGER NOT NULL,
source_location TEXT NOT NULL,
has_credentials BOOLEAN DEFAULT FALSE,
extracted_at TIMESTAMP NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP NOT NULL DEFAULT NOW(),
CONSTRAINT idx_node_type UNIQUE (node_type),
INDEX idx_package_name (package_name),
INDEX idx_code_hash (code_hash)
);
-- Source code storage
CREATE TABLE IF NOT EXISTS node_source_code (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
node_id UUID NOT NULL REFERENCES nodes(id) ON DELETE CASCADE,
source_code TEXT NOT NULL,
minified_code TEXT,
source_map TEXT,
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
CONSTRAINT idx_node_source UNIQUE (node_id)
);
-- Credentials definitions
CREATE TABLE IF NOT EXISTS node_credentials (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
node_id UUID NOT NULL REFERENCES nodes(id) ON DELETE CASCADE,
credential_type VARCHAR(255) NOT NULL,
credential_code TEXT NOT NULL,
required_fields JSONB,
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
INDEX idx_node_credentials (node_id)
);
-- Package metadata
CREATE TABLE IF NOT EXISTS node_packages (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
package_name VARCHAR(255) UNIQUE NOT NULL,
version VARCHAR(50),
description TEXT,
author VARCHAR(255),
license VARCHAR(50),
repository_url TEXT,
metadata JSONB,
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
updated_at TIMESTAMP NOT NULL DEFAULT NOW()
);
-- Node dependencies
CREATE TABLE IF NOT EXISTS node_dependencies (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
node_id UUID NOT NULL REFERENCES nodes(id) ON DELETE CASCADE,
depends_on_node_id UUID NOT NULL REFERENCES nodes(id),
dependency_type VARCHAR(50), -- 'extends', 'imports', 'requires'
created_at TIMESTAMP NOT NULL DEFAULT NOW(),
CONSTRAINT unique_dependency UNIQUE (node_id, depends_on_node_id)
);
`;
async function main() {
console.log('=== n8n Node Extraction for Database Storage Test ===\n');
const extractor = new NodeSourceExtractor();
const results = {
tested: 0,
extracted: 0,
failed: 0,
nodes: [],
errors: [],
totalSize: 0
};
// Create output directory
const outputDir = path.join(__dirname, 'extracted-nodes-db');
await fs.mkdir(outputDir, { recursive: true });
console.log(`Testing extraction of ${KNOWN_NODES.length} known nodes...\n`);
// Extract each node
for (const nodeConfig of KNOWN_NODES) {
console.log(`📦 Extracting: ${nodeConfig.type}`);
results.tested++;
try {
const startTime = Date.now();
const nodeInfo = await extractor.extractNodeSource(nodeConfig.type);
const extractTime = Date.now() - startTime;
// Calculate hash for deduplication
const codeHash = crypto.createHash('sha256').update(nodeInfo.sourceCode).digest('hex');
// Prepare database record
const dbRecord = {
// Primary data
node_type: nodeConfig.type,
name: nodeConfig.name,
package_name: nodeConfig.package,
code_hash: codeHash,
code_length: nodeInfo.sourceCode.length,
source_location: nodeInfo.location,
has_credentials: !!nodeInfo.credentialCode,
// Source code (separate table in real DB)
source_code: nodeInfo.sourceCode,
credential_code: nodeInfo.credentialCode,
// Package info
package_info: nodeInfo.packageInfo,
// Metadata
extraction_time_ms: extractTime,
extracted_at: new Date().toISOString()
};
results.nodes.push(dbRecord);
results.extracted++;
results.totalSize += nodeInfo.sourceCode.length;
console.log(` ✅ Success: ${nodeInfo.sourceCode.length} bytes (${extractTime}ms)`);
console.log(` 📍 Location: ${nodeInfo.location}`);
console.log(` 🔑 Hash: ${codeHash.substring(0, 12)}...`);
if (nodeInfo.credentialCode) {
console.log(` 🔐 Has credentials: ${nodeInfo.credentialCode.length} bytes`);
}
// Save individual node data
const nodeFile = path.join(outputDir, `${nodeConfig.package}__${nodeConfig.name}.json`);
await fs.writeFile(nodeFile, JSON.stringify(dbRecord, null, 2));
} catch (error) {
results.failed++;
results.errors.push({
node: nodeConfig.type,
error: error.message
});
console.log(` ❌ Failed: ${error.message}`);
}
console.log('');
}
// Generate summary report
const successRate = ((results.extracted / results.tested) * 100).toFixed(1);
console.log('='.repeat(60));
console.log('EXTRACTION SUMMARY');
console.log('='.repeat(60));
console.log(`Total nodes tested: ${results.tested}`);
console.log(`Successfully extracted: ${results.extracted} (${successRate}%)`);
console.log(`Failed: ${results.failed}`);
console.log(`Total code size: ${(results.totalSize / 1024).toFixed(2)} KB`);
console.log(`Average node size: ${(results.totalSize / results.extracted / 1024).toFixed(2)} KB`);
// Test database insertion simulation
console.log('\n📊 Database Storage Simulation:');
console.log('--------------------------------');
if (results.extracted > 0) {
// Group by package
const packages = {};
results.nodes.forEach(node => {
if (!packages[node.package_name]) {
packages[node.package_name] = {
name: node.package_name,
nodes: [],
totalSize: 0
};
}
packages[node.package_name].nodes.push(node.name);
packages[node.package_name].totalSize += node.code_length;
});
console.log('\nPackages:');
Object.values(packages).forEach(pkg => {
console.log(` 📦 ${pkg.name}`);
console.log(` Nodes: ${pkg.nodes.length}`);
console.log(` Total size: ${(pkg.totalSize / 1024).toFixed(2)} KB`);
console.log(` Nodes: ${pkg.nodes.join(', ')}`);
});
// Save database-ready JSON
const dbData = {
schema: DB_SCHEMA,
extracted_at: new Date().toISOString(),
statistics: {
total_nodes: results.extracted,
total_size_bytes: results.totalSize,
packages: Object.keys(packages).length,
success_rate: successRate
},
nodes: results.nodes
};
const dbFile = path.join(outputDir, 'database-import.json');
await fs.writeFile(dbFile, JSON.stringify(dbData, null, 2));
console.log(`\n💾 Database import file saved: ${dbFile}`);
// Create SQL insert statements
const sqlFile = path.join(outputDir, 'insert-nodes.sql');
let sql = '-- Auto-generated SQL for n8n nodes\n\n';
results.nodes.forEach(node => {
sql += `-- Node: ${node.node_type}\n`;
sql += `INSERT INTO nodes (node_type, name, package_name, code_hash, code_length, source_location, has_credentials)\n`;
sql += `VALUES ('${node.node_type}', '${node.name}', '${node.package_name}', '${node.code_hash}', ${node.code_length}, '${node.source_location}', ${node.has_credentials});\n\n`;
});
await fs.writeFile(sqlFile, sql);
console.log(`📝 SQL insert file saved: ${sqlFile}`);
}
// Save full report
const reportFile = path.join(outputDir, 'extraction-report.json');
await fs.writeFile(reportFile, JSON.stringify(results, null, 2));
console.log(`\n📄 Full report saved: ${reportFile}`);
// Show any errors
if (results.errors.length > 0) {
console.log('\n⚠ Extraction Errors:');
results.errors.forEach(err => {
console.log(` - ${err.node}: ${err.error}`);
});
}
console.log('\n✨ Database extraction test completed!');
console.log(`📁 Results saved in: ${outputDir}`);
// Exit with appropriate code
process.exit(results.failed > 0 ? 1 : 0);
}
// Run the test
main().catch(error => {
console.error('Fatal error:', error);
process.exit(1);
});

79
tests/test-direct-extraction.js Executable file
View File

@@ -0,0 +1,79 @@
#!/usr/bin/env node
const fs = require('fs');
const path = require('path');
// Import the NodeSourceExtractor
const { NodeSourceExtractor } = require('../dist/utils/node-source-extractor');
async function testExtraction() {
console.log('=== Direct Node Extraction Test ===\n');
const extractor = new NodeSourceExtractor();
// Test extraction of AI Agent node
const nodeType = '@n8n/n8n-nodes-langchain.Agent';
console.log(`Testing extraction of: ${nodeType}`);
// First, let's debug what paths are being searched
console.log('\nSearching in paths:');
const searchPaths = [
'/usr/local/lib/node_modules/n8n/node_modules',
'/app/node_modules',
'/home/node/.n8n/custom/nodes',
'./node_modules'
];
for (const basePath of searchPaths) {
console.log(`- ${basePath}`);
try {
const exists = fs.existsSync(basePath);
console.log(` Exists: ${exists}`);
if (exists) {
const items = fs.readdirSync(basePath).slice(0, 5);
console.log(` Sample items: ${items.join(', ')}...`);
}
} catch (e) {
console.log(` Error: ${e.message}`);
}
}
try {
const result = await extractor.extractNodeSource(nodeType, true);
console.log('\n✅ Extraction successful!');
console.log(`Source file: ${result.location}`);
console.log(`Code length: ${result.sourceCode.length} characters`);
console.log(`Credential code found: ${result.credentialCode ? 'Yes' : 'No'}`);
console.log(`Package.json found: ${result.packageInfo ? 'Yes' : 'No'}`);
// Show first 500 characters of the code
console.log('\nFirst 500 characters of code:');
console.log('=' .repeat(60));
console.log(result.sourceCode.substring(0, 500) + '...');
console.log('=' .repeat(60));
// Show credential code if found
if (result.credentialCode) {
console.log('\nCredential code found!');
console.log('First 200 characters of credential code:');
console.log(result.credentialCode.substring(0, 200) + '...');
}
// Check if we can find it in Docker volume
const dockerPath = '/usr/local/lib/node_modules/n8n/node_modules/.pnpm/@n8n+n8n-nodes-langchain@file+packages+@n8n+nodes-langchain_f35e7d377a7fe4d08dc2766706b5dbff/node_modules/@n8n/n8n-nodes-langchain/dist/nodes/agents/Agent/Agent.node.js';
if (fs.existsSync(dockerPath)) {
console.log('\n✅ File also found in expected Docker path');
const dockerContent = fs.readFileSync(dockerPath, 'utf8');
console.log(`Docker file size: ${dockerContent.length} bytes`);
}
} catch (error) {
console.error('\n❌ Extraction failed:', error.message);
console.error('Stack trace:', error.stack);
}
}
testExtraction().catch(console.error);

View File

@@ -0,0 +1,104 @@
#!/usr/bin/env node
/**
* Test MCP Server extraction functionality
* Simulates an MCP client calling the get_node_source_code tool
*/
const { spawn } = require('child_process');
const path = require('path');
// MCP request to get AI Agent node source code
const mcpRequest = {
jsonrpc: '2.0',
id: 1,
method: 'tools/call',
params: {
name: 'get_node_source_code',
arguments: {
nodeType: '@n8n/n8n-nodes-langchain.Agent',
includeCredentials: true
}
}
};
async function testMCPExtraction() {
console.log('=== MCP Server Node Extraction Test ===\n');
console.log('Starting MCP server...');
// Start the MCP server
const serverPath = path.join(__dirname, '../dist/index.js');
const server = spawn('node', [serverPath], {
env: {
...process.env,
MCP_SERVER_PORT: '3000',
MCP_SERVER_HOST: '0.0.0.0',
N8N_API_URL: 'http://n8n:5678',
N8N_API_KEY: 'test-api-key',
MCP_AUTH_TOKEN: 'test-token',
LOG_LEVEL: 'info'
},
stdio: ['pipe', 'pipe', 'pipe']
});
let responseBuffer = '';
let errorBuffer = '';
server.stdout.on('data', (data) => {
responseBuffer += data.toString();
});
server.stderr.on('data', (data) => {
errorBuffer += data.toString();
});
// Give server time to start
await new Promise(resolve => setTimeout(resolve, 2000));
console.log('Sending MCP request...');
console.log(JSON.stringify(mcpRequest, null, 2));
// Send the request via stdin (MCP uses stdio transport)
server.stdin.write(JSON.stringify(mcpRequest) + '\n');
// Wait for response
await new Promise(resolve => setTimeout(resolve, 3000));
// Kill the server
server.kill();
console.log('\n=== Server Output ===');
console.log(responseBuffer);
if (errorBuffer) {
console.log('\n=== Server Errors ===');
console.log(errorBuffer);
}
// Try to parse any JSON responses
const lines = responseBuffer.split('\n').filter(line => line.trim());
for (const line of lines) {
try {
const data = JSON.parse(line);
if (data.id === 1 && data.result) {
console.log('\n✅ MCP Response received!');
console.log(`Node type: ${data.result.nodeType}`);
console.log(`Source code length: ${data.result.sourceCode ? data.result.sourceCode.length : 0} characters`);
console.log(`Location: ${data.result.location}`);
console.log(`Has credentials: ${data.result.credentialCode ? 'Yes' : 'No'}`);
console.log(`Has package info: ${data.result.packageInfo ? 'Yes' : 'No'}`);
if (data.result.sourceCode) {
console.log('\nFirst 300 characters of extracted code:');
console.log('='.repeat(60));
console.log(data.result.sourceCode.substring(0, 300) + '...');
console.log('='.repeat(60));
}
}
} catch (e) {
// Not JSON, skip
}
}
}
testMCPExtraction().catch(console.error);

View File

@@ -0,0 +1,235 @@
#!/usr/bin/env node
/**
* End-to-end test for MCP server tools integration
* Tests both get_node_source_code and list_available_nodes tools
*/
const { Server } = require('@modelcontextprotocol/sdk/server/index.js');
const { StdioServerTransport } = require('@modelcontextprotocol/sdk/server/stdio.js');
const { N8NMCPServer } = require('../dist/mcp/server');
// Test configuration
const TEST_CONFIG = {
mcp: {
port: 3000,
host: '0.0.0.0',
authToken: 'test-token'
},
n8n: {
apiUrl: 'http://localhost:5678',
apiKey: 'test-key'
}
};
// Mock tool calls
const TEST_REQUESTS = [
{
name: 'list_available_nodes',
description: 'List all available n8n nodes',
request: {
name: 'list_available_nodes',
arguments: {}
}
},
{
name: 'list_ai_nodes',
description: 'List AI/LangChain nodes',
request: {
name: 'list_available_nodes',
arguments: {
category: 'ai'
}
}
},
{
name: 'get_function_node',
description: 'Extract Function node source',
request: {
name: 'get_node_source_code',
arguments: {
nodeType: 'n8n-nodes-base.Function',
includeCredentials: true
}
}
},
{
name: 'get_ai_agent_node',
description: 'Extract AI Agent node source',
request: {
name: 'get_node_source_code',
arguments: {
nodeType: '@n8n/n8n-nodes-langchain.Agent',
includeCredentials: true
}
}
},
{
name: 'get_webhook_node',
description: 'Extract Webhook node source',
request: {
name: 'get_node_source_code',
arguments: {
nodeType: 'n8n-nodes-base.Webhook',
includeCredentials: false
}
}
}
];
async function simulateToolCall(server, toolRequest) {
console.log(`\n📋 Testing: ${toolRequest.description}`);
console.log(` Tool: ${toolRequest.request.name}`);
console.log(` Args:`, JSON.stringify(toolRequest.request.arguments, null, 2));
try {
const startTime = Date.now();
// Directly call the tool handler
const handler = server.toolHandlers[toolRequest.request.name];
if (!handler) {
throw new Error(`Tool handler not found: ${toolRequest.request.name}`);
}
const result = await handler(toolRequest.request.arguments);
const elapsed = Date.now() - startTime;
console.log(` ✅ Success (${elapsed}ms)`);
// Analyze results based on tool type
if (toolRequest.request.name === 'list_available_nodes') {
console.log(` 📊 Found ${result.nodes.length} nodes`);
if (result.nodes.length > 0) {
console.log(` Sample nodes:`);
result.nodes.slice(0, 3).forEach(node => {
console.log(` - ${node.name} (${node.packageName || 'unknown'})`);
});
}
} else if (toolRequest.request.name === 'get_node_source_code') {
console.log(` 📦 Node: ${result.nodeType}`);
console.log(` 📏 Code size: ${result.sourceCode.length} bytes`);
console.log(` 📍 Location: ${result.location}`);
console.log(` 🔐 Has credentials: ${!!result.credentialCode}`);
console.log(` 📄 Has package info: ${!!result.packageInfo}`);
if (result.packageInfo) {
console.log(` 📦 Package: ${result.packageInfo.name} v${result.packageInfo.version}`);
}
}
return { success: true, result, elapsed };
} catch (error) {
console.log(` ❌ Failed: ${error.message}`);
return { success: false, error: error.message };
}
}
async function main() {
console.log('=== MCP Server Tools Integration Test ===\n');
// Create MCP server instance
console.log('🚀 Initializing MCP server...');
const server = new N8NMCPServer(TEST_CONFIG.mcp, TEST_CONFIG.n8n);
// Store tool handlers for direct access
server.toolHandlers = {};
// Override handler setup to capture handlers
const originalSetup = server.setupHandlers.bind(server);
server.setupHandlers = function() {
originalSetup();
// Capture tool call handler
const originalHandler = this.server.setRequestHandler;
this.server.setRequestHandler = function(schema, handler) {
if (schema.parse && schema.parse({method: 'tools/call'}).method === 'tools/call') {
// This is the tool call handler
const toolCallHandler = handler;
server.handleToolCall = async (args) => {
const response = await toolCallHandler({ method: 'tools/call', params: args });
return response.content[0];
};
}
return originalHandler.call(this, schema, handler);
};
};
// Re-setup handlers
server.setupHandlers();
// Extract individual tool handlers
server.toolHandlers = {
list_available_nodes: async (args) => server.listAvailableNodes(args),
get_node_source_code: async (args) => server.getNodeSourceCode(args)
};
console.log('✅ MCP server initialized\n');
// Test statistics
const stats = {
total: 0,
passed: 0,
failed: 0,
results: []
};
// Run all test requests
for (const testRequest of TEST_REQUESTS) {
stats.total++;
const result = await simulateToolCall(server, testRequest);
stats.results.push({
name: testRequest.name,
...result
});
if (result.success) {
stats.passed++;
} else {
stats.failed++;
}
}
// Summary
console.log('\n' + '='.repeat(60));
console.log('TEST SUMMARY');
console.log('='.repeat(60));
console.log(`Total tests: ${stats.total}`);
console.log(`Passed: ${stats.passed}`);
console.log(`Failed: ${stats.failed}`);
console.log(`Success rate: ${((stats.passed / stats.total) * 100).toFixed(1)}%`);
// Detailed results
console.log('\nDetailed Results:');
stats.results.forEach(result => {
const status = result.success ? '✅' : '❌';
const time = result.elapsed ? ` (${result.elapsed}ms)` : '';
console.log(` ${status} ${result.name}${time}`);
if (!result.success) {
console.log(` Error: ${result.error}`);
}
});
console.log('\n✨ MCP tools integration test completed!');
// Test database storage capability
console.log('\n📊 Database Storage Capability:');
const sampleExtraction = stats.results.find(r => r.success && r.result && r.result.sourceCode);
if (sampleExtraction) {
console.log('✅ Node extraction produces database-ready structure');
console.log('✅ Includes source code, hash, location, and metadata');
console.log('✅ Ready for bulk extraction and storage');
} else {
console.log('⚠️ No successful extraction to verify database structure');
}
process.exit(stats.failed > 0 ? 1 : 0);
}
// Handle errors
process.on('unhandledRejection', (error) => {
console.error('\n💥 Unhandled error:', error);
process.exit(1);
});
// Run the test
main();

143
tests/test-sqlite-search.js Executable file
View File

@@ -0,0 +1,143 @@
#!/usr/bin/env node
/**
* Test SQLite database search functionality
*/
const { SQLiteStorageService } = require('../dist/services/sqlite-storage-service');
const { NodeSourceExtractor } = require('../dist/utils/node-source-extractor');
async function testDatabaseSearch() {
console.log('=== SQLite Database Search Test ===\n');
const storage = new SQLiteStorageService();
const extractor = new NodeSourceExtractor();
// First, ensure we have some data
console.log('1⃣ Checking database status...');
let stats = await storage.getStatistics();
if (stats.totalNodes === 0) {
console.log(' Database is empty. Adding some test nodes...\n');
const testNodes = [
'n8n-nodes-base.Function',
'n8n-nodes-base.Webhook',
'n8n-nodes-base.HttpRequest',
'n8n-nodes-base.If',
'n8n-nodes-base.Slack',
'n8n-nodes-base.Discord'
];
for (const nodeType of testNodes) {
try {
const nodeInfo = await extractor.extractNodeSource(nodeType);
await storage.storeNode(nodeInfo);
console.log(` ✅ Stored ${nodeType}`);
} catch (error) {
console.log(` ❌ Failed to store ${nodeType}: ${error.message}`);
}
}
stats = await storage.getStatistics();
}
console.log(`\n Total nodes in database: ${stats.totalNodes}`);
console.log(` Total packages: ${stats.totalPackages}`);
console.log(` Database size: ${(stats.totalCodeSize / 1024).toFixed(2)} KB\n`);
// Test different search scenarios
console.log('2⃣ Testing search functionality...\n');
const searchTests = [
{
name: 'Search by partial name (func)',
query: { query: 'func' }
},
{
name: 'Search by partial name (web)',
query: { query: 'web' }
},
{
name: 'Search for HTTP',
query: { query: 'http' }
},
{
name: 'Search for multiple terms',
query: { query: 'slack discord' }
},
{
name: 'Filter by package',
query: { packageName: 'n8n-nodes-base' }
},
{
name: 'Search with package filter',
query: { query: 'func', packageName: 'n8n-nodes-base' }
},
{
name: 'Search by node type',
query: { nodeType: 'Webhook' }
},
{
name: 'Limit results',
query: { query: 'node', limit: 3 }
}
];
for (const test of searchTests) {
console.log(` 📍 ${test.name}:`);
console.log(` Query: ${JSON.stringify(test.query)}`);
try {
const results = await storage.searchNodes(test.query);
console.log(` Results: ${results.length} nodes found`);
if (results.length > 0) {
console.log(' Matches:');
results.slice(0, 3).forEach(node => {
console.log(` - ${node.nodeType} (${node.displayName || node.name})`);
});
if (results.length > 3) {
console.log(` ... and ${results.length - 3} more`);
}
}
} catch (error) {
console.log(` ❌ Error: ${error.message}`);
}
console.log('');
}
// Test specific node retrieval
console.log('3⃣ Testing specific node retrieval...\n');
const specificNode = await storage.getNode('n8n-nodes-base.Function');
if (specificNode) {
console.log(` ✅ Found node: ${specificNode.nodeType}`);
console.log(` Display name: ${specificNode.displayName}`);
console.log(` Code size: ${specificNode.codeLength} bytes`);
console.log(` Has credentials: ${specificNode.hasCredentials}`);
} else {
console.log(' ❌ Node not found');
}
// Test package listing
console.log('\n4⃣ Testing package listing...\n');
const packages = await storage.getPackages();
console.log(` Found ${packages.length} packages:`);
packages.forEach(pkg => {
console.log(` - ${pkg.name}: ${pkg.nodeCount} nodes`);
});
// Close database
storage.close();
console.log('\n✅ Search functionality test completed!');
}
// Run the test
testDatabaseSearch().catch(error => {
console.error('Test failed:', error);
process.exit(1);
});

116
tests/test-storage-system.js Executable file
View File

@@ -0,0 +1,116 @@
#!/usr/bin/env node
/**
* Test the node storage and search system
*/
const { NodeSourceExtractor } = require('../dist/utils/node-source-extractor');
const { NodeStorageService } = require('../dist/services/node-storage-service');
async function testStorageSystem() {
console.log('=== Node Storage System Test ===\n');
const extractor = new NodeSourceExtractor();
const storage = new NodeStorageService();
// 1. Extract and store some nodes
console.log('1. Extracting and storing nodes...\n');
const testNodes = [
'n8n-nodes-base.Function',
'n8n-nodes-base.Webhook',
'n8n-nodes-base.HttpRequest',
'@n8n/n8n-nodes-langchain.Agent'
];
let stored = 0;
for (const nodeType of testNodes) {
try {
console.log(` Extracting ${nodeType}...`);
const nodeInfo = await extractor.extractNodeSource(nodeType);
await storage.storeNode(nodeInfo);
stored++;
console.log(` ✅ Stored successfully`);
} catch (error) {
console.log(` ❌ Failed: ${error.message}`);
}
}
console.log(`\n Total stored: ${stored}/${testNodes.length}\n`);
// 2. Test search functionality
console.log('2. Testing search functionality...\n');
const searchTests = [
{ query: 'function', desc: 'Search for "function"' },
{ query: 'webhook', desc: 'Search for "webhook"' },
{ packageName: 'n8n-nodes-base', desc: 'Filter by package' },
{ hasCredentials: false, desc: 'Nodes without credentials' }
];
for (const test of searchTests) {
console.log(` ${test.desc}:`);
const results = await storage.searchNodes(test);
console.log(` Found ${results.length} nodes`);
if (results.length > 0) {
console.log(` First result: ${results[0].nodeType}`);
}
}
// 3. Get statistics
console.log('\n3. Storage statistics:\n');
const stats = await storage.getStatistics();
console.log(` Total nodes: ${stats.totalNodes}`);
console.log(` Total packages: ${stats.totalPackages}`);
console.log(` Total code size: ${(stats.totalCodeSize / 1024).toFixed(2)} KB`);
console.log(` Average node size: ${(stats.averageNodeSize / 1024).toFixed(2)} KB`);
console.log(` Nodes with credentials: ${stats.nodesWithCredentials}`);
console.log('\n Package distribution:');
stats.packageDistribution.forEach(pkg => {
console.log(` ${pkg.package}: ${pkg.count} nodes`);
});
// 4. Test bulk extraction
console.log('\n4. Testing bulk extraction (first 10 nodes)...\n');
const allNodes = await extractor.listAvailableNodes();
const nodesToExtract = allNodes.slice(0, 10);
const nodeInfos = [];
for (const node of nodesToExtract) {
try {
const nodeType = node.packageName ? `${node.packageName}.${node.name}` : node.name;
const nodeInfo = await extractor.extractNodeSource(nodeType);
nodeInfos.push(nodeInfo);
} catch (error) {
// Skip failed extractions
}
}
if (nodeInfos.length > 0) {
const bulkResult = await storage.bulkStoreNodes(nodeInfos);
console.log(` Bulk stored: ${bulkResult.stored}`);
console.log(` Failed: ${bulkResult.failed}`);
}
// 5. Export for database
console.log('\n5. Exporting for database...\n');
const dbExport = await storage.exportForDatabase();
console.log(` Exported ${dbExport.nodes.length} nodes`);
console.log(` Total packages: ${dbExport.metadata.totalPackages}`);
console.log(` Export timestamp: ${dbExport.metadata.exportedAt}`);
// Save export to file
const fs = require('fs').promises;
const exportFile = path.join(__dirname, 'node-storage-export.json');
await fs.writeFile(exportFile, JSON.stringify(dbExport, null, 2));
console.log(` Saved to: ${exportFile}`);
console.log('\n✅ Storage system test completed!');
}
const path = require('path');
testStorageSystem().catch(console.error);