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 Configuration
N8N_API_URL=http://localhost:5678 N8N_BASIC_AUTH_USER=admin
N8N_API_KEY=your-n8n-api-key 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 # Authentication
MCP_AUTH_TOKEN=your-secure-token # MCP_AUTH_TOKEN=your-secure-token
# Logging
LOG_LEVEL=info

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 # Production stage
FROM node:18-alpine FROM node:18-alpine
# Install SQLite (for database management)
RUN apk add --no-cache sqlite
WORKDIR /app WORKDIR /app
# Copy package files # Copy package files
@@ -26,20 +12,43 @@ COPY package*.json ./
# Install production dependencies only # Install production dependencies only
RUN npm ci --only=production RUN npm ci --only=production
# Copy built files from builder stage # Copy built files
COPY --from=builder /app/dist ./dist COPY dist ./dist
COPY tests ./tests
# Create data directory for SQLite database
RUN mkdir -p /app/data
# Create a non-root user # Create a non-root user
RUN addgroup -g 1001 -S nodejs && adduser -S nodejs -u 1001 RUN addgroup -g 1001 -S nodejs && adduser -S nodejs -u 1001
# Change ownership # Change ownership (including data directory)
RUN chown -R nodejs:nodejs /app RUN chown -R nodejs:nodejs /app
# Switch to non-root user # Switch to non-root user
USER nodejs 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 the MCP server port (if using HTTP transport)
EXPOSE 3000 EXPOSE 3000
# Start the MCP server # Volume for persistent database storage
CMD ["node", "dist/index.js"] 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 ## Overview
- A custom n8n node for connecting to MCP servers from within workflows
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 ## Features
- **MCP Server**: Expose n8n workflows as tools, resources, and prompts for AI assistants - **Bidirectional Integration**: n8n workflows can call MCP tools, and MCP servers can execute n8n workflows
- **n8n Node**: Connect to any MCP server from n8n workflows - **Node Source Extraction**: Extract and search source code from any n8n node, including AI Agent nodes
- **Bidirectional Integration**: Use AI capabilities in n8n and n8n automation in AI contexts - **SQLite Database**: Full-text search for n8n node documentation and source code (500+ nodes indexed)
- **Node Source Extraction**: Extract source code from any n8n node, including AI Agent nodes - **Production Ready**: Docker-based deployment with persistent storage
- **Authentication**: Secure token-based authentication - **Comprehensive MCP Tools**: 12+ tools for workflow management, node exploration, and database search
- **Flexible Transport**: Support for WebSocket and stdio connections - **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 ## Quick Start
### Prerequisites
- Node.js 18+
- n8n instance with API access enabled
- MCP-compatible AI assistant (Claude, etc.)
### Installation ### Installation
```bash ```bash
# Clone the repository # Clone the repository
git clone https://github.com/czlonkowski/n8n-mcp.git git clone https://github.com/yourusername/n8n-mcp.git
cd n8n-mcp cd n8n-mcp
# Install dependencies # Install dependencies
npm install npm install
# Copy environment configuration # Copy environment template
cp .env.example .env 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 # Build the project
npm run build npm run build
# Start the MCP server # Initialize the database
npm start npm run db:init
# (Optional) Rebuild database with all nodes
npm run db:rebuild
``` ```
For development: ### Development
```bash ```bash
# Run tests
npm test
# Start development server
npm run dev 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 ## Configuration
### Environment Variables Environment variables (`.env` file):
Create a `.env` file based on `.env.example`:
```env ```env
# MCP Server Configuration
MCP_SERVER_PORT=3000
MCP_SERVER_HOST=localhost
# n8n Configuration # n8n Configuration
N8N_API_URL=http://localhost:5678 N8N_BASIC_AUTH_USER=admin
N8N_API_KEY=your-n8n-api-key N8N_BASIC_AUTH_PASSWORD=your-password
N8N_HOST=localhost
N8N_API_KEY=your-api-key
# Authentication # Database
MCP_AUTH_TOKEN=your-secure-token NODE_DB_PATH=/app/data/nodes.db
# Logging # Logging
LOG_LEVEL=info LOG_LEVEL=info
@@ -99,20 +119,32 @@ Add the server to your Claude configuration:
### Available MCP Tools ### Available MCP Tools
#### Workflow Management
- `execute_workflow` - Execute an n8n workflow by ID - `execute_workflow` - Execute an n8n workflow by ID
- `list_workflows` - List all available workflows - `list_workflows` - List all workflows with filtering options
- `get_workflow` - Get details of a specific workflow - `get_workflow` - Get detailed workflow information
- `create_workflow` - Create a new workflow - `create_workflow` - Create new workflows programmatically
- `update_workflow` - Update an existing workflow - `update_workflow` - Update existing workflows
- `delete_workflow` - Delete a workflow - `delete_workflow` - Delete workflows
- `get_executions` - Get workflow execution history - `get_executions` - Get workflow execution history
- `get_execution_data` - Get detailed execution data - `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 - `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 ### 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 2. Restart n8n
3. The MCP node will appear in the nodes panel 3. The MCP node will appear in the nodes panel
4. Configure with your MCP server credentials 4. Configure with your MCP server credentials
@@ -139,44 +171,64 @@ Add the server to your Claude configuration:
## Architecture ## Architecture
### Project Structure ### Components
``` 1. **MCP Server** (`src/mcp/`): Exposes n8n operations as MCP tools
n8n-mcp/ 2. **n8n Custom Node** (`src/n8n/`): Allows n8n to connect to MCP servers
├── src/ 3. **SQLite Storage** (`src/services/`): Persistent storage with full-text search
│ ├── mcp/ # MCP server implementation 4. **Bridge Layer** (`src/utils/`): Converts between n8n and MCP formats
│ ├── n8n/ # n8n node implementation
│ ├── utils/ # Shared utilities ### Database Management
│ └── types/ # TypeScript type definitions
├── tests/ # Test files The SQLite database stores n8n node documentation and source code with full-text search capabilities:
└── dist/ # Compiled output
```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 ```javascript
- **n8n API Client**: Manages communication with n8n instance // Search for nodes by name
- **Bridge Layer**: Converts between n8n and MCP data formats await mcp.callTool('search_nodes', { query: 'webhook' })
- **Authentication**: Validates tokens and manages access control
## 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 ```bash
npm test npm test
``` ```
### Building ### Test Specific Features
```bash ```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 # Test AI Agent extraction
npm run typecheck ./scripts/test-ai-agent-extraction.sh
``` ```
## API Reference ## API Reference
@@ -201,14 +253,36 @@ Parameters:
Extract source code of any n8n node. Extract source code of any n8n node.
Parameters: 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 - `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_available_nodes
List all available n8n nodes in the system. List all available n8n nodes in the system.
Parameters: 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 - `search` (string, optional): Search term to filter nodes
### MCP Resources ### MCP Resources
@@ -227,65 +301,88 @@ Parameters:
- `optimize_workflow_prompt` - Optimize workflow performance - `optimize_workflow_prompt` - Optimize workflow performance
- `explain_workflow_prompt` - Explain workflow functionality - `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 ## Troubleshooting
### Common Issues ### Common Issues
1. **Connection refused**: Ensure n8n is running and API is enabled 1. **MCP server keeps restarting in Docker**
2. **Authentication failed**: Check your API key in .env - This is expected behavior. The MCP server uses stdio transport and waits for input from AI assistants.
3. **Workflow not found**: Verify workflow ID exists in n8n - For testing, use the development mode or invoke through Claude Desktop.
4. **MCP connection failed**: Check server is running and accessible
### 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
``` ```
n8n-mcp/
## Special Features ├── src/
│ ├── mcp/ # MCP server implementation
### AI Agent Node Extraction │ ├── n8n/ # n8n custom node
│ ├── services/ # SQLite storage service
The MCP server can extract source code from n8n nodes, particularly useful for AI Agent nodes: │ ├── utils/ # Utilities and helpers
│ └── scripts/ # Database management scripts
```bash ├── tests/ # Test suite
# Test AI Agent extraction ├── docs/ # Documentation
./scripts/test-ai-agent-extraction.sh ├── scripts/ # Deployment and management scripts
└── data/ # SQLite database (created on init)
# 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
``` ```
## Contributing ## Contributing
Contributions are welcome! Please:
1. Fork the repository 1. Fork the repository
2. Create a feature branch 2. Create a feature branch
3. Make your changes 3. Add tests for new features
4. Add tests 4. Ensure all tests pass
5. Submit a pull request 5. Submit a pull request
## License ## License
ISC License - see LICENSE file for details ISC License
## Support ## Support
- Issues: https://github.com/czlonkowski/n8n-mcp/issues - GitHub Issues: [Report bugs or request features](https://github.com/yourusername/n8n-mcp/issues)
- n8n Documentation: https://docs.n8n.io - n8n Community: [n8n.io/community](https://community.n8n.io/)
- MCP Specification: https://modelcontextprotocol.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: networks:
- test-network - test-network
healthcheck: healthcheck:
test: ["CMD", "wget", "--spider", "-q", "http://localhost:5678/healthz"] test: ["CMD", "wget", "--spider", "-q", "http://localhost:5678/"]
interval: 30s interval: 30s
timeout: 10s timeout: 10s
retries: 3 retries: 3
@@ -51,8 +51,7 @@ services:
networks: networks:
- test-network - test-network
depends_on: depends_on:
n8n: - n8n
condition: service_healthy
command: node dist/index.js command: node dist/index.js
networks: 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' version: '3.8'
services: 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", "license": "ISC",
"dependencies": { "dependencies": {
"@modelcontextprotocol/sdk": "^1.12.1", "@modelcontextprotocol/sdk": "^1.12.1",
"@types/better-sqlite3": "^7.6.13",
"better-sqlite3": "^11.10.0",
"dotenv": "^16.5.0", "dotenv": "^16.5.0",
"express": "^5.1.0", "express": "^5.1.0",
"n8n-core": "^1.14.1", "n8n-core": "^1.14.1",
@@ -4000,6 +4002,15 @@
"@babel/types": "^7.20.7" "@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": { "node_modules/@types/body-parser": {
"version": "1.19.6", "version": "1.19.6",
"resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz",
@@ -4894,6 +4905,17 @@
"tweetnacl": "^0.14.3" "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": { "node_modules/big-integer": {
"version": "1.6.52", "version": "1.6.52",
"resolved": "https://registry.npmjs.org/big-integer/-/big-integer-1.6.52.tgz", "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==", "integrity": "sha512-rA2CrUl1+6yKrn+XgLs8Hdy18OER1UW146nM+ixzhQXDY+Bd3ySkyIJGwF2a4I45JwbvF1mDL/nWkqBwpOcdBA==",
"peer": true "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": { "node_modules/bl": {
"version": "6.1.0", "version": "6.1.0",
"resolved": "https://registry.npmjs.org/bl/-/bl-6.1.0.tgz", "resolved": "https://registry.npmjs.org/bl/-/bl-6.1.0.tgz",
@@ -5155,7 +5186,6 @@
} }
], ],
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"base64-js": "^1.3.1", "base64-js": "^1.3.1",
"ieee754": "^1.1.13" "ieee754": "^1.1.13"
@@ -5437,6 +5467,12 @@
"fsevents": "~2.3.2" "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": { "node_modules/ci-info": {
"version": "3.9.0", "version": "3.9.0",
"resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", "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": { "node_modules/dedent": {
"version": "1.6.0", "version": "1.6.0",
"resolved": "https://registry.npmjs.org/dedent/-/dedent-1.6.0.tgz", "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.6.0.tgz",
@@ -5933,6 +5984,15 @@
"url": "https://github.com/sponsors/ljharb" "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": { "node_modules/deepmerge": {
"version": "4.3.1", "version": "4.3.1",
"resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
@@ -6014,6 +6074,15 @@
"node": ">= 0.8" "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": { "node_modules/detect-newline": {
"version": "3.1.0", "version": "3.1.0",
"resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", "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", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
"integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"once": "^1.4.0" "once": "^1.4.0"
} }
@@ -6602,6 +6670,15 @@
"node": ">= 0.8.0" "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": { "node_modules/expand-tilde": {
"version": "2.0.2", "version": "2.0.2",
"resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", "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" "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": { "node_modules/filelist": {
"version": "1.0.4", "version": "1.0.4",
"resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz",
@@ -7037,6 +7120,12 @@
"node": ">= 0.8" "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": { "node_modules/fs.realpath": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
@@ -7270,6 +7359,12 @@
"node": ">8.0.0" "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": { "node_modules/glob": {
"version": "7.2.3", "version": "7.2.3",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
@@ -7964,6 +8059,12 @@
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"license": "ISC" "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": { "node_modules/internal-slot": {
"version": "1.1.0", "version": "1.1.0",
"resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz",
@@ -9953,6 +10054,18 @@
"node": ">=6" "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": { "node_modules/minifaker": {
"version": "1.34.1", "version": "1.34.1",
"resolved": "https://registry.npmjs.org/minifaker/-/minifaker-1.34.1.tgz", "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", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
"integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
"license": "MIT", "license": "MIT",
"peer": true,
"funding": { "funding": {
"url": "https://github.com/sponsors/ljharb" "url": "https://github.com/sponsors/ljharb"
} }
@@ -10025,6 +10137,12 @@
"node": ">=10" "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": { "node_modules/moment": {
"version": "2.30.1", "version": "2.30.1",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz", "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": "^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": { "node_modules/native-duplexpair": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/native-duplexpair/-/native-duplexpair-1.0.0.tgz", "resolved": "https://registry.npmjs.org/native-duplexpair/-/native-duplexpair-1.0.0.tgz",
@@ -10659,6 +10783,30 @@
"tslib": "^2.0.3" "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": { "node_modules/node-abort-controller": {
"version": "3.1.1", "version": "3.1.1",
"resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz", "resolved": "https://registry.npmjs.org/node-abort-controller/-/node-abort-controller-3.1.1.tgz",
@@ -11712,6 +11860,32 @@
"node": ">=0.10.0" "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": { "node_modules/pretty-bytes": {
"version": "5.6.0", "version": "5.6.0",
"resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz",
@@ -11875,6 +12049,16 @@
"dev": true, "dev": true,
"license": "MIT" "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": { "node_modules/punycode": {
"version": "2.3.1", "version": "2.3.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
@@ -12012,6 +12196,30 @@
"node": ">= 0.8" "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": { "node_modules/react-is": {
"version": "18.3.1", "version": "18.3.1",
"resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
@@ -12800,6 +13008,51 @@
"dev": true, "dev": true,
"license": "ISC" "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": { "node_modules/simple-git": {
"version": "3.28.0", "version": "3.28.0",
"resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.28.0.tgz", "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.28.0.tgz",
@@ -13465,6 +13718,45 @@
"url": "https://github.com/sponsors/ljharb" "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": { "node_modules/tarn": {
"version": "3.0.2", "version": "3.0.2",
"resolved": "https://registry.npmjs.org/tarn/-/tarn-3.0.2.tgz", "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": ">=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": { "node_modules/tweetnacl": {
"version": "0.14.5", "version": "0.14.5",
"resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",

View File

@@ -9,7 +9,9 @@
"start": "node dist/index.js", "start": "node dist/index.js",
"test": "jest", "test": "jest",
"lint": "tsc --noEmit", "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": { "repository": {
"type": "git", "type": "git",
@@ -34,6 +36,8 @@
}, },
"dependencies": { "dependencies": {
"@modelcontextprotocol/sdk": "^1.12.1", "@modelcontextprotocol/sdk": "^1.12.1",
"@types/better-sqlite3": "^7.6.13",
"better-sqlite3": "^11.10.0",
"dotenv": "^16.5.0", "dotenv": "^16.5.0",
"express": "^5.1.0", "express": "^5.1.0",
"n8n-core": "^1.14.1", "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
echo "2. Building Docker image..." echo "2. Building Docker image..."
docker-compose -f docker-compose.test.yml build docker compose -f docker-compose.test.yml build
echo echo
echo "3. Starting test environment..." 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
echo "4. Waiting for services to be ready..." echo "4. Waiting for services to be ready..."
@@ -36,7 +36,7 @@ sleep 10
# Wait for n8n to be healthy # Wait for n8n to be healthy
echo " Waiting for n8n to be ready..." echo " Waiting for n8n to be ready..."
for i in {1..30}; do 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}" echo -e " ${GREEN}✓ n8n is ready${NC}"
break break
fi fi
@@ -48,7 +48,7 @@ echo
echo "5. Running MCP client test..." echo "5. Running MCP client test..."
# Create a simple test using the MCP server directly # 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'); const http = require('http');
// Test data // Test data
@@ -107,12 +107,12 @@ if (!found) {
echo echo
echo "6. Alternative test - Direct file system check..." 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
echo "7. Test using curl to n8n API..." echo "7. Test using curl to n8n API..."
# Get available node types from n8n # 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 if [ -n "$NODE_TYPES" ]; then
echo -e "${GREEN}✓ Found Agent nodes in n8n:${NC}" 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 read -p "Stop test environment? (y/n) " -n 1 -r
echo echo
if [[ $REPLY =~ ^[Yy]$ ]]; then 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}" echo -e "${GREEN}✓ Test environment stopped${NC}"
fi 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 { N8NMCPBridge } from '../utils/bridge';
import { logger } from '../utils/logger'; import { logger } from '../utils/logger';
import { NodeSourceExtractor } from '../utils/node-source-extractor'; import { NodeSourceExtractor } from '../utils/node-source-extractor';
import { SQLiteStorageService } from '../services/sqlite-storage-service';
export class N8NMCPServer { export class N8NMCPServer {
private server: Server; private server: Server;
private n8nClient: N8NApiClient; private n8nClient: N8NApiClient;
private nodeExtractor: NodeSourceExtractor; private nodeExtractor: NodeSourceExtractor;
private nodeStorage: SQLiteStorageService;
constructor(config: MCPServerConfig, n8nConfig: N8NConfig) { constructor(config: MCPServerConfig, n8nConfig: N8NConfig) {
this.n8nClient = new N8NApiClient(n8nConfig); this.n8nClient = new N8NApiClient(n8nConfig);
this.nodeExtractor = new NodeSourceExtractor(); this.nodeExtractor = new NodeSourceExtractor();
this.nodeStorage = new SQLiteStorageService();
logger.info('Initializing n8n MCP server', { config, n8nConfig }); logger.info('Initializing n8n MCP server', { config, n8nConfig });
this.server = new Server( this.server = new Server(
{ {
@@ -161,6 +164,12 @@ export class N8NMCPServer {
return this.getNodeSourceCode(args); return this.getNodeSourceCode(args);
case 'list_available_nodes': case 'list_available_nodes':
return this.listAvailableNodes(args); 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: default:
throw new Error(`Unknown tool: ${name}`); 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> { async start(): Promise<void> {
try { try {
logger.info('Starting n8n MCP server...'); 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', '/app/node_modules',
'/home/node/.n8n/custom/nodes', '/home/node/.n8n/custom/nodes',
'./node_modules', './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 * Extract source code for a specific n8n node
@@ -70,8 +75,8 @@ export class NodeSourceExtractor {
nodeName: string nodeName: string
): Promise<NodeSourceInfo | null> { ): Promise<NodeSourceInfo | null> {
try { try {
// Common patterns for node files // First, try standard patterns
const patterns = [ const standardPatterns = [
`${packageName}/dist/nodes/${nodeName}/${nodeName}.node.js`, `${packageName}/dist/nodes/${nodeName}/${nodeName}.node.js`,
`${packageName}/dist/nodes/${nodeName}.node.js`, `${packageName}/dist/nodes/${nodeName}.node.js`,
`${packageName}/nodes/${nodeName}/${nodeName}.node.js`, `${packageName}/nodes/${nodeName}/${nodeName}.node.js`,
@@ -80,39 +85,36 @@ export class NodeSourceExtractor {
`${nodeName}.node.js`, `${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 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 { try {
const sourceCode = await fs.readFile(fullPath, 'utf-8'); await fs.access(pnpmPath);
const result = await this.searchInPnpm(pnpmPath, packageName, nodeName);
// Try to find credential file if (result) return result;
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,
};
} catch { } catch {
// Continue searching // .pnpm directory doesn't exist
} }
} }
} catch (error) { } catch (error) {
@@ -122,6 +124,172 @@ export class NodeSourceExtractor {
return null; 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 * List all available nodes
*/ */
@@ -183,9 +351,14 @@ export class NodeSourceExtractor {
} catch { } catch {
// Skip files we can't read // Skip files we can't read
} }
} else if (entry.isDirectory() && entry.name !== 'node_modules') { } else if (entry.isDirectory()) {
// Recursively scan subdirectories // Special handling for .pnpm directories
await this.scanDirectoryForNodes(path.join(dirPath, entry.name), nodes, category, search); 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) { } 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 * 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);