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,500 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Connection Management Tools
|
|
3
|
+
*
|
|
4
|
+
* Implements tools for managing connections between nodes in n8n workflows, including:
|
|
5
|
+
* - Creating connections between nodes
|
|
6
|
+
* - Removing connections
|
|
7
|
+
* - Validating connection compatibility
|
|
8
|
+
* - Updating workflow.json connections object
|
|
9
|
+
* - Helper functions for connection management
|
|
10
|
+
* - Connection visualization data generation
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
const { createTool } = require('../models/tool');
|
|
14
|
+
const { workflowStorage } = require('../models/storage');
|
|
15
|
+
const { getNodeTypeDefinition } = require('./nodeManagement');
|
|
16
|
+
const { logger } = require('../utils/logger');
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Check if a connection between two nodes is compatible
|
|
20
|
+
*
|
|
21
|
+
* @param {Object} sourceNode - Source node object
|
|
22
|
+
* @param {Object} targetNode - Target node object
|
|
23
|
+
* @param {string} sourceOutput - Output name on source node
|
|
24
|
+
* @param {string} targetInput - Input name on target node
|
|
25
|
+
* @returns {Promise<boolean>} Whether the connection is compatible
|
|
26
|
+
*/
|
|
27
|
+
const checkConnectionCompatibility = async (sourceNode, targetNode, sourceOutput = 'main', targetInput = 'main') => {
|
|
28
|
+
try {
|
|
29
|
+
// Get node type definitions
|
|
30
|
+
const sourceNodeDef = await getNodeTypeDefinition(sourceNode.type);
|
|
31
|
+
const targetNodeDef = await getNodeTypeDefinition(targetNode.type);
|
|
32
|
+
|
|
33
|
+
if (!sourceNodeDef || !targetNodeDef) {
|
|
34
|
+
logger.warn('Unable to validate connection compatibility due to missing node definitions', {
|
|
35
|
+
sourceType: sourceNode.type,
|
|
36
|
+
targetType: targetNode.type
|
|
37
|
+
});
|
|
38
|
+
// Default to allowing connection if we can't validate
|
|
39
|
+
return true;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Check for trigger nodes - triggers can only be source nodes, not target nodes
|
|
43
|
+
const sourceCategories = new Set(sourceNodeDef.categories || []);
|
|
44
|
+
const targetCategories = new Set(targetNodeDef.categories || []);
|
|
45
|
+
|
|
46
|
+
if (targetCategories.has('Trigger')) {
|
|
47
|
+
logger.warn('Invalid connection: Target node is a Trigger node', {
|
|
48
|
+
targetType: targetNode.type
|
|
49
|
+
});
|
|
50
|
+
return false;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Additional compatibility checks could be added here based on node definitions
|
|
54
|
+
// For now, we'll return true for most connections as n8n is quite flexible
|
|
55
|
+
|
|
56
|
+
return true;
|
|
57
|
+
} catch (error) {
|
|
58
|
+
logger.error('Error checking connection compatibility', {
|
|
59
|
+
error: error.message,
|
|
60
|
+
sourceNode: sourceNode.id,
|
|
61
|
+
targetNode: targetNode.id
|
|
62
|
+
});
|
|
63
|
+
// Default to allowing connection if we encounter an error during validation
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Create a connection between two nodes in a workflow
|
|
70
|
+
*
|
|
71
|
+
* @param {Object} params - The parameters for the operation
|
|
72
|
+
* @param {string} params.workflowId - ID or path of the workflow to modify
|
|
73
|
+
* @param {string} params.sourceNodeId - ID of the source node
|
|
74
|
+
* @param {string} params.targetNodeId - ID of the target node
|
|
75
|
+
* @param {string} params.sourceOutput - Output name on source node (default: 'main')
|
|
76
|
+
* @param {string} params.targetInput - Input name on target node (default: 'main')
|
|
77
|
+
* @returns {Promise<Object>} Operation result with updated workflow
|
|
78
|
+
*/
|
|
79
|
+
const createConnection = async (params) => {
|
|
80
|
+
try {
|
|
81
|
+
const {
|
|
82
|
+
workflowId,
|
|
83
|
+
sourceNodeId,
|
|
84
|
+
targetNodeId,
|
|
85
|
+
sourceOutput = 'main',
|
|
86
|
+
targetInput = 'main'
|
|
87
|
+
} = params;
|
|
88
|
+
|
|
89
|
+
logger.info('Creating connection in workflow', {
|
|
90
|
+
workflowId,
|
|
91
|
+
sourceNodeId,
|
|
92
|
+
targetNodeId,
|
|
93
|
+
sourceOutput,
|
|
94
|
+
targetInput
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
// Load workflow
|
|
98
|
+
const workflow = await workflowStorage.loadWorkflow(workflowId);
|
|
99
|
+
if (!workflow) {
|
|
100
|
+
throw new Error(`Workflow with ID ${workflowId} not found`);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
// Verify nodes exist
|
|
104
|
+
const sourceNode = workflow.nodes.find(node => node.id === sourceNodeId);
|
|
105
|
+
const targetNode = workflow.nodes.find(node => node.id === targetNodeId);
|
|
106
|
+
|
|
107
|
+
if (!sourceNode) {
|
|
108
|
+
throw new Error(`Source node with ID ${sourceNodeId} not found`);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
if (!targetNode) {
|
|
112
|
+
throw new Error(`Target node with ID ${targetNodeId} not found`);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Check for self-connections
|
|
116
|
+
if (sourceNodeId === targetNodeId) {
|
|
117
|
+
throw new Error('Cannot create a connection from a node to itself');
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// Verify connection compatibility
|
|
121
|
+
const isCompatible = await checkConnectionCompatibility(sourceNode, targetNode, sourceOutput, targetInput);
|
|
122
|
+
if (!isCompatible) {
|
|
123
|
+
throw new Error(`Connection between ${sourceNode.type} and ${targetNode.type} is not compatible`);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// Initialize connections object if needed
|
|
127
|
+
if (!workflow.connections) {
|
|
128
|
+
workflow.connections = {};
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
if (!workflow.connections[sourceNodeId]) {
|
|
132
|
+
workflow.connections[sourceNodeId] = {};
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
if (!workflow.connections[sourceNodeId][sourceOutput]) {
|
|
136
|
+
workflow.connections[sourceNodeId][sourceOutput] = [];
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// Check if connection already exists
|
|
140
|
+
const existingConnection = workflow.connections[sourceNodeId][sourceOutput].find(
|
|
141
|
+
conn => conn.node === targetNodeId && conn.type === targetInput
|
|
142
|
+
);
|
|
143
|
+
|
|
144
|
+
if (existingConnection) {
|
|
145
|
+
logger.info('Connection already exists, skipping creation', {
|
|
146
|
+
sourceNodeId,
|
|
147
|
+
targetNodeId,
|
|
148
|
+
sourceOutput,
|
|
149
|
+
targetInput
|
|
150
|
+
});
|
|
151
|
+
return {
|
|
152
|
+
success: true,
|
|
153
|
+
workflow,
|
|
154
|
+
message: 'Connection already exists',
|
|
155
|
+
alreadyExists: true
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// Add connection with proper index
|
|
160
|
+
const connectionsCount = workflow.connections[sourceNodeId][sourceOutput].length;
|
|
161
|
+
workflow.connections[sourceNodeId][sourceOutput].push({
|
|
162
|
+
node: targetNodeId,
|
|
163
|
+
type: targetInput,
|
|
164
|
+
index: connectionsCount
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
// Update workflow timestamp
|
|
168
|
+
workflow.updatedAt = new Date().toISOString();
|
|
169
|
+
|
|
170
|
+
// Save updated workflow to the same file
|
|
171
|
+
const filePath = workflowId.includes('/') || workflowId.includes('\\') ?
|
|
172
|
+
workflowId : `${workflowId}.json`;
|
|
173
|
+
|
|
174
|
+
await workflowStorage.saveWorkflow(workflow.id || 'workflow', workflow, filePath);
|
|
175
|
+
|
|
176
|
+
return {
|
|
177
|
+
success: true,
|
|
178
|
+
workflow,
|
|
179
|
+
message: `Connection created from ${sourceNodeId}:${sourceOutput} to ${targetNodeId}:${targetInput}`
|
|
180
|
+
};
|
|
181
|
+
} catch (error) {
|
|
182
|
+
logger.error('Error creating connection', { error: error.message });
|
|
183
|
+
throw new Error(`Failed to create connection: ${error.message}`);
|
|
184
|
+
}
|
|
185
|
+
};
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Remove a connection between two nodes
|
|
189
|
+
*
|
|
190
|
+
* @param {Object} params - The parameters for the operation
|
|
191
|
+
* @param {string} params.workflowId - ID or path of the workflow to modify
|
|
192
|
+
* @param {string} params.sourceNodeId - ID of the source node
|
|
193
|
+
* @param {string} params.targetNodeId - ID of the target node
|
|
194
|
+
* @param {string} params.sourceOutput - Output name on source node (default: 'main')
|
|
195
|
+
* @param {string} params.targetInput - Input name on target node (default: 'main')
|
|
196
|
+
* @returns {Promise<Object>} Operation result with updated workflow
|
|
197
|
+
*/
|
|
198
|
+
const removeConnection = async (params) => {
|
|
199
|
+
try {
|
|
200
|
+
const {
|
|
201
|
+
workflowId,
|
|
202
|
+
sourceNodeId,
|
|
203
|
+
targetNodeId,
|
|
204
|
+
sourceOutput = 'main',
|
|
205
|
+
targetInput = 'main'
|
|
206
|
+
} = params;
|
|
207
|
+
|
|
208
|
+
logger.info('Removing connection from workflow', {
|
|
209
|
+
workflowId,
|
|
210
|
+
sourceNodeId,
|
|
211
|
+
targetNodeId
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
// Load workflow
|
|
215
|
+
const workflow = await workflowStorage.loadWorkflow(workflowId);
|
|
216
|
+
if (!workflow) {
|
|
217
|
+
throw new Error(`Workflow with ID ${workflowId} not found`);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
// Check if the source node has any connections
|
|
221
|
+
if (!workflow.connections ||
|
|
222
|
+
!workflow.connections[sourceNodeId] ||
|
|
223
|
+
!workflow.connections[sourceNodeId][sourceOutput] ||
|
|
224
|
+
!Array.isArray(workflow.connections[sourceNodeId][sourceOutput])) {
|
|
225
|
+
logger.info('No connections found to remove', {
|
|
226
|
+
sourceNodeId,
|
|
227
|
+
targetNodeId
|
|
228
|
+
});
|
|
229
|
+
return {
|
|
230
|
+
success: true,
|
|
231
|
+
workflow,
|
|
232
|
+
message: 'No matching connection found to remove',
|
|
233
|
+
removed: false
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
// Find the connection to remove
|
|
238
|
+
const connections = workflow.connections[sourceNodeId][sourceOutput];
|
|
239
|
+
const connectionIndex = connections.findIndex(
|
|
240
|
+
conn => conn.node === targetNodeId && conn.type === targetInput
|
|
241
|
+
);
|
|
242
|
+
|
|
243
|
+
if (connectionIndex === -1) {
|
|
244
|
+
return {
|
|
245
|
+
success: true,
|
|
246
|
+
workflow,
|
|
247
|
+
message: 'No matching connection found to remove',
|
|
248
|
+
removed: false
|
|
249
|
+
};
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
// Remove the connection
|
|
253
|
+
connections.splice(connectionIndex, 1);
|
|
254
|
+
|
|
255
|
+
// Reindex remaining connections
|
|
256
|
+
connections.forEach((conn, index) => {
|
|
257
|
+
conn.index = index;
|
|
258
|
+
});
|
|
259
|
+
|
|
260
|
+
// Clean up empty arrays and objects
|
|
261
|
+
if (connections.length === 0) {
|
|
262
|
+
delete workflow.connections[sourceNodeId][sourceOutput];
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
if (Object.keys(workflow.connections[sourceNodeId]).length === 0) {
|
|
266
|
+
delete workflow.connections[sourceNodeId];
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
// Update workflow timestamp
|
|
270
|
+
workflow.updatedAt = new Date().toISOString();
|
|
271
|
+
|
|
272
|
+
// Save updated workflow to the same file
|
|
273
|
+
const filePath = workflowId.includes('/') || workflowId.includes('\\') ?
|
|
274
|
+
workflowId : `${workflowId}.json`;
|
|
275
|
+
|
|
276
|
+
await workflowStorage.saveWorkflow(workflow.id || 'workflow', workflow, filePath);
|
|
277
|
+
|
|
278
|
+
return {
|
|
279
|
+
success: true,
|
|
280
|
+
workflow,
|
|
281
|
+
message: `Connection removed from ${sourceNodeId}:${sourceOutput} to ${targetNodeId}:${targetInput}`,
|
|
282
|
+
removed: true
|
|
283
|
+
};
|
|
284
|
+
} catch (error) {
|
|
285
|
+
logger.error('Error removing connection', { error: error.message });
|
|
286
|
+
throw new Error(`Failed to remove connection: ${error.message}`);
|
|
287
|
+
}
|
|
288
|
+
};
|
|
289
|
+
|
|
290
|
+
/**
|
|
291
|
+
* Generate connection data for visualization
|
|
292
|
+
*
|
|
293
|
+
* @param {Object} workflow - The workflow object
|
|
294
|
+
* @returns {Array} Array of connection objects for visualization
|
|
295
|
+
*/
|
|
296
|
+
const generateConnectionsVisualization = (workflow) => {
|
|
297
|
+
if (!workflow.connections) return [];
|
|
298
|
+
|
|
299
|
+
const connections = [];
|
|
300
|
+
|
|
301
|
+
// Iterate through all connections in the workflow
|
|
302
|
+
Object.entries(workflow.connections).forEach(([sourceNodeId, outputs]) => {
|
|
303
|
+
Object.entries(outputs).forEach(([outputName, targetConnections]) => {
|
|
304
|
+
targetConnections.forEach(connection => {
|
|
305
|
+
connections.push({
|
|
306
|
+
id: `${sourceNodeId}-${outputName}-${connection.node}-${connection.type}`,
|
|
307
|
+
source: sourceNodeId,
|
|
308
|
+
sourceHandle: outputName,
|
|
309
|
+
target: connection.node,
|
|
310
|
+
targetHandle: connection.type,
|
|
311
|
+
type: 'smoothstep', // Default visualization type
|
|
312
|
+
});
|
|
313
|
+
});
|
|
314
|
+
});
|
|
315
|
+
});
|
|
316
|
+
|
|
317
|
+
return connections;
|
|
318
|
+
};
|
|
319
|
+
|
|
320
|
+
/**
|
|
321
|
+
* Remove all connections for a node
|
|
322
|
+
*
|
|
323
|
+
* @param {Object} params - The parameters for the operation
|
|
324
|
+
* @param {string} params.workflowId - ID or path of the workflow to modify
|
|
325
|
+
* @param {string} params.nodeId - ID of the node to remove connections for
|
|
326
|
+
* @returns {Promise<Object>} Operation result with updated workflow
|
|
327
|
+
*/
|
|
328
|
+
const removeNodeConnections = async (params) => {
|
|
329
|
+
try {
|
|
330
|
+
const { workflowId, nodeId } = params;
|
|
331
|
+
|
|
332
|
+
logger.info('Removing all connections for node', {
|
|
333
|
+
workflowId,
|
|
334
|
+
nodeId
|
|
335
|
+
});
|
|
336
|
+
|
|
337
|
+
// Load workflow
|
|
338
|
+
const workflow = await workflowStorage.loadWorkflow(workflowId);
|
|
339
|
+
if (!workflow) {
|
|
340
|
+
throw new Error(`Workflow with ID ${workflowId} not found`);
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
if (!workflow.connections) {
|
|
344
|
+
return {
|
|
345
|
+
success: true,
|
|
346
|
+
workflow,
|
|
347
|
+
message: 'No connections found',
|
|
348
|
+
removed: 0
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
let removedCount = 0;
|
|
353
|
+
|
|
354
|
+
// Remove connections where this node is the source
|
|
355
|
+
if (workflow.connections[nodeId]) {
|
|
356
|
+
delete workflow.connections[nodeId];
|
|
357
|
+
removedCount++;
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
// Remove connections where this node is the target
|
|
361
|
+
Object.entries(workflow.connections).forEach(([sourceId, outputs]) => {
|
|
362
|
+
Object.entries(outputs).forEach(([outputName, connections]) => {
|
|
363
|
+
const originalLength = connections.length;
|
|
364
|
+
workflow.connections[sourceId][outputName] = connections.filter(
|
|
365
|
+
conn => conn.node !== nodeId
|
|
366
|
+
);
|
|
367
|
+
|
|
368
|
+
// Reindex the connections
|
|
369
|
+
workflow.connections[sourceId][outputName].forEach((conn, index) => {
|
|
370
|
+
conn.index = index;
|
|
371
|
+
});
|
|
372
|
+
|
|
373
|
+
// Update removed count
|
|
374
|
+
removedCount += originalLength - workflow.connections[sourceId][outputName].length;
|
|
375
|
+
|
|
376
|
+
// Clean up empty arrays
|
|
377
|
+
if (workflow.connections[sourceId][outputName].length === 0) {
|
|
378
|
+
delete workflow.connections[sourceId][outputName];
|
|
379
|
+
}
|
|
380
|
+
});
|
|
381
|
+
|
|
382
|
+
// Clean up empty objects
|
|
383
|
+
if (Object.keys(workflow.connections[sourceId]).length === 0) {
|
|
384
|
+
delete workflow.connections[sourceId];
|
|
385
|
+
}
|
|
386
|
+
});
|
|
387
|
+
|
|
388
|
+
// Update workflow timestamp
|
|
389
|
+
workflow.updatedAt = new Date().toISOString();
|
|
390
|
+
|
|
391
|
+
// Save updated workflow to the same file
|
|
392
|
+
const filePath = workflowId.includes('/') || workflowId.includes('\\') ?
|
|
393
|
+
workflowId : `${workflowId}.json`;
|
|
394
|
+
|
|
395
|
+
await workflowStorage.saveWorkflow(workflow.id || 'workflow', workflow, filePath);
|
|
396
|
+
|
|
397
|
+
return {
|
|
398
|
+
success: true,
|
|
399
|
+
workflow,
|
|
400
|
+
message: `Removed ${removedCount} connections for node ${nodeId}`,
|
|
401
|
+
removed: removedCount
|
|
402
|
+
};
|
|
403
|
+
} catch (error) {
|
|
404
|
+
logger.error('Error removing node connections', { error: error.message });
|
|
405
|
+
throw new Error(`Failed to remove node connections: ${error.message}`);
|
|
406
|
+
}
|
|
407
|
+
};
|
|
408
|
+
|
|
409
|
+
/**
|
|
410
|
+
* Tool definition for the create_connection MCP tool
|
|
411
|
+
*/
|
|
412
|
+
const createConnectionTool = createTool(
|
|
413
|
+
'Create a connection between two nodes in a workflow',
|
|
414
|
+
{
|
|
415
|
+
workflowId: {
|
|
416
|
+
type: 'string',
|
|
417
|
+
description: 'ID or path of the workflow to modify'
|
|
418
|
+
},
|
|
419
|
+
sourceNodeId: {
|
|
420
|
+
type: 'string',
|
|
421
|
+
description: 'ID of the source node'
|
|
422
|
+
},
|
|
423
|
+
targetNodeId: {
|
|
424
|
+
type: 'string',
|
|
425
|
+
description: 'ID of the target node'
|
|
426
|
+
},
|
|
427
|
+
sourceOutput: {
|
|
428
|
+
type: 'string',
|
|
429
|
+
description: 'Output name on source node (default: "main")',
|
|
430
|
+
optional: true
|
|
431
|
+
},
|
|
432
|
+
targetInput: {
|
|
433
|
+
type: 'string',
|
|
434
|
+
description: 'Input name on target node (default: "main")',
|
|
435
|
+
optional: true
|
|
436
|
+
}
|
|
437
|
+
},
|
|
438
|
+
createConnection
|
|
439
|
+
);
|
|
440
|
+
|
|
441
|
+
/**
|
|
442
|
+
* Tool definition for the remove_connection MCP tool
|
|
443
|
+
*/
|
|
444
|
+
const removeConnectionTool = createTool(
|
|
445
|
+
'Remove a connection between two nodes in a workflow',
|
|
446
|
+
{
|
|
447
|
+
workflowId: {
|
|
448
|
+
type: 'string',
|
|
449
|
+
description: 'ID or path of the workflow to modify'
|
|
450
|
+
},
|
|
451
|
+
sourceNodeId: {
|
|
452
|
+
type: 'string',
|
|
453
|
+
description: 'ID of the source node'
|
|
454
|
+
},
|
|
455
|
+
targetNodeId: {
|
|
456
|
+
type: 'string',
|
|
457
|
+
description: 'ID of the target node'
|
|
458
|
+
},
|
|
459
|
+
sourceOutput: {
|
|
460
|
+
type: 'string',
|
|
461
|
+
description: 'Output name on source node (default: "main")',
|
|
462
|
+
optional: true
|
|
463
|
+
},
|
|
464
|
+
targetInput: {
|
|
465
|
+
type: 'string',
|
|
466
|
+
description: 'Input name on target node (default: "main")',
|
|
467
|
+
optional: true
|
|
468
|
+
}
|
|
469
|
+
},
|
|
470
|
+
removeConnection
|
|
471
|
+
);
|
|
472
|
+
|
|
473
|
+
/**
|
|
474
|
+
* Tool definition for the remove_node_connections MCP tool
|
|
475
|
+
*/
|
|
476
|
+
const removeNodeConnectionsTool = createTool(
|
|
477
|
+
'Remove all connections for a specific node in a workflow',
|
|
478
|
+
{
|
|
479
|
+
workflowId: {
|
|
480
|
+
type: 'string',
|
|
481
|
+
description: 'ID or path of the workflow to modify'
|
|
482
|
+
},
|
|
483
|
+
nodeId: {
|
|
484
|
+
type: 'string',
|
|
485
|
+
description: 'ID of the node to remove connections for'
|
|
486
|
+
}
|
|
487
|
+
},
|
|
488
|
+
removeNodeConnections
|
|
489
|
+
);
|
|
490
|
+
|
|
491
|
+
module.exports = {
|
|
492
|
+
createConnectionTool,
|
|
493
|
+
removeConnectionTool,
|
|
494
|
+
removeNodeConnectionsTool,
|
|
495
|
+
createConnection,
|
|
496
|
+
removeConnection,
|
|
497
|
+
removeNodeConnections,
|
|
498
|
+
checkConnectionCompatibility,
|
|
499
|
+
generateConnectionsVisualization
|
|
500
|
+
};
|