This is page 43 of 59. Use http://codebase.md/czlonkowski/n8n-mcp?lines=true&page={x} to view the full context. # Directory Structure ``` ├── _config.yml ├── .claude │ └── agents │ ├── code-reviewer.md │ ├── context-manager.md │ ├── debugger.md │ ├── deployment-engineer.md │ ├── mcp-backend-engineer.md │ ├── n8n-mcp-tester.md │ ├── technical-researcher.md │ └── test-automator.md ├── .dockerignore ├── .env.docker ├── .env.example ├── .env.n8n.example ├── .env.test ├── .env.test.example ├── .github │ ├── ABOUT.md │ ├── BENCHMARK_THRESHOLDS.md │ ├── FUNDING.yml │ ├── gh-pages.yml │ ├── secret_scanning.yml │ └── workflows │ ├── benchmark-pr.yml │ ├── benchmark.yml │ ├── docker-build-fast.yml │ ├── docker-build-n8n.yml │ ├── docker-build.yml │ ├── release.yml │ ├── test.yml │ └── update-n8n-deps.yml ├── .gitignore ├── .npmignore ├── ATTRIBUTION.md ├── CHANGELOG.md ├── CLAUDE.md ├── codecov.yml ├── coverage.json ├── data │ ├── .gitkeep │ ├── nodes.db │ ├── nodes.db-shm │ ├── nodes.db-wal │ └── templates.db ├── deploy │ └── quick-deploy-n8n.sh ├── docker │ ├── docker-entrypoint.sh │ ├── n8n-mcp │ ├── parse-config.js │ └── README.md ├── docker-compose.buildkit.yml ├── docker-compose.extract.yml ├── docker-compose.n8n.yml ├── docker-compose.override.yml.example ├── docker-compose.test-n8n.yml ├── docker-compose.yml ├── Dockerfile ├── Dockerfile.railway ├── Dockerfile.test ├── docs │ ├── AUTOMATED_RELEASES.md │ ├── BENCHMARKS.md │ ├── CHANGELOG.md │ ├── CLAUDE_CODE_SETUP.md │ ├── CLAUDE_INTERVIEW.md │ ├── CODECOV_SETUP.md │ ├── CODEX_SETUP.md │ ├── CURSOR_SETUP.md │ ├── DEPENDENCY_UPDATES.md │ ├── DOCKER_README.md │ ├── DOCKER_TROUBLESHOOTING.md │ ├── FINAL_AI_VALIDATION_SPEC.md │ ├── FLEXIBLE_INSTANCE_CONFIGURATION.md │ ├── HTTP_DEPLOYMENT.md │ ├── img │ │ ├── cc_command.png │ │ ├── cc_connected.png │ │ ├── codex_connected.png │ │ ├── cursor_tut.png │ │ ├── Railway_api.png │ │ ├── Railway_server_address.png │ │ ├── vsc_ghcp_chat_agent_mode.png │ │ ├── vsc_ghcp_chat_instruction_files.png │ │ ├── vsc_ghcp_chat_thinking_tool.png │ │ └── windsurf_tut.png │ ├── INSTALLATION.md │ ├── LIBRARY_USAGE.md │ ├── local │ │ ├── DEEP_DIVE_ANALYSIS_2025-10-02.md │ │ ├── DEEP_DIVE_ANALYSIS_README.md │ │ ├── Deep_dive_p1_p2.md │ │ ├── integration-testing-plan.md │ │ ├── integration-tests-phase1-summary.md │ │ ├── N8N_AI_WORKFLOW_BUILDER_ANALYSIS.md │ │ ├── P0_IMPLEMENTATION_PLAN.md │ │ └── TEMPLATE_MINING_ANALYSIS.md │ ├── MCP_ESSENTIALS_README.md │ ├── MCP_QUICK_START_GUIDE.md │ ├── N8N_DEPLOYMENT.md │ ├── RAILWAY_DEPLOYMENT.md │ ├── README_CLAUDE_SETUP.md │ ├── README.md │ ├── tools-documentation-usage.md │ ├── VS_CODE_PROJECT_SETUP.md │ ├── WINDSURF_SETUP.md │ └── workflow-diff-examples.md ├── examples │ └── enhanced-documentation-demo.js ├── fetch_log.txt ├── LICENSE ├── MEMORY_N8N_UPDATE.md ├── MEMORY_TEMPLATE_UPDATE.md ├── monitor_fetch.sh ├── N8N_HTTP_STREAMABLE_SETUP.md ├── n8n-nodes.db ├── P0-R3-TEST-PLAN.md ├── package-lock.json ├── package.json ├── package.runtime.json ├── PRIVACY.md ├── railway.json ├── README.md ├── renovate.json ├── scripts │ ├── analyze-optimization.sh │ ├── audit-schema-coverage.ts │ ├── build-optimized.sh │ ├── compare-benchmarks.js │ ├── demo-optimization.sh │ ├── deploy-http.sh │ ├── deploy-to-vm.sh │ ├── export-webhook-workflows.ts │ ├── extract-changelog.js │ ├── extract-from-docker.js │ ├── extract-nodes-docker.sh │ ├── extract-nodes-simple.sh │ ├── format-benchmark-results.js │ ├── generate-benchmark-stub.js │ ├── generate-detailed-reports.js │ ├── generate-test-summary.js │ ├── http-bridge.js │ ├── mcp-http-client.js │ ├── migrate-nodes-fts.ts │ ├── migrate-tool-docs.ts │ ├── n8n-docs-mcp.service │ ├── nginx-n8n-mcp.conf │ ├── prebuild-fts5.ts │ ├── prepare-release.js │ ├── publish-npm-quick.sh │ ├── publish-npm.sh │ ├── quick-test.ts │ ├── run-benchmarks-ci.js │ ├── sync-runtime-version.js │ ├── test-ai-validation-debug.ts │ ├── test-code-node-enhancements.ts │ ├── test-code-node-fixes.ts │ ├── test-docker-config.sh │ ├── test-docker-fingerprint.ts │ ├── test-docker-optimization.sh │ ├── test-docker.sh │ ├── test-empty-connection-validation.ts │ ├── test-error-message-tracking.ts │ ├── test-error-output-validation.ts │ ├── test-error-validation.js │ ├── test-essentials.ts │ ├── test-expression-code-validation.ts │ ├── test-expression-format-validation.js │ ├── test-fts5-search.ts │ ├── test-fuzzy-fix.ts │ ├── test-fuzzy-simple.ts │ ├── test-helpers-validation.ts │ ├── test-http-search.ts │ ├── test-http.sh │ ├── test-jmespath-validation.ts │ ├── test-multi-tenant-simple.ts │ ├── test-multi-tenant.ts │ ├── test-n8n-integration.sh │ ├── test-node-info.js │ ├── test-node-type-validation.ts │ ├── test-nodes-base-prefix.ts │ ├── test-operation-validation.ts │ ├── test-optimized-docker.sh │ ├── test-release-automation.js │ ├── test-search-improvements.ts │ ├── test-security.ts │ ├── test-single-session.sh │ ├── test-sqljs-triggers.ts │ ├── test-telemetry-debug.ts │ ├── test-telemetry-direct.ts │ ├── test-telemetry-env.ts │ ├── test-telemetry-integration.ts │ ├── test-telemetry-no-select.ts │ ├── test-telemetry-security.ts │ ├── test-telemetry-simple.ts │ ├── test-typeversion-validation.ts │ ├── test-url-configuration.ts │ ├── test-user-id-persistence.ts │ ├── test-webhook-validation.ts │ ├── test-workflow-insert.ts │ ├── test-workflow-sanitizer.ts │ ├── test-workflow-tracking-debug.ts │ ├── update-and-publish-prep.sh │ ├── update-n8n-deps.js │ ├── update-readme-version.js │ ├── vitest-benchmark-json-reporter.js │ └── vitest-benchmark-reporter.ts ├── SECURITY.md ├── src │ ├── config │ │ └── n8n-api.ts │ ├── data │ │ └── canonical-ai-tool-examples.json │ ├── database │ │ ├── database-adapter.ts │ │ ├── migrations │ │ │ └── add-template-node-configs.sql │ │ ├── node-repository.ts │ │ ├── nodes.db │ │ ├── schema-optimized.sql │ │ └── schema.sql │ ├── errors │ │ └── validation-service-error.ts │ ├── http-server-single-session.ts │ ├── http-server.ts │ ├── index.ts │ ├── loaders │ │ └── node-loader.ts │ ├── mappers │ │ └── docs-mapper.ts │ ├── mcp │ │ ├── handlers-n8n-manager.ts │ │ ├── handlers-workflow-diff.ts │ │ ├── index.ts │ │ ├── server.ts │ │ ├── stdio-wrapper.ts │ │ ├── tool-docs │ │ │ ├── configuration │ │ │ │ ├── get-node-as-tool-info.ts │ │ │ │ ├── get-node-documentation.ts │ │ │ │ ├── get-node-essentials.ts │ │ │ │ ├── get-node-info.ts │ │ │ │ ├── get-property-dependencies.ts │ │ │ │ ├── index.ts │ │ │ │ └── search-node-properties.ts │ │ │ ├── discovery │ │ │ │ ├── get-database-statistics.ts │ │ │ │ ├── index.ts │ │ │ │ ├── list-ai-tools.ts │ │ │ │ ├── list-nodes.ts │ │ │ │ └── search-nodes.ts │ │ │ ├── guides │ │ │ │ ├── ai-agents-guide.ts │ │ │ │ └── index.ts │ │ │ ├── index.ts │ │ │ ├── system │ │ │ │ ├── index.ts │ │ │ │ ├── n8n-diagnostic.ts │ │ │ │ ├── n8n-health-check.ts │ │ │ │ ├── n8n-list-available-tools.ts │ │ │ │ └── tools-documentation.ts │ │ │ ├── templates │ │ │ │ ├── get-template.ts │ │ │ │ ├── get-templates-for-task.ts │ │ │ │ ├── index.ts │ │ │ │ ├── list-node-templates.ts │ │ │ │ ├── list-tasks.ts │ │ │ │ ├── search-templates-by-metadata.ts │ │ │ │ └── search-templates.ts │ │ │ ├── types.ts │ │ │ ├── validation │ │ │ │ ├── index.ts │ │ │ │ ├── validate-node-minimal.ts │ │ │ │ ├── validate-node-operation.ts │ │ │ │ ├── validate-workflow-connections.ts │ │ │ │ ├── validate-workflow-expressions.ts │ │ │ │ └── validate-workflow.ts │ │ │ └── workflow_management │ │ │ ├── index.ts │ │ │ ├── n8n-autofix-workflow.ts │ │ │ ├── n8n-create-workflow.ts │ │ │ ├── n8n-delete-execution.ts │ │ │ ├── n8n-delete-workflow.ts │ │ │ ├── n8n-get-execution.ts │ │ │ ├── n8n-get-workflow-details.ts │ │ │ ├── n8n-get-workflow-minimal.ts │ │ │ ├── n8n-get-workflow-structure.ts │ │ │ ├── n8n-get-workflow.ts │ │ │ ├── n8n-list-executions.ts │ │ │ ├── n8n-list-workflows.ts │ │ │ ├── n8n-trigger-webhook-workflow.ts │ │ │ ├── n8n-update-full-workflow.ts │ │ │ ├── n8n-update-partial-workflow.ts │ │ │ └── n8n-validate-workflow.ts │ │ ├── tools-documentation.ts │ │ ├── tools-n8n-friendly.ts │ │ ├── tools-n8n-manager.ts │ │ ├── tools.ts │ │ └── workflow-examples.ts │ ├── mcp-engine.ts │ ├── mcp-tools-engine.ts │ ├── n8n │ │ ├── MCPApi.credentials.ts │ │ └── MCPNode.node.ts │ ├── parsers │ │ ├── node-parser.ts │ │ ├── property-extractor.ts │ │ └── simple-parser.ts │ ├── scripts │ │ ├── debug-http-search.ts │ │ ├── extract-from-docker.ts │ │ ├── fetch-templates-robust.ts │ │ ├── fetch-templates.ts │ │ ├── rebuild-database.ts │ │ ├── rebuild-optimized.ts │ │ ├── rebuild.ts │ │ ├── sanitize-templates.ts │ │ ├── seed-canonical-ai-examples.ts │ │ ├── test-autofix-documentation.ts │ │ ├── test-autofix-workflow.ts │ │ ├── test-execution-filtering.ts │ │ ├── test-node-suggestions.ts │ │ ├── test-protocol-negotiation.ts │ │ ├── test-summary.ts │ │ ├── test-webhook-autofix.ts │ │ ├── validate.ts │ │ └── validation-summary.ts │ ├── services │ │ ├── ai-node-validator.ts │ │ ├── ai-tool-validators.ts │ │ ├── confidence-scorer.ts │ │ ├── config-validator.ts │ │ ├── enhanced-config-validator.ts │ │ ├── example-generator.ts │ │ ├── execution-processor.ts │ │ ├── expression-format-validator.ts │ │ ├── expression-validator.ts │ │ ├── n8n-api-client.ts │ │ ├── n8n-validation.ts │ │ ├── node-documentation-service.ts │ │ ├── node-similarity-service.ts │ │ ├── node-specific-validators.ts │ │ ├── operation-similarity-service.ts │ │ ├── property-dependencies.ts │ │ ├── property-filter.ts │ │ ├── resource-similarity-service.ts │ │ ├── sqlite-storage-service.ts │ │ ├── task-templates.ts │ │ ├── universal-expression-validator.ts │ │ ├── workflow-auto-fixer.ts │ │ ├── workflow-diff-engine.ts │ │ └── workflow-validator.ts │ ├── telemetry │ │ ├── batch-processor.ts │ │ ├── config-manager.ts │ │ ├── early-error-logger.ts │ │ ├── error-sanitization-utils.ts │ │ ├── error-sanitizer.ts │ │ ├── event-tracker.ts │ │ ├── event-validator.ts │ │ ├── index.ts │ │ ├── performance-monitor.ts │ │ ├── rate-limiter.ts │ │ ├── startup-checkpoints.ts │ │ ├── telemetry-error.ts │ │ ├── telemetry-manager.ts │ │ ├── telemetry-types.ts │ │ └── workflow-sanitizer.ts │ ├── templates │ │ ├── batch-processor.ts │ │ ├── metadata-generator.ts │ │ ├── README.md │ │ ├── template-fetcher.ts │ │ ├── template-repository.ts │ │ └── template-service.ts │ ├── types │ │ ├── index.ts │ │ ├── instance-context.ts │ │ ├── n8n-api.ts │ │ ├── node-types.ts │ │ └── workflow-diff.ts │ └── utils │ ├── auth.ts │ ├── bridge.ts │ ├── cache-utils.ts │ ├── console-manager.ts │ ├── documentation-fetcher.ts │ ├── enhanced-documentation-fetcher.ts │ ├── error-handler.ts │ ├── example-generator.ts │ ├── fixed-collection-validator.ts │ ├── logger.ts │ ├── mcp-client.ts │ ├── n8n-errors.ts │ ├── node-source-extractor.ts │ ├── node-type-normalizer.ts │ ├── node-type-utils.ts │ ├── node-utils.ts │ ├── npm-version-checker.ts │ ├── protocol-version.ts │ ├── simple-cache.ts │ ├── ssrf-protection.ts │ ├── template-node-resolver.ts │ ├── template-sanitizer.ts │ ├── url-detector.ts │ ├── validation-schemas.ts │ └── version.ts ├── test-output.txt ├── test-reinit-fix.sh ├── tests │ ├── __snapshots__ │ │ └── .gitkeep │ ├── auth.test.ts │ ├── benchmarks │ │ ├── database-queries.bench.ts │ │ ├── index.ts │ │ ├── mcp-tools.bench.ts │ │ ├── mcp-tools.bench.ts.disabled │ │ ├── mcp-tools.bench.ts.skip │ │ ├── node-loading.bench.ts.disabled │ │ ├── README.md │ │ ├── search-operations.bench.ts.disabled │ │ └── validation-performance.bench.ts.disabled │ ├── bridge.test.ts │ ├── comprehensive-extraction-test.js │ ├── data │ │ └── .gitkeep │ ├── debug-slack-doc.js │ ├── demo-enhanced-documentation.js │ ├── docker-tests-README.md │ ├── error-handler.test.ts │ ├── examples │ │ └── using-database-utils.test.ts │ ├── extracted-nodes-db │ │ ├── database-import.json │ │ ├── extraction-report.json │ │ ├── insert-nodes.sql │ │ ├── n8n-nodes-base__Airtable.json │ │ ├── n8n-nodes-base__Discord.json │ │ ├── n8n-nodes-base__Function.json │ │ ├── n8n-nodes-base__HttpRequest.json │ │ ├── n8n-nodes-base__If.json │ │ ├── n8n-nodes-base__Slack.json │ │ ├── n8n-nodes-base__SplitInBatches.json │ │ └── n8n-nodes-base__Webhook.json │ ├── factories │ │ ├── node-factory.ts │ │ └── property-definition-factory.ts │ ├── fixtures │ │ ├── .gitkeep │ │ ├── database │ │ │ └── test-nodes.json │ │ ├── factories │ │ │ ├── node.factory.ts │ │ │ └── parser-node.factory.ts │ │ └── template-configs.ts │ ├── helpers │ │ └── env-helpers.ts │ ├── http-server-auth.test.ts │ ├── integration │ │ ├── ai-validation │ │ │ ├── ai-agent-validation.test.ts │ │ │ ├── ai-tool-validation.test.ts │ │ │ ├── chat-trigger-validation.test.ts │ │ │ ├── e2e-validation.test.ts │ │ │ ├── helpers.ts │ │ │ ├── llm-chain-validation.test.ts │ │ │ ├── README.md │ │ │ └── TEST_REPORT.md │ │ ├── ci │ │ │ └── database-population.test.ts │ │ ├── database │ │ │ ├── connection-management.test.ts │ │ │ ├── empty-database.test.ts │ │ │ ├── fts5-search.test.ts │ │ │ ├── node-fts5-search.test.ts │ │ │ ├── node-repository.test.ts │ │ │ ├── performance.test.ts │ │ │ ├── template-node-configs.test.ts │ │ │ ├── template-repository.test.ts │ │ │ ├── test-utils.ts │ │ │ └── transactions.test.ts │ │ ├── database-integration.test.ts │ │ ├── docker │ │ │ ├── docker-config.test.ts │ │ │ ├── docker-entrypoint.test.ts │ │ │ └── test-helpers.ts │ │ ├── flexible-instance-config.test.ts │ │ ├── mcp │ │ │ └── template-examples-e2e.test.ts │ │ ├── mcp-protocol │ │ │ ├── basic-connection.test.ts │ │ │ ├── error-handling.test.ts │ │ │ ├── performance.test.ts │ │ │ ├── protocol-compliance.test.ts │ │ │ ├── README.md │ │ │ ├── session-management.test.ts │ │ │ ├── test-helpers.ts │ │ │ ├── tool-invocation.test.ts │ │ │ └── workflow-error-validation.test.ts │ │ ├── msw-setup.test.ts │ │ ├── n8n-api │ │ │ ├── executions │ │ │ │ ├── delete-execution.test.ts │ │ │ │ ├── get-execution.test.ts │ │ │ │ ├── list-executions.test.ts │ │ │ │ └── trigger-webhook.test.ts │ │ │ ├── scripts │ │ │ │ └── cleanup-orphans.ts │ │ │ ├── system │ │ │ │ ├── diagnostic.test.ts │ │ │ │ ├── health-check.test.ts │ │ │ │ └── list-tools.test.ts │ │ │ ├── test-connection.ts │ │ │ ├── types │ │ │ │ └── mcp-responses.ts │ │ │ ├── utils │ │ │ │ ├── cleanup-helpers.ts │ │ │ │ ├── credentials.ts │ │ │ │ ├── factories.ts │ │ │ │ ├── fixtures.ts │ │ │ │ ├── mcp-context.ts │ │ │ │ ├── n8n-client.ts │ │ │ │ ├── node-repository.ts │ │ │ │ ├── response-types.ts │ │ │ │ ├── test-context.ts │ │ │ │ └── webhook-workflows.ts │ │ │ └── workflows │ │ │ ├── autofix-workflow.test.ts │ │ │ ├── create-workflow.test.ts │ │ │ ├── delete-workflow.test.ts │ │ │ ├── get-workflow-details.test.ts │ │ │ ├── get-workflow-minimal.test.ts │ │ │ ├── get-workflow-structure.test.ts │ │ │ ├── get-workflow.test.ts │ │ │ ├── list-workflows.test.ts │ │ │ ├── smart-parameters.test.ts │ │ │ ├── update-partial-workflow.test.ts │ │ │ ├── update-workflow.test.ts │ │ │ └── validate-workflow.test.ts │ │ ├── security │ │ │ ├── command-injection-prevention.test.ts │ │ │ └── rate-limiting.test.ts │ │ ├── setup │ │ │ ├── integration-setup.ts │ │ │ └── msw-test-server.ts │ │ ├── telemetry │ │ │ ├── docker-user-id-stability.test.ts │ │ │ └── mcp-telemetry.test.ts │ │ ├── templates │ │ │ └── metadata-operations.test.ts │ │ └── workflow-creation-node-type-format.test.ts │ ├── logger.test.ts │ ├── MOCKING_STRATEGY.md │ ├── mocks │ │ ├── n8n-api │ │ │ ├── data │ │ │ │ ├── credentials.ts │ │ │ │ ├── executions.ts │ │ │ │ └── workflows.ts │ │ │ ├── handlers.ts │ │ │ └── index.ts │ │ └── README.md │ ├── node-storage-export.json │ ├── setup │ │ ├── global-setup.ts │ │ ├── msw-setup.ts │ │ ├── TEST_ENV_DOCUMENTATION.md │ │ └── test-env.ts │ ├── test-database-extraction.js │ ├── test-direct-extraction.js │ ├── test-enhanced-documentation.js │ ├── test-enhanced-integration.js │ ├── test-mcp-extraction.js │ ├── test-mcp-server-extraction.js │ ├── test-mcp-tools-integration.js │ ├── test-node-documentation-service.js │ ├── test-node-list.js │ ├── test-package-info.js │ ├── test-parsing-operations.js │ ├── test-slack-node-complete.js │ ├── test-small-rebuild.js │ ├── test-sqlite-search.js │ ├── test-storage-system.js │ ├── unit │ │ ├── __mocks__ │ │ │ ├── n8n-nodes-base.test.ts │ │ │ ├── n8n-nodes-base.ts │ │ │ └── README.md │ │ ├── database │ │ │ ├── __mocks__ │ │ │ │ └── better-sqlite3.ts │ │ │ ├── database-adapter-unit.test.ts │ │ │ ├── node-repository-core.test.ts │ │ │ ├── node-repository-operations.test.ts │ │ │ ├── node-repository-outputs.test.ts │ │ │ ├── README.md │ │ │ └── template-repository-core.test.ts │ │ ├── docker │ │ │ ├── config-security.test.ts │ │ │ ├── edge-cases.test.ts │ │ │ ├── parse-config.test.ts │ │ │ └── serve-command.test.ts │ │ ├── errors │ │ │ └── validation-service-error.test.ts │ │ ├── examples │ │ │ └── using-n8n-nodes-base-mock.test.ts │ │ ├── flexible-instance-security-advanced.test.ts │ │ ├── flexible-instance-security.test.ts │ │ ├── http-server │ │ │ └── multi-tenant-support.test.ts │ │ ├── http-server-n8n-mode.test.ts │ │ ├── http-server-n8n-reinit.test.ts │ │ ├── http-server-session-management.test.ts │ │ ├── loaders │ │ │ └── node-loader.test.ts │ │ ├── mappers │ │ │ └── docs-mapper.test.ts │ │ ├── mcp │ │ │ ├── get-node-essentials-examples.test.ts │ │ │ ├── handlers-n8n-manager-simple.test.ts │ │ │ ├── handlers-n8n-manager.test.ts │ │ │ ├── handlers-workflow-diff.test.ts │ │ │ ├── lru-cache-behavior.test.ts │ │ │ ├── multi-tenant-tool-listing.test.ts.disabled │ │ │ ├── parameter-validation.test.ts │ │ │ ├── search-nodes-examples.test.ts │ │ │ ├── tools-documentation.test.ts │ │ │ └── tools.test.ts │ │ ├── monitoring │ │ │ └── cache-metrics.test.ts │ │ ├── MULTI_TENANT_TEST_COVERAGE.md │ │ ├── multi-tenant-integration.test.ts │ │ ├── parsers │ │ │ ├── node-parser-outputs.test.ts │ │ │ ├── node-parser.test.ts │ │ │ ├── property-extractor.test.ts │ │ │ └── simple-parser.test.ts │ │ ├── scripts │ │ │ └── fetch-templates-extraction.test.ts │ │ ├── services │ │ │ ├── ai-node-validator.test.ts │ │ │ ├── ai-tool-validators.test.ts │ │ │ ├── confidence-scorer.test.ts │ │ │ ├── config-validator-basic.test.ts │ │ │ ├── config-validator-edge-cases.test.ts │ │ │ ├── config-validator-node-specific.test.ts │ │ │ ├── config-validator-security.test.ts │ │ │ ├── debug-validator.test.ts │ │ │ ├── enhanced-config-validator-integration.test.ts │ │ │ ├── enhanced-config-validator-operations.test.ts │ │ │ ├── enhanced-config-validator.test.ts │ │ │ ├── example-generator.test.ts │ │ │ ├── execution-processor.test.ts │ │ │ ├── expression-format-validator.test.ts │ │ │ ├── expression-validator-edge-cases.test.ts │ │ │ ├── expression-validator.test.ts │ │ │ ├── fixed-collection-validation.test.ts │ │ │ ├── loop-output-edge-cases.test.ts │ │ │ ├── n8n-api-client.test.ts │ │ │ ├── n8n-validation.test.ts │ │ │ ├── node-similarity-service.test.ts │ │ │ ├── node-specific-validators.test.ts │ │ │ ├── operation-similarity-service-comprehensive.test.ts │ │ │ ├── operation-similarity-service.test.ts │ │ │ ├── property-dependencies.test.ts │ │ │ ├── property-filter-edge-cases.test.ts │ │ │ ├── property-filter.test.ts │ │ │ ├── resource-similarity-service-comprehensive.test.ts │ │ │ ├── resource-similarity-service.test.ts │ │ │ ├── task-templates.test.ts │ │ │ ├── template-service.test.ts │ │ │ ├── universal-expression-validator.test.ts │ │ │ ├── validation-fixes.test.ts │ │ │ ├── workflow-auto-fixer.test.ts │ │ │ ├── workflow-diff-engine.test.ts │ │ │ ├── workflow-fixed-collection-validation.test.ts │ │ │ ├── workflow-validator-comprehensive.test.ts │ │ │ ├── workflow-validator-edge-cases.test.ts │ │ │ ├── workflow-validator-error-outputs.test.ts │ │ │ ├── workflow-validator-expression-format.test.ts │ │ │ ├── workflow-validator-loops-simple.test.ts │ │ │ ├── workflow-validator-loops.test.ts │ │ │ ├── workflow-validator-mocks.test.ts │ │ │ ├── workflow-validator-performance.test.ts │ │ │ ├── workflow-validator-with-mocks.test.ts │ │ │ └── workflow-validator.test.ts │ │ ├── telemetry │ │ │ ├── batch-processor.test.ts │ │ │ ├── config-manager.test.ts │ │ │ ├── event-tracker.test.ts │ │ │ ├── event-validator.test.ts │ │ │ ├── rate-limiter.test.ts │ │ │ ├── telemetry-error.test.ts │ │ │ ├── telemetry-manager.test.ts │ │ │ ├── v2.18.3-fixes-verification.test.ts │ │ │ └── workflow-sanitizer.test.ts │ │ ├── templates │ │ │ ├── batch-processor.test.ts │ │ │ ├── metadata-generator.test.ts │ │ │ ├── template-repository-metadata.test.ts │ │ │ └── template-repository-security.test.ts │ │ ├── test-env-example.test.ts │ │ ├── test-infrastructure.test.ts │ │ ├── types │ │ │ ├── instance-context-coverage.test.ts │ │ │ └── instance-context-multi-tenant.test.ts │ │ ├── utils │ │ │ ├── auth-timing-safe.test.ts │ │ │ ├── cache-utils.test.ts │ │ │ ├── console-manager.test.ts │ │ │ ├── database-utils.test.ts │ │ │ ├── fixed-collection-validator.test.ts │ │ │ ├── n8n-errors.test.ts │ │ │ ├── node-type-normalizer.test.ts │ │ │ ├── node-type-utils.test.ts │ │ │ ├── node-utils.test.ts │ │ │ ├── simple-cache-memory-leak-fix.test.ts │ │ │ ├── ssrf-protection.test.ts │ │ │ └── template-node-resolver.test.ts │ │ └── validation-fixes.test.ts │ └── utils │ ├── assertions.ts │ ├── builders │ │ └── workflow.builder.ts │ ├── data-generators.ts │ ├── database-utils.ts │ ├── README.md │ └── test-helpers.ts ├── thumbnail.png ├── tsconfig.build.json ├── tsconfig.json ├── types │ ├── mcp.d.ts │ └── test-env.d.ts ├── verify-telemetry-fix.js ├── versioned-nodes.md ├── vitest.config.benchmark.ts ├── vitest.config.integration.ts └── vitest.config.ts ``` # Files -------------------------------------------------------------------------------- /docs/local/integration-testing-plan.md: -------------------------------------------------------------------------------- ```markdown 1 | # Comprehensive Integration Testing Plan 2 | 3 | ## Status 4 | 5 | **Phase 1: Foundation** ✅ **COMPLETE** (October 3, 2025) 6 | - All utility files created and tested 7 | - Webhook workflows created on `https://n8n-test.n8n-mcp.com` 8 | - GitHub secrets configured 9 | - Critical fix: Updated credentials to use webhook URLs instead of IDs 10 | - Environment loading fixed to support real n8n API integration tests 11 | 12 | **Phase 2: Workflow Creation Tests** ✅ **COMPLETE** (October 3, 2025) 13 | - 15 test scenarios implemented and passing 14 | - P0 bug verification confirmed (FULL node type format) 15 | - All test categories covered: base nodes, advanced features, error scenarios, edge cases 16 | - Documented actual n8n API behavior (validation at execution time, not creation time) 17 | - Test file: `tests/integration/n8n-api/workflows/create-workflow.test.ts` (484 lines) 18 | 19 | **Phase 3: Workflow Retrieval Tests** ✅ **COMPLETE** (October 3, 2025) 20 | - 11 test scenarios implemented and passing 21 | - All MCP retrieval handlers tested: handleGetWorkflow, handleGetWorkflowDetails, handleGetWorkflowStructure, handleGetWorkflowMinimal 22 | - Test files: 23 | - `get-workflow.test.ts` (3 scenarios) 24 | - `get-workflow-details.test.ts` (4 scenarios) 25 | - `get-workflow-structure.test.ts` (2 scenarios) 26 | - `get-workflow-minimal.test.ts` (2 scenarios) 27 | 28 | **Phase 4: Workflow Update Tests** ✅ **COMPLETE** (October 4, 2025) 29 | - 42 test scenarios implemented and passing 30 | - Enhanced settings filtering (whitelist approach) to enable updates while maintaining Issue #248 protection 31 | - All update operations tested: 32 | - Full workflow updates: 7 scenarios (update-workflow.test.ts) 33 | - Partial/diff-based updates: 32 scenarios covering all 15 operations (update-partial-workflow.test.ts) 34 | - Validation error scenarios: 3 scenarios 35 | - Critical fixes: 36 | - Settings filtering uses OpenAPI spec whitelist (filters callerPolicy, preserves safe properties) 37 | - All tests comply with n8n API requirements (name, nodes, connections, settings fields) 38 | - Removed invalid "Update Connections" test (empty connections invalid for multi-node workflows) 39 | - Version 2.15.4 released with comprehensive CHANGELOG entry 40 | 41 | **Phase 5: Workflow Management Tests** ✅ **COMPLETE** (October 4, 2025) 42 | - 16 test scenarios implemented and passing 43 | - All workflow management operations tested: 44 | - Delete workflow: 3 scenarios (delete-workflow.test.ts) 45 | - List workflows: 13 scenarios (list-workflows.test.ts) 46 | - Critical API compliance fixes: 47 | - handleDeleteWorkflow: Now returns deleted workflow data (per n8n API spec) 48 | - handleListWorkflows: Fixed tags parameter format (array → CSV string conversion) 49 | - N8nApiClient.deleteWorkflow: Return type corrected (void → Workflow) 50 | - WorkflowListParams.tags: Type corrected (string[] → string per n8n OpenAPI spec) 51 | - Unit test coverage: Added 9 unit tests for handler coverage (100% coverage achieved) 52 | - n8n-mcp-tester validation: All tools tested and working correctly in production 53 | - Version 2.15.5 released with comprehensive CHANGELOG entry 54 | - Test results: 71/71 integration tests passing (Phase 1-5 complete) 55 | 56 | **Phase 6A: Workflow Validation Tests** ✅ **COMPLETE** (October 5, 2025) 57 | - 12 test scenarios implemented and passing 58 | - NodeRepository utility created for tests requiring node validation 59 | - All validation profiles tested: strict, runtime, ai-friendly, minimal 60 | - Test coverage: 61 | - Valid workflows across all 4 profiles (4 scenarios) 62 | - Invalid workflow detection (2 scenarios - bad node types, missing connections) 63 | - Selective validation (3 scenarios - nodes only, connections only, expressions only) 64 | - Error handling (2 scenarios - non-existent workflow, invalid profile) 65 | - Response format verification (1 scenario) 66 | - Critical discoveries: 67 | - Response only includes errors/warnings fields when they exist (not empty arrays) 68 | - Field name is errorCount, not totalErrors 69 | - Tests require NodeRepository instance (added singleton utility) 70 | - Test file: validate-workflow.test.ts (431 lines) 71 | - Test results: 83/83 integration tests passing (Phase 1-5, 6A complete) 72 | 73 | **Phase 6B: Workflow Autofix Tests** ✅ **COMPLETE** (October 5, 2025) 74 | - 16 test scenarios implemented and passing 75 | - All autofix operations tested: preview mode, apply mode, fix types, confidence filtering 76 | - Test coverage: 77 | - Preview mode (2 scenarios - expression-format, multiple fix types) 78 | - Apply mode (2 scenarios - expression-format, webhook-missing-path) 79 | - Fix type filtering (2 scenarios - single type, multiple types) 80 | - Confidence thresholds (3 scenarios - high, medium, low) 81 | - Max fixes parameter (1 scenario) 82 | - No fixes available (1 scenario) 83 | - Error handling (3 scenarios - non-existent workflow, invalid parameters) 84 | - Response format verification (2 scenarios - preview and apply modes) 85 | - Fix types tested: 86 | - expression-format (missing = prefix for resource locators) 87 | - typeversion-correction (outdated typeVersion values) 88 | - error-output-config (error output configuration issues) 89 | - node-type-correction (incorrect node types) 90 | - webhook-missing-path (missing webhook path parameters) 91 | - Code quality improvements: 92 | - Fixed database resource leak in NodeRepository utility 93 | - Added TypeScript interfaces (ValidationResponse, AutofixResponse) 94 | - Replaced unsafe `as any` casts with proper type definitions 95 | - All lint and typecheck errors resolved 96 | - Test file: autofix-workflow.test.ts (855 lines) 97 | - Test results: 99/99 integration tests passing (Phase 1-6 complete) 98 | 99 | **Phase 7: Execution Management Tests** ✅ **COMPLETE** (October 5, 2025) 100 | - 54 test scenarios implemented and passing 101 | - All 4 execution management handlers tested against real n8n instance 102 | - Test coverage: 103 | - handleTriggerWebhookWorkflow (20 tests): All HTTP methods (GET/POST/PUT/DELETE), query params, JSON body, custom headers, error handling 104 | - handleGetExecution (16 tests): All 4 retrieval modes (preview/summary/filtered/full), node filtering, item limits, input data inclusion, legacy compatibility 105 | - handleListExecutions (13 tests): Status filtering (success/error/waiting), pagination with cursor, various limits (1/10/50/100), data inclusion control 106 | - handleDeleteExecution (5 tests): Successful deletion, verification via fetch attempt, error handling 107 | - Critical fix: Corrected response structure expectations (executions/returned vs data/count) 108 | - Test files: 109 | - trigger-webhook.test.ts (375 lines, 20 tests) 110 | - get-execution.test.ts (429 lines, 16 tests) 111 | - list-executions.test.ts (264 lines, 13 tests) 112 | - delete-execution.test.ts (149 lines, 5 tests) 113 | - Code review: APPROVED (9.5/10 quality score) 114 | - Test results: 153/153 integration tests passing (Phase 1-7 complete) 115 | 116 | **Phase 8: System Tools Tests** ✅ **COMPLETE** (October 5, 2025) 117 | - 19 test scenarios implemented and passing 118 | - All 3 system tool handlers tested against real n8n instance 119 | - Test coverage: 120 | - handleHealthCheck (3 tests): API connectivity verification, version information, feature availability 121 | - handleListAvailableTools (7 tests): Complete tool inventory by category, configuration status, API limitations 122 | - handleDiagnostic (9 tests): Environment checks, API connectivity, tools availability, verbose mode with debug info 123 | - TypeScript type safety improvements: 124 | - Created response-types.ts with comprehensive interfaces for all response types 125 | - Replaced all 'as any' casts with proper TypeScript interfaces 126 | - Added null-safety checks and non-null assertions 127 | - Full type safety and IDE autocomplete support 128 | - Test files: 129 | - health-check.test.ts (117 lines, 3 tests) 130 | - list-tools.test.ts (181 lines, 7 tests) 131 | - diagnostic.test.ts (243 lines, 9 tests) 132 | - response-types.ts (241 lines, comprehensive type definitions) 133 | - Code review: APPROVED 134 | - Test results: 172/172 integration tests passing (Phase 1-8 complete) 135 | 136 | **🎉 INTEGRATION TEST SUITE COMPLETE**: All 18 MCP handlers fully tested 137 | 138 | **Next Phase**: Update documentation and finalize integration testing plan 139 | 140 | --- 141 | 142 | ## Overview 143 | 144 | Transform the test suite to test all 17 **MCP handlers** against a **real n8n instance** instead of mocks. This plan ensures 100% coverage of every tool, operation, and parameter combination to prevent bugs like the P0 workflow creation issue from slipping through. 145 | 146 | ### What We Test: MCP Handlers (The Product Layer) 147 | 148 | **IMPORTANT**: These integration tests validate the **MCP handler layer** (the actual product that AI assistants interact with), not just the raw n8n API client. 149 | 150 | **Architecture:** 151 | ``` 152 | AI Assistant (Claude) 153 | ↓ 154 | MCP Tools (What AI sees) 155 | ↓ 156 | MCP Handlers (What we test) ← INTEGRATION TESTS TARGET THIS LAYER 157 | ↓ 158 | N8nApiClient (Low-level HTTP) 159 | ↓ 160 | n8n REST API 161 | ``` 162 | 163 | **Why This Matters:** 164 | - **MCP handlers** wrap API responses in `McpToolResponse` format: `{ success: boolean, data?: any, error?: string }` 165 | - **MCP handlers** transform and enrich API responses (e.g., `handleGetWorkflowDetails` adds execution stats) 166 | - **MCP handlers** provide the exact interface that AI assistants consume 167 | - Testing raw API client bypasses the product layer and misses MCP-specific logic 168 | 169 | **Test Pattern:** 170 | ```typescript 171 | // ❌ WRONG: Testing raw API client (low-level service) 172 | const result = await client.createWorkflow(workflow); 173 | 174 | // ✅ CORRECT: Testing MCP handler (product layer) 175 | const response = await handleCreateWorkflow({ ...workflow }, mcpContext); 176 | expect(response.success).toBe(true); 177 | const result = response.data; 178 | ``` 179 | 180 | ## Critical Requirements 181 | 182 | 1. **Credentials**: 183 | - Local development: Read from `.env` file 184 | - CI/GitHub Actions: Use GitHub secrets (`N8N_URL`, `N8N_API_KEY`) 185 | 186 | 2. **Pre-activated Webhook Workflows**: 187 | - n8n API doesn't support workflow activation via API 188 | - Need pre-created, activated workflows for webhook testing 189 | - Store webhook URLs (not workflow IDs) in `.env`: 190 | - `N8N_TEST_WEBHOOK_GET_URL` - GET method webhook URL 191 | - `N8N_TEST_WEBHOOK_POST_URL` - POST method webhook URL 192 | - `N8N_TEST_WEBHOOK_PUT_URL` - PUT method webhook URL 193 | - `N8N_TEST_WEBHOOK_DELETE_URL` - DELETE method webhook URL 194 | - **Rationale**: Webhook URLs are what the `n8n_trigger_webhook_workflow` tool needs. Workflow IDs are only for workflow management tests (which create workflows dynamically during test execution). 195 | 196 | 3. **100% Coverage Goal**: Test EVERY tool, EVERY operation, EVERY parameter combination 197 | 198 | --- 199 | 200 | ## Complete Test Coverage Matrix 201 | 202 | ### Total Test Scenarios: ~150+ 203 | 204 | #### Workflow Management (10 MCP handlers) 205 | 206 | **1. `handleCreateWorkflow`** - 15+ scenarios (MCP handler testing) 207 | - Create workflow with base nodes (webhook, httpRequest, set) 208 | - Create workflow with langchain nodes (agent, aiChain) 209 | - Invalid node types (error handling) 210 | - Complex multi-node workflows 211 | - Complex connection patterns 212 | - **P0 Bug Verification**: SHORT vs FULL node type handling 213 | - Missing required parameters 214 | - Duplicate node names 215 | - Invalid connection references 216 | - Settings variations 217 | 218 | **2. `handleGetWorkflow`** - 3 scenarios 219 | - Successful retrieval 220 | - Not found (invalid ID) 221 | - Malformed ID 222 | 223 | **3. `handleGetWorkflowDetails`** - 4 scenarios 224 | - Basic workflow 225 | - Workflow with metadata 226 | - Workflow with version history 227 | - Workflow with execution stats 228 | 229 | **4. `handleGetWorkflowStructure`** - 2 scenarios 230 | - Simple workflow 231 | - Complex workflow (verify no parameter data) 232 | 233 | **5. `handleGetWorkflowMinimal`** - 2 scenarios 234 | - Active workflow 235 | - Inactive workflow 236 | 237 | **6. `handleUpdateWorkflow`** - 8+ scenarios 238 | - Full workflow replacement 239 | - Update nodes 240 | - Update connections 241 | - Update settings 242 | - Update tags 243 | - Validation errors 244 | - Concurrent update conflicts 245 | - Large workflow updates 246 | 247 | **7. `handleUpdatePartialWorkflow`** - 30+ scenarios (15 operations × 2 paths) 248 | 249 | **Node Operations (12 scenarios):** 250 | - `addNode`: Success, duplicate name, invalid type, missing position 251 | - `removeNode`: By ID, by name, not found, with connection cleanup 252 | - `updateNode`: By ID, by name, invalid updates, nested parameter updates 253 | - `moveNode`: Valid position, boundary positions 254 | - `enableNode`: Success, already enabled 255 | - `disableNode`: Success, already disabled 256 | 257 | **Connection Operations (10 scenarios):** 258 | - `addConnection`: Default ports, custom ports, invalid nodes 259 | - `removeConnection`: Success, not found, with ignoreErrors 260 | - `updateConnection`: Change ports, change indices 261 | - `cleanStaleConnections`: Dry run, actual cleanup 262 | - `replaceConnections`: Full replacement, validation 263 | 264 | **Metadata Operations (8 scenarios):** 265 | - `updateSettings`: Timezone, execution order, error workflow 266 | - `updateName`: Valid, duplicate, empty 267 | - `addTag`: New tag, existing tag 268 | - `removeTag`: Existing, non-existing 269 | 270 | **8. `handleDeleteWorkflow`** - 3 scenarios 271 | - Successful deletion 272 | - Not found 273 | - Verify cleanup (workflow actually deleted) 274 | 275 | **9. `handleListWorkflows`** - 12+ scenarios 276 | - No filters (all workflows) 277 | - Filter by active status (true/false) 278 | - Filter by tags (single, multiple) 279 | - Filter by projectId (enterprise feature) 280 | - Pagination: first page, next page, last page 281 | - Pagination: cursor handling 282 | - Exclude pinned data 283 | - Limit variations (1, 50, 100) 284 | - Empty results 285 | - Sort order verification 286 | 287 | **10. `handleValidateWorkflow`** - 16 scenarios (4 profiles × 4 validation types) 288 | 289 | **Validation Profiles:** 290 | - `strict`: All validations enabled, strictest rules 291 | - `runtime`: Production-ready validation 292 | - `ai-friendly`: Relaxed rules for AI-generated workflows 293 | - `minimal`: Basic structure validation only 294 | 295 | **Validation Types (for each profile):** 296 | - All validations enabled (default) 297 | - Nodes only (`validateNodes: true`, others false) 298 | - Connections only (`validateConnections: true`, others false) 299 | - Expressions only (`validateExpressions: true`, others false) 300 | 301 | **11. `handleAutofixWorkflow`** - 20+ scenarios 302 | 303 | **Fix Types (5):** 304 | - `expression-format`: Fix `{{}}` syntax issues 305 | - `typeversion-correction`: Fix outdated typeVersion 306 | - `error-output-config`: Fix error output configuration 307 | - `node-type-correction`: Fix incorrect node types 308 | - `webhook-missing-path`: Add missing webhook paths 309 | 310 | **Confidence Levels (3):** 311 | - `high`: Only apply high-confidence fixes 312 | - `medium`: Apply high + medium confidence fixes 313 | - `low`: Apply all fixes 314 | 315 | **Test Matrix:** 316 | - Each fix type with preview mode (`applyFixes: false`) 317 | - Each fix type with apply mode (`applyFixes: true`) 318 | - Confidence threshold filtering 319 | - `maxFixes` parameter limiting 320 | - Multiple fix types in single workflow 321 | - No fixes available scenario 322 | 323 | --- 324 | 325 | #### Execution Management (4 handlers) 326 | 327 | **12. `handleTriggerWebhookWorkflow`** - 16+ scenarios 328 | 329 | **HTTP Methods (4):** 330 | - GET: Query parameters, no data 331 | - POST: JSON body, form data, headers 332 | - PUT: Update data, custom headers 333 | - DELETE: Query parameters, headers 334 | 335 | **Scenarios per method:** 336 | - Basic trigger (no data) 337 | - With request data 338 | - With custom headers 339 | - Wait for response (true/false) 340 | - Workflow not found 341 | - Invalid webhook URL 342 | 343 | **13. `handleGetExecution`** - 20+ scenarios 344 | 345 | **Execution Modes (4):** 346 | - `preview`: Structure & counts only (no data) 347 | - `summary`: 2 samples per node (default) 348 | - `filtered`: Custom limits and node filters 349 | - `full`: Complete execution data 350 | 351 | **Scenarios per mode:** 352 | - Successful execution 353 | - Failed execution 354 | - Running execution 355 | - With input data (`includeInputData: true`) 356 | - Node filters (`nodeNames: ['Node1', 'Node2']`) 357 | - Item limits (`itemsLimit: 0, 2, 5, -1`) 358 | - Not found 359 | 360 | **14. `handleListExecutions`** - 10+ scenarios 361 | - No filters (all executions) 362 | - Filter by workflowId 363 | - Filter by status (success, error, waiting) 364 | - Filter by projectId 365 | - Pagination: first page, next page, last page 366 | - Include execution data (`includeData: true/false`) 367 | - Limit variations (1, 50, 100) 368 | - Empty results 369 | 370 | **15. `handleDeleteExecution`** - 3 scenarios 371 | - Successful deletion 372 | - Not found 373 | - Verify cleanup 374 | 375 | --- 376 | 377 | #### System/Utility (3 handlers) 378 | 379 | **16. `handleHealthCheck`** - 2 scenarios 380 | - API available 381 | - Feature availability check 382 | 383 | **17. `handleListAvailableTools`** - 1 scenario 384 | - List all tools 385 | 386 | **18. `handleDiagnostic`** - 3 scenarios 387 | - Basic diagnostic 388 | - Verbose mode (`verbose: true`) 389 | - Configuration display 390 | 391 | --- 392 | 393 | ## Implementation Phases 394 | 395 | ### Phase 1: Foundation (Branch: `feat/integration-tests-foundation`) 396 | 397 | #### 1.1 Environment Configuration 398 | 399 | **Update `.env.example`:** 400 | ```bash 401 | # ======================================== 402 | # INTEGRATION TESTING CONFIGURATION 403 | # ======================================== 404 | 405 | # n8n API Configuration for Integration Tests 406 | N8N_API_URL=http://localhost:5678 407 | N8N_API_KEY=your-api-key-here 408 | 409 | # Pre-activated Webhook URLs for Testing 410 | # Create these workflows manually in n8n and activate them 411 | # Store the full webhook URLs (not workflow IDs) 412 | N8N_TEST_WEBHOOK_GET_URL=https://n8n-test.n8n-mcp.com/webhook/mcp-test-get 413 | N8N_TEST_WEBHOOK_POST_URL=https://n8n-test.n8n-mcp.com/webhook/mcp-test-post 414 | N8N_TEST_WEBHOOK_PUT_URL=https://n8n-test.n8n-mcp.com/webhook/mcp-test-put 415 | N8N_TEST_WEBHOOK_DELETE_URL=https://n8n-test.n8n-mcp.com/webhook/mcp-test-delete 416 | 417 | # Test Configuration 418 | N8N_TEST_CLEANUP_ENABLED=true # Enable automatic cleanup 419 | N8N_TEST_TAG=mcp-integration-test # Tag for test workflows 420 | N8N_TEST_NAME_PREFIX=[MCP-TEST] # Name prefix for test workflows 421 | ``` 422 | 423 | **GitHub Secrets (for CI):** 424 | - `N8N_URL`: n8n instance URL (e.g., `https://n8n-test.n8n-mcp.com`) 425 | - `N8N_API_KEY`: n8n API key (JWT token from n8n Settings > API) 426 | - `N8N_TEST_WEBHOOK_GET_URL`: Pre-activated GET webhook URL 427 | - `N8N_TEST_WEBHOOK_POST_URL`: Pre-activated POST webhook URL 428 | - `N8N_TEST_WEBHOOK_PUT_URL`: Pre-activated PUT webhook URL 429 | - `N8N_TEST_WEBHOOK_DELETE_URL`: Pre-activated DELETE webhook URL 430 | 431 | **Note**: Webhook URLs can be stored as repository secrets (not environment secrets) since they don't grant API access. The real secret is `N8N_API_KEY`. 432 | 433 | #### 1.2 Directory Structure 434 | 435 | ``` 436 | tests/integration/n8n-api/ 437 | ├── workflows/ 438 | │ ├── create-workflow.test.ts (10+ scenarios) 439 | │ ├── get-workflow.test.ts (3 scenarios) 440 | │ ├── get-workflow-details.test.ts (4 scenarios) 441 | │ ├── get-workflow-structure.test.ts (2 scenarios) 442 | │ ├── get-workflow-minimal.test.ts (2 scenarios) 443 | │ ├── update-workflow.test.ts (8+ scenarios) 444 | │ ├── update-partial-workflow.test.ts (30+ scenarios - 15 operations) 445 | │ ├── delete-workflow.test.ts (3 scenarios) 446 | │ ├── list-workflows.test.ts (12+ scenarios) 447 | │ ├── validate-workflow.test.ts (16 scenarios - 4 profiles × 4 types) 448 | │ └── autofix-workflow.test.ts (20+ scenarios - 5 types × modes) 449 | ├── executions/ 450 | │ ├── trigger-webhook.test.ts (16+ scenarios - 4 methods) 451 | │ ├── get-execution.test.ts (20+ scenarios - 4 modes) 452 | │ ├── list-executions.test.ts (10+ scenarios) 453 | │ └── delete-execution.test.ts (3 scenarios) 454 | ├── system/ 455 | │ ├── health-check.test.ts (2 scenarios) 456 | │ ├── list-tools.test.ts (1 scenario) 457 | │ └── diagnostic.test.ts (3 scenarios) 458 | └── utils/ 459 | ├── credentials.ts # Environment-aware credential loader 460 | ├── n8n-client.ts # Pre-configured API client 461 | ├── cleanup-helpers.ts # Multi-level cleanup 462 | ├── test-context.ts # Resource tracking 463 | ├── fixtures.ts # Reusable workflow templates 464 | ├── factories.ts # Test data generators 465 | └── webhook-workflows.ts # Webhook workflow configurations 466 | ``` 467 | 468 | #### 1.3 Core Utilities 469 | 470 | **mcp-context.ts** - MCP context configuration for handler testing: 471 | ```typescript 472 | import { InstanceContext } from '../../../../src/types/instance-context'; 473 | import { getN8nCredentials } from './credentials'; 474 | 475 | /** 476 | * Creates MCP context for testing MCP handlers against real n8n instance 477 | * This is what gets passed to MCP handlers (handleCreateWorkflow, etc.) 478 | */ 479 | export function createMcpContext(): InstanceContext { 480 | const creds = getN8nCredentials(); 481 | return { 482 | n8nApiUrl: creds.url, 483 | n8nApiKey: creds.apiKey 484 | }; 485 | } 486 | ``` 487 | 488 | **credentials.ts** - Environment-aware credential loader: 489 | ```typescript 490 | import dotenv from 'dotenv'; 491 | 492 | dotenv.config(); 493 | 494 | export interface N8nTestCredentials { 495 | url: string; 496 | apiKey: string; 497 | webhookUrls: { 498 | get: string; 499 | post: string; 500 | put: string; 501 | delete: string; 502 | }; 503 | cleanup: { 504 | enabled: boolean; 505 | tag: string; 506 | namePrefix: string; 507 | }; 508 | } 509 | 510 | export function getN8nCredentials(): N8nTestCredentials { 511 | if (process.env.CI) { 512 | // CI: Use GitHub secrets 513 | const url = process.env.N8N_URL; 514 | const apiKey = process.env.N8N_API_KEY; 515 | 516 | if (!url || !apiKey) { 517 | throw new Error( 518 | 'Missing required CI credentials:\n' + 519 | ` N8N_URL: ${url ? 'set' : 'MISSING'}\n` + 520 | ` N8N_API_KEY: ${apiKey ? 'set' : 'MISSING'}\n` + 521 | 'Please configure GitHub secrets for integration tests.' 522 | ); 523 | } 524 | 525 | return { 526 | url, 527 | apiKey, 528 | webhookUrls: { 529 | get: process.env.N8N_TEST_WEBHOOK_GET_URL || '', 530 | post: process.env.N8N_TEST_WEBHOOK_POST_URL || '', 531 | put: process.env.N8N_TEST_WEBHOOK_PUT_URL || '', 532 | delete: process.env.N8N_TEST_WEBHOOK_DELETE_URL || '' 533 | }, 534 | cleanup: { 535 | enabled: true, 536 | tag: 'mcp-integration-test', 537 | namePrefix: '[MCP-TEST]' 538 | } 539 | }; 540 | } else { 541 | // Local: Use .env file 542 | const url = process.env.N8N_API_URL; 543 | const apiKey = process.env.N8N_API_KEY; 544 | 545 | if (!url || !apiKey) { 546 | throw new Error( 547 | 'Missing required credentials in .env:\n' + 548 | ` N8N_API_URL: ${url ? 'set' : 'MISSING'}\n` + 549 | ` N8N_API_KEY: ${apiKey ? 'set' : 'MISSING'}\n\n` + 550 | 'Please add these to your .env file.\n' + 551 | 'See .env.example for configuration details.' 552 | ); 553 | } 554 | 555 | return { 556 | url, 557 | apiKey, 558 | webhookUrls: { 559 | get: process.env.N8N_TEST_WEBHOOK_GET_URL || '', 560 | post: process.env.N8N_TEST_WEBHOOK_POST_URL || '', 561 | put: process.env.N8N_TEST_WEBHOOK_PUT_URL || '', 562 | delete: process.env.N8N_TEST_WEBHOOK_DELETE_URL || '' 563 | }, 564 | cleanup: { 565 | enabled: process.env.N8N_TEST_CLEANUP_ENABLED !== 'false', 566 | tag: process.env.N8N_TEST_TAG || 'mcp-integration-test', 567 | namePrefix: process.env.N8N_TEST_NAME_PREFIX || '[MCP-TEST]' 568 | } 569 | }; 570 | } 571 | } 572 | 573 | export function validateCredentials(creds: N8nTestCredentials): void { 574 | if (!creds.url) throw new Error('N8N_API_URL is required'); 575 | if (!creds.apiKey) throw new Error('N8N_API_KEY is required'); 576 | } 577 | 578 | export function validateWebhookUrls(creds: N8nTestCredentials): void { 579 | const missing: string[] = []; 580 | if (!creds.webhookUrls.get) missing.push('GET'); 581 | if (!creds.webhookUrls.post) missing.push('POST'); 582 | if (!creds.webhookUrls.put) missing.push('PUT'); 583 | if (!creds.webhookUrls.delete) missing.push('DELETE'); 584 | 585 | if (missing.length > 0) { 586 | throw new Error( 587 | `Missing webhook URLs for HTTP methods: ${missing.join(', ')}\n` + 588 | `Please create and activate webhook workflows, then set:\n` + 589 | missing.map(m => ` N8N_TEST_WEBHOOK_${m}_URL`).join('\n') 590 | ); 591 | } 592 | } 593 | ``` 594 | 595 | **n8n-client.ts** - Pre-configured API client (for test utilities only): 596 | ```typescript 597 | import { N8nApiClient } from '../../../src/services/n8n-api-client'; 598 | import { getN8nCredentials } from './credentials'; 599 | 600 | /** 601 | * IMPORTANT: This client is ONLY used for test setup/cleanup utilities. 602 | * DO NOT use this in actual test cases - use MCP handlers instead! 603 | * 604 | * Test utilities that need direct API access: 605 | * - cleanupOrphanedWorkflows() - bulk cleanup 606 | * - Fixture setup/teardown 607 | * - Pre-test verification 608 | * 609 | * Actual tests MUST use MCP handlers: 610 | * - handleCreateWorkflow() 611 | * - handleGetWorkflow() 612 | * - etc. 613 | */ 614 | let client: N8nApiClient | null = null; 615 | 616 | export function getTestN8nClient(): N8nApiClient { 617 | if (!client) { 618 | const creds = getN8nCredentials(); 619 | client = new N8nApiClient(creds.url, creds.apiKey); 620 | } 621 | return client; 622 | } 623 | 624 | export function resetTestN8nClient(): void { 625 | client = null; 626 | } 627 | ``` 628 | 629 | **test-context.ts** - Resource tracking for cleanup: 630 | ```typescript 631 | import { getN8nCredentials } from './credentials'; 632 | 633 | export interface TestContext { 634 | workflowIds: string[]; 635 | executionIds: string[]; 636 | cleanup: () => Promise<void>; 637 | } 638 | 639 | export function createTestContext(): TestContext { 640 | const context: TestContext = { 641 | workflowIds: [], 642 | executionIds: [], 643 | cleanup: async () => { 644 | const creds = getN8nCredentials(); 645 | if (!creds.cleanup.enabled) return; 646 | 647 | const client = getTestN8nClient(); 648 | 649 | // Delete executions first 650 | for (const id of context.executionIds) { 651 | try { 652 | await client.deleteExecution(id); 653 | } catch (error) { 654 | console.warn(`Failed to delete execution ${id}:`, error); 655 | } 656 | } 657 | 658 | // Then delete workflows 659 | for (const id of context.workflowIds) { 660 | try { 661 | await client.deleteWorkflow(id); 662 | } catch (error) { 663 | console.warn(`Failed to delete workflow ${id}:`, error); 664 | } 665 | } 666 | 667 | context.workflowIds = []; 668 | context.executionIds = []; 669 | } 670 | }; 671 | 672 | return context; 673 | } 674 | ``` 675 | 676 | **cleanup-helpers.ts** - Multi-level cleanup strategies: 677 | ```typescript 678 | import { N8nApiClient } from '../../../src/services/n8n-api-client'; 679 | import { getN8nCredentials, getTestN8nClient } from './credentials'; 680 | 681 | /** 682 | * Clean up orphaned test workflows 683 | * Run this periodically in CI to clean up failed test runs 684 | */ 685 | export async function cleanupOrphanedWorkflows(): Promise<void> { 686 | const creds = getN8nCredentials(); 687 | const client = getTestN8nClient(); 688 | 689 | let allWorkflows: any[] = []; 690 | let cursor: string | undefined; 691 | 692 | // Fetch all workflows with pagination 693 | do { 694 | const response = await client.listWorkflows({ cursor, limit: 100 }); 695 | allWorkflows.push(...response.data); 696 | cursor = response.nextCursor; 697 | } while (cursor); 698 | 699 | // Find test workflows 700 | const testWorkflows = allWorkflows.filter(w => 701 | w.tags?.includes(creds.cleanup.tag) || 702 | w.name?.startsWith(creds.cleanup.namePrefix) 703 | ); 704 | 705 | console.log(`Found ${testWorkflows.length} orphaned test workflows`); 706 | 707 | // Delete them 708 | for (const workflow of testWorkflows) { 709 | try { 710 | await client.deleteWorkflow(workflow.id); 711 | console.log(`Deleted orphaned workflow: ${workflow.name} (${workflow.id})`); 712 | } catch (error) { 713 | console.warn(`Failed to delete workflow ${workflow.id}:`, error); 714 | } 715 | } 716 | } 717 | 718 | /** 719 | * Clean up old executions (older than 24 hours) 720 | */ 721 | export async function cleanupOldExecutions(): Promise<void> { 722 | const client = getTestN8nClient(); 723 | 724 | let allExecutions: any[] = []; 725 | let cursor: string | undefined; 726 | 727 | // Fetch all executions 728 | do { 729 | const response = await client.listExecutions({ cursor, limit: 100 }); 730 | allExecutions.push(...response.data); 731 | cursor = response.nextCursor; 732 | } while (cursor); 733 | 734 | const oneDayAgo = Date.now() - 24 * 60 * 60 * 1000; 735 | const oldExecutions = allExecutions.filter(e => 736 | new Date(e.startedAt).getTime() < oneDayAgo 737 | ); 738 | 739 | console.log(`Found ${oldExecutions.length} old executions`); 740 | 741 | for (const execution of oldExecutions) { 742 | try { 743 | await client.deleteExecution(execution.id); 744 | } catch (error) { 745 | console.warn(`Failed to delete execution ${execution.id}:`, error); 746 | } 747 | } 748 | } 749 | ``` 750 | 751 | **fixtures.ts** - Reusable workflow templates: 752 | ```typescript 753 | import { Workflow } from '../../../src/types/n8n-api'; 754 | 755 | export const SIMPLE_WEBHOOK_WORKFLOW: Partial<Workflow> = { 756 | name: '[MCP-TEST] Simple Webhook', 757 | nodes: [ 758 | { 759 | id: 'webhook-1', 760 | name: 'Webhook', 761 | type: 'n8n-nodes-base.webhook', 762 | typeVersion: 2, 763 | position: [250, 300], 764 | parameters: { 765 | httpMethod: 'GET', 766 | path: 'test-webhook' 767 | } 768 | } 769 | ], 770 | connections: {} 771 | }; 772 | 773 | export const SIMPLE_HTTP_WORKFLOW: Partial<Workflow> = { 774 | name: '[MCP-TEST] Simple HTTP Request', 775 | nodes: [ 776 | { 777 | id: 'webhook-1', 778 | name: 'Webhook', 779 | type: 'n8n-nodes-base.webhook', 780 | typeVersion: 2, 781 | position: [250, 300], 782 | parameters: { 783 | httpMethod: 'GET', 784 | path: 'trigger' 785 | } 786 | }, 787 | { 788 | id: 'http-1', 789 | name: 'HTTP Request', 790 | type: 'n8n-nodes-base.httpRequest', 791 | typeVersion: 4.2, 792 | position: [450, 300], 793 | parameters: { 794 | url: 'https://httpbin.org/get', 795 | method: 'GET' 796 | } 797 | } 798 | ], 799 | connections: { 800 | Webhook: { 801 | main: [[{ node: 'HTTP Request', type: 'main', index: 0 }]] 802 | } 803 | } 804 | }; 805 | 806 | // Add more fixtures for complex workflows 807 | ``` 808 | 809 | **webhook-workflows.ts** - Webhook workflow setup guide: 810 | ```typescript 811 | /** 812 | * Guide for setting up webhook workflows manually in n8n 813 | * 814 | * These workflows must be created manually and activated because 815 | * n8n API doesn't support workflow activation. 816 | * 817 | * For each HTTP method, create a workflow with: 818 | * 1. Single Webhook node 819 | * 2. Configured for the specific HTTP method 820 | * 3. Unique webhook path 821 | * 4. Activated in n8n UI 822 | * 5. Workflow ID added to .env 823 | */ 824 | 825 | export const WEBHOOK_WORKFLOW_CONFIGS = { 826 | GET: { 827 | name: '[MCP-TEST] Webhook GET', 828 | description: 'Pre-activated webhook for GET method testing', 829 | nodes: [ 830 | { 831 | name: 'Webhook', 832 | type: 'n8n-nodes-base.webhook', 833 | typeVersion: 2, 834 | parameters: { 835 | httpMethod: 'GET', 836 | path: 'mcp-test-get', 837 | responseMode: 'lastNode' 838 | } 839 | } 840 | ] 841 | }, 842 | POST: { 843 | name: '[MCP-TEST] Webhook POST', 844 | description: 'Pre-activated webhook for POST method testing', 845 | nodes: [ 846 | { 847 | name: 'Webhook', 848 | type: 'n8n-nodes-base.webhook', 849 | typeVersion: 2, 850 | parameters: { 851 | httpMethod: 'POST', 852 | path: 'mcp-test-post', 853 | responseMode: 'lastNode' 854 | } 855 | } 856 | ] 857 | }, 858 | PUT: { 859 | name: '[MCP-TEST] Webhook PUT', 860 | description: 'Pre-activated webhook for PUT method testing', 861 | nodes: [ 862 | { 863 | name: 'Webhook', 864 | type: 'n8n-nodes-base.webhook', 865 | typeVersion: 2, 866 | parameters: { 867 | httpMethod: 'PUT', 868 | path: 'mcp-test-put', 869 | responseMode: 'lastNode' 870 | } 871 | } 872 | ] 873 | }, 874 | DELETE: { 875 | name: '[MCP-TEST] Webhook DELETE', 876 | description: 'Pre-activated webhook for DELETE method testing', 877 | nodes: [ 878 | { 879 | name: 'Webhook', 880 | type: 'n8n-nodes-base.webhook', 881 | typeVersion: 2, 882 | parameters: { 883 | httpMethod: 'DELETE', 884 | path: 'mcp-test-delete', 885 | responseMode: 'lastNode' 886 | } 887 | } 888 | ] 889 | } 890 | }; 891 | 892 | export function printSetupInstructions(): void { 893 | console.log(` 894 | ╔════════════════════════════════════════════════════════════════╗ 895 | ║ WEBHOOK WORKFLOW SETUP REQUIRED ║ 896 | ╠════════════════════════════════════════════════════════════════╣ 897 | ║ ║ 898 | ║ Integration tests require 4 pre-activated webhook workflows: ║ 899 | ║ ║ 900 | ║ 1. Create workflows manually in n8n UI ║ 901 | ║ 2. Use the configurations shown below ║ 902 | ║ 3. ACTIVATE each workflow in n8n UI ║ 903 | ║ 4. Copy workflow IDs to .env file ║ 904 | ║ ║ 905 | ╚════════════════════════════════════════════════════════════════╝ 906 | 907 | Required workflows: 908 | `); 909 | 910 | Object.entries(WEBHOOK_WORKFLOW_CONFIGS).forEach(([method, config]) => { 911 | console.log(` 912 | ${method} Method: 913 | Name: ${config.name} 914 | Path: ${config.nodes[0].parameters.path} 915 | .env variable: N8N_TEST_WEBHOOK_${method}_ID 916 | `); 917 | }); 918 | } 919 | ``` 920 | 921 | --- 922 | 923 | ### Phase 2: Workflow Creation Tests (P0) 924 | 925 | **Branch**: `feat/integration-tests-phase-2` 926 | 927 | **File**: `tests/integration/n8n-api/workflows/create-workflow.test.ts` 928 | 929 | **Test Approach**: Tests the `handleCreateWorkflow` MCP handler against real n8n instance 930 | 931 | **MCP Handler Test Pattern:** 932 | ```typescript 933 | import { handleCreateWorkflow } from '../../../../src/mcp/handlers-n8n-manager'; 934 | import { createMcpContext } from '../utils/mcp-context'; 935 | import { InstanceContext } from '../../../../src/types/instance-context'; 936 | 937 | describe('Integration: handleCreateWorkflow', () => { 938 | let mcpContext: InstanceContext; 939 | 940 | beforeEach(() => { 941 | mcpContext = createMcpContext(); 942 | }); 943 | 944 | it('should create workflow using MCP handler', async () => { 945 | const workflow = { name: 'Test', nodes: [...], connections: {} }; 946 | 947 | // Test MCP handler (the product layer) 948 | const response = await handleCreateWorkflow({ ...workflow }, mcpContext); 949 | 950 | // Verify MCP response structure 951 | expect(response.success).toBe(true); 952 | expect(response.data).toBeDefined(); 953 | 954 | // Extract actual workflow from MCP response 955 | const result = response.data; 956 | expect(result.id).toBeTruthy(); 957 | }); 958 | }); 959 | ``` 960 | 961 | **15 Test Scenarios** (all testing MCP handlers): 962 | 1. Create workflow with base webhook node (verify P0 bug fix) 963 | 2. Create workflow with base HTTP request node 964 | 3. Create workflow with langchain agent node 965 | 4. Create complex multi-node workflow 966 | 5. Create workflow with complex connections 967 | 6. Create workflow with custom settings 968 | 7. Create workflow with n8n expressions 969 | 8. Create workflow with error handling 970 | 9. Error: Invalid node type (documents API behavior) 971 | 10. Error: Missing required parameters (documents API behavior) 972 | 11. Error: Duplicate node names (documents API behavior) 973 | 12. Error: Invalid connection references (documents API behavior) 974 | 13. Edge case: Minimal single node workflow 975 | 14. Edge case: Empty connections object 976 | 15. Edge case: Workflow without settings 977 | 978 | --- 979 | 980 | ### Phase 3: Workflow Retrieval Tests (P1) 981 | 982 | **Branch**: `feat/integration-tests-phase-3` 983 | 984 | **Test Approach**: Tests MCP handlers (`handleGetWorkflow`, `handleGetWorkflowDetails`, `handleGetWorkflowStructure`, `handleGetWorkflowMinimal`) 985 | 986 | **MCP Handler Pattern:** 987 | ```typescript 988 | import { 989 | handleGetWorkflow, 990 | handleGetWorkflowDetails, 991 | handleGetWorkflowStructure, 992 | handleGetWorkflowMinimal 993 | } from '../../../../src/mcp/handlers-n8n-manager'; 994 | 995 | // Test MCP handler 996 | const response = await handleGetWorkflow({ id: workflowId }, mcpContext); 997 | expect(response.success).toBe(true); 998 | const workflow = response.data; 999 | 1000 | // Note: handleGetWorkflowDetails returns nested structure 1001 | const detailsResponse = await handleGetWorkflowDetails({ id }, mcpContext); 1002 | const workflow = detailsResponse.data.workflow; // Extract from nested structure 1003 | const stats = detailsResponse.data.executionStats; 1004 | ``` 1005 | 1006 | **Files**: 1007 | - `get-workflow.test.ts` (3 scenarios - tests handleGetWorkflow) 1008 | - `get-workflow-details.test.ts` (4 scenarios - tests handleGetWorkflowDetails) 1009 | - `get-workflow-structure.test.ts` (2 scenarios - tests handleGetWorkflowStructure) 1010 | - `get-workflow-minimal.test.ts` (2 scenarios - tests handleGetWorkflowMinimal) 1011 | 1012 | --- 1013 | 1014 | ### Phase 4: Workflow Update Tests (P1) 1015 | 1016 | **Branch**: `feat/integration-tests-workflow-updates` 1017 | 1018 | **Files**: 1019 | - `update-workflow.test.ts` (8+ scenarios) 1020 | - `update-partial-workflow.test.ts` (30+ scenarios covering all 15 operations) 1021 | 1022 | --- 1023 | 1024 | ### Phase 5: Workflow Management Tests (P2) 1025 | 1026 | **Branch**: `feat/integration-tests-workflow-management` 1027 | 1028 | **Files**: 1029 | - `delete-workflow.test.ts` (3 scenarios) 1030 | - `list-workflows.test.ts` (12+ scenarios with all filters and pagination) 1031 | 1032 | --- 1033 | 1034 | ### Phase 6A: Workflow Validation Tests (P2) ✅ COMPLETE 1035 | 1036 | **Branch**: `feat/integration-tests-phase-6` 1037 | 1038 | **Files**: 1039 | - ✅ `tests/integration/n8n-api/utils/node-repository.ts` - NodeRepository singleton for validation tests 1040 | - ✅ `validate-workflow.test.ts` (12 scenarios: 4 profiles + invalid detection + selective validation + error handling) 1041 | 1042 | **Implementation Notes**: 1043 | - Created NodeRepository utility since handleValidateWorkflow requires repository parameter 1044 | - Tests cover all 4 validation profiles (strict, runtime, ai-friendly, minimal) 1045 | - Invalid workflow detection tests (bad node types, missing connections) 1046 | - Selective validation tests (nodes only, connections only, expressions only) 1047 | - Response structure correctly handles conditional errors/warnings fields 1048 | 1049 | ### Phase 6B: Workflow Autofix Tests (P2) 1050 | 1051 | **Branch**: `feat/integration-tests-phase-6b` (or continue on `feat/integration-tests-phase-6`) 1052 | 1053 | **Files**: 1054 | - `autofix-workflow.test.ts` (15-20 scenarios: 5 fix types × modes × confidence levels) 1055 | 1056 | **Test Coverage Required**: 1057 | - 5 fix types: expression-format, typeversion-correction, error-output-config, node-type-correction, webhook-missing-path 1058 | - Preview mode (applyFixes: false) vs Apply mode (applyFixes: true) 1059 | - Confidence threshold filtering (high, medium, low) 1060 | - maxFixes parameter limiting 1061 | - Multiple fix types in single workflow 1062 | - No fixes available scenario 1063 | 1064 | --- 1065 | 1066 | ### Phase 7: Execution Management Tests (P2) 1067 | 1068 | **Branch**: `feat/integration-tests-executions` 1069 | 1070 | **Files**: 1071 | - `trigger-webhook.test.ts` (16+ scenarios: 4 HTTP methods × variations) 1072 | - `get-execution.test.ts` (20+ scenarios: 4 modes × filters) 1073 | - `list-executions.test.ts` (10+ scenarios) 1074 | - `delete-execution.test.ts` (3 scenarios) 1075 | 1076 | **Special Considerations for Webhook Testing**: 1077 | - Use pre-activated workflows from `.env` 1078 | - Each HTTP method uses a different workflow ID 1079 | - Test both successful triggers and error cases 1080 | - Verify response data for synchronous executions 1081 | 1082 | --- 1083 | 1084 | ### Phase 8: System Tools Tests (P3) 1085 | 1086 | **Branch**: `feat/integration-tests-system` 1087 | 1088 | **Files**: 1089 | - `health-check.test.ts` (2 scenarios) 1090 | - `list-tools.test.ts` (1 scenario) 1091 | - `diagnostic.test.ts` (3 scenarios) 1092 | 1093 | --- 1094 | 1095 | ### Phase 9: CI/CD Integration 1096 | 1097 | **Branch**: `feat/integration-tests-ci` 1098 | 1099 | **GitHub Actions Workflow** (`.github/workflows/integration-tests.yml`): 1100 | 1101 | ```yaml 1102 | name: Integration Tests 1103 | 1104 | on: 1105 | pull_request: 1106 | push: 1107 | branches: [main] 1108 | schedule: 1109 | - cron: '0 2 * * *' # Daily at 2 AM 1110 | workflow_dispatch: 1111 | 1112 | jobs: 1113 | integration-tests: 1114 | runs-on: ubuntu-latest 1115 | 1116 | steps: 1117 | - uses: actions/checkout@v4 1118 | 1119 | - name: Setup Node.js 1120 | uses: actions/setup-node@v4 1121 | with: 1122 | node-version: '20' 1123 | cache: 'npm' 1124 | 1125 | - name: Install dependencies 1126 | run: npm ci 1127 | 1128 | - name: Build project 1129 | run: npm run build 1130 | 1131 | - name: Run integration tests 1132 | env: 1133 | N8N_URL: ${{ secrets.N8N_URL }} 1134 | N8N_API_KEY: ${{ secrets.N8N_API_KEY }} 1135 | N8N_TEST_WEBHOOK_GET_URL: ${{ secrets.N8N_TEST_WEBHOOK_GET_URL }} 1136 | N8N_TEST_WEBHOOK_POST_URL: ${{ secrets.N8N_TEST_WEBHOOK_POST_URL }} 1137 | N8N_TEST_WEBHOOK_PUT_URL: ${{ secrets.N8N_TEST_WEBHOOK_PUT_URL }} 1138 | N8N_TEST_WEBHOOK_DELETE_URL: ${{ secrets.N8N_TEST_WEBHOOK_DELETE_URL }} 1139 | CI: true 1140 | run: npm run test:integration:n8n 1141 | 1142 | - name: Cleanup orphaned workflows 1143 | if: always() 1144 | env: 1145 | N8N_URL: ${{ secrets.N8N_URL }} 1146 | N8N_API_KEY: ${{ secrets.N8N_API_KEY }} 1147 | run: npm run test:cleanup:orphans 1148 | ``` 1149 | 1150 | **Add npm scripts to `package.json`**: 1151 | ```json 1152 | { 1153 | "scripts": { 1154 | "test:integration:n8n": "vitest run tests/integration/n8n-api", 1155 | "test:cleanup:orphans": "tsx tests/integration/n8n-api/utils/cleanup-orphans.ts" 1156 | } 1157 | } 1158 | ``` 1159 | 1160 | --- 1161 | 1162 | ## Test Isolation Strategy 1163 | 1164 | ### Workflow Naming Convention 1165 | - Prefix: `[MCP-TEST]` 1166 | - Include test name: `[MCP-TEST] Create Workflow - Base Nodes` 1167 | - Include timestamp for uniqueness: `[MCP-TEST] Test Name ${Date.now()}` 1168 | 1169 | ### Workflow Tagging 1170 | - All test workflows tagged with: `mcp-integration-test` 1171 | - Enables bulk cleanup queries 1172 | 1173 | ### Cleanup Levels 1174 | 1. **Test-level**: After each test via `afterEach` hook 1175 | 2. **Suite-level**: After each test file via `afterAll` hook 1176 | 3. **CI-level**: After CI job completes (always run) 1177 | 4. **Orphan cleanup**: Periodic job to clean up failed test runs 1178 | 1179 | --- 1180 | 1181 | ## Pre-Test Setup Checklist 1182 | 1183 | ### Local Development 1184 | 1. ✅ Install n8n locally or use Docker 1185 | 2. ✅ Start n8n instance: `npx n8n start` 1186 | 3. ✅ Create 4 webhook workflows (GET, POST, PUT, DELETE) 1187 | 4. ✅ Activate all 4 webhook workflows in n8n UI 1188 | 5. ✅ Get webhook URLs from the workflow's Webhook node 1189 | 6. ✅ Copy `.env.example` to `.env` 1190 | 7. ✅ Set `N8N_API_URL=<your-n8n-url>` 1191 | 8. ✅ Generate API key in n8n Settings > API 1192 | 9. ✅ Set `N8N_API_KEY=<your-key>` 1193 | 10. ✅ Set all 4 `N8N_TEST_WEBHOOK_*_URL` variables with full webhook URLs 1194 | 1195 | ### CI/GitHub Actions (✅ COMPLETED) 1196 | 1. ✅ Set up cloud n8n instance: `https://n8n-test.n8n-mcp.com` 1197 | 2. ✅ Create 4 webhook workflows (GET, POST, PUT, DELETE) 1198 | 3. ✅ Activate all 4 webhook workflows 1199 | 4. ✅ Add GitHub secrets: `N8N_URL`, `N8N_API_KEY` 1200 | 5. ✅ Add webhook URL secrets: 1201 | - `N8N_TEST_WEBHOOK_GET_URL=https://n8n-test.n8n-mcp.com/webhook/mcp-test-get` 1202 | - `N8N_TEST_WEBHOOK_POST_URL=https://n8n-test.n8n-mcp.com/webhook/mcp-test-post` 1203 | - `N8N_TEST_WEBHOOK_PUT_URL=https://n8n-test.n8n-mcp.com/webhook/mcp-test-put` 1204 | - `N8N_TEST_WEBHOOK_DELETE_URL=https://n8n-test.n8n-mcp.com/webhook/mcp-test-delete` 1205 | 1206 | --- 1207 | 1208 | ## Success Criteria 1209 | 1210 | ### Phase 1: Foundation ✅ COMPLETE 1211 | - ✅ Environment configuration (.env, GitHub secrets) 1212 | - ✅ All utility files created (8 files, ~1,520 lines of code) 1213 | - ✅ Pre-activated webhook workflows created and tested 1214 | - ✅ Cleanup helpers with pagination safety 1215 | - ✅ Resource tracking with TestContext 1216 | - ✅ Fixtures and factories for test data 1217 | - ✅ Documentation updated 1218 | - ✅ Environment loading fixed (loads .env before test defaults) 1219 | - ✅ Vitest integration config updated (removed MSW for n8n-api tests) 1220 | 1221 | ### Phase 2: Workflow Creation Tests ✅ COMPLETE 1222 | - ✅ 15 test scenarios implemented (all passing) 1223 | - ✅ Tests the `handleCreateWorkflow` MCP handler (product layer) 1224 | - ✅ All tests use MCP handler pattern with McpToolResponse validation 1225 | - ✅ P0 bug verification (FULL vs SHORT node type format) 1226 | - ✅ Base node tests (webhook, HTTP, langchain, multi-node) 1227 | - ✅ Advanced features (connections, settings, expressions, error handling) 1228 | - ✅ Error scenarios (4 tests documenting actual API behavior) 1229 | - ✅ Edge cases (3 tests for minimal/empty configurations) 1230 | - ✅ Test file: 563 lines covering all handleCreateWorkflow scenarios 1231 | - ✅ All tests passing against real n8n instance 1232 | 1233 | ### Overall Project (In Progress) 1234 | - ⏳ All 17 handlers have integration tests (11 of 17 complete) 1235 | - ⏳ All operations/parameters covered (99 of 150+ scenarios complete) 1236 | - ✅ Tests run successfully locally (Phases 1-6 verified) 1237 | - ⏳ Tests run successfully in CI (pending Phase 9) 1238 | - ✅ No manual cleanup required (automatic) 1239 | - ✅ Test coverage catches P0-level bugs (verified in Phase 2) 1240 | - ⏳ CI runs on every PR and daily (pending Phase 9) 1241 | - ✅ Clear error messages when tests fail 1242 | - ✅ Documentation for webhook workflow setup 1243 | - ✅ Code quality maintained (lint, typecheck, type safety) 1244 | 1245 | --- 1246 | 1247 | ## Timeline Estimate 1248 | 1249 | - **Phase 1 (Foundation)**: ✅ COMPLETE (October 3, 2025) 1250 | - **Phase 2 (Workflow Creation)**: ✅ COMPLETE (October 3, 2025) 1251 | - **Phase 3 (Retrieval)**: ✅ COMPLETE (October 3, 2025) 1252 | - **Phase 4 (Updates)**: ✅ COMPLETE (October 4, 2025) 1253 | - **Phase 5 (Management)**: ✅ COMPLETE (October 4, 2025) 1254 | - **Phase 6A (Validation)**: ✅ COMPLETE (October 5, 2025) 1255 | - **Phase 6B (Autofix)**: ✅ COMPLETE (October 5, 2025) 1256 | - **Phase 7 (Executions)**: 2 days 1257 | - **Phase 8 (System)**: 1 day 1258 | - **Phase 9 (CI/CD)**: 1 day 1259 | 1260 | **Total**: 6 days complete, ~4 days remaining 1261 | 1262 | --- 1263 | 1264 | ## Notes 1265 | 1266 | - Each phase should be developed on a separate branch 1267 | - Phases can be parallelized where dependencies allow 1268 | - Run local tests frequently to catch issues early 1269 | - Document any n8n API quirks discovered during testing 1270 | 1271 | ## Key Learnings from Implementation 1272 | 1273 | ### Critical Testing Principle: Test the Product Layer 1274 | 1275 | **The Mistake**: Initially, Phase 2 tests called `client.createWorkflow()` (raw API client) instead of `handleCreateWorkflow()` (MCP handler). 1276 | 1277 | **Why This Was Wrong**: 1278 | - AI assistants interact with MCP handlers, not raw API client 1279 | - MCP handlers wrap responses in `McpToolResponse` format 1280 | - MCP handlers may transform/enrich API responses 1281 | - Bypassing MCP layer misses product-specific logic and bugs 1282 | 1283 | **The Fix**: All tests updated to use MCP handlers: 1284 | ```typescript 1285 | // ❌ BEFORE: Testing wrong layer 1286 | const result = await client.createWorkflow(workflow); 1287 | 1288 | // ✅ AFTER: Testing the actual product 1289 | const response = await handleCreateWorkflow({ ...workflow }, mcpContext); 1290 | expect(response.success).toBe(true); 1291 | const result = response.data; 1292 | ``` 1293 | 1294 | **Lesson Learned**: Always test the layer closest to the user/consumer. For n8n-mcp, that's the MCP handler layer. 1295 | 1296 | ### n8n API Behavior Discoveries 1297 | 1. **Validation Timing**: n8n API accepts workflows with invalid node types and connection references at creation time. Validation only happens at execution time. 1298 | 2. **Node Type Format**: FULL node type format (`n8n-nodes-base.*`) must be used in API requests. The P0 bug was confirmed fixed. 1299 | 3. **Missing Parameters**: n8n accepts workflows with missing required parameters. They fail during execution, not creation. 1300 | 4. **Duplicate Names**: n8n API handles duplicate node names gracefully (may auto-rename). 1301 | 1302 | ### Technical Implementation Insights 1303 | 1. **MSW Interference**: Integration tests that need real network requests must NOT load MSW setup. Removed from vitest.config.integration.ts. 1304 | 2. **Environment Loading**: Must load `.env` file BEFORE test defaults in global setup to preserve real credentials. 1305 | 3. **Cleanup Safety**: TestContext pattern works well for tracking and cleaning up test resources. 1306 | 4. **Test Isolation**: Each test creates unique workflows with timestamps to avoid conflicts. 1307 | ``` -------------------------------------------------------------------------------- /tests/extracted-nodes-db/n8n-nodes-base__Airtable.json: -------------------------------------------------------------------------------- ```json 1 | { 2 | "node_type": "n8n-nodes-base.Airtable", 3 | "name": "Airtable", 4 | "package_name": "n8n-nodes-base", 5 | "code_hash": "2d67e72931697178946f5127b43e954649c4c5e7ad9e29764796404ae96e7db5", 6 | "code_length": 936, 7 | "source_location": "node_modules/n8n-nodes-base/dist/nodes/Airtable/Airtable.node.js", 8 | "has_credentials": false, 9 | "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", 10 | "package_info": { 11 | "name": "n8n-nodes-base", 12 | "version": "1.14.1", 13 | "description": "Base nodes of n8n", 14 | "license": "SEE LICENSE IN LICENSE.md", 15 | "homepage": "https://n8n.io", 16 | "author": { 17 | "name": "Jan Oberhauser", 18 | "email": "[email protected]" 19 | }, 20 | "main": "index.js", 21 | "repository": { 22 | "type": "git", 23 | "url": "git+https://github.com/n8n-io/n8n.git" 24 | }, 25 | "files": [ 26 | "dist" 27 | ], 28 | "n8n": { 29 | "credentials": [ 30 | "dist/credentials/ActionNetworkApi.credentials.js", 31 | "dist/credentials/ActiveCampaignApi.credentials.js", 32 | "dist/credentials/AcuitySchedulingApi.credentials.js", 33 | "dist/credentials/AcuitySchedulingOAuth2Api.credentials.js", 34 | "dist/credentials/AdaloApi.credentials.js", 35 | "dist/credentials/AffinityApi.credentials.js", 36 | "dist/credentials/AgileCrmApi.credentials.js", 37 | "dist/credentials/AirtableApi.credentials.js", 38 | "dist/credentials/AirtableOAuth2Api.credentials.js", 39 | "dist/credentials/AirtableTokenApi.credentials.js", 40 | "dist/credentials/AlienVaultApi.credentials.js", 41 | "dist/credentials/Amqp.credentials.js", 42 | "dist/credentials/ApiTemplateIoApi.credentials.js", 43 | "dist/credentials/AsanaApi.credentials.js", 44 | "dist/credentials/AsanaOAuth2Api.credentials.js", 45 | "dist/credentials/Auth0ManagementApi.credentials.js", 46 | "dist/credentials/AutomizyApi.credentials.js", 47 | "dist/credentials/AutopilotApi.credentials.js", 48 | "dist/credentials/Aws.credentials.js", 49 | "dist/credentials/BambooHrApi.credentials.js", 50 | "dist/credentials/BannerbearApi.credentials.js", 51 | "dist/credentials/BaserowApi.credentials.js", 52 | "dist/credentials/BeeminderApi.credentials.js", 53 | "dist/credentials/BitbucketApi.credentials.js", 54 | "dist/credentials/BitlyApi.credentials.js", 55 | "dist/credentials/BitlyOAuth2Api.credentials.js", 56 | "dist/credentials/BitwardenApi.credentials.js", 57 | "dist/credentials/BoxOAuth2Api.credentials.js", 58 | "dist/credentials/BrandfetchApi.credentials.js", 59 | "dist/credentials/BubbleApi.credentials.js", 60 | "dist/credentials/CalApi.credentials.js", 61 | "dist/credentials/CalendlyApi.credentials.js", 62 | "dist/credentials/CarbonBlackApi.credentials.js", 63 | "dist/credentials/ChargebeeApi.credentials.js", 64 | "dist/credentials/CircleCiApi.credentials.js", 65 | "dist/credentials/CiscoMerakiApi.credentials.js", 66 | "dist/credentials/CiscoSecureEndpointApi.credentials.js", 67 | "dist/credentials/CiscoWebexOAuth2Api.credentials.js", 68 | "dist/credentials/CiscoUmbrellaApi.credentials.js", 69 | "dist/credentials/CitrixAdcApi.credentials.js", 70 | "dist/credentials/CloudflareApi.credentials.js", 71 | "dist/credentials/ClearbitApi.credentials.js", 72 | "dist/credentials/ClickUpApi.credentials.js", 73 | "dist/credentials/ClickUpOAuth2Api.credentials.js", 74 | "dist/credentials/ClockifyApi.credentials.js", 75 | "dist/credentials/CockpitApi.credentials.js", 76 | "dist/credentials/CodaApi.credentials.js", 77 | "dist/credentials/ContentfulApi.credentials.js", 78 | "dist/credentials/ConvertKitApi.credentials.js", 79 | "dist/credentials/CopperApi.credentials.js", 80 | "dist/credentials/CortexApi.credentials.js", 81 | "dist/credentials/CrateDb.credentials.js", 82 | "dist/credentials/CrowdStrikeOAuth2Api.credentials.js", 83 | "dist/credentials/CrowdDevApi.credentials.js", 84 | "dist/credentials/CustomerIoApi.credentials.js", 85 | "dist/credentials/DeepLApi.credentials.js", 86 | "dist/credentials/DemioApi.credentials.js", 87 | "dist/credentials/DhlApi.credentials.js", 88 | "dist/credentials/DiscourseApi.credentials.js", 89 | "dist/credentials/DisqusApi.credentials.js", 90 | "dist/credentials/DriftApi.credentials.js", 91 | "dist/credentials/DriftOAuth2Api.credentials.js", 92 | "dist/credentials/DropboxApi.credentials.js", 93 | "dist/credentials/DropboxOAuth2Api.credentials.js", 94 | "dist/credentials/DropcontactApi.credentials.js", 95 | "dist/credentials/EgoiApi.credentials.js", 96 | "dist/credentials/ElasticsearchApi.credentials.js", 97 | "dist/credentials/ElasticSecurityApi.credentials.js", 98 | "dist/credentials/EmeliaApi.credentials.js", 99 | "dist/credentials/ERPNextApi.credentials.js", 100 | "dist/credentials/EventbriteApi.credentials.js", 101 | "dist/credentials/EventbriteOAuth2Api.credentials.js", 102 | "dist/credentials/F5BigIpApi.credentials.js", 103 | "dist/credentials/FacebookGraphApi.credentials.js", 104 | "dist/credentials/FacebookGraphAppApi.credentials.js", 105 | "dist/credentials/FacebookLeadAdsOAuth2Api.credentials.js", 106 | "dist/credentials/FigmaApi.credentials.js", 107 | "dist/credentials/FileMaker.credentials.js", 108 | "dist/credentials/FlowApi.credentials.js", 109 | "dist/credentials/FormIoApi.credentials.js", 110 | "dist/credentials/FormstackApi.credentials.js", 111 | "dist/credentials/FormstackOAuth2Api.credentials.js", 112 | "dist/credentials/FortiGateApi.credentials.js", 113 | "dist/credentials/FreshdeskApi.credentials.js", 114 | "dist/credentials/FreshserviceApi.credentials.js", 115 | "dist/credentials/FreshworksCrmApi.credentials.js", 116 | "dist/credentials/Ftp.credentials.js", 117 | "dist/credentials/GetResponseApi.credentials.js", 118 | "dist/credentials/GetResponseOAuth2Api.credentials.js", 119 | "dist/credentials/GhostAdminApi.credentials.js", 120 | "dist/credentials/GhostContentApi.credentials.js", 121 | "dist/credentials/GithubApi.credentials.js", 122 | "dist/credentials/GithubOAuth2Api.credentials.js", 123 | "dist/credentials/GitlabApi.credentials.js", 124 | "dist/credentials/GitlabOAuth2Api.credentials.js", 125 | "dist/credentials/GitPassword.credentials.js", 126 | "dist/credentials/GmailOAuth2Api.credentials.js", 127 | "dist/credentials/GoogleAdsOAuth2Api.credentials.js", 128 | "dist/credentials/GoogleAnalyticsOAuth2Api.credentials.js", 129 | "dist/credentials/GoogleApi.credentials.js", 130 | "dist/credentials/GoogleBigQueryOAuth2Api.credentials.js", 131 | "dist/credentials/GoogleBooksOAuth2Api.credentials.js", 132 | "dist/credentials/GoogleCalendarOAuth2Api.credentials.js", 133 | "dist/credentials/GoogleCloudNaturalLanguageOAuth2Api.credentials.js", 134 | "dist/credentials/GoogleCloudStorageOAuth2Api.credentials.js", 135 | "dist/credentials/GoogleContactsOAuth2Api.credentials.js", 136 | "dist/credentials/GoogleDocsOAuth2Api.credentials.js", 137 | "dist/credentials/GoogleDriveOAuth2Api.credentials.js", 138 | "dist/credentials/GoogleFirebaseCloudFirestoreOAuth2Api.credentials.js", 139 | "dist/credentials/GoogleFirebaseRealtimeDatabaseOAuth2Api.credentials.js", 140 | "dist/credentials/GoogleOAuth2Api.credentials.js", 141 | "dist/credentials/GooglePerspectiveOAuth2Api.credentials.js", 142 | "dist/credentials/GoogleSheetsOAuth2Api.credentials.js", 143 | "dist/credentials/GoogleSheetsTriggerOAuth2Api.credentials.js", 144 | "dist/credentials/GoogleSlidesOAuth2Api.credentials.js", 145 | "dist/credentials/GoogleTasksOAuth2Api.credentials.js", 146 | "dist/credentials/GoogleTranslateOAuth2Api.credentials.js", 147 | "dist/credentials/GotifyApi.credentials.js", 148 | "dist/credentials/GoToWebinarOAuth2Api.credentials.js", 149 | "dist/credentials/GristApi.credentials.js", 150 | "dist/credentials/GrafanaApi.credentials.js", 151 | "dist/credentials/GSuiteAdminOAuth2Api.credentials.js", 152 | "dist/credentials/GumroadApi.credentials.js", 153 | "dist/credentials/HaloPSAApi.credentials.js", 154 | "dist/credentials/HarvestApi.credentials.js", 155 | "dist/credentials/HarvestOAuth2Api.credentials.js", 156 | "dist/credentials/HelpScoutOAuth2Api.credentials.js", 157 | "dist/credentials/HighLevelApi.credentials.js", 158 | "dist/credentials/HomeAssistantApi.credentials.js", 159 | "dist/credentials/HttpBasicAuth.credentials.js", 160 | "dist/credentials/HttpDigestAuth.credentials.js", 161 | "dist/credentials/HttpHeaderAuth.credentials.js", 162 | "dist/credentials/HttpCustomAuth.credentials.js", 163 | "dist/credentials/HttpQueryAuth.credentials.js", 164 | "dist/credentials/HubspotApi.credentials.js", 165 | "dist/credentials/HubspotAppToken.credentials.js", 166 | "dist/credentials/HubspotDeveloperApi.credentials.js", 167 | "dist/credentials/HubspotOAuth2Api.credentials.js", 168 | "dist/credentials/HumanticAiApi.credentials.js", 169 | "dist/credentials/HunterApi.credentials.js", 170 | "dist/credentials/HybridAnalysisApi.credentials.js", 171 | "dist/credentials/Imap.credentials.js", 172 | "dist/credentials/ImpervaWafApi.credentials.js", 173 | "dist/credentials/IntercomApi.credentials.js", 174 | "dist/credentials/InvoiceNinjaApi.credentials.js", 175 | "dist/credentials/IterableApi.credentials.js", 176 | "dist/credentials/JenkinsApi.credentials.js", 177 | "dist/credentials/JiraSoftwareCloudApi.credentials.js", 178 | "dist/credentials/JiraSoftwareServerApi.credentials.js", 179 | "dist/credentials/JotFormApi.credentials.js", 180 | "dist/credentials/Kafka.credentials.js", 181 | "dist/credentials/KeapOAuth2Api.credentials.js", 182 | "dist/credentials/KibanaApi.credentials.js", 183 | "dist/credentials/KitemakerApi.credentials.js", 184 | "dist/credentials/KoBoToolboxApi.credentials.js", 185 | "dist/credentials/Ldap.credentials.js", 186 | "dist/credentials/LemlistApi.credentials.js", 187 | "dist/credentials/LinearApi.credentials.js", 188 | "dist/credentials/LinearOAuth2Api.credentials.js", 189 | "dist/credentials/LineNotifyOAuth2Api.credentials.js", 190 | "dist/credentials/LingvaNexApi.credentials.js", 191 | "dist/credentials/LinkedInOAuth2Api.credentials.js", 192 | "dist/credentials/LoneScaleApi.credentials.js", 193 | "dist/credentials/Magento2Api.credentials.js", 194 | "dist/credentials/MailcheckApi.credentials.js", 195 | "dist/credentials/MailchimpApi.credentials.js", 196 | "dist/credentials/MailchimpOAuth2Api.credentials.js", 197 | "dist/credentials/MailerLiteApi.credentials.js", 198 | "dist/credentials/MailgunApi.credentials.js", 199 | "dist/credentials/MailjetEmailApi.credentials.js", 200 | "dist/credentials/MailjetSmsApi.credentials.js", 201 | "dist/credentials/MandrillApi.credentials.js", 202 | "dist/credentials/MarketstackApi.credentials.js", 203 | "dist/credentials/MatrixApi.credentials.js", 204 | "dist/credentials/MattermostApi.credentials.js", 205 | "dist/credentials/MauticApi.credentials.js", 206 | "dist/credentials/MauticOAuth2Api.credentials.js", 207 | "dist/credentials/MediumApi.credentials.js", 208 | "dist/credentials/MediumOAuth2Api.credentials.js", 209 | "dist/credentials/MetabaseApi.credentials.js", 210 | "dist/credentials/MessageBirdApi.credentials.js", 211 | "dist/credentials/MetabaseApi.credentials.js", 212 | "dist/credentials/MicrosoftDynamicsOAuth2Api.credentials.js", 213 | "dist/credentials/MicrosoftEntraOAuth2Api.credentials.js", 214 | "dist/credentials/MicrosoftExcelOAuth2Api.credentials.js", 215 | "dist/credentials/MicrosoftGraphSecurityOAuth2Api.credentials.js", 216 | "dist/credentials/MicrosoftOAuth2Api.credentials.js", 217 | "dist/credentials/MicrosoftOneDriveOAuth2Api.credentials.js", 218 | "dist/credentials/MicrosoftOutlookOAuth2Api.credentials.js", 219 | "dist/credentials/MicrosoftSql.credentials.js", 220 | "dist/credentials/MicrosoftTeamsOAuth2Api.credentials.js", 221 | "dist/credentials/MicrosoftToDoOAuth2Api.credentials.js", 222 | "dist/credentials/MindeeInvoiceApi.credentials.js", 223 | "dist/credentials/MindeeReceiptApi.credentials.js", 224 | "dist/credentials/MispApi.credentials.js", 225 | "dist/credentials/MistApi.credentials.js", 226 | "dist/credentials/MoceanApi.credentials.js", 227 | "dist/credentials/MondayComApi.credentials.js", 228 | "dist/credentials/MondayComOAuth2Api.credentials.js", 229 | "dist/credentials/MongoDb.credentials.js", 230 | "dist/credentials/MonicaCrmApi.credentials.js", 231 | "dist/credentials/Mqtt.credentials.js", 232 | "dist/credentials/Msg91Api.credentials.js", 233 | "dist/credentials/MySql.credentials.js", 234 | "dist/credentials/N8nApi.credentials.js", 235 | "dist/credentials/NasaApi.credentials.js", 236 | "dist/credentials/NetlifyApi.credentials.js", 237 | "dist/credentials/NextCloudApi.credentials.js", 238 | "dist/credentials/NextCloudOAuth2Api.credentials.js", 239 | "dist/credentials/NocoDb.credentials.js", 240 | "dist/credentials/NocoDbApiToken.credentials.js", 241 | "dist/credentials/NotionApi.credentials.js", 242 | "dist/credentials/NotionOAuth2Api.credentials.js", 243 | "dist/credentials/NpmApi.credentials.js", 244 | "dist/credentials/OAuth1Api.credentials.js", 245 | "dist/credentials/OAuth2Api.credentials.js", 246 | "dist/credentials/OdooApi.credentials.js", 247 | "dist/credentials/OktaApi.credentials.js", 248 | "dist/credentials/OneSimpleApi.credentials.js", 249 | "dist/credentials/OnfleetApi.credentials.js", 250 | "dist/credentials/OpenAiApi.credentials.js", 251 | "dist/credentials/OpenCTIApi.credentials.js", 252 | "dist/credentials/OpenWeatherMapApi.credentials.js", 253 | "dist/credentials/OrbitApi.credentials.js", 254 | "dist/credentials/OuraApi.credentials.js", 255 | "dist/credentials/PaddleApi.credentials.js", 256 | "dist/credentials/PagerDutyApi.credentials.js", 257 | "dist/credentials/PagerDutyOAuth2Api.credentials.js", 258 | "dist/credentials/PayPalApi.credentials.js", 259 | "dist/credentials/PeekalinkApi.credentials.js", 260 | "dist/credentials/PhantombusterApi.credentials.js", 261 | "dist/credentials/PhilipsHueOAuth2Api.credentials.js", 262 | "dist/credentials/PipedriveApi.credentials.js", 263 | "dist/credentials/PipedriveOAuth2Api.credentials.js", 264 | "dist/credentials/PlivoApi.credentials.js", 265 | "dist/credentials/Postgres.credentials.js", 266 | "dist/credentials/PostHogApi.credentials.js", 267 | "dist/credentials/PostmarkApi.credentials.js", 268 | "dist/credentials/ProfitWellApi.credentials.js", 269 | "dist/credentials/PushbulletOAuth2Api.credentials.js", 270 | "dist/credentials/PushcutApi.credentials.js", 271 | "dist/credentials/PushoverApi.credentials.js", 272 | "dist/credentials/QRadarApi.credentials.js", 273 | "dist/credentials/QualysApi.credentials.js", 274 | "dist/credentials/QuestDb.credentials.js", 275 | "dist/credentials/QuickBaseApi.credentials.js", 276 | "dist/credentials/QuickBooksOAuth2Api.credentials.js", 277 | "dist/credentials/RabbitMQ.credentials.js", 278 | "dist/credentials/RaindropOAuth2Api.credentials.js", 279 | "dist/credentials/RecordedFutureApi.credentials.js", 280 | "dist/credentials/RedditOAuth2Api.credentials.js", 281 | "dist/credentials/Redis.credentials.js", 282 | "dist/credentials/RocketchatApi.credentials.js", 283 | "dist/credentials/RundeckApi.credentials.js", 284 | "dist/credentials/S3.credentials.js", 285 | "dist/credentials/SalesforceJwtApi.credentials.js", 286 | "dist/credentials/SalesforceOAuth2Api.credentials.js", 287 | "dist/credentials/SalesmateApi.credentials.js", 288 | "dist/credentials/SeaTableApi.credentials.js", 289 | "dist/credentials/SecurityScorecardApi.credentials.js", 290 | "dist/credentials/SegmentApi.credentials.js", 291 | "dist/credentials/SekoiaApi.credentials.js", 292 | "dist/credentials/SendGridApi.credentials.js", 293 | "dist/credentials/BrevoApi.credentials.js", 294 | "dist/credentials/SendyApi.credentials.js", 295 | "dist/credentials/SentryIoApi.credentials.js", 296 | "dist/credentials/SentryIoOAuth2Api.credentials.js", 297 | "dist/credentials/SentryIoServerApi.credentials.js", 298 | "dist/credentials/ServiceNowOAuth2Api.credentials.js", 299 | "dist/credentials/ServiceNowBasicApi.credentials.js", 300 | "dist/credentials/Sftp.credentials.js", 301 | "dist/credentials/ShopifyApi.credentials.js", 302 | "dist/credentials/ShopifyAccessTokenApi.credentials.js", 303 | "dist/credentials/ShopifyOAuth2Api.credentials.js", 304 | "dist/credentials/Signl4Api.credentials.js", 305 | "dist/credentials/SlackApi.credentials.js", 306 | "dist/credentials/SlackOAuth2Api.credentials.js", 307 | "dist/credentials/Sms77Api.credentials.js", 308 | "dist/credentials/Smtp.credentials.js", 309 | "dist/credentials/Snowflake.credentials.js", 310 | "dist/credentials/SplunkApi.credentials.js", 311 | "dist/credentials/SpontitApi.credentials.js", 312 | "dist/credentials/SpotifyOAuth2Api.credentials.js", 313 | "dist/credentials/ShufflerApi.credentials.js", 314 | "dist/credentials/SshPassword.credentials.js", 315 | "dist/credentials/SshPrivateKey.credentials.js", 316 | "dist/credentials/StackbyApi.credentials.js", 317 | "dist/credentials/StoryblokContentApi.credentials.js", 318 | "dist/credentials/StoryblokManagementApi.credentials.js", 319 | "dist/credentials/StrapiApi.credentials.js", 320 | "dist/credentials/StrapiTokenApi.credentials.js", 321 | "dist/credentials/StravaOAuth2Api.credentials.js", 322 | "dist/credentials/StripeApi.credentials.js", 323 | "dist/credentials/SupabaseApi.credentials.js", 324 | "dist/credentials/SurveyMonkeyApi.credentials.js", 325 | "dist/credentials/SurveyMonkeyOAuth2Api.credentials.js", 326 | "dist/credentials/SyncroMspApi.credentials.js", 327 | "dist/credentials/TaigaApi.credentials.js", 328 | "dist/credentials/TapfiliateApi.credentials.js", 329 | "dist/credentials/TelegramApi.credentials.js", 330 | "dist/credentials/TheHiveProjectApi.credentials.js", 331 | "dist/credentials/TheHiveApi.credentials.js", 332 | "dist/credentials/TimescaleDb.credentials.js", 333 | "dist/credentials/TodoistApi.credentials.js", 334 | "dist/credentials/TodoistOAuth2Api.credentials.js", 335 | "dist/credentials/TogglApi.credentials.js", 336 | "dist/credentials/TotpApi.credentials.js", 337 | "dist/credentials/TravisCiApi.credentials.js", 338 | "dist/credentials/TrellixEpoApi.credentials.js", 339 | "dist/credentials/TrelloApi.credentials.js", 340 | "dist/credentials/TwakeCloudApi.credentials.js", 341 | "dist/credentials/TwakeServerApi.credentials.js", 342 | "dist/credentials/TwilioApi.credentials.js", 343 | "dist/credentials/TwistOAuth2Api.credentials.js", 344 | "dist/credentials/TwitterOAuth1Api.credentials.js", 345 | "dist/credentials/TwitterOAuth2Api.credentials.js", 346 | "dist/credentials/TypeformApi.credentials.js", 347 | "dist/credentials/TypeformOAuth2Api.credentials.js", 348 | "dist/credentials/UnleashedSoftwareApi.credentials.js", 349 | "dist/credentials/UpleadApi.credentials.js", 350 | "dist/credentials/UProcApi.credentials.js", 351 | "dist/credentials/UptimeRobotApi.credentials.js", 352 | "dist/credentials/UrlScanIoApi.credentials.js", 353 | "dist/credentials/VeroApi.credentials.js", 354 | "dist/credentials/VirusTotalApi.credentials.js", 355 | "dist/credentials/VonageApi.credentials.js", 356 | "dist/credentials/VenafiTlsProtectCloudApi.credentials.js", 357 | "dist/credentials/VenafiTlsProtectDatacenterApi.credentials.js", 358 | "dist/credentials/WebflowApi.credentials.js", 359 | "dist/credentials/WebflowOAuth2Api.credentials.js", 360 | "dist/credentials/WekanApi.credentials.js", 361 | "dist/credentials/WhatsAppApi.credentials.js", 362 | "dist/credentials/WiseApi.credentials.js", 363 | "dist/credentials/WooCommerceApi.credentials.js", 364 | "dist/credentials/WordpressApi.credentials.js", 365 | "dist/credentials/WorkableApi.credentials.js", 366 | "dist/credentials/WufooApi.credentials.js", 367 | "dist/credentials/XeroOAuth2Api.credentials.js", 368 | "dist/credentials/YourlsApi.credentials.js", 369 | "dist/credentials/YouTubeOAuth2Api.credentials.js", 370 | "dist/credentials/ZammadBasicAuthApi.credentials.js", 371 | "dist/credentials/ZammadTokenAuthApi.credentials.js", 372 | "dist/credentials/ZendeskApi.credentials.js", 373 | "dist/credentials/ZendeskOAuth2Api.credentials.js", 374 | "dist/credentials/ZohoOAuth2Api.credentials.js", 375 | "dist/credentials/ZoomApi.credentials.js", 376 | "dist/credentials/ZoomOAuth2Api.credentials.js", 377 | "dist/credentials/ZscalerZiaApi.credentials.js", 378 | "dist/credentials/ZulipApi.credentials.js" 379 | ], 380 | "nodes": [ 381 | "dist/nodes/ActionNetwork/ActionNetwork.node.js", 382 | "dist/nodes/ActiveCampaign/ActiveCampaign.node.js", 383 | "dist/nodes/ActiveCampaign/ActiveCampaignTrigger.node.js", 384 | "dist/nodes/AcuityScheduling/AcuitySchedulingTrigger.node.js", 385 | "dist/nodes/Adalo/Adalo.node.js", 386 | "dist/nodes/Affinity/Affinity.node.js", 387 | "dist/nodes/Affinity/AffinityTrigger.node.js", 388 | "dist/nodes/AgileCrm/AgileCrm.node.js", 389 | "dist/nodes/Airtable/Airtable.node.js", 390 | "dist/nodes/Airtable/AirtableTrigger.node.js", 391 | "dist/nodes/Amqp/Amqp.node.js", 392 | "dist/nodes/Amqp/AmqpTrigger.node.js", 393 | "dist/nodes/ApiTemplateIo/ApiTemplateIo.node.js", 394 | "dist/nodes/Asana/Asana.node.js", 395 | "dist/nodes/Asana/AsanaTrigger.node.js", 396 | "dist/nodes/Automizy/Automizy.node.js", 397 | "dist/nodes/Autopilot/Autopilot.node.js", 398 | "dist/nodes/Autopilot/AutopilotTrigger.node.js", 399 | "dist/nodes/Aws/AwsLambda.node.js", 400 | "dist/nodes/Aws/AwsSns.node.js", 401 | "dist/nodes/Aws/AwsSnsTrigger.node.js", 402 | "dist/nodes/Aws/CertificateManager/AwsCertificateManager.node.js", 403 | "dist/nodes/Aws/Comprehend/AwsComprehend.node.js", 404 | "dist/nodes/Aws/DynamoDB/AwsDynamoDB.node.js", 405 | "dist/nodes/Aws/ELB/AwsElb.node.js", 406 | "dist/nodes/Aws/Rekognition/AwsRekognition.node.js", 407 | "dist/nodes/Aws/S3/AwsS3.node.js", 408 | "dist/nodes/Aws/SES/AwsSes.node.js", 409 | "dist/nodes/Aws/SQS/AwsSqs.node.js", 410 | "dist/nodes/Aws/Textract/AwsTextract.node.js", 411 | "dist/nodes/Aws/Transcribe/AwsTranscribe.node.js", 412 | "dist/nodes/BambooHr/BambooHr.node.js", 413 | "dist/nodes/Bannerbear/Bannerbear.node.js", 414 | "dist/nodes/Baserow/Baserow.node.js", 415 | "dist/nodes/Beeminder/Beeminder.node.js", 416 | "dist/nodes/Bitbucket/BitbucketTrigger.node.js", 417 | "dist/nodes/Bitly/Bitly.node.js", 418 | "dist/nodes/Bitwarden/Bitwarden.node.js", 419 | "dist/nodes/Box/Box.node.js", 420 | "dist/nodes/Box/BoxTrigger.node.js", 421 | "dist/nodes/Brandfetch/Brandfetch.node.js", 422 | "dist/nodes/Bubble/Bubble.node.js", 423 | "dist/nodes/Cal/CalTrigger.node.js", 424 | "dist/nodes/Calendly/CalendlyTrigger.node.js", 425 | "dist/nodes/Chargebee/Chargebee.node.js", 426 | "dist/nodes/Chargebee/ChargebeeTrigger.node.js", 427 | "dist/nodes/CircleCi/CircleCi.node.js", 428 | "dist/nodes/Cisco/Webex/CiscoWebex.node.js", 429 | "dist/nodes/Citrix/ADC/CitrixAdc.node.js", 430 | "dist/nodes/Cisco/Webex/CiscoWebexTrigger.node.js", 431 | "dist/nodes/Cloudflare/Cloudflare.node.js", 432 | "dist/nodes/Clearbit/Clearbit.node.js", 433 | "dist/nodes/ClickUp/ClickUp.node.js", 434 | "dist/nodes/ClickUp/ClickUpTrigger.node.js", 435 | "dist/nodes/Clockify/Clockify.node.js", 436 | "dist/nodes/Clockify/ClockifyTrigger.node.js", 437 | "dist/nodes/Cockpit/Cockpit.node.js", 438 | "dist/nodes/Coda/Coda.node.js", 439 | "dist/nodes/Code/Code.node.js", 440 | "dist/nodes/CoinGecko/CoinGecko.node.js", 441 | "dist/nodes/CompareDatasets/CompareDatasets.node.js", 442 | "dist/nodes/Compression/Compression.node.js", 443 | "dist/nodes/Contentful/Contentful.node.js", 444 | "dist/nodes/ConvertKit/ConvertKit.node.js", 445 | "dist/nodes/ConvertKit/ConvertKitTrigger.node.js", 446 | "dist/nodes/Copper/Copper.node.js", 447 | "dist/nodes/Copper/CopperTrigger.node.js", 448 | "dist/nodes/Cortex/Cortex.node.js", 449 | "dist/nodes/CrateDb/CrateDb.node.js", 450 | "dist/nodes/Cron/Cron.node.js", 451 | "dist/nodes/CrowdDev/CrowdDev.node.js", 452 | "dist/nodes/CrowdDev/CrowdDevTrigger.node.js", 453 | "dist/nodes/Crypto/Crypto.node.js", 454 | "dist/nodes/CustomerIo/CustomerIo.node.js", 455 | "dist/nodes/CustomerIo/CustomerIoTrigger.node.js", 456 | "dist/nodes/DateTime/DateTime.node.js", 457 | "dist/nodes/DebugHelper/DebugHelper.node.js", 458 | "dist/nodes/DeepL/DeepL.node.js", 459 | "dist/nodes/Demio/Demio.node.js", 460 | "dist/nodes/Dhl/Dhl.node.js", 461 | "dist/nodes/Discord/Discord.node.js", 462 | "dist/nodes/Discourse/Discourse.node.js", 463 | "dist/nodes/Disqus/Disqus.node.js", 464 | "dist/nodes/Drift/Drift.node.js", 465 | "dist/nodes/Dropbox/Dropbox.node.js", 466 | "dist/nodes/Dropcontact/Dropcontact.node.js", 467 | "dist/nodes/EditImage/EditImage.node.js", 468 | "dist/nodes/E2eTest/E2eTest.node.js", 469 | "dist/nodes/Egoi/Egoi.node.js", 470 | "dist/nodes/Elastic/Elasticsearch/Elasticsearch.node.js", 471 | "dist/nodes/Elastic/ElasticSecurity/ElasticSecurity.node.js", 472 | "dist/nodes/EmailReadImap/EmailReadImap.node.js", 473 | "dist/nodes/EmailSend/EmailSend.node.js", 474 | "dist/nodes/Emelia/Emelia.node.js", 475 | "dist/nodes/Emelia/EmeliaTrigger.node.js", 476 | "dist/nodes/ERPNext/ERPNext.node.js", 477 | "dist/nodes/ErrorTrigger/ErrorTrigger.node.js", 478 | "dist/nodes/Eventbrite/EventbriteTrigger.node.js", 479 | "dist/nodes/ExecuteCommand/ExecuteCommand.node.js", 480 | "dist/nodes/ExecuteWorkflow/ExecuteWorkflow.node.js", 481 | "dist/nodes/ExecuteWorkflowTrigger/ExecuteWorkflowTrigger.node.js", 482 | "dist/nodes/ExecutionData/ExecutionData.node.js", 483 | "dist/nodes/Facebook/FacebookGraphApi.node.js", 484 | "dist/nodes/Facebook/FacebookTrigger.node.js", 485 | "dist/nodes/FacebookLeadAds/FacebookLeadAdsTrigger.node.js", 486 | "dist/nodes/Figma/FigmaTrigger.node.js", 487 | "dist/nodes/FileMaker/FileMaker.node.js", 488 | "dist/nodes/Filter/Filter.node.js", 489 | "dist/nodes/Flow/Flow.node.js", 490 | "dist/nodes/Flow/FlowTrigger.node.js", 491 | "dist/nodes/Form/FormTrigger.node.js", 492 | "dist/nodes/FormIo/FormIoTrigger.node.js", 493 | "dist/nodes/Formstack/FormstackTrigger.node.js", 494 | "dist/nodes/Freshdesk/Freshdesk.node.js", 495 | "dist/nodes/Freshservice/Freshservice.node.js", 496 | "dist/nodes/FreshworksCrm/FreshworksCrm.node.js", 497 | "dist/nodes/Ftp/Ftp.node.js", 498 | "dist/nodes/Function/Function.node.js", 499 | "dist/nodes/FunctionItem/FunctionItem.node.js", 500 | "dist/nodes/GetResponse/GetResponse.node.js", 501 | "dist/nodes/GetResponse/GetResponseTrigger.node.js", 502 | "dist/nodes/Ghost/Ghost.node.js", 503 | "dist/nodes/Git/Git.node.js", 504 | "dist/nodes/Github/Github.node.js", 505 | "dist/nodes/Github/GithubTrigger.node.js", 506 | "dist/nodes/Gitlab/Gitlab.node.js", 507 | "dist/nodes/Gitlab/GitlabTrigger.node.js", 508 | "dist/nodes/Google/Ads/GoogleAds.node.js", 509 | "dist/nodes/Google/Analytics/GoogleAnalytics.node.js", 510 | "dist/nodes/Google/BigQuery/GoogleBigQuery.node.js", 511 | "dist/nodes/Google/Books/GoogleBooks.node.js", 512 | "dist/nodes/Google/Calendar/GoogleCalendar.node.js", 513 | "dist/nodes/Google/Calendar/GoogleCalendarTrigger.node.js", 514 | "dist/nodes/Google/Chat/GoogleChat.node.js", 515 | "dist/nodes/Google/CloudNaturalLanguage/GoogleCloudNaturalLanguage.node.js", 516 | "dist/nodes/Google/CloudStorage/GoogleCloudStorage.node.js", 517 | "dist/nodes/Google/Contacts/GoogleContacts.node.js", 518 | "dist/nodes/Google/Docs/GoogleDocs.node.js", 519 | "dist/nodes/Google/Drive/GoogleDrive.node.js", 520 | "dist/nodes/Google/Drive/GoogleDriveTrigger.node.js", 521 | "dist/nodes/Google/Firebase/CloudFirestore/GoogleFirebaseCloudFirestore.node.js", 522 | "dist/nodes/Google/Firebase/RealtimeDatabase/GoogleFirebaseRealtimeDatabase.node.js", 523 | "dist/nodes/Google/Gmail/Gmail.node.js", 524 | "dist/nodes/Google/Gmail/GmailTrigger.node.js", 525 | "dist/nodes/Google/GSuiteAdmin/GSuiteAdmin.node.js", 526 | "dist/nodes/Google/Perspective/GooglePerspective.node.js", 527 | "dist/nodes/Google/Sheet/GoogleSheets.node.js", 528 | "dist/nodes/Google/Sheet/GoogleSheetsTrigger.node.js", 529 | "dist/nodes/Google/Slides/GoogleSlides.node.js", 530 | "dist/nodes/Google/Task/GoogleTasks.node.js", 531 | "dist/nodes/Google/Translate/GoogleTranslate.node.js", 532 | "dist/nodes/Google/YouTube/YouTube.node.js", 533 | "dist/nodes/Gotify/Gotify.node.js", 534 | "dist/nodes/GoToWebinar/GoToWebinar.node.js", 535 | "dist/nodes/Grafana/Grafana.node.js", 536 | "dist/nodes/GraphQL/GraphQL.node.js", 537 | "dist/nodes/Grist/Grist.node.js", 538 | "dist/nodes/Gumroad/GumroadTrigger.node.js", 539 | "dist/nodes/HackerNews/HackerNews.node.js", 540 | "dist/nodes/HaloPSA/HaloPSA.node.js", 541 | "dist/nodes/Harvest/Harvest.node.js", 542 | "dist/nodes/HelpScout/HelpScout.node.js", 543 | "dist/nodes/HelpScout/HelpScoutTrigger.node.js", 544 | "dist/nodes/HighLevel/HighLevel.node.js", 545 | "dist/nodes/HomeAssistant/HomeAssistant.node.js", 546 | "dist/nodes/HtmlExtract/HtmlExtract.node.js", 547 | "dist/nodes/Html/Html.node.js", 548 | "dist/nodes/HttpRequest/HttpRequest.node.js", 549 | "dist/nodes/Hubspot/Hubspot.node.js", 550 | "dist/nodes/Hubspot/HubspotTrigger.node.js", 551 | "dist/nodes/HumanticAI/HumanticAi.node.js", 552 | "dist/nodes/Hunter/Hunter.node.js", 553 | "dist/nodes/ICalendar/ICalendar.node.js", 554 | "dist/nodes/If/If.node.js", 555 | "dist/nodes/Intercom/Intercom.node.js", 556 | "dist/nodes/Interval/Interval.node.js", 557 | "dist/nodes/InvoiceNinja/InvoiceNinja.node.js", 558 | "dist/nodes/InvoiceNinja/InvoiceNinjaTrigger.node.js", 559 | "dist/nodes/ItemLists/ItemLists.node.js", 560 | "dist/nodes/Iterable/Iterable.node.js", 561 | "dist/nodes/Jenkins/Jenkins.node.js", 562 | "dist/nodes/Jira/Jira.node.js", 563 | "dist/nodes/Jira/JiraTrigger.node.js", 564 | "dist/nodes/JotForm/JotFormTrigger.node.js", 565 | "dist/nodes/Kafka/Kafka.node.js", 566 | "dist/nodes/Kafka/KafkaTrigger.node.js", 567 | "dist/nodes/Keap/Keap.node.js", 568 | "dist/nodes/Keap/KeapTrigger.node.js", 569 | "dist/nodes/Kitemaker/Kitemaker.node.js", 570 | "dist/nodes/KoBoToolbox/KoBoToolbox.node.js", 571 | "dist/nodes/KoBoToolbox/KoBoToolboxTrigger.node.js", 572 | "dist/nodes/Ldap/Ldap.node.js", 573 | "dist/nodes/Lemlist/Lemlist.node.js", 574 | "dist/nodes/Lemlist/LemlistTrigger.node.js", 575 | "dist/nodes/Line/Line.node.js", 576 | "dist/nodes/Linear/Linear.node.js", 577 | "dist/nodes/Linear/LinearTrigger.node.js", 578 | "dist/nodes/LingvaNex/LingvaNex.node.js", 579 | "dist/nodes/LinkedIn/LinkedIn.node.js", 580 | "dist/nodes/LocalFileTrigger/LocalFileTrigger.node.js", 581 | "dist/nodes/LoneScale/LoneScaleTrigger.node.js", 582 | "dist/nodes/LoneScale/LoneScale.node.js", 583 | "dist/nodes/Magento/Magento2.node.js", 584 | "dist/nodes/Mailcheck/Mailcheck.node.js", 585 | "dist/nodes/Mailchimp/Mailchimp.node.js", 586 | "dist/nodes/Mailchimp/MailchimpTrigger.node.js", 587 | "dist/nodes/MailerLite/MailerLite.node.js", 588 | "dist/nodes/MailerLite/MailerLiteTrigger.node.js", 589 | "dist/nodes/Mailgun/Mailgun.node.js", 590 | "dist/nodes/Mailjet/Mailjet.node.js", 591 | "dist/nodes/Mailjet/MailjetTrigger.node.js", 592 | "dist/nodes/Mandrill/Mandrill.node.js", 593 | "dist/nodes/ManualTrigger/ManualTrigger.node.js", 594 | "dist/nodes/Markdown/Markdown.node.js", 595 | "dist/nodes/Marketstack/Marketstack.node.js", 596 | "dist/nodes/Matrix/Matrix.node.js", 597 | "dist/nodes/Mattermost/Mattermost.node.js", 598 | "dist/nodes/Mautic/Mautic.node.js", 599 | "dist/nodes/Mautic/MauticTrigger.node.js", 600 | "dist/nodes/Medium/Medium.node.js", 601 | "dist/nodes/Merge/Merge.node.js", 602 | "dist/nodes/MessageBird/MessageBird.node.js", 603 | "dist/nodes/Metabase/Metabase.node.js", 604 | "dist/nodes/Microsoft/Dynamics/MicrosoftDynamicsCrm.node.js", 605 | "dist/nodes/Microsoft/Excel/MicrosoftExcel.node.js", 606 | "dist/nodes/Microsoft/GraphSecurity/MicrosoftGraphSecurity.node.js", 607 | "dist/nodes/Microsoft/OneDrive/MicrosoftOneDrive.node.js", 608 | "dist/nodes/Microsoft/Outlook/MicrosoftOutlook.node.js", 609 | "dist/nodes/Microsoft/Sql/MicrosoftSql.node.js", 610 | "dist/nodes/Microsoft/Teams/MicrosoftTeams.node.js", 611 | "dist/nodes/Microsoft/ToDo/MicrosoftToDo.node.js", 612 | "dist/nodes/Mindee/Mindee.node.js", 613 | "dist/nodes/Misp/Misp.node.js", 614 | "dist/nodes/Mocean/Mocean.node.js", 615 | "dist/nodes/MondayCom/MondayCom.node.js", 616 | "dist/nodes/MongoDb/MongoDb.node.js", 617 | "dist/nodes/MonicaCrm/MonicaCrm.node.js", 618 | "dist/nodes/MoveBinaryData/MoveBinaryData.node.js", 619 | "dist/nodes/MQTT/Mqtt.node.js", 620 | "dist/nodes/MQTT/MqttTrigger.node.js", 621 | "dist/nodes/Msg91/Msg91.node.js", 622 | "dist/nodes/MySql/MySql.node.js", 623 | "dist/nodes/N8n/N8n.node.js", 624 | "dist/nodes/N8nTrainingCustomerDatastore/N8nTrainingCustomerDatastore.node.js", 625 | "dist/nodes/N8nTrainingCustomerMessenger/N8nTrainingCustomerMessenger.node.js", 626 | "dist/nodes/N8nTrigger/N8nTrigger.node.js", 627 | "dist/nodes/Nasa/Nasa.node.js", 628 | "dist/nodes/Netlify/Netlify.node.js", 629 | "dist/nodes/Netlify/NetlifyTrigger.node.js", 630 | "dist/nodes/NextCloud/NextCloud.node.js", 631 | "dist/nodes/NocoDB/NocoDB.node.js", 632 | "dist/nodes/Brevo/Brevo.node.js", 633 | "dist/nodes/Brevo/BrevoTrigger.node.js", 634 | "dist/nodes/StickyNote/StickyNote.node.js", 635 | "dist/nodes/NoOp/NoOp.node.js", 636 | "dist/nodes/Onfleet/Onfleet.node.js", 637 | "dist/nodes/Onfleet/OnfleetTrigger.node.js", 638 | "dist/nodes/Notion/Notion.node.js", 639 | "dist/nodes/Notion/NotionTrigger.node.js", 640 | "dist/nodes/Npm/Npm.node.js", 641 | "dist/nodes/Odoo/Odoo.node.js", 642 | "dist/nodes/OneSimpleApi/OneSimpleApi.node.js", 643 | "dist/nodes/OpenAi/OpenAi.node.js", 644 | "dist/nodes/OpenThesaurus/OpenThesaurus.node.js", 645 | "dist/nodes/OpenWeatherMap/OpenWeatherMap.node.js", 646 | "dist/nodes/Orbit/Orbit.node.js", 647 | "dist/nodes/Oura/Oura.node.js", 648 | "dist/nodes/Paddle/Paddle.node.js", 649 | "dist/nodes/PagerDuty/PagerDuty.node.js", 650 | "dist/nodes/PayPal/PayPal.node.js", 651 | "dist/nodes/PayPal/PayPalTrigger.node.js", 652 | "dist/nodes/Peekalink/Peekalink.node.js", 653 | "dist/nodes/Phantombuster/Phantombuster.node.js", 654 | "dist/nodes/PhilipsHue/PhilipsHue.node.js", 655 | "dist/nodes/Pipedrive/Pipedrive.node.js", 656 | "dist/nodes/Pipedrive/PipedriveTrigger.node.js", 657 | "dist/nodes/Plivo/Plivo.node.js", 658 | "dist/nodes/PostBin/PostBin.node.js", 659 | "dist/nodes/Postgres/Postgres.node.js", 660 | "dist/nodes/Postgres/PostgresTrigger.node.js", 661 | "dist/nodes/PostHog/PostHog.node.js", 662 | "dist/nodes/Postmark/PostmarkTrigger.node.js", 663 | "dist/nodes/ProfitWell/ProfitWell.node.js", 664 | "dist/nodes/Pushbullet/Pushbullet.node.js", 665 | "dist/nodes/Pushcut/Pushcut.node.js", 666 | "dist/nodes/Pushcut/PushcutTrigger.node.js", 667 | "dist/nodes/Pushover/Pushover.node.js", 668 | "dist/nodes/QuestDb/QuestDb.node.js", 669 | "dist/nodes/QuickBase/QuickBase.node.js", 670 | "dist/nodes/QuickBooks/QuickBooks.node.js", 671 | "dist/nodes/QuickChart/QuickChart.node.js", 672 | "dist/nodes/RabbitMQ/RabbitMQ.node.js", 673 | "dist/nodes/RabbitMQ/RabbitMQTrigger.node.js", 674 | "dist/nodes/Raindrop/Raindrop.node.js", 675 | "dist/nodes/ReadBinaryFile/ReadBinaryFile.node.js", 676 | "dist/nodes/ReadBinaryFiles/ReadBinaryFiles.node.js", 677 | "dist/nodes/ReadPdf/ReadPDF.node.js", 678 | "dist/nodes/Reddit/Reddit.node.js", 679 | "dist/nodes/Redis/Redis.node.js", 680 | "dist/nodes/Redis/RedisTrigger.node.js", 681 | "dist/nodes/RenameKeys/RenameKeys.node.js", 682 | "dist/nodes/RespondToWebhook/RespondToWebhook.node.js", 683 | "dist/nodes/Rocketchat/Rocketchat.node.js", 684 | "dist/nodes/RssFeedRead/RssFeedRead.node.js", 685 | "dist/nodes/RssFeedRead/RssFeedReadTrigger.node.js", 686 | "dist/nodes/Rundeck/Rundeck.node.js", 687 | "dist/nodes/S3/S3.node.js", 688 | "dist/nodes/Salesforce/Salesforce.node.js", 689 | "dist/nodes/Salesmate/Salesmate.node.js", 690 | "dist/nodes/Schedule/ScheduleTrigger.node.js", 691 | "dist/nodes/SeaTable/SeaTable.node.js", 692 | "dist/nodes/SeaTable/SeaTableTrigger.node.js", 693 | "dist/nodes/SecurityScorecard/SecurityScorecard.node.js", 694 | "dist/nodes/Segment/Segment.node.js", 695 | "dist/nodes/SendGrid/SendGrid.node.js", 696 | "dist/nodes/Sendy/Sendy.node.js", 697 | "dist/nodes/SentryIo/SentryIo.node.js", 698 | "dist/nodes/ServiceNow/ServiceNow.node.js", 699 | "dist/nodes/Set/Set.node.js", 700 | "dist/nodes/Shopify/Shopify.node.js", 701 | "dist/nodes/Shopify/ShopifyTrigger.node.js", 702 | "dist/nodes/Signl4/Signl4.node.js", 703 | "dist/nodes/Slack/Slack.node.js", 704 | "dist/nodes/Sms77/Sms77.node.js", 705 | "dist/nodes/Snowflake/Snowflake.node.js", 706 | "dist/nodes/SplitInBatches/SplitInBatches.node.js", 707 | "dist/nodes/Splunk/Splunk.node.js", 708 | "dist/nodes/Spontit/Spontit.node.js", 709 | "dist/nodes/Spotify/Spotify.node.js", 710 | "dist/nodes/SpreadsheetFile/SpreadsheetFile.node.js", 711 | "dist/nodes/SseTrigger/SseTrigger.node.js", 712 | "dist/nodes/Ssh/Ssh.node.js", 713 | "dist/nodes/Stackby/Stackby.node.js", 714 | "dist/nodes/Start/Start.node.js", 715 | "dist/nodes/StopAndError/StopAndError.node.js", 716 | "dist/nodes/Storyblok/Storyblok.node.js", 717 | "dist/nodes/Strapi/Strapi.node.js", 718 | "dist/nodes/Strava/Strava.node.js", 719 | "dist/nodes/Strava/StravaTrigger.node.js", 720 | "dist/nodes/Stripe/Stripe.node.js", 721 | "dist/nodes/Stripe/StripeTrigger.node.js", 722 | "dist/nodes/Supabase/Supabase.node.js", 723 | "dist/nodes/SurveyMonkey/SurveyMonkeyTrigger.node.js", 724 | "dist/nodes/Switch/Switch.node.js", 725 | "dist/nodes/SyncroMSP/SyncroMsp.node.js", 726 | "dist/nodes/Taiga/Taiga.node.js", 727 | "dist/nodes/Taiga/TaigaTrigger.node.js", 728 | "dist/nodes/Tapfiliate/Tapfiliate.node.js", 729 | "dist/nodes/Telegram/Telegram.node.js", 730 | "dist/nodes/Telegram/TelegramTrigger.node.js", 731 | "dist/nodes/TheHiveProject/TheHiveProject.node.js", 732 | "dist/nodes/TheHiveProject/TheHiveProjectTrigger.node.js", 733 | "dist/nodes/TheHive/TheHive.node.js", 734 | "dist/nodes/TheHive/TheHiveTrigger.node.js", 735 | "dist/nodes/TimescaleDb/TimescaleDb.node.js", 736 | "dist/nodes/Todoist/Todoist.node.js", 737 | "dist/nodes/Toggl/TogglTrigger.node.js", 738 | "dist/nodes/Totp/Totp.node.js", 739 | "dist/nodes/TravisCi/TravisCi.node.js", 740 | "dist/nodes/Trello/Trello.node.js", 741 | "dist/nodes/Trello/TrelloTrigger.node.js", 742 | "dist/nodes/Twake/Twake.node.js", 743 | "dist/nodes/Twilio/Twilio.node.js", 744 | "dist/nodes/Twist/Twist.node.js", 745 | "dist/nodes/Twitter/Twitter.node.js", 746 | "dist/nodes/Typeform/TypeformTrigger.node.js", 747 | "dist/nodes/UnleashedSoftware/UnleashedSoftware.node.js", 748 | "dist/nodes/Uplead/Uplead.node.js", 749 | "dist/nodes/UProc/UProc.node.js", 750 | "dist/nodes/UptimeRobot/UptimeRobot.node.js", 751 | "dist/nodes/UrlScanIo/UrlScanIo.node.js", 752 | "dist/nodes/Vero/Vero.node.js", 753 | "dist/nodes/Venafi/ProtectCloud/VenafiTlsProtectCloud.node.js", 754 | "dist/nodes/Venafi/ProtectCloud/VenafiTlsProtectCloudTrigger.node.js", 755 | "dist/nodes/Venafi/Datacenter/VenafiTlsProtectDatacenter.node.js", 756 | "dist/nodes/Vonage/Vonage.node.js", 757 | "dist/nodes/Wait/Wait.node.js", 758 | "dist/nodes/Webflow/Webflow.node.js", 759 | "dist/nodes/Webflow/WebflowTrigger.node.js", 760 | "dist/nodes/Webhook/Webhook.node.js", 761 | "dist/nodes/Wekan/Wekan.node.js", 762 | "dist/nodes/WhatsApp/WhatsApp.node.js", 763 | "dist/nodes/Wise/Wise.node.js", 764 | "dist/nodes/Wise/WiseTrigger.node.js", 765 | "dist/nodes/WooCommerce/WooCommerce.node.js", 766 | "dist/nodes/WooCommerce/WooCommerceTrigger.node.js", 767 | "dist/nodes/Wordpress/Wordpress.node.js", 768 | "dist/nodes/Workable/WorkableTrigger.node.js", 769 | "dist/nodes/WorkflowTrigger/WorkflowTrigger.node.js", 770 | "dist/nodes/WriteBinaryFile/WriteBinaryFile.node.js", 771 | "dist/nodes/Wufoo/WufooTrigger.node.js", 772 | "dist/nodes/Xero/Xero.node.js", 773 | "dist/nodes/Xml/Xml.node.js", 774 | "dist/nodes/Yourls/Yourls.node.js", 775 | "dist/nodes/Zammad/Zammad.node.js", 776 | "dist/nodes/Zendesk/Zendesk.node.js", 777 | "dist/nodes/Zendesk/ZendeskTrigger.node.js", 778 | "dist/nodes/Zoho/ZohoCrm.node.js", 779 | "dist/nodes/Zoom/Zoom.node.js", 780 | "dist/nodes/Zulip/Zulip.node.js" 781 | ] 782 | }, 783 | "devDependencies": { 784 | "@types/amqplib": "^0.10.1", 785 | "@types/aws4": "^1.5.1", 786 | "@types/basic-auth": "^1.1.3", 787 | "@types/cheerio": "^0.22.15", 788 | "@types/cron": "~1.7.1", 789 | "@types/eventsource": "^1.1.2", 790 | "@types/express": "^4.17.6", 791 | "@types/gm": "^1.25.0", 792 | "@types/imap-simple": "^4.2.0", 793 | "@types/js-nacl": "^1.3.0", 794 | "@types/jsonwebtoken": "^9.0.1", 795 | "@types/lodash": "^4.14.195", 796 | "@types/lossless-json": "^1.0.0", 797 | "@types/mailparser": "^2.7.3", 798 | "@types/mime-types": "^2.1.0", 799 | "@types/mssql": "^6.0.2", 800 | "@types/node-ssh": "^7.0.1", 801 | "@types/nodemailer": "^6.4.0", 802 | "@types/promise-ftp": "^1.3.4", 803 | "@types/redis": "^2.8.11", 804 | "@types/request-promise-native": "~1.0.15", 805 | "@types/rfc2047": "^2.0.1", 806 | "@types/showdown": "^1.9.4", 807 | "@types/snowflake-sdk": "^1.6.12", 808 | "@types/ssh2-sftp-client": "^5.1.0", 809 | "@types/tmp": "^0.2.0", 810 | "@types/uuid": "^8.3.2", 811 | "@types/xml2js": "^0.4.11", 812 | "eslint-plugin-n8n-nodes-base": "^1.16.0", 813 | "gulp": "^4.0.0", 814 | "n8n-core": "1.14.1" 815 | }, 816 | "dependencies": { 817 | "@kafkajs/confluent-schema-registry": "1.0.6", 818 | "@n8n/vm2": "^3.9.20", 819 | "amqplib": "^0.10.3", 820 | "aws4": "^1.8.0", 821 | "basic-auth": "^2.0.1", 822 | "change-case": "^4.1.1", 823 | "cheerio": "1.0.0-rc.6", 824 | "chokidar": "3.5.2", 825 | "cron": "~1.7.2", 826 | "csv-parse": "^5.5.0", 827 | "currency-codes": "^2.1.0", 828 | "eventsource": "^2.0.2", 829 | "fast-glob": "^3.2.5", 830 | "fflate": "^0.7.0", 831 | "get-system-fonts": "^2.0.2", 832 | "gm": "^1.25.0", 833 | "iconv-lite": "^0.6.2", 834 | "ics": "^2.27.0", 835 | "imap-simple": "^4.3.0", 836 | "isbot": "^3.6.13", 837 | "iso-639-1": "^2.1.3", 838 | "js-nacl": "^1.4.0", 839 | "jsonwebtoken": "^9.0.0", 840 | "kafkajs": "^1.14.0", 841 | "ldapts": "^4.2.6", 842 | "lodash": "^4.17.21", 843 | "lossless-json": "^1.0.4", 844 | "luxon": "^3.3.0", 845 | "mailparser": "^3.2.0", 846 | "minifaker": "^1.34.1", 847 | "moment": "~2.29.2", 848 | "moment-timezone": "^0.5.28", 849 | "mongodb": "^4.17.1", 850 | "mqtt": "^5.0.2", 851 | "mssql": "^8.1.2", 852 | "mysql2": "~2.3.0", 853 | "nanoid": "^3.3.6", 854 | "node-html-markdown": "^1.1.3", 855 | "node-ssh": "^12.0.0", 856 | "nodemailer": "^6.7.1", 857 | "otpauth": "^9.1.1", 858 | "pdfjs-dist": "^2.16.105", 859 | "pg": "^8.3.0", 860 | "pg-promise": "^10.5.8", 861 | "pretty-bytes": "^5.6.0", 862 | "promise-ftp": "^1.3.5", 863 | "pyodide": "^0.23.4", 864 | "redis": "^3.1.1", 865 | "rfc2047": "^4.0.1", 866 | "rhea": "^1.0.11", 867 | "rss-parser": "^3.7.0", 868 | "semver": "^7.5.4", 869 | "showdown": "^2.0.3", 870 | "simple-git": "^3.17.0", 871 | "snowflake-sdk": "^1.8.0", 872 | "ssh2-sftp-client": "^7.0.0", 873 | "tmp-promise": "^3.0.2", 874 | "typedi": "^0.10.0", 875 | "uuid": "^8.3.2", 876 | "xlsx": "https://cdn.sheetjs.com/xlsx-0.19.3/xlsx-0.19.3.tgz", 877 | "xml2js": "^0.5.0", 878 | "n8n-workflow": "1.14.1" 879 | }, 880 | "scripts": { 881 | "clean": "rimraf dist .turbo", 882 | "dev": "pnpm watch", 883 | "typecheck": "tsc", 884 | "build": "tsc -p tsconfig.build.json && tsc-alias -p tsconfig.build.json && gulp build:icons && gulp build:translations && pnpm build:metadata", 885 | "build:translations": "gulp build:translations", 886 | "build:metadata": "pnpm n8n-generate-known && pnpm n8n-generate-ui-types", 887 | "format": "prettier --write . --ignore-path ../../.prettierignore", 888 | "lint": "eslint . --quiet && node ./scripts/validate-load-options-methods.js", 889 | "lintfix": "eslint . --fix", 890 | "watch": "tsc-watch -p tsconfig.build.json --onCompilationComplete \"tsc-alias -p tsconfig.build.json\" --onSuccess \"pnpm n8n-generate-ui-types\"", 891 | "test": "jest" 892 | } 893 | }, 894 | "extraction_time_ms": 5, 895 | "extracted_at": "2025-06-07T17:49:22.782Z" 896 | } ```