n8n-workflow-builder-mcp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.cursor/rules/cursor_rules.mdc +53 -0
- package/.cursor/rules/dev_workflow.mdc +219 -0
- package/.cursor/rules/mcp.mdc +430 -0
- package/.cursor/rules/self_improve.mdc +72 -0
- package/.cursor/rules/taskmaster.mdc +382 -0
- package/.cursorignore +1 -0
- package/.cursorrules +4 -0
- package/.env.example +23 -0
- package/.eslintrc.json +38 -0
- package/.github/workflows/npm-publish-github-packages.yml +55 -0
- package/.prettierrc +9 -0
- package/.roo/rules/dev_workflow.md +219 -0
- package/.roo/rules/mcp.md +430 -0
- package/.roo/rules/roo_rules.md +53 -0
- package/.roo/rules/self_improve.md +72 -0
- package/.roo/rules/taskmaster.md +382 -0
- package/.roo/rules-architect/architect-rules +93 -0
- package/.roo/rules-ask/ask-rules +89 -0
- package/.roo/rules-boomerang/boomerang-rules +181 -0
- package/.roo/rules-code/code-rules +61 -0
- package/.roo/rules-debug/debug-rules +68 -0
- package/.roo/rules-test/test-rules +61 -0
- package/.roomodes +63 -0
- package/.taskmasterconfig +31 -0
- package/.windsurfrules +2382 -0
- package/LICENSE +21 -0
- package/README.md +210 -0
- package/config/credentials/credentials.json +1 -0
- package/config/default.js +41 -0
- package/package.json +56 -0
- package/scripts/demo-n8n-integration.js +161 -0
- package/scripts/demo-workflow-generator.js +102 -0
- package/scripts/init.sh +36 -0
- package/scripts/prd.txt +197 -0
- package/src/index.ts +1440 -0
- package/src/middleware/auth.js +273 -0
- package/src/middleware/authorize.js +183 -0
- package/src/middleware/logging.js +64 -0
- package/src/middleware/mcp.js +187 -0
- package/src/middleware/rateLimiter.js +82 -0
- package/src/middleware/validation.js +241 -0
- package/src/models/credential.js +359 -0
- package/src/models/llmService.js +236 -0
- package/src/models/n8nIntegration.js +542 -0
- package/src/models/storage.js +196 -0
- package/src/models/tool.js +148 -0
- package/src/models/user.js +164 -0
- package/src/models/workflow.js +229 -0
- package/src/routes/toolDefinitions.js +62 -0
- package/src/routes/toolExecution.js +79 -0
- package/src/tools/__index.js +242 -0
- package/src/tools/connectionManagement.js +500 -0
- package/src/tools/n8nIntegration.js +370 -0
- package/src/tools/nodeDiscovery.js +488 -0
- package/src/tools/nodeManagement.js +674 -0
- package/src/tools/toolDefinitions.js +660 -0
- package/src/tools/workflowCreation.js +100 -0
- package/src/tools/workflowGenerator.js +152 -0
- package/src/tools/workflowStorage.js +113 -0
- package/src/tools/workflowTesting.js +285 -0
- package/src/utils/encryption.js +164 -0
- package/src/utils/logger.js +84 -0
- package/src/utils/mcp.js +85 -0
- package/src/utils/securityLogger.js +109 -0
- package/tests/auth.test.js +402 -0
- package/tests/authorize.test.js +208 -0
- package/tests/run-memory-tests.js +55 -0
- package/tests/run-tests.js +55 -0
- package/tests/server.test.js +203 -0
- package/tests/unit/add-ai-connections.test.js +385 -0
- package/tests/unit/connectionManagement.test.js +309 -0
- package/tests/unit/langchain-llm-format.test.js +259 -0
- package/tests/unit/memory-connection.test.js +140 -0
- package/tests/unit/memory-integration.test.js +253 -0
- package/tests/unit/n8nIntegration.test.js +291 -0
- package/tests/unit/nodeDiscovery.test.js +270 -0
- package/tests/unit/nodeManagement.test.js +522 -0
- package/tests/unit/utils/mcp-test-utils.js +94 -0
- package/tests/unit/workflowCreation.test.js +110 -0
- package/tests/unit/workflowTesting.test.js +269 -0
- package/tests/user.test.js +181 -0
- package/tsconfig.json +20 -0
- package/workflow_nodes/Brandfetch.json +85 -0
- package/workflow_nodes/WorkflowTrigger.json +28 -0
- package/workflow_nodes/actionNetwork.json +218 -0
- package/workflow_nodes/activeCampaign.json +722 -0
- package/workflow_nodes/activeCampaignTrigger.json +52 -0
- package/workflow_nodes/acuitySchedulingTrigger.json +8 -0
- package/workflow_nodes/adalo.json +123 -0
- package/workflow_nodes/affinity.json +203 -0
- package/workflow_nodes/affinityTrigger.json +124 -0
- package/workflow_nodes/aggregate.json +119 -0
- package/workflow_nodes/agileCrm.json +503 -0
- package/workflow_nodes/aiTransform.json +17 -0
- package/workflow_nodes/airtable.json +226 -0
- package/workflow_nodes/airtableTrigger.json +120 -0
- package/workflow_nodes/airtop.json +10 -0
- package/workflow_nodes/amqp.json +62 -0
- package/workflow_nodes/amqpTrigger.json +8 -0
- package/workflow_nodes/apiTemplateIo.json +147 -0
- package/workflow_nodes/asana.json +446 -0
- package/workflow_nodes/asanaTrigger.json +52 -0
- package/workflow_nodes/automizy.json +195 -0
- package/workflow_nodes/autopilot.json +287 -0
- package/workflow_nodes/autopilotTrigger.json +8 -0
- package/workflow_nodes/awsCertificateManager.json +223 -0
- package/workflow_nodes/awsComprehend.json +125 -0
- package/workflow_nodes/awsDynamoDb.json +251 -0
- package/workflow_nodes/awsElb.json +174 -0
- package/workflow_nodes/awsLambda.json +69 -0
- package/workflow_nodes/awsRekognition.json +191 -0
- package/workflow_nodes/awsS3.json +32 -0
- package/workflow_nodes/awsSes.json +302 -0
- package/workflow_nodes/awsSns.json +110 -0
- package/workflow_nodes/awsSnsTrigger.json +47 -0
- package/workflow_nodes/awsSqs.json +140 -0
- package/workflow_nodes/awsTextract.json +43 -0
- package/workflow_nodes/awsTranscribe.json +217 -0
- package/workflow_nodes/azureCosmosDb.json +8 -0
- package/workflow_nodes/azureStorage.json +17 -0
- package/workflow_nodes/bambooHr.json +8 -0
- package/workflow_nodes/bannerbear.json +126 -0
- package/workflow_nodes/baserow.json +277 -0
- package/workflow_nodes/beeminder.json +146 -0
- package/workflow_nodes/bitbucketTrigger.json +62 -0
- package/workflow_nodes/bitly.json +130 -0
- package/workflow_nodes/bitwarden.json +224 -0
- package/workflow_nodes/box.json +457 -0
- package/workflow_nodes/boxTrigger.json +8 -0
- package/workflow_nodes/brevo.json +41 -0
- package/workflow_nodes/brevoTrigger.json +145 -0
- package/workflow_nodes/bubble.json +212 -0
- package/workflow_nodes/calTrigger.json +91 -0
- package/workflow_nodes/calendlyTrigger.json +71 -0
- package/workflow_nodes/chargebee.json +217 -0
- package/workflow_nodes/chargebeeTrigger.json +187 -0
- package/workflow_nodes/circleCi.json +89 -0
- package/workflow_nodes/ciscoWebex.json +593 -0
- package/workflow_nodes/ciscoWebexTrigger.json +159 -0
- package/workflow_nodes/clearbit.json +138 -0
- package/workflow_nodes/clickUp.json +793 -0
- package/workflow_nodes/clickUpTrigger.json +188 -0
- package/workflow_nodes/clockify.json +372 -0
- package/workflow_nodes/clockifyTrigger.json +26 -0
- package/workflow_nodes/cloudflare.json +103 -0
- package/workflow_nodes/cockpit.json +161 -0
- package/workflow_nodes/coda.json +242 -0
- package/workflow_nodes/code.json +40 -0
- package/workflow_nodes/coinGecko.json +363 -0
- package/workflow_nodes/compareDatasets.json +14 -0
- package/workflow_nodes/compression.json +66 -0
- package/workflow_nodes/contentful.json +29 -0
- package/workflow_nodes/convertKit.json +159 -0
- package/workflow_nodes/convertKitTrigger.json +109 -0
- package/workflow_nodes/convertToFile.json +64 -0
- package/workflow_nodes/copper.json +239 -0
- package/workflow_nodes/copperTrigger.json +8 -0
- package/workflow_nodes/cortex.json +348 -0
- package/workflow_nodes/crateDb.json +90 -0
- package/workflow_nodes/cron.json +23 -0
- package/workflow_nodes/crowdDev.json +8 -0
- package/workflow_nodes/crowdDevTrigger.json +8 -0
- package/workflow_nodes/crypto.json +147 -0
- package/workflow_nodes/customerIo.json +206 -0
- package/workflow_nodes/customerIoTrigger.json +185 -0
- package/workflow_nodes/dateTime.json +39 -0
- package/workflow_nodes/debughelper.json +162 -0
- package/workflow_nodes/deepL.json +103 -0
- package/workflow_nodes/demio.json +187 -0
- package/workflow_nodes/dhl.json +53 -0
- package/workflow_nodes/discord.json +81 -0
- package/workflow_nodes/discourse.json +319 -0
- package/workflow_nodes/disqus.json +254 -0
- package/workflow_nodes/drift.json +112 -0
- package/workflow_nodes/dropbox.json +258 -0
- package/workflow_nodes/dropcontact.json +154 -0
- package/workflow_nodes/e2eTest.json +70 -0
- package/workflow_nodes/editImage.json +132 -0
- package/workflow_nodes/egoi.json +220 -0
- package/workflow_nodes/elasticSecurity.json +401 -0
- package/workflow_nodes/elasticsearch.json +422 -0
- package/workflow_nodes/emailReadImap.json +88 -0
- package/workflow_nodes/emailSend.json +38 -0
- package/workflow_nodes/emelia.json +201 -0
- package/workflow_nodes/emeliaTrigger.json +57 -0
- package/workflow_nodes/erpNext.json +139 -0
- package/workflow_nodes/errorTrigger.json +15 -0
- package/workflow_nodes/evaluationMetrics.json +21 -0
- package/workflow_nodes/eventbriteTrigger.json +125 -0
- package/workflow_nodes/executeCommand.json +25 -0
- package/workflow_nodes/executeWorkflow.json +102 -0
- package/workflow_nodes/executeWorkflowTrigger.json +65 -0
- package/workflow_nodes/executionData.json +35 -0
- package/workflow_nodes/extractFromFile.json +71 -0
- package/workflow_nodes/facebookGraphApi.json +234 -0
- package/workflow_nodes/facebookLeadAdsTrigger.json +8 -0
- package/workflow_nodes/facebookTrigger.json +112 -0
- package/workflow_nodes/figmaTrigger.json +8 -0
- package/workflow_nodes/filemaker.json +268 -0
- package/workflow_nodes/filter.json +24 -0
- package/workflow_nodes/flow.json +323 -0
- package/workflow_nodes/flowTrigger.json +52 -0
- package/workflow_nodes/form.json +25 -0
- package/workflow_nodes/formIoTrigger.json +59 -0
- package/workflow_nodes/formTrigger.json +8 -0
- package/workflow_nodes/formstackTrigger.json +8 -0
- package/workflow_nodes/freshdesk.json +584 -0
- package/workflow_nodes/freshservice.json +899 -0
- package/workflow_nodes/freshworksCrm.json +772 -0
- package/workflow_nodes/ftp.json +127 -0
- package/workflow_nodes/function.json +22 -0
- package/workflow_nodes/functionItem.json +22 -0
- package/workflow_nodes/gSuiteAdmin.json +562 -0
- package/workflow_nodes/getResponse.json +310 -0
- package/workflow_nodes/getResponseTrigger.json +82 -0
- package/workflow_nodes/ghost.json +290 -0
- package/workflow_nodes/git.json +184 -0
- package/workflow_nodes/github.json +732 -0
- package/workflow_nodes/githubTrigger.json +317 -0
- package/workflow_nodes/gitlab.json +544 -0
- package/workflow_nodes/gitlabTrigger.json +61 -0
- package/workflow_nodes/gmail.json +62 -0
- package/workflow_nodes/gmailTrigger.json +127 -0
- package/workflow_nodes/goToWebinar.json +430 -0
- package/workflow_nodes/gong.json +22 -0
- package/workflow_nodes/googleAds.json +116 -0
- package/workflow_nodes/googleAnalytics.json +28 -0
- package/workflow_nodes/googleBigQuery.json +38 -0
- package/workflow_nodes/googleBooks.json +154 -0
- package/workflow_nodes/googleBusinessProfile.json +277 -0
- package/workflow_nodes/googleBusinessProfileTrigger.json +55 -0
- package/workflow_nodes/googleCalendar.json +474 -0
- package/workflow_nodes/googleCalendarTrigger.json +72 -0
- package/workflow_nodes/googleChat.json +187 -0
- package/workflow_nodes/googleCloudNaturalLanguage.json +171 -0
- package/workflow_nodes/googleCloudStorage.json +466 -0
- package/workflow_nodes/googleContacts.json +481 -0
- package/workflow_nodes/googleDocs.json +312 -0
- package/workflow_nodes/googleDrive.json +920 -0
- package/workflow_nodes/googleDriveTrigger.json +181 -0
- package/workflow_nodes/googleFirebaseCloudFirestore.json +156 -0
- package/workflow_nodes/googleFirebaseRealtimeDatabase.json +75 -0
- package/workflow_nodes/googlePerspective.json +94 -0
- package/workflow_nodes/googleSheets.json +98 -0
- package/workflow_nodes/googleSheetsTrigger.json +192 -0
- package/workflow_nodes/googleSlides.json +186 -0
- package/workflow_nodes/googleTasks.json +198 -0
- package/workflow_nodes/googleTranslate.json +80 -0
- package/workflow_nodes/gotify.json +110 -0
- package/workflow_nodes/grafana.json +155 -0
- package/workflow_nodes/graphql.json +165 -0
- package/workflow_nodes/grist.json +13 -0
- package/workflow_nodes/gumroadTrigger.json +8 -0
- package/workflow_nodes/hackerNews.json +100 -0
- package/workflow_nodes/haloPSA.json +286 -0
- package/workflow_nodes/harvest.json +699 -0
- package/workflow_nodes/helpScout.json +629 -0
- package/workflow_nodes/helpScoutTrigger.json +8 -0
- package/workflow_nodes/highLevel.json +8 -0
- package/workflow_nodes/homeAssistant.json +201 -0
- package/workflow_nodes/html.json +118 -0
- package/workflow_nodes/htmlExtract.json +87 -0
- package/workflow_nodes/httpRequest.json +472 -0
- package/workflow_nodes/hubspot.json +62 -0
- package/workflow_nodes/hubspotTrigger.json +138 -0
- package/workflow_nodes/humanticAi.json +82 -0
- package/workflow_nodes/hunter.json +168 -0
- package/workflow_nodes/iCal.json +20 -0
- package/workflow_nodes/if.json +24 -0
- package/workflow_nodes/intercom.json +335 -0
- package/workflow_nodes/interval.json +8 -0
- package/workflow_nodes/invoiceNinja.json +882 -0
- package/workflow_nodes/invoiceNinjaTrigger.json +11 -0
- package/workflow_nodes/itemLists.json +313 -0
- package/workflow_nodes/iterable.json +168 -0
- package/workflow_nodes/jenkins.json +172 -0
- package/workflow_nodes/jira.json +529 -0
- package/workflow_nodes/jiraTrigger.json +308 -0
- package/workflow_nodes/jotFormTrigger.json +44 -0
- package/workflow_nodes/jwt.json +195 -0
- package/workflow_nodes/kafka.json +132 -0
- package/workflow_nodes/kafkaTrigger.json +11 -0
- package/workflow_nodes/keap.json +915 -0
- package/workflow_nodes/keapTrigger.json +37 -0
- package/workflow_nodes/kitemaker.json +153 -0
- package/workflow_nodes/koBoToolbox.json +337 -0
- package/workflow_nodes/koBoToolboxTrigger.json +8 -0
- package/workflow_nodes/langchain_Summarization Chain.json +60 -0
- package/workflow_nodes/langchain_agent.json +145 -0
- package/workflow_nodes/langchain_allowFileUploads.json +180 -0
- package/workflow_nodes/langchain_chainLlm.json +16 -0
- package/workflow_nodes/langchain_chainSummarization.json +119 -0
- package/workflow_nodes/langchain_code.json +62 -0
- package/workflow_nodes/langchain_documentBinaryInputLoader.json +8 -0
- package/workflow_nodes/langchain_documentDefaultDataLoader.json +8 -0
- package/workflow_nodes/langchain_documentGithubLoader.json +8 -0
- package/workflow_nodes/langchain_documentJsonInputLoader.json +8 -0
- package/workflow_nodes/langchain_embeddingDimensions.json +17 -0
- package/workflow_nodes/langchain_embeddingsAwsBedrock.json +8 -0
- package/workflow_nodes/langchain_embeddingsAzureOpenAi.json +151 -0
- package/workflow_nodes/langchain_embeddingsCohere.json +8 -0
- package/workflow_nodes/langchain_embeddingsGoogleGemini.json +8 -0
- package/workflow_nodes/langchain_embeddingsGoogleVertex.json +8 -0
- package/workflow_nodes/langchain_embeddingsHuggingFaceInference.json +8 -0
- package/workflow_nodes/langchain_embeddingsMistralCloud.json +8 -0
- package/workflow_nodes/langchain_embeddingsOllama.json +8 -0
- package/workflow_nodes/langchain_informationExtractor.json +81 -0
- package/workflow_nodes/langchain_lmChatAwsBedrock.json +8 -0
- package/workflow_nodes/langchain_lmChatAzureOpenAi.json +151 -0
- package/workflow_nodes/langchain_lmChatDeepSeek.json +10 -0
- package/workflow_nodes/langchain_lmChatGoogleGemini.json +31 -0
- package/workflow_nodes/langchain_lmChatGoogleVertex.json +32 -0
- package/workflow_nodes/langchain_lmChatGroq.json +8 -0
- package/workflow_nodes/langchain_lmChatMistralCloud.json +8 -0
- package/workflow_nodes/langchain_lmChatOllama.json +8 -0
- package/workflow_nodes/langchain_lmChatOpenAi.json +155 -0
- package/workflow_nodes/langchain_lmChatOpenRouter.json +10 -0
- package/workflow_nodes/langchain_lmChatXAiGrok.json +10 -0
- package/workflow_nodes/langchain_lmCohere.json +8 -0
- package/workflow_nodes/langchain_lmOllama.json +8 -0
- package/workflow_nodes/langchain_lmOpenAi.json +251 -0
- package/workflow_nodes/langchain_lmOpenHuggingFaceInference.json +8 -0
- package/workflow_nodes/langchain_manualChatTrigger.json +11 -0
- package/workflow_nodes/langchain_mcpClientTool.json +86 -0
- package/workflow_nodes/langchain_mcpTrigger.json +8 -0
- package/workflow_nodes/langchain_memoryBufferWindow.json +13 -0
- package/workflow_nodes/langchain_memoryChatRetriever.json +22 -0
- package/workflow_nodes/langchain_memoryManager.json +106 -0
- package/workflow_nodes/langchain_memoryMongoDbChat.json +10 -0
- package/workflow_nodes/langchain_memoryMotorhead.json +13 -0
- package/workflow_nodes/langchain_memoryPostgresChat.json +13 -0
- package/workflow_nodes/langchain_memoryRedisChat.json +15 -0
- package/workflow_nodes/langchain_memoryXata.json +14 -0
- package/workflow_nodes/langchain_memoryZep.json +13 -0
- package/workflow_nodes/langchain_model.json +155 -0
- package/workflow_nodes/langchain_mongoCollection.json +16 -0
- package/workflow_nodes/langchain_notice.json +22 -0
- package/workflow_nodes/langchain_openAiAssistant.json +132 -0
- package/workflow_nodes/langchain_options.json +17 -0
- package/workflow_nodes/langchain_outputParserAutofixing.json +8 -0
- package/workflow_nodes/langchain_outputParserItemList.json +8 -0
- package/workflow_nodes/langchain_outputParserStructured.json +12 -0
- package/workflow_nodes/langchain_pineconeNamespace.json +16 -0
- package/workflow_nodes/langchain_queryName.json +16 -0
- package/workflow_nodes/langchain_retrieverContextualCompression.json +8 -0
- package/workflow_nodes/langchain_retrieverMultiQuery.json +8 -0
- package/workflow_nodes/langchain_retrieverVectorStore.json +8 -0
- package/workflow_nodes/langchain_retrieverWorkflow.json +103 -0
- package/workflow_nodes/langchain_sentimentAnalysis.json +52 -0
- package/workflow_nodes/langchain_systemPromptTemplate.json +47 -0
- package/workflow_nodes/langchain_tableName.json +23 -0
- package/workflow_nodes/langchain_textClassifier.json +66 -0
- package/workflow_nodes/langchain_textSplitterCharacterTextSplitter.json +8 -0
- package/workflow_nodes/langchain_textSplitterRecursiveCharacterTextSplitter.json +8 -0
- package/workflow_nodes/langchain_textSplitterTokenSplitter.json +8 -0
- package/workflow_nodes/langchain_toolCalculator.json +8 -0
- package/workflow_nodes/langchain_toolCode.json +12 -0
- package/workflow_nodes/langchain_toolHttpRequest.json +232 -0
- package/workflow_nodes/langchain_toolSearXng.json +8 -0
- package/workflow_nodes/langchain_toolSerpApi.json +8 -0
- package/workflow_nodes/langchain_toolThink.json +8 -0
- package/workflow_nodes/langchain_toolVectorStore.json +11 -0
- package/workflow_nodes/langchain_toolWikipedia.json +8 -0
- package/workflow_nodes/langchain_toolWolframAlpha.json +8 -0
- package/workflow_nodes/langchain_toolWorkflow.json +8 -0
- package/workflow_nodes/langchain_vectorStoreInMemoryInsert.json +29 -0
- package/workflow_nodes/langchain_vectorStoreInMemoryLoad.json +8 -0
- package/workflow_nodes/langchain_vectorStorePineconeInsert.json +37 -0
- package/workflow_nodes/langchain_vectorStorePineconeLoad.json +8 -0
- package/workflow_nodes/langchain_vectorStoreSupabaseInsert.json +32 -0
- package/workflow_nodes/langchain_vectorStoreSupabaseLoad.json +8 -0
- package/workflow_nodes/langchain_vectorStoreZepInsert.json +46 -0
- package/workflow_nodes/langchain_vectorStoreZepLoad.json +8 -0
- package/workflow_nodes/ldap.json +182 -0
- package/workflow_nodes/lemlist.json +44 -0
- package/workflow_nodes/lemlistTrigger.json +45 -0
- package/workflow_nodes/limit.json +26 -0
- package/workflow_nodes/line.json +95 -0
- package/workflow_nodes/linear.json +151 -0
- package/workflow_nodes/linearTrigger.json +71 -0
- package/workflow_nodes/lingvaNex.json +66 -0
- package/workflow_nodes/linkedIn.json +142 -0
- package/workflow_nodes/localFileTrigger.json +120 -0
- package/workflow_nodes/lonescale.json +171 -0
- package/workflow_nodes/lonescaleTrigger.json +8 -0
- package/workflow_nodes/magento2.json +164 -0
- package/workflow_nodes/mailcheck.json +46 -0
- package/workflow_nodes/mailchimp.json +507 -0
- package/workflow_nodes/mailchimpTrigger.json +100 -0
- package/workflow_nodes/mailerLite.json +24 -0
- package/workflow_nodes/mailerLiteTrigger.json +74 -0
- package/workflow_nodes/mailgun.json +81 -0
- package/workflow_nodes/mailjet.json +201 -0
- package/workflow_nodes/mailjetTrigger.json +8 -0
- package/workflow_nodes/mandrill.json +372 -0
- package/workflow_nodes/manualTrigger.json +8 -0
- package/workflow_nodes/markdown.json +376 -0
- package/workflow_nodes/marketstack.json +126 -0
- package/workflow_nodes/matrix.json +264 -0
- package/workflow_nodes/mattermost.json +8 -0
- package/workflow_nodes/mautic.json +564 -0
- package/workflow_nodes/mauticTrigger.json +54 -0
- package/workflow_nodes/medium.json +209 -0
- package/workflow_nodes/merge.json +125 -0
- package/workflow_nodes/messageBird.json +182 -0
- package/workflow_nodes/metabase.json +175 -0
- package/workflow_nodes/microsoftDynamicsCrm.json +100 -0
- package/workflow_nodes/microsoftEntra.json +51 -0
- package/workflow_nodes/microsoftExcel.json +35 -0
- package/workflow_nodes/microsoftGraphSecurity.json +113 -0
- package/workflow_nodes/microsoftOneDrive.json +232 -0
- package/workflow_nodes/microsoftOneDriveTrigger.json +80 -0
- package/workflow_nodes/microsoftOutlook.json +40 -0
- package/workflow_nodes/microsoftOutlookTrigger.json +24 -0
- package/workflow_nodes/microsoftSql.json +81 -0
- package/workflow_nodes/microsoftTeams.json +36 -0
- package/workflow_nodes/microsoftToDo.json +181 -0
- package/workflow_nodes/mindee.json +86 -0
- package/workflow_nodes/misp.json +399 -0
- package/workflow_nodes/mocean.json +103 -0
- package/workflow_nodes/mondayCom.json +290 -0
- package/workflow_nodes/mongoDb.json +16 -0
- package/workflow_nodes/monicaCrm.json +543 -0
- package/workflow_nodes/moveBinaryData.json +121 -0
- package/workflow_nodes/mqtt.json +67 -0
- package/workflow_nodes/mqttTrigger.json +47 -0
- package/workflow_nodes/msg91.json +65 -0
- package/workflow_nodes/mySql.json +111 -0
- package/workflow_nodes/n8n.json +75 -0
- package/workflow_nodes/n8nTrigger.json +27 -0
- package/workflow_nodes/nasa.json +310 -0
- package/workflow_nodes/netlify.json +87 -0
- package/workflow_nodes/netlifyTrigger.json +68 -0
- package/workflow_nodes/netscalerAdc.json +243 -0
- package/workflow_nodes/nextCloud.json +312 -0
- package/workflow_nodes/noOp.json +8 -0
- package/workflow_nodes/nocoDb.json +276 -0
- package/workflow_nodes/notion.json +8 -0
- package/workflow_nodes/notionTrigger.json +75 -0
- package/workflow_nodes/npm.json +64 -0
- package/workflow_nodes/odoo.json +344 -0
- package/workflow_nodes/okta.json +97 -0
- package/workflow_nodes/oneSimpleApi.json +281 -0
- package/workflow_nodes/onfleet.json +316 -0
- package/workflow_nodes/onfleetTrigger.json +8 -0
- package/workflow_nodes/openAi.json +154 -0
- package/workflow_nodes/openThesaurus.json +81 -0
- package/workflow_nodes/openWeatherMap.json +129 -0
- package/workflow_nodes/orbit.json +375 -0
- package/workflow_nodes/oura.json +74 -0
- package/workflow_nodes/paddle.json +403 -0
- package/workflow_nodes/pagerDuty.json +351 -0
- package/workflow_nodes/payPal.json +196 -0
- package/workflow_nodes/payPalTrigger.json +40 -0
- package/workflow_nodes/peekalink.json +41 -0
- package/workflow_nodes/phantombuster.json +172 -0
- package/workflow_nodes/philipsHue.json +177 -0
- package/workflow_nodes/pipedrive.json +860 -0
- package/workflow_nodes/pipedriveTrigger.json +11 -0
- package/workflow_nodes/plivo.json +91 -0
- package/workflow_nodes/postHog.json +122 -0
- package/workflow_nodes/postbin.json +60 -0
- package/workflow_nodes/postgres.json +109 -0
- package/workflow_nodes/postgresTrigger.json +8 -0
- package/workflow_nodes/postmarkTrigger.json +72 -0
- package/workflow_nodes/profitWell.json +305 -0
- package/workflow_nodes/pushbullet.json +186 -0
- package/workflow_nodes/pushcut.json +75 -0
- package/workflow_nodes/pushcutTrigger.json +8 -0
- package/workflow_nodes/pushover.json +159 -0
- package/workflow_nodes/questDb.json +94 -0
- package/workflow_nodes/quickChart.json +188 -0
- package/workflow_nodes/quickbase.json +205 -0
- package/workflow_nodes/quickbooks.json +550 -0
- package/workflow_nodes/rabbitmq.json +165 -0
- package/workflow_nodes/rabbitmqTrigger.json +8 -0
- package/workflow_nodes/raindrop.json +216 -0
- package/workflow_nodes/readBinaryFile.json +26 -0
- package/workflow_nodes/readBinaryFiles.json +26 -0
- package/workflow_nodes/readPDF.json +31 -0
- package/workflow_nodes/readWriteFile.json +27 -0
- package/workflow_nodes/reddit.json +309 -0
- package/workflow_nodes/redis.json +183 -0
- package/workflow_nodes/redisTrigger.json +8 -0
- package/workflow_nodes/removeDuplicates.json +8 -0
- package/workflow_nodes/renameKeys.json +67 -0
- package/workflow_nodes/respondToWebhook.json +126 -0
- package/workflow_nodes/rocketchat.json +216 -0
- package/workflow_nodes/rssFeedRead.json +28 -0
- package/workflow_nodes/rssFeedReadTrigger.json +17 -0
- package/workflow_nodes/rundeck.json +79 -0
- package/workflow_nodes/s3.json +425 -0
- package/workflow_nodes/salesforce.json +1137 -0
- package/workflow_nodes/salesforceTrigger.json +122 -0
- package/workflow_nodes/salesmate.json +467 -0
- package/workflow_nodes/scheduleTrigger.json +270 -0
- package/workflow_nodes/seaTable.json +8 -0
- package/workflow_nodes/seaTableTrigger.json +87 -0
- package/workflow_nodes/securityScorecard.json +459 -0
- package/workflow_nodes/segment.json +219 -0
- package/workflow_nodes/sendGrid.json +359 -0
- package/workflow_nodes/sendy.json +225 -0
- package/workflow_nodes/sentryIo.json +426 -0
- package/workflow_nodes/serviceNow.json +544 -0
- package/workflow_nodes/set.json +124 -0
- package/workflow_nodes/shopify.json +707 -0
- package/workflow_nodes/shopifyTrigger.json +8 -0
- package/workflow_nodes/signl4.json +133 -0
- package/workflow_nodes/simulate.json +30 -0
- package/workflow_nodes/simulateTrigger.json +8 -0
- package/workflow_nodes/slack.json +62 -0
- package/workflow_nodes/slackTrigger.json +135 -0
- package/workflow_nodes/sms77.json +121 -0
- package/workflow_nodes/snowflake.json +65 -0
- package/workflow_nodes/sort.json +57 -0
- package/workflow_nodes/splitInBatches.json +30 -0
- package/workflow_nodes/splitOut.json +62 -0
- package/workflow_nodes/splunk.json +40 -0
- package/workflow_nodes/spontit.json +123 -0
- package/workflow_nodes/spotify.json +285 -0
- package/workflow_nodes/spreadsheetFile.json +8 -0
- package/workflow_nodes/sseTrigger.json +8 -0
- package/workflow_nodes/ssh.json +105 -0
- package/workflow_nodes/stackby.json +85 -0
- package/workflow_nodes/start.json +15 -0
- package/workflow_nodes/stickyNote.json +36 -0
- package/workflow_nodes/stopAndError.json +8 -0
- package/workflow_nodes/storyblok.json +138 -0
- package/workflow_nodes/strapi.json +138 -0
- package/workflow_nodes/strava.json +427 -0
- package/workflow_nodes/stravaTrigger.json +79 -0
- package/workflow_nodes/stripe.json +357 -0
- package/workflow_nodes/stripeTrigger.json +775 -0
- package/workflow_nodes/summarize.json +124 -0
- package/workflow_nodes/supabase.json +136 -0
- package/workflow_nodes/surveyMonkeyTrigger.json +160 -0
- package/workflow_nodes/switch.json +91 -0
- package/workflow_nodes/syncroMsp.json +8 -0
- package/workflow_nodes/taiga.json +340 -0
- package/workflow_nodes/taigaTrigger.json +81 -0
- package/workflow_nodes/tapfiliate.json +241 -0
- package/workflow_nodes/telegram.json +612 -0
- package/workflow_nodes/telegramTrigger.json +142 -0
- package/workflow_nodes/theHive.json +497 -0
- package/workflow_nodes/theHiveProject.json +8 -0
- package/workflow_nodes/theHiveProjectTrigger.json +162 -0
- package/workflow_nodes/theHiveTrigger.json +101 -0
- package/workflow_nodes/timescaleDb.json +95 -0
- package/workflow_nodes/todoist.json +285 -0
- package/workflow_nodes/togglTrigger.json +24 -0
- package/workflow_nodes/totp.json +86 -0
- package/workflow_nodes/travisCi.json +142 -0
- package/workflow_nodes/trello.json +609 -0
- package/workflow_nodes/trelloTrigger.json +8 -0
- package/workflow_nodes/twake.json +76 -0
- package/workflow_nodes/twilio.json +95 -0
- package/workflow_nodes/twilioTrigger.json +46 -0
- package/workflow_nodes/twist.json +376 -0
- package/workflow_nodes/twitter.json +40 -0
- package/workflow_nodes/typeformTrigger.json +62 -0
- package/workflow_nodes/unleashedSoftware.json +154 -0
- package/workflow_nodes/uplead.json +72 -0
- package/workflow_nodes/uproc.json +26 -0
- package/workflow_nodes/uptimeRobot.json +453 -0
- package/workflow_nodes/urlScanIo.json +113 -0
- package/workflow_nodes/venafiTlsProtectCloud.json +310 -0
- package/workflow_nodes/venafiTlsProtectCloudTrigger.json +38 -0
- package/workflow_nodes/venafiTlsProtectDatacenter.json +491 -0
- package/workflow_nodes/vero.json +158 -0
- package/workflow_nodes/vonage.json +125 -0
- package/workflow_nodes/wait.json +71 -0
- package/workflow_nodes/webflow.json +38 -0
- package/workflow_nodes/webflowTrigger.json +8 -0
- package/workflow_nodes/webhook.json +55 -0
- package/workflow_nodes/wekan.json +460 -0
- package/workflow_nodes/whatsApp.json +476 -0
- package/workflow_nodes/whatsAppTrigger.json +103 -0
- package/workflow_nodes/wise.json +330 -0
- package/workflow_nodes/wiseTrigger.json +8 -0
- package/workflow_nodes/wooCommerce.json +812 -0
- package/workflow_nodes/wooCommerceTrigger.json +8 -0
- package/workflow_nodes/wordpress.json +500 -0
- package/workflow_nodes/workableTrigger.json +51 -0
- package/workflow_nodes/writeBinaryFile.json +34 -0
- package/workflow_nodes/wufooTrigger.json +37 -0
- package/workflow_nodes/xero.json +530 -0
- package/workflow_nodes/xml.json +129 -0
- package/workflow_nodes/youTube.json +578 -0
- package/workflow_nodes/yourls.json +71 -0
- package/workflow_nodes/zammad.json +406 -0
- package/workflow_nodes/zendesk.json +526 -0
- package/workflow_nodes/zendeskTrigger.json +187 -0
- package/workflow_nodes/zohoCrm.json +721 -0
- package/workflow_nodes/zoom.json +507 -0
- package/workflow_nodes/zulip.json +371 -0
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow Creation Tools
|
|
3
|
+
*
|
|
4
|
+
* Tools for creating and modifying workflows
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const { v4: uuidv4 } = require('uuid');
|
|
8
|
+
const path = require('path');
|
|
9
|
+
const fs = require('fs');
|
|
10
|
+
const { logger } = require('../utils/logger');
|
|
11
|
+
const { logSecurityEvent } = require('../utils/securityLogger');
|
|
12
|
+
const { workflowStorage } = require('../models/storage');
|
|
13
|
+
|
|
14
|
+
// Constants
|
|
15
|
+
const DEFAULT_WORKFLOW_DIR = process.env.WORKFLOW_DIR || path.join(process.cwd(), 'workflow_data');
|
|
16
|
+
|
|
17
|
+
// Create workflow directory if it doesn't exist
|
|
18
|
+
if (!fs.existsSync(DEFAULT_WORKFLOW_DIR)) {
|
|
19
|
+
fs.mkdirSync(DEFAULT_WORKFLOW_DIR, { recursive: true });
|
|
20
|
+
logger.info(`Created workflow directory: ${DEFAULT_WORKFLOW_DIR}`);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* Create a new workflow
|
|
25
|
+
*
|
|
26
|
+
* @param {Object} params - Parameters for creating workflow
|
|
27
|
+
* @param {string} params.name - Name of the workflow
|
|
28
|
+
* @param {string} [params.workflow_filename] - Custom filename for the workflow
|
|
29
|
+
* @param {string} [params.description] - Description of the workflow
|
|
30
|
+
* @param {boolean} [params.active] - Whether the workflow is active
|
|
31
|
+
* @param {Object} [params.settings] - Custom workflow settings
|
|
32
|
+
* @param {string} [params.userId] - User ID for security logging
|
|
33
|
+
* @returns {Object} Created workflow data and file path
|
|
34
|
+
*/
|
|
35
|
+
const createWorkflowExecute = async (params) => {
|
|
36
|
+
const { name, workflow_filename, description = '', active = false, settings = {}, userId } = params;
|
|
37
|
+
|
|
38
|
+
// Security logging
|
|
39
|
+
logSecurityEvent({
|
|
40
|
+
level: 'info',
|
|
41
|
+
eventType: 'workflow_create',
|
|
42
|
+
userId: userId || 'anonymous',
|
|
43
|
+
details: {
|
|
44
|
+
name,
|
|
45
|
+
active,
|
|
46
|
+
workflow_filename
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
// Generate a unique ID for the workflow
|
|
51
|
+
const workflowId = uuidv4();
|
|
52
|
+
|
|
53
|
+
// Create basic workflow structure
|
|
54
|
+
const workflow = {
|
|
55
|
+
id: workflowId,
|
|
56
|
+
name,
|
|
57
|
+
description,
|
|
58
|
+
active,
|
|
59
|
+
createdAt: new Date().toISOString(),
|
|
60
|
+
updatedAt: new Date().toISOString(),
|
|
61
|
+
settings: {
|
|
62
|
+
saveExecutionProgress: true,
|
|
63
|
+
saveManualExecutions: true,
|
|
64
|
+
saveDataErrorExecution: 'all',
|
|
65
|
+
saveDataSuccessExecution: 'all',
|
|
66
|
+
executionTimeout: 3600,
|
|
67
|
+
...settings
|
|
68
|
+
},
|
|
69
|
+
nodes: [],
|
|
70
|
+
connections: {},
|
|
71
|
+
pinData: {},
|
|
72
|
+
staticData: null,
|
|
73
|
+
tags: []
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
// Determine the file path
|
|
77
|
+
let filePath;
|
|
78
|
+
if (workflow_filename) {
|
|
79
|
+
// Ensure filename ends with .json
|
|
80
|
+
const filename = workflow_filename.endsWith('.json') ? workflow_filename : `${workflow_filename}.json`;
|
|
81
|
+
filePath = path.join(DEFAULT_WORKFLOW_DIR, filename);
|
|
82
|
+
} else {
|
|
83
|
+
filePath = path.join(DEFAULT_WORKFLOW_DIR, `${workflowId}.json`);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Save the workflow
|
|
87
|
+
await workflowStorage.saveWorkflow(workflowId, workflow, filePath);
|
|
88
|
+
|
|
89
|
+
logger.info(`Created new workflow: ${name} (${workflowId}) at ${filePath}`);
|
|
90
|
+
|
|
91
|
+
return {
|
|
92
|
+
workflowId,
|
|
93
|
+
workflowData: workflow,
|
|
94
|
+
filePath
|
|
95
|
+
};
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
module.exports = {
|
|
99
|
+
createWorkflowExecute
|
|
100
|
+
};
|
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow Generator Tool
|
|
3
|
+
*
|
|
4
|
+
* Converts natural language descriptions into complete n8n workflow JSON.
|
|
5
|
+
* Uses LLM to generate nodes and connections based on the workflow description.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const { createTool } = require('../models/tool');
|
|
9
|
+
const { logger } = require('../utils/logger');
|
|
10
|
+
const fs = require('fs').promises;
|
|
11
|
+
const path = require('path');
|
|
12
|
+
const config = require('../../config/default');
|
|
13
|
+
const { workflowStorage } = require('../models/storage');
|
|
14
|
+
const { logDataAccess } = require('../utils/securityLogger');
|
|
15
|
+
const { generateWorkflow } = require('../models/llmService');
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Generate an n8n workflow JSON based on a natural language description
|
|
19
|
+
*
|
|
20
|
+
* @param {Object} params - Tool parameters
|
|
21
|
+
* @returns {Promise<Object>} Generated workflow data and file path
|
|
22
|
+
*/
|
|
23
|
+
const generateWorkflowExecute = async (params) => {
|
|
24
|
+
try {
|
|
25
|
+
const { description, name, savePath, userId, llmProvider, copyToClipboard } = params;
|
|
26
|
+
|
|
27
|
+
logger.info('Generating workflow from description', {
|
|
28
|
+
name: name || 'Unnamed Workflow',
|
|
29
|
+
descriptionLength: description.length,
|
|
30
|
+
llmProvider: llmProvider || 'default'
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
// Create workflow structure
|
|
34
|
+
const workflow = {
|
|
35
|
+
name: name || `Generated Workflow ${new Date().toISOString().split('T')[0]}`,
|
|
36
|
+
active: false,
|
|
37
|
+
nodes: [],
|
|
38
|
+
connections: {},
|
|
39
|
+
settings: {
|
|
40
|
+
executionOrder: 'v1', // Standard n8n execution order
|
|
41
|
+
saveExecutionProgress: true,
|
|
42
|
+
saveManualExecutions: true,
|
|
43
|
+
saveDataErrorExecution: 'all',
|
|
44
|
+
saveDataSuccessExecution: 'all',
|
|
45
|
+
callerPolicy: 'workflowsFromSameOwner',
|
|
46
|
+
errorWorkflow: ''
|
|
47
|
+
},
|
|
48
|
+
tags: [],
|
|
49
|
+
pinData: {},
|
|
50
|
+
id: `generated-workflow-${Date.now()}`,
|
|
51
|
+
createdAt: new Date().toISOString(),
|
|
52
|
+
updatedAt: new Date().toISOString()
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
// Setup LLM options
|
|
56
|
+
const llmOptions = {};
|
|
57
|
+
if (llmProvider) {
|
|
58
|
+
llmOptions.provider = llmProvider;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Process description to generate nodes using LLM
|
|
62
|
+
const generatedNodes = await generateWorkflow(description, llmOptions);
|
|
63
|
+
workflow.nodes = generatedNodes.nodes;
|
|
64
|
+
workflow.connections = generatedNodes.connections;
|
|
65
|
+
|
|
66
|
+
// Add relevant tags based on the workflow purpose
|
|
67
|
+
if (description.toLowerCase().includes('http') || description.toLowerCase().includes('api')) {
|
|
68
|
+
workflow.tags.push({ name: 'API' });
|
|
69
|
+
}
|
|
70
|
+
if (description.toLowerCase().includes('automat')) {
|
|
71
|
+
workflow.tags.push({ name: 'Automation' });
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// Save workflow to file if path is provided
|
|
75
|
+
let filePath;
|
|
76
|
+
if (savePath) {
|
|
77
|
+
filePath = savePath;
|
|
78
|
+
} else {
|
|
79
|
+
// Use default storage location
|
|
80
|
+
filePath = path.join(config.storage.workflowsPath, `${workflow.id}.json`);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
await workflowStorage.saveWorkflow(workflow.id, workflow, filePath);
|
|
84
|
+
|
|
85
|
+
// Log the operation
|
|
86
|
+
logDataAccess({
|
|
87
|
+
success: true,
|
|
88
|
+
userId: userId || 'anonymous',
|
|
89
|
+
dataType: 'workflow',
|
|
90
|
+
action: 'generate',
|
|
91
|
+
resourceId: workflow.id,
|
|
92
|
+
details: { nodeCount: workflow.nodes.length }
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
return {
|
|
96
|
+
success: true,
|
|
97
|
+
workflow,
|
|
98
|
+
filePath,
|
|
99
|
+
json: JSON.stringify(workflow, null, 2), // Pretty-printed JSON for easy copying
|
|
100
|
+
message: `Workflow generated successfully from description and saved to ${filePath}`
|
|
101
|
+
};
|
|
102
|
+
} catch (error) {
|
|
103
|
+
logger.error('Failed to generate workflow', { error: error.message });
|
|
104
|
+
|
|
105
|
+
// Log the failed operation
|
|
106
|
+
logDataAccess({
|
|
107
|
+
success: false,
|
|
108
|
+
userId: params.userId || 'anonymous',
|
|
109
|
+
dataType: 'workflow',
|
|
110
|
+
action: 'generate',
|
|
111
|
+
reason: error.message
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
throw new Error(`Failed to generate workflow: ${error.message}`);
|
|
115
|
+
}
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
// Define the generate workflow tool
|
|
119
|
+
const generateWorkflowTool = createTool(
|
|
120
|
+
'Generate a complete n8n workflow from a natural language description',
|
|
121
|
+
{
|
|
122
|
+
description: {
|
|
123
|
+
type: 'string',
|
|
124
|
+
description: 'Natural language description of the workflow to generate'
|
|
125
|
+
},
|
|
126
|
+
name: {
|
|
127
|
+
type: 'string',
|
|
128
|
+
description: 'Name for the generated workflow',
|
|
129
|
+
optional: true
|
|
130
|
+
},
|
|
131
|
+
savePath: {
|
|
132
|
+
type: 'string',
|
|
133
|
+
description: 'Path where the workflow JSON file should be saved',
|
|
134
|
+
optional: true
|
|
135
|
+
},
|
|
136
|
+
llmProvider: {
|
|
137
|
+
type: 'string',
|
|
138
|
+
description: 'LLM provider to use (openai, anthropic)',
|
|
139
|
+
optional: true
|
|
140
|
+
},
|
|
141
|
+
userId: {
|
|
142
|
+
type: 'string',
|
|
143
|
+
description: 'User identifier for security logging',
|
|
144
|
+
optional: true
|
|
145
|
+
}
|
|
146
|
+
},
|
|
147
|
+
generateWorkflowExecute
|
|
148
|
+
);
|
|
149
|
+
|
|
150
|
+
module.exports = {
|
|
151
|
+
generateWorkflowTool
|
|
152
|
+
};
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow Storage Tools
|
|
3
|
+
*
|
|
4
|
+
* Tools for saving, loading, and managing workflow files
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const { v4: uuidv4 } = require('uuid');
|
|
8
|
+
const { logger } = require('../utils/logger');
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Save a workflow to storage
|
|
12
|
+
*
|
|
13
|
+
* @param {Object} params - Save parameters
|
|
14
|
+
* @param {string} params.workflowId - ID of the workflow to save
|
|
15
|
+
* @param {Object} params.workflowData - Workflow data to save
|
|
16
|
+
* @returns {Object} Save operation result
|
|
17
|
+
*/
|
|
18
|
+
const saveWorkflowExecute = async (params) => {
|
|
19
|
+
const { workflowId, workflowData } = params;
|
|
20
|
+
|
|
21
|
+
logger.info(`Saving workflow ${workflowId}`);
|
|
22
|
+
|
|
23
|
+
// Mock implementation
|
|
24
|
+
return {
|
|
25
|
+
success: true,
|
|
26
|
+
workflowId,
|
|
27
|
+
filePath: `/path/to/workflows/${workflowId}.json`
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Load a workflow from storage
|
|
33
|
+
*
|
|
34
|
+
* @param {Object} params - Load parameters
|
|
35
|
+
* @param {string} params.workflowId - ID of the workflow to load
|
|
36
|
+
* @returns {Object} Load operation result with workflow data
|
|
37
|
+
*/
|
|
38
|
+
const loadWorkflowExecute = async (params) => {
|
|
39
|
+
const { workflowId } = params;
|
|
40
|
+
|
|
41
|
+
logger.info(`Loading workflow ${workflowId}`);
|
|
42
|
+
|
|
43
|
+
// Mock implementation
|
|
44
|
+
return {
|
|
45
|
+
workflowId,
|
|
46
|
+
workflowData: {
|
|
47
|
+
id: workflowId,
|
|
48
|
+
name: 'Mock Workflow',
|
|
49
|
+
nodes: [],
|
|
50
|
+
connections: {}
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* List available workflows
|
|
57
|
+
*
|
|
58
|
+
* @param {Object} params - List parameters
|
|
59
|
+
* @param {number} [params.limit] - Maximum number of workflows to return
|
|
60
|
+
* @param {number} [params.offset] - Number of workflows to skip
|
|
61
|
+
* @returns {Object} List of workflows
|
|
62
|
+
*/
|
|
63
|
+
const listWorkflowsExecute = async (params) => {
|
|
64
|
+
const { limit = 10, offset = 0 } = params;
|
|
65
|
+
|
|
66
|
+
logger.info(`Listing workflows (limit: ${limit}, offset: ${offset})`);
|
|
67
|
+
|
|
68
|
+
// Mock implementation
|
|
69
|
+
return {
|
|
70
|
+
workflows: [
|
|
71
|
+
{
|
|
72
|
+
id: 'wf1',
|
|
73
|
+
name: 'Mock Workflow 1',
|
|
74
|
+
path: '/path/to/workflows/wf1.json',
|
|
75
|
+
lastModified: new Date().toISOString()
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
id: 'wf2',
|
|
79
|
+
name: 'Mock Workflow 2',
|
|
80
|
+
path: '/path/to/workflows/wf2.json',
|
|
81
|
+
lastModified: new Date().toISOString()
|
|
82
|
+
}
|
|
83
|
+
],
|
|
84
|
+
total: 2
|
|
85
|
+
};
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Delete a workflow
|
|
90
|
+
*
|
|
91
|
+
* @param {Object} params - Delete parameters
|
|
92
|
+
* @param {string} params.workflowId - ID of the workflow to delete
|
|
93
|
+
* @returns {Object} Delete operation result
|
|
94
|
+
*/
|
|
95
|
+
const deleteWorkflowExecute = async (params) => {
|
|
96
|
+
const { workflowId } = params;
|
|
97
|
+
|
|
98
|
+
logger.info(`Deleting workflow ${workflowId}`);
|
|
99
|
+
|
|
100
|
+
// Mock implementation
|
|
101
|
+
return {
|
|
102
|
+
success: true,
|
|
103
|
+
workflowId,
|
|
104
|
+
deletedPath: `/path/to/workflows/${workflowId}.json`
|
|
105
|
+
};
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
module.exports = {
|
|
109
|
+
saveWorkflowExecute,
|
|
110
|
+
loadWorkflowExecute,
|
|
111
|
+
listWorkflowsExecute,
|
|
112
|
+
deleteWorkflowExecute
|
|
113
|
+
};
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow Testing Tools
|
|
3
|
+
*
|
|
4
|
+
* MCP tools for testing workflow execution and returning results.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const { createTool } = require('../models/tool');
|
|
8
|
+
const { logger } = require('../utils/logger');
|
|
9
|
+
const { logDataAccess } = require('../utils/securityLogger');
|
|
10
|
+
const { workflowStorage } = require('../models/storage');
|
|
11
|
+
const config = require('../../config/default');
|
|
12
|
+
const fetch = require('node-fetch');
|
|
13
|
+
const { getIntegrationType } = require('../models/n8nIntegration');
|
|
14
|
+
const AbortController = require('abort-controller');
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Execute a workflow with test data and return the results
|
|
18
|
+
*
|
|
19
|
+
* @param {Object} params - The execution parameters
|
|
20
|
+
* @returns {Promise<Object>} The execution results
|
|
21
|
+
*/
|
|
22
|
+
const executeWorkflow = async (params) => {
|
|
23
|
+
const { workflowId, testData, timeout = 60000 } = params;
|
|
24
|
+
const integrationType = getIntegrationType();
|
|
25
|
+
|
|
26
|
+
try {
|
|
27
|
+
// Load workflow
|
|
28
|
+
const workflow = await workflowStorage.loadWorkflow(workflowId);
|
|
29
|
+
if (!workflow) {
|
|
30
|
+
throw new Error(`Workflow with ID ${workflowId} not found`);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
logger.info('Executing workflow test', {
|
|
34
|
+
workflowId,
|
|
35
|
+
integrationType,
|
|
36
|
+
hasTestData: !!testData
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
if (integrationType === 'api') {
|
|
40
|
+
// Create abort controller for timeout handling
|
|
41
|
+
const controller = new AbortController();
|
|
42
|
+
const timeoutId = setTimeout(() => controller.abort(), timeout);
|
|
43
|
+
|
|
44
|
+
try {
|
|
45
|
+
// Execute via n8n API
|
|
46
|
+
const response = await fetch(`${config.n8n.apiUrl}workflows/${workflowId}/execute`, {
|
|
47
|
+
method: 'POST',
|
|
48
|
+
headers: {
|
|
49
|
+
'Content-Type': 'application/json',
|
|
50
|
+
'X-N8N-API-KEY': config.n8n.apiKey
|
|
51
|
+
},
|
|
52
|
+
body: JSON.stringify({ data: testData || {} }),
|
|
53
|
+
signal: controller.signal
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
// Clear the timeout since the request completed
|
|
57
|
+
clearTimeout(timeoutId);
|
|
58
|
+
|
|
59
|
+
if (!response.ok) {
|
|
60
|
+
const errorData = await response.json().catch(() => ({}));
|
|
61
|
+
logger.error('n8n API error during workflow execution', {
|
|
62
|
+
status: response.status,
|
|
63
|
+
error: errorData
|
|
64
|
+
});
|
|
65
|
+
throw new Error(`Failed to execute workflow: ${response.status} ${response.statusText}`);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const result = await response.json();
|
|
69
|
+
|
|
70
|
+
// Log successful execution
|
|
71
|
+
logDataAccess({
|
|
72
|
+
success: true,
|
|
73
|
+
dataType: 'workflow',
|
|
74
|
+
action: 'execute',
|
|
75
|
+
resourceId: workflowId,
|
|
76
|
+
details: { integrationType, executionId: result.executionId || 'unknown' }
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
return {
|
|
80
|
+
success: true,
|
|
81
|
+
executionId: result.executionId,
|
|
82
|
+
data: result.data,
|
|
83
|
+
logs: result.logs || [],
|
|
84
|
+
executionTime: result.executionTime || null,
|
|
85
|
+
status: result.status || 'completed'
|
|
86
|
+
};
|
|
87
|
+
} catch (error) {
|
|
88
|
+
clearTimeout(timeoutId);
|
|
89
|
+
|
|
90
|
+
if (error.name === 'AbortError') {
|
|
91
|
+
// Handle timeout error
|
|
92
|
+
logger.error('Workflow execution timed out', { workflowId, timeout });
|
|
93
|
+
|
|
94
|
+
// Log timeout
|
|
95
|
+
logDataAccess({
|
|
96
|
+
success: false,
|
|
97
|
+
dataType: 'workflow',
|
|
98
|
+
action: 'execute',
|
|
99
|
+
resourceId: workflowId,
|
|
100
|
+
reason: `Execution timed out after ${timeout}ms`
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
throw new Error(`Workflow execution timed out after ${timeout}ms`);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
throw error;
|
|
107
|
+
}
|
|
108
|
+
} else if (integrationType === 'filesystem') {
|
|
109
|
+
// For filesystem integration, we don't have a built-in way to execute
|
|
110
|
+
logger.warn('Workflow execution not supported for filesystem integration', { workflowId });
|
|
111
|
+
|
|
112
|
+
// Log the limitation
|
|
113
|
+
logDataAccess({
|
|
114
|
+
success: false,
|
|
115
|
+
dataType: 'workflow',
|
|
116
|
+
action: 'execute',
|
|
117
|
+
resourceId: workflowId,
|
|
118
|
+
reason: 'Direct workflow execution not supported for filesystem integration'
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
throw new Error('Direct workflow execution not supported for filesystem integration. Please use the n8n API integration type.');
|
|
122
|
+
} else {
|
|
123
|
+
throw new Error('Invalid integration type');
|
|
124
|
+
}
|
|
125
|
+
} catch (error) {
|
|
126
|
+
logger.error('Failed to execute workflow', {
|
|
127
|
+
workflowId,
|
|
128
|
+
error: error.message
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
// Log the failed operation (if not already logged)
|
|
132
|
+
if (error.message !== 'Direct workflow execution not supported for filesystem integration. Please use the n8n API integration type.') {
|
|
133
|
+
logDataAccess({
|
|
134
|
+
success: false,
|
|
135
|
+
dataType: 'workflow',
|
|
136
|
+
action: 'execute',
|
|
137
|
+
resourceId: workflowId,
|
|
138
|
+
reason: error.message
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
throw new Error(`Failed to execute workflow: ${error.message}`);
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Get the execution status of a workflow execution
|
|
148
|
+
*
|
|
149
|
+
* @param {Object} params - The status parameters
|
|
150
|
+
* @returns {Promise<Object>} The execution status
|
|
151
|
+
*/
|
|
152
|
+
const getExecutionStatus = async (params) => {
|
|
153
|
+
const { executionId } = params;
|
|
154
|
+
const integrationType = getIntegrationType();
|
|
155
|
+
|
|
156
|
+
try {
|
|
157
|
+
logger.info('Getting workflow execution status', {
|
|
158
|
+
executionId,
|
|
159
|
+
integrationType
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
if (integrationType === 'api') {
|
|
163
|
+
// Execute via n8n API
|
|
164
|
+
const response = await fetch(`${config.n8n.apiUrl}executions/${executionId}`, {
|
|
165
|
+
method: 'GET',
|
|
166
|
+
headers: {
|
|
167
|
+
'Content-Type': 'application/json',
|
|
168
|
+
'X-N8N-API-KEY': config.n8n.apiKey
|
|
169
|
+
}
|
|
170
|
+
});
|
|
171
|
+
|
|
172
|
+
if (!response.ok) {
|
|
173
|
+
const errorData = await response.json().catch(() => ({}));
|
|
174
|
+
logger.error('n8n API error during execution status check', {
|
|
175
|
+
status: response.status,
|
|
176
|
+
error: errorData
|
|
177
|
+
});
|
|
178
|
+
throw new Error(`Failed to get execution status: ${response.status} ${response.statusText}`);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
const result = await response.json();
|
|
182
|
+
|
|
183
|
+
// Log successful status check
|
|
184
|
+
logDataAccess({
|
|
185
|
+
success: true,
|
|
186
|
+
dataType: 'execution',
|
|
187
|
+
action: 'get-status',
|
|
188
|
+
resourceId: executionId
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
return {
|
|
192
|
+
success: true,
|
|
193
|
+
executionId: result.id,
|
|
194
|
+
status: result.status,
|
|
195
|
+
data: result.data,
|
|
196
|
+
startedAt: result.startedAt,
|
|
197
|
+
finishedAt: result.finishedAt,
|
|
198
|
+
workflowId: result.workflowId,
|
|
199
|
+
mode: result.mode
|
|
200
|
+
};
|
|
201
|
+
} else if (integrationType === 'filesystem') {
|
|
202
|
+
// For filesystem integration, we don't have a built-in way to check execution status
|
|
203
|
+
logger.warn('Execution status check not supported for filesystem integration', { executionId });
|
|
204
|
+
|
|
205
|
+
// Log the limitation
|
|
206
|
+
logDataAccess({
|
|
207
|
+
success: false,
|
|
208
|
+
dataType: 'execution',
|
|
209
|
+
action: 'get-status',
|
|
210
|
+
resourceId: executionId,
|
|
211
|
+
reason: 'Execution status check not supported for filesystem integration'
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
throw new Error('Execution status check not supported for filesystem integration. Please use the n8n API integration type.');
|
|
215
|
+
} else {
|
|
216
|
+
throw new Error('Invalid integration type');
|
|
217
|
+
}
|
|
218
|
+
} catch (error) {
|
|
219
|
+
logger.error('Failed to get execution status', {
|
|
220
|
+
executionId,
|
|
221
|
+
error: error.message
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
// Log the failed operation (if not already logged)
|
|
225
|
+
if (error.message !== 'Execution status check not supported for filesystem integration. Please use the n8n API integration type.') {
|
|
226
|
+
logDataAccess({
|
|
227
|
+
success: false,
|
|
228
|
+
dataType: 'execution',
|
|
229
|
+
action: 'get-status',
|
|
230
|
+
resourceId: executionId,
|
|
231
|
+
reason: error.message
|
|
232
|
+
});
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
throw new Error(`Failed to get execution status: ${error.message}`);
|
|
236
|
+
}
|
|
237
|
+
};
|
|
238
|
+
|
|
239
|
+
// Create and export the MCP tools
|
|
240
|
+
const testWorkflowTool = createTool(
|
|
241
|
+
'Test a workflow by executing it and returning results',
|
|
242
|
+
{
|
|
243
|
+
workflowId: {
|
|
244
|
+
type: 'string',
|
|
245
|
+
description: 'ID of the workflow to execute'
|
|
246
|
+
},
|
|
247
|
+
testData: {
|
|
248
|
+
type: 'object',
|
|
249
|
+
description: 'Test data to use for the execution',
|
|
250
|
+
optional: true
|
|
251
|
+
},
|
|
252
|
+
timeout: {
|
|
253
|
+
type: 'number',
|
|
254
|
+
description: 'Timeout in milliseconds for the execution (default: 60000)',
|
|
255
|
+
optional: true
|
|
256
|
+
},
|
|
257
|
+
userId: {
|
|
258
|
+
type: 'string',
|
|
259
|
+
description: 'ID of the user executing the workflow for logging purposes',
|
|
260
|
+
optional: true
|
|
261
|
+
}
|
|
262
|
+
},
|
|
263
|
+
executeWorkflow
|
|
264
|
+
);
|
|
265
|
+
|
|
266
|
+
const getExecutionStatusTool = createTool(
|
|
267
|
+
'Get the status of a workflow execution',
|
|
268
|
+
{
|
|
269
|
+
executionId: {
|
|
270
|
+
type: 'string',
|
|
271
|
+
description: 'ID of the execution to check'
|
|
272
|
+
},
|
|
273
|
+
userId: {
|
|
274
|
+
type: 'string',
|
|
275
|
+
description: 'ID of the user checking the execution for logging purposes',
|
|
276
|
+
optional: true
|
|
277
|
+
}
|
|
278
|
+
},
|
|
279
|
+
getExecutionStatus
|
|
280
|
+
);
|
|
281
|
+
|
|
282
|
+
module.exports = {
|
|
283
|
+
testWorkflowTool,
|
|
284
|
+
getExecutionStatusTool
|
|
285
|
+
};
|