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.
Files changed (595) hide show
  1. package/.cursor/rules/cursor_rules.mdc +53 -0
  2. package/.cursor/rules/dev_workflow.mdc +219 -0
  3. package/.cursor/rules/mcp.mdc +430 -0
  4. package/.cursor/rules/self_improve.mdc +72 -0
  5. package/.cursor/rules/taskmaster.mdc +382 -0
  6. package/.cursorignore +1 -0
  7. package/.cursorrules +4 -0
  8. package/.env.example +23 -0
  9. package/.eslintrc.json +38 -0
  10. package/.github/workflows/npm-publish-github-packages.yml +55 -0
  11. package/.prettierrc +9 -0
  12. package/.roo/rules/dev_workflow.md +219 -0
  13. package/.roo/rules/mcp.md +430 -0
  14. package/.roo/rules/roo_rules.md +53 -0
  15. package/.roo/rules/self_improve.md +72 -0
  16. package/.roo/rules/taskmaster.md +382 -0
  17. package/.roo/rules-architect/architect-rules +93 -0
  18. package/.roo/rules-ask/ask-rules +89 -0
  19. package/.roo/rules-boomerang/boomerang-rules +181 -0
  20. package/.roo/rules-code/code-rules +61 -0
  21. package/.roo/rules-debug/debug-rules +68 -0
  22. package/.roo/rules-test/test-rules +61 -0
  23. package/.roomodes +63 -0
  24. package/.taskmasterconfig +31 -0
  25. package/.windsurfrules +2382 -0
  26. package/LICENSE +21 -0
  27. package/README.md +210 -0
  28. package/config/credentials/credentials.json +1 -0
  29. package/config/default.js +41 -0
  30. package/package.json +56 -0
  31. package/scripts/demo-n8n-integration.js +161 -0
  32. package/scripts/demo-workflow-generator.js +102 -0
  33. package/scripts/init.sh +36 -0
  34. package/scripts/prd.txt +197 -0
  35. package/src/index.ts +1440 -0
  36. package/src/middleware/auth.js +273 -0
  37. package/src/middleware/authorize.js +183 -0
  38. package/src/middleware/logging.js +64 -0
  39. package/src/middleware/mcp.js +187 -0
  40. package/src/middleware/rateLimiter.js +82 -0
  41. package/src/middleware/validation.js +241 -0
  42. package/src/models/credential.js +359 -0
  43. package/src/models/llmService.js +236 -0
  44. package/src/models/n8nIntegration.js +542 -0
  45. package/src/models/storage.js +196 -0
  46. package/src/models/tool.js +148 -0
  47. package/src/models/user.js +164 -0
  48. package/src/models/workflow.js +229 -0
  49. package/src/routes/toolDefinitions.js +62 -0
  50. package/src/routes/toolExecution.js +79 -0
  51. package/src/tools/__index.js +242 -0
  52. package/src/tools/connectionManagement.js +500 -0
  53. package/src/tools/n8nIntegration.js +370 -0
  54. package/src/tools/nodeDiscovery.js +488 -0
  55. package/src/tools/nodeManagement.js +674 -0
  56. package/src/tools/toolDefinitions.js +660 -0
  57. package/src/tools/workflowCreation.js +100 -0
  58. package/src/tools/workflowGenerator.js +152 -0
  59. package/src/tools/workflowStorage.js +113 -0
  60. package/src/tools/workflowTesting.js +285 -0
  61. package/src/utils/encryption.js +164 -0
  62. package/src/utils/logger.js +84 -0
  63. package/src/utils/mcp.js +85 -0
  64. package/src/utils/securityLogger.js +109 -0
  65. package/tests/auth.test.js +402 -0
  66. package/tests/authorize.test.js +208 -0
  67. package/tests/run-memory-tests.js +55 -0
  68. package/tests/run-tests.js +55 -0
  69. package/tests/server.test.js +203 -0
  70. package/tests/unit/add-ai-connections.test.js +385 -0
  71. package/tests/unit/connectionManagement.test.js +309 -0
  72. package/tests/unit/langchain-llm-format.test.js +259 -0
  73. package/tests/unit/memory-connection.test.js +140 -0
  74. package/tests/unit/memory-integration.test.js +253 -0
  75. package/tests/unit/n8nIntegration.test.js +291 -0
  76. package/tests/unit/nodeDiscovery.test.js +270 -0
  77. package/tests/unit/nodeManagement.test.js +522 -0
  78. package/tests/unit/utils/mcp-test-utils.js +94 -0
  79. package/tests/unit/workflowCreation.test.js +110 -0
  80. package/tests/unit/workflowTesting.test.js +269 -0
  81. package/tests/user.test.js +181 -0
  82. package/tsconfig.json +20 -0
  83. package/workflow_nodes/Brandfetch.json +85 -0
  84. package/workflow_nodes/WorkflowTrigger.json +28 -0
  85. package/workflow_nodes/actionNetwork.json +218 -0
  86. package/workflow_nodes/activeCampaign.json +722 -0
  87. package/workflow_nodes/activeCampaignTrigger.json +52 -0
  88. package/workflow_nodes/acuitySchedulingTrigger.json +8 -0
  89. package/workflow_nodes/adalo.json +123 -0
  90. package/workflow_nodes/affinity.json +203 -0
  91. package/workflow_nodes/affinityTrigger.json +124 -0
  92. package/workflow_nodes/aggregate.json +119 -0
  93. package/workflow_nodes/agileCrm.json +503 -0
  94. package/workflow_nodes/aiTransform.json +17 -0
  95. package/workflow_nodes/airtable.json +226 -0
  96. package/workflow_nodes/airtableTrigger.json +120 -0
  97. package/workflow_nodes/airtop.json +10 -0
  98. package/workflow_nodes/amqp.json +62 -0
  99. package/workflow_nodes/amqpTrigger.json +8 -0
  100. package/workflow_nodes/apiTemplateIo.json +147 -0
  101. package/workflow_nodes/asana.json +446 -0
  102. package/workflow_nodes/asanaTrigger.json +52 -0
  103. package/workflow_nodes/automizy.json +195 -0
  104. package/workflow_nodes/autopilot.json +287 -0
  105. package/workflow_nodes/autopilotTrigger.json +8 -0
  106. package/workflow_nodes/awsCertificateManager.json +223 -0
  107. package/workflow_nodes/awsComprehend.json +125 -0
  108. package/workflow_nodes/awsDynamoDb.json +251 -0
  109. package/workflow_nodes/awsElb.json +174 -0
  110. package/workflow_nodes/awsLambda.json +69 -0
  111. package/workflow_nodes/awsRekognition.json +191 -0
  112. package/workflow_nodes/awsS3.json +32 -0
  113. package/workflow_nodes/awsSes.json +302 -0
  114. package/workflow_nodes/awsSns.json +110 -0
  115. package/workflow_nodes/awsSnsTrigger.json +47 -0
  116. package/workflow_nodes/awsSqs.json +140 -0
  117. package/workflow_nodes/awsTextract.json +43 -0
  118. package/workflow_nodes/awsTranscribe.json +217 -0
  119. package/workflow_nodes/azureCosmosDb.json +8 -0
  120. package/workflow_nodes/azureStorage.json +17 -0
  121. package/workflow_nodes/bambooHr.json +8 -0
  122. package/workflow_nodes/bannerbear.json +126 -0
  123. package/workflow_nodes/baserow.json +277 -0
  124. package/workflow_nodes/beeminder.json +146 -0
  125. package/workflow_nodes/bitbucketTrigger.json +62 -0
  126. package/workflow_nodes/bitly.json +130 -0
  127. package/workflow_nodes/bitwarden.json +224 -0
  128. package/workflow_nodes/box.json +457 -0
  129. package/workflow_nodes/boxTrigger.json +8 -0
  130. package/workflow_nodes/brevo.json +41 -0
  131. package/workflow_nodes/brevoTrigger.json +145 -0
  132. package/workflow_nodes/bubble.json +212 -0
  133. package/workflow_nodes/calTrigger.json +91 -0
  134. package/workflow_nodes/calendlyTrigger.json +71 -0
  135. package/workflow_nodes/chargebee.json +217 -0
  136. package/workflow_nodes/chargebeeTrigger.json +187 -0
  137. package/workflow_nodes/circleCi.json +89 -0
  138. package/workflow_nodes/ciscoWebex.json +593 -0
  139. package/workflow_nodes/ciscoWebexTrigger.json +159 -0
  140. package/workflow_nodes/clearbit.json +138 -0
  141. package/workflow_nodes/clickUp.json +793 -0
  142. package/workflow_nodes/clickUpTrigger.json +188 -0
  143. package/workflow_nodes/clockify.json +372 -0
  144. package/workflow_nodes/clockifyTrigger.json +26 -0
  145. package/workflow_nodes/cloudflare.json +103 -0
  146. package/workflow_nodes/cockpit.json +161 -0
  147. package/workflow_nodes/coda.json +242 -0
  148. package/workflow_nodes/code.json +40 -0
  149. package/workflow_nodes/coinGecko.json +363 -0
  150. package/workflow_nodes/compareDatasets.json +14 -0
  151. package/workflow_nodes/compression.json +66 -0
  152. package/workflow_nodes/contentful.json +29 -0
  153. package/workflow_nodes/convertKit.json +159 -0
  154. package/workflow_nodes/convertKitTrigger.json +109 -0
  155. package/workflow_nodes/convertToFile.json +64 -0
  156. package/workflow_nodes/copper.json +239 -0
  157. package/workflow_nodes/copperTrigger.json +8 -0
  158. package/workflow_nodes/cortex.json +348 -0
  159. package/workflow_nodes/crateDb.json +90 -0
  160. package/workflow_nodes/cron.json +23 -0
  161. package/workflow_nodes/crowdDev.json +8 -0
  162. package/workflow_nodes/crowdDevTrigger.json +8 -0
  163. package/workflow_nodes/crypto.json +147 -0
  164. package/workflow_nodes/customerIo.json +206 -0
  165. package/workflow_nodes/customerIoTrigger.json +185 -0
  166. package/workflow_nodes/dateTime.json +39 -0
  167. package/workflow_nodes/debughelper.json +162 -0
  168. package/workflow_nodes/deepL.json +103 -0
  169. package/workflow_nodes/demio.json +187 -0
  170. package/workflow_nodes/dhl.json +53 -0
  171. package/workflow_nodes/discord.json +81 -0
  172. package/workflow_nodes/discourse.json +319 -0
  173. package/workflow_nodes/disqus.json +254 -0
  174. package/workflow_nodes/drift.json +112 -0
  175. package/workflow_nodes/dropbox.json +258 -0
  176. package/workflow_nodes/dropcontact.json +154 -0
  177. package/workflow_nodes/e2eTest.json +70 -0
  178. package/workflow_nodes/editImage.json +132 -0
  179. package/workflow_nodes/egoi.json +220 -0
  180. package/workflow_nodes/elasticSecurity.json +401 -0
  181. package/workflow_nodes/elasticsearch.json +422 -0
  182. package/workflow_nodes/emailReadImap.json +88 -0
  183. package/workflow_nodes/emailSend.json +38 -0
  184. package/workflow_nodes/emelia.json +201 -0
  185. package/workflow_nodes/emeliaTrigger.json +57 -0
  186. package/workflow_nodes/erpNext.json +139 -0
  187. package/workflow_nodes/errorTrigger.json +15 -0
  188. package/workflow_nodes/evaluationMetrics.json +21 -0
  189. package/workflow_nodes/eventbriteTrigger.json +125 -0
  190. package/workflow_nodes/executeCommand.json +25 -0
  191. package/workflow_nodes/executeWorkflow.json +102 -0
  192. package/workflow_nodes/executeWorkflowTrigger.json +65 -0
  193. package/workflow_nodes/executionData.json +35 -0
  194. package/workflow_nodes/extractFromFile.json +71 -0
  195. package/workflow_nodes/facebookGraphApi.json +234 -0
  196. package/workflow_nodes/facebookLeadAdsTrigger.json +8 -0
  197. package/workflow_nodes/facebookTrigger.json +112 -0
  198. package/workflow_nodes/figmaTrigger.json +8 -0
  199. package/workflow_nodes/filemaker.json +268 -0
  200. package/workflow_nodes/filter.json +24 -0
  201. package/workflow_nodes/flow.json +323 -0
  202. package/workflow_nodes/flowTrigger.json +52 -0
  203. package/workflow_nodes/form.json +25 -0
  204. package/workflow_nodes/formIoTrigger.json +59 -0
  205. package/workflow_nodes/formTrigger.json +8 -0
  206. package/workflow_nodes/formstackTrigger.json +8 -0
  207. package/workflow_nodes/freshdesk.json +584 -0
  208. package/workflow_nodes/freshservice.json +899 -0
  209. package/workflow_nodes/freshworksCrm.json +772 -0
  210. package/workflow_nodes/ftp.json +127 -0
  211. package/workflow_nodes/function.json +22 -0
  212. package/workflow_nodes/functionItem.json +22 -0
  213. package/workflow_nodes/gSuiteAdmin.json +562 -0
  214. package/workflow_nodes/getResponse.json +310 -0
  215. package/workflow_nodes/getResponseTrigger.json +82 -0
  216. package/workflow_nodes/ghost.json +290 -0
  217. package/workflow_nodes/git.json +184 -0
  218. package/workflow_nodes/github.json +732 -0
  219. package/workflow_nodes/githubTrigger.json +317 -0
  220. package/workflow_nodes/gitlab.json +544 -0
  221. package/workflow_nodes/gitlabTrigger.json +61 -0
  222. package/workflow_nodes/gmail.json +62 -0
  223. package/workflow_nodes/gmailTrigger.json +127 -0
  224. package/workflow_nodes/goToWebinar.json +430 -0
  225. package/workflow_nodes/gong.json +22 -0
  226. package/workflow_nodes/googleAds.json +116 -0
  227. package/workflow_nodes/googleAnalytics.json +28 -0
  228. package/workflow_nodes/googleBigQuery.json +38 -0
  229. package/workflow_nodes/googleBooks.json +154 -0
  230. package/workflow_nodes/googleBusinessProfile.json +277 -0
  231. package/workflow_nodes/googleBusinessProfileTrigger.json +55 -0
  232. package/workflow_nodes/googleCalendar.json +474 -0
  233. package/workflow_nodes/googleCalendarTrigger.json +72 -0
  234. package/workflow_nodes/googleChat.json +187 -0
  235. package/workflow_nodes/googleCloudNaturalLanguage.json +171 -0
  236. package/workflow_nodes/googleCloudStorage.json +466 -0
  237. package/workflow_nodes/googleContacts.json +481 -0
  238. package/workflow_nodes/googleDocs.json +312 -0
  239. package/workflow_nodes/googleDrive.json +920 -0
  240. package/workflow_nodes/googleDriveTrigger.json +181 -0
  241. package/workflow_nodes/googleFirebaseCloudFirestore.json +156 -0
  242. package/workflow_nodes/googleFirebaseRealtimeDatabase.json +75 -0
  243. package/workflow_nodes/googlePerspective.json +94 -0
  244. package/workflow_nodes/googleSheets.json +98 -0
  245. package/workflow_nodes/googleSheetsTrigger.json +192 -0
  246. package/workflow_nodes/googleSlides.json +186 -0
  247. package/workflow_nodes/googleTasks.json +198 -0
  248. package/workflow_nodes/googleTranslate.json +80 -0
  249. package/workflow_nodes/gotify.json +110 -0
  250. package/workflow_nodes/grafana.json +155 -0
  251. package/workflow_nodes/graphql.json +165 -0
  252. package/workflow_nodes/grist.json +13 -0
  253. package/workflow_nodes/gumroadTrigger.json +8 -0
  254. package/workflow_nodes/hackerNews.json +100 -0
  255. package/workflow_nodes/haloPSA.json +286 -0
  256. package/workflow_nodes/harvest.json +699 -0
  257. package/workflow_nodes/helpScout.json +629 -0
  258. package/workflow_nodes/helpScoutTrigger.json +8 -0
  259. package/workflow_nodes/highLevel.json +8 -0
  260. package/workflow_nodes/homeAssistant.json +201 -0
  261. package/workflow_nodes/html.json +118 -0
  262. package/workflow_nodes/htmlExtract.json +87 -0
  263. package/workflow_nodes/httpRequest.json +472 -0
  264. package/workflow_nodes/hubspot.json +62 -0
  265. package/workflow_nodes/hubspotTrigger.json +138 -0
  266. package/workflow_nodes/humanticAi.json +82 -0
  267. package/workflow_nodes/hunter.json +168 -0
  268. package/workflow_nodes/iCal.json +20 -0
  269. package/workflow_nodes/if.json +24 -0
  270. package/workflow_nodes/intercom.json +335 -0
  271. package/workflow_nodes/interval.json +8 -0
  272. package/workflow_nodes/invoiceNinja.json +882 -0
  273. package/workflow_nodes/invoiceNinjaTrigger.json +11 -0
  274. package/workflow_nodes/itemLists.json +313 -0
  275. package/workflow_nodes/iterable.json +168 -0
  276. package/workflow_nodes/jenkins.json +172 -0
  277. package/workflow_nodes/jira.json +529 -0
  278. package/workflow_nodes/jiraTrigger.json +308 -0
  279. package/workflow_nodes/jotFormTrigger.json +44 -0
  280. package/workflow_nodes/jwt.json +195 -0
  281. package/workflow_nodes/kafka.json +132 -0
  282. package/workflow_nodes/kafkaTrigger.json +11 -0
  283. package/workflow_nodes/keap.json +915 -0
  284. package/workflow_nodes/keapTrigger.json +37 -0
  285. package/workflow_nodes/kitemaker.json +153 -0
  286. package/workflow_nodes/koBoToolbox.json +337 -0
  287. package/workflow_nodes/koBoToolboxTrigger.json +8 -0
  288. package/workflow_nodes/langchain_Summarization Chain.json +60 -0
  289. package/workflow_nodes/langchain_agent.json +145 -0
  290. package/workflow_nodes/langchain_allowFileUploads.json +180 -0
  291. package/workflow_nodes/langchain_chainLlm.json +16 -0
  292. package/workflow_nodes/langchain_chainSummarization.json +119 -0
  293. package/workflow_nodes/langchain_code.json +62 -0
  294. package/workflow_nodes/langchain_documentBinaryInputLoader.json +8 -0
  295. package/workflow_nodes/langchain_documentDefaultDataLoader.json +8 -0
  296. package/workflow_nodes/langchain_documentGithubLoader.json +8 -0
  297. package/workflow_nodes/langchain_documentJsonInputLoader.json +8 -0
  298. package/workflow_nodes/langchain_embeddingDimensions.json +17 -0
  299. package/workflow_nodes/langchain_embeddingsAwsBedrock.json +8 -0
  300. package/workflow_nodes/langchain_embeddingsAzureOpenAi.json +151 -0
  301. package/workflow_nodes/langchain_embeddingsCohere.json +8 -0
  302. package/workflow_nodes/langchain_embeddingsGoogleGemini.json +8 -0
  303. package/workflow_nodes/langchain_embeddingsGoogleVertex.json +8 -0
  304. package/workflow_nodes/langchain_embeddingsHuggingFaceInference.json +8 -0
  305. package/workflow_nodes/langchain_embeddingsMistralCloud.json +8 -0
  306. package/workflow_nodes/langchain_embeddingsOllama.json +8 -0
  307. package/workflow_nodes/langchain_informationExtractor.json +81 -0
  308. package/workflow_nodes/langchain_lmChatAwsBedrock.json +8 -0
  309. package/workflow_nodes/langchain_lmChatAzureOpenAi.json +151 -0
  310. package/workflow_nodes/langchain_lmChatDeepSeek.json +10 -0
  311. package/workflow_nodes/langchain_lmChatGoogleGemini.json +31 -0
  312. package/workflow_nodes/langchain_lmChatGoogleVertex.json +32 -0
  313. package/workflow_nodes/langchain_lmChatGroq.json +8 -0
  314. package/workflow_nodes/langchain_lmChatMistralCloud.json +8 -0
  315. package/workflow_nodes/langchain_lmChatOllama.json +8 -0
  316. package/workflow_nodes/langchain_lmChatOpenAi.json +155 -0
  317. package/workflow_nodes/langchain_lmChatOpenRouter.json +10 -0
  318. package/workflow_nodes/langchain_lmChatXAiGrok.json +10 -0
  319. package/workflow_nodes/langchain_lmCohere.json +8 -0
  320. package/workflow_nodes/langchain_lmOllama.json +8 -0
  321. package/workflow_nodes/langchain_lmOpenAi.json +251 -0
  322. package/workflow_nodes/langchain_lmOpenHuggingFaceInference.json +8 -0
  323. package/workflow_nodes/langchain_manualChatTrigger.json +11 -0
  324. package/workflow_nodes/langchain_mcpClientTool.json +86 -0
  325. package/workflow_nodes/langchain_mcpTrigger.json +8 -0
  326. package/workflow_nodes/langchain_memoryBufferWindow.json +13 -0
  327. package/workflow_nodes/langchain_memoryChatRetriever.json +22 -0
  328. package/workflow_nodes/langchain_memoryManager.json +106 -0
  329. package/workflow_nodes/langchain_memoryMongoDbChat.json +10 -0
  330. package/workflow_nodes/langchain_memoryMotorhead.json +13 -0
  331. package/workflow_nodes/langchain_memoryPostgresChat.json +13 -0
  332. package/workflow_nodes/langchain_memoryRedisChat.json +15 -0
  333. package/workflow_nodes/langchain_memoryXata.json +14 -0
  334. package/workflow_nodes/langchain_memoryZep.json +13 -0
  335. package/workflow_nodes/langchain_model.json +155 -0
  336. package/workflow_nodes/langchain_mongoCollection.json +16 -0
  337. package/workflow_nodes/langchain_notice.json +22 -0
  338. package/workflow_nodes/langchain_openAiAssistant.json +132 -0
  339. package/workflow_nodes/langchain_options.json +17 -0
  340. package/workflow_nodes/langchain_outputParserAutofixing.json +8 -0
  341. package/workflow_nodes/langchain_outputParserItemList.json +8 -0
  342. package/workflow_nodes/langchain_outputParserStructured.json +12 -0
  343. package/workflow_nodes/langchain_pineconeNamespace.json +16 -0
  344. package/workflow_nodes/langchain_queryName.json +16 -0
  345. package/workflow_nodes/langchain_retrieverContextualCompression.json +8 -0
  346. package/workflow_nodes/langchain_retrieverMultiQuery.json +8 -0
  347. package/workflow_nodes/langchain_retrieverVectorStore.json +8 -0
  348. package/workflow_nodes/langchain_retrieverWorkflow.json +103 -0
  349. package/workflow_nodes/langchain_sentimentAnalysis.json +52 -0
  350. package/workflow_nodes/langchain_systemPromptTemplate.json +47 -0
  351. package/workflow_nodes/langchain_tableName.json +23 -0
  352. package/workflow_nodes/langchain_textClassifier.json +66 -0
  353. package/workflow_nodes/langchain_textSplitterCharacterTextSplitter.json +8 -0
  354. package/workflow_nodes/langchain_textSplitterRecursiveCharacterTextSplitter.json +8 -0
  355. package/workflow_nodes/langchain_textSplitterTokenSplitter.json +8 -0
  356. package/workflow_nodes/langchain_toolCalculator.json +8 -0
  357. package/workflow_nodes/langchain_toolCode.json +12 -0
  358. package/workflow_nodes/langchain_toolHttpRequest.json +232 -0
  359. package/workflow_nodes/langchain_toolSearXng.json +8 -0
  360. package/workflow_nodes/langchain_toolSerpApi.json +8 -0
  361. package/workflow_nodes/langchain_toolThink.json +8 -0
  362. package/workflow_nodes/langchain_toolVectorStore.json +11 -0
  363. package/workflow_nodes/langchain_toolWikipedia.json +8 -0
  364. package/workflow_nodes/langchain_toolWolframAlpha.json +8 -0
  365. package/workflow_nodes/langchain_toolWorkflow.json +8 -0
  366. package/workflow_nodes/langchain_vectorStoreInMemoryInsert.json +29 -0
  367. package/workflow_nodes/langchain_vectorStoreInMemoryLoad.json +8 -0
  368. package/workflow_nodes/langchain_vectorStorePineconeInsert.json +37 -0
  369. package/workflow_nodes/langchain_vectorStorePineconeLoad.json +8 -0
  370. package/workflow_nodes/langchain_vectorStoreSupabaseInsert.json +32 -0
  371. package/workflow_nodes/langchain_vectorStoreSupabaseLoad.json +8 -0
  372. package/workflow_nodes/langchain_vectorStoreZepInsert.json +46 -0
  373. package/workflow_nodes/langchain_vectorStoreZepLoad.json +8 -0
  374. package/workflow_nodes/ldap.json +182 -0
  375. package/workflow_nodes/lemlist.json +44 -0
  376. package/workflow_nodes/lemlistTrigger.json +45 -0
  377. package/workflow_nodes/limit.json +26 -0
  378. package/workflow_nodes/line.json +95 -0
  379. package/workflow_nodes/linear.json +151 -0
  380. package/workflow_nodes/linearTrigger.json +71 -0
  381. package/workflow_nodes/lingvaNex.json +66 -0
  382. package/workflow_nodes/linkedIn.json +142 -0
  383. package/workflow_nodes/localFileTrigger.json +120 -0
  384. package/workflow_nodes/lonescale.json +171 -0
  385. package/workflow_nodes/lonescaleTrigger.json +8 -0
  386. package/workflow_nodes/magento2.json +164 -0
  387. package/workflow_nodes/mailcheck.json +46 -0
  388. package/workflow_nodes/mailchimp.json +507 -0
  389. package/workflow_nodes/mailchimpTrigger.json +100 -0
  390. package/workflow_nodes/mailerLite.json +24 -0
  391. package/workflow_nodes/mailerLiteTrigger.json +74 -0
  392. package/workflow_nodes/mailgun.json +81 -0
  393. package/workflow_nodes/mailjet.json +201 -0
  394. package/workflow_nodes/mailjetTrigger.json +8 -0
  395. package/workflow_nodes/mandrill.json +372 -0
  396. package/workflow_nodes/manualTrigger.json +8 -0
  397. package/workflow_nodes/markdown.json +376 -0
  398. package/workflow_nodes/marketstack.json +126 -0
  399. package/workflow_nodes/matrix.json +264 -0
  400. package/workflow_nodes/mattermost.json +8 -0
  401. package/workflow_nodes/mautic.json +564 -0
  402. package/workflow_nodes/mauticTrigger.json +54 -0
  403. package/workflow_nodes/medium.json +209 -0
  404. package/workflow_nodes/merge.json +125 -0
  405. package/workflow_nodes/messageBird.json +182 -0
  406. package/workflow_nodes/metabase.json +175 -0
  407. package/workflow_nodes/microsoftDynamicsCrm.json +100 -0
  408. package/workflow_nodes/microsoftEntra.json +51 -0
  409. package/workflow_nodes/microsoftExcel.json +35 -0
  410. package/workflow_nodes/microsoftGraphSecurity.json +113 -0
  411. package/workflow_nodes/microsoftOneDrive.json +232 -0
  412. package/workflow_nodes/microsoftOneDriveTrigger.json +80 -0
  413. package/workflow_nodes/microsoftOutlook.json +40 -0
  414. package/workflow_nodes/microsoftOutlookTrigger.json +24 -0
  415. package/workflow_nodes/microsoftSql.json +81 -0
  416. package/workflow_nodes/microsoftTeams.json +36 -0
  417. package/workflow_nodes/microsoftToDo.json +181 -0
  418. package/workflow_nodes/mindee.json +86 -0
  419. package/workflow_nodes/misp.json +399 -0
  420. package/workflow_nodes/mocean.json +103 -0
  421. package/workflow_nodes/mondayCom.json +290 -0
  422. package/workflow_nodes/mongoDb.json +16 -0
  423. package/workflow_nodes/monicaCrm.json +543 -0
  424. package/workflow_nodes/moveBinaryData.json +121 -0
  425. package/workflow_nodes/mqtt.json +67 -0
  426. package/workflow_nodes/mqttTrigger.json +47 -0
  427. package/workflow_nodes/msg91.json +65 -0
  428. package/workflow_nodes/mySql.json +111 -0
  429. package/workflow_nodes/n8n.json +75 -0
  430. package/workflow_nodes/n8nTrigger.json +27 -0
  431. package/workflow_nodes/nasa.json +310 -0
  432. package/workflow_nodes/netlify.json +87 -0
  433. package/workflow_nodes/netlifyTrigger.json +68 -0
  434. package/workflow_nodes/netscalerAdc.json +243 -0
  435. package/workflow_nodes/nextCloud.json +312 -0
  436. package/workflow_nodes/noOp.json +8 -0
  437. package/workflow_nodes/nocoDb.json +276 -0
  438. package/workflow_nodes/notion.json +8 -0
  439. package/workflow_nodes/notionTrigger.json +75 -0
  440. package/workflow_nodes/npm.json +64 -0
  441. package/workflow_nodes/odoo.json +344 -0
  442. package/workflow_nodes/okta.json +97 -0
  443. package/workflow_nodes/oneSimpleApi.json +281 -0
  444. package/workflow_nodes/onfleet.json +316 -0
  445. package/workflow_nodes/onfleetTrigger.json +8 -0
  446. package/workflow_nodes/openAi.json +154 -0
  447. package/workflow_nodes/openThesaurus.json +81 -0
  448. package/workflow_nodes/openWeatherMap.json +129 -0
  449. package/workflow_nodes/orbit.json +375 -0
  450. package/workflow_nodes/oura.json +74 -0
  451. package/workflow_nodes/paddle.json +403 -0
  452. package/workflow_nodes/pagerDuty.json +351 -0
  453. package/workflow_nodes/payPal.json +196 -0
  454. package/workflow_nodes/payPalTrigger.json +40 -0
  455. package/workflow_nodes/peekalink.json +41 -0
  456. package/workflow_nodes/phantombuster.json +172 -0
  457. package/workflow_nodes/philipsHue.json +177 -0
  458. package/workflow_nodes/pipedrive.json +860 -0
  459. package/workflow_nodes/pipedriveTrigger.json +11 -0
  460. package/workflow_nodes/plivo.json +91 -0
  461. package/workflow_nodes/postHog.json +122 -0
  462. package/workflow_nodes/postbin.json +60 -0
  463. package/workflow_nodes/postgres.json +109 -0
  464. package/workflow_nodes/postgresTrigger.json +8 -0
  465. package/workflow_nodes/postmarkTrigger.json +72 -0
  466. package/workflow_nodes/profitWell.json +305 -0
  467. package/workflow_nodes/pushbullet.json +186 -0
  468. package/workflow_nodes/pushcut.json +75 -0
  469. package/workflow_nodes/pushcutTrigger.json +8 -0
  470. package/workflow_nodes/pushover.json +159 -0
  471. package/workflow_nodes/questDb.json +94 -0
  472. package/workflow_nodes/quickChart.json +188 -0
  473. package/workflow_nodes/quickbase.json +205 -0
  474. package/workflow_nodes/quickbooks.json +550 -0
  475. package/workflow_nodes/rabbitmq.json +165 -0
  476. package/workflow_nodes/rabbitmqTrigger.json +8 -0
  477. package/workflow_nodes/raindrop.json +216 -0
  478. package/workflow_nodes/readBinaryFile.json +26 -0
  479. package/workflow_nodes/readBinaryFiles.json +26 -0
  480. package/workflow_nodes/readPDF.json +31 -0
  481. package/workflow_nodes/readWriteFile.json +27 -0
  482. package/workflow_nodes/reddit.json +309 -0
  483. package/workflow_nodes/redis.json +183 -0
  484. package/workflow_nodes/redisTrigger.json +8 -0
  485. package/workflow_nodes/removeDuplicates.json +8 -0
  486. package/workflow_nodes/renameKeys.json +67 -0
  487. package/workflow_nodes/respondToWebhook.json +126 -0
  488. package/workflow_nodes/rocketchat.json +216 -0
  489. package/workflow_nodes/rssFeedRead.json +28 -0
  490. package/workflow_nodes/rssFeedReadTrigger.json +17 -0
  491. package/workflow_nodes/rundeck.json +79 -0
  492. package/workflow_nodes/s3.json +425 -0
  493. package/workflow_nodes/salesforce.json +1137 -0
  494. package/workflow_nodes/salesforceTrigger.json +122 -0
  495. package/workflow_nodes/salesmate.json +467 -0
  496. package/workflow_nodes/scheduleTrigger.json +270 -0
  497. package/workflow_nodes/seaTable.json +8 -0
  498. package/workflow_nodes/seaTableTrigger.json +87 -0
  499. package/workflow_nodes/securityScorecard.json +459 -0
  500. package/workflow_nodes/segment.json +219 -0
  501. package/workflow_nodes/sendGrid.json +359 -0
  502. package/workflow_nodes/sendy.json +225 -0
  503. package/workflow_nodes/sentryIo.json +426 -0
  504. package/workflow_nodes/serviceNow.json +544 -0
  505. package/workflow_nodes/set.json +124 -0
  506. package/workflow_nodes/shopify.json +707 -0
  507. package/workflow_nodes/shopifyTrigger.json +8 -0
  508. package/workflow_nodes/signl4.json +133 -0
  509. package/workflow_nodes/simulate.json +30 -0
  510. package/workflow_nodes/simulateTrigger.json +8 -0
  511. package/workflow_nodes/slack.json +62 -0
  512. package/workflow_nodes/slackTrigger.json +135 -0
  513. package/workflow_nodes/sms77.json +121 -0
  514. package/workflow_nodes/snowflake.json +65 -0
  515. package/workflow_nodes/sort.json +57 -0
  516. package/workflow_nodes/splitInBatches.json +30 -0
  517. package/workflow_nodes/splitOut.json +62 -0
  518. package/workflow_nodes/splunk.json +40 -0
  519. package/workflow_nodes/spontit.json +123 -0
  520. package/workflow_nodes/spotify.json +285 -0
  521. package/workflow_nodes/spreadsheetFile.json +8 -0
  522. package/workflow_nodes/sseTrigger.json +8 -0
  523. package/workflow_nodes/ssh.json +105 -0
  524. package/workflow_nodes/stackby.json +85 -0
  525. package/workflow_nodes/start.json +15 -0
  526. package/workflow_nodes/stickyNote.json +36 -0
  527. package/workflow_nodes/stopAndError.json +8 -0
  528. package/workflow_nodes/storyblok.json +138 -0
  529. package/workflow_nodes/strapi.json +138 -0
  530. package/workflow_nodes/strava.json +427 -0
  531. package/workflow_nodes/stravaTrigger.json +79 -0
  532. package/workflow_nodes/stripe.json +357 -0
  533. package/workflow_nodes/stripeTrigger.json +775 -0
  534. package/workflow_nodes/summarize.json +124 -0
  535. package/workflow_nodes/supabase.json +136 -0
  536. package/workflow_nodes/surveyMonkeyTrigger.json +160 -0
  537. package/workflow_nodes/switch.json +91 -0
  538. package/workflow_nodes/syncroMsp.json +8 -0
  539. package/workflow_nodes/taiga.json +340 -0
  540. package/workflow_nodes/taigaTrigger.json +81 -0
  541. package/workflow_nodes/tapfiliate.json +241 -0
  542. package/workflow_nodes/telegram.json +612 -0
  543. package/workflow_nodes/telegramTrigger.json +142 -0
  544. package/workflow_nodes/theHive.json +497 -0
  545. package/workflow_nodes/theHiveProject.json +8 -0
  546. package/workflow_nodes/theHiveProjectTrigger.json +162 -0
  547. package/workflow_nodes/theHiveTrigger.json +101 -0
  548. package/workflow_nodes/timescaleDb.json +95 -0
  549. package/workflow_nodes/todoist.json +285 -0
  550. package/workflow_nodes/togglTrigger.json +24 -0
  551. package/workflow_nodes/totp.json +86 -0
  552. package/workflow_nodes/travisCi.json +142 -0
  553. package/workflow_nodes/trello.json +609 -0
  554. package/workflow_nodes/trelloTrigger.json +8 -0
  555. package/workflow_nodes/twake.json +76 -0
  556. package/workflow_nodes/twilio.json +95 -0
  557. package/workflow_nodes/twilioTrigger.json +46 -0
  558. package/workflow_nodes/twist.json +376 -0
  559. package/workflow_nodes/twitter.json +40 -0
  560. package/workflow_nodes/typeformTrigger.json +62 -0
  561. package/workflow_nodes/unleashedSoftware.json +154 -0
  562. package/workflow_nodes/uplead.json +72 -0
  563. package/workflow_nodes/uproc.json +26 -0
  564. package/workflow_nodes/uptimeRobot.json +453 -0
  565. package/workflow_nodes/urlScanIo.json +113 -0
  566. package/workflow_nodes/venafiTlsProtectCloud.json +310 -0
  567. package/workflow_nodes/venafiTlsProtectCloudTrigger.json +38 -0
  568. package/workflow_nodes/venafiTlsProtectDatacenter.json +491 -0
  569. package/workflow_nodes/vero.json +158 -0
  570. package/workflow_nodes/vonage.json +125 -0
  571. package/workflow_nodes/wait.json +71 -0
  572. package/workflow_nodes/webflow.json +38 -0
  573. package/workflow_nodes/webflowTrigger.json +8 -0
  574. package/workflow_nodes/webhook.json +55 -0
  575. package/workflow_nodes/wekan.json +460 -0
  576. package/workflow_nodes/whatsApp.json +476 -0
  577. package/workflow_nodes/whatsAppTrigger.json +103 -0
  578. package/workflow_nodes/wise.json +330 -0
  579. package/workflow_nodes/wiseTrigger.json +8 -0
  580. package/workflow_nodes/wooCommerce.json +812 -0
  581. package/workflow_nodes/wooCommerceTrigger.json +8 -0
  582. package/workflow_nodes/wordpress.json +500 -0
  583. package/workflow_nodes/workableTrigger.json +51 -0
  584. package/workflow_nodes/writeBinaryFile.json +34 -0
  585. package/workflow_nodes/wufooTrigger.json +37 -0
  586. package/workflow_nodes/xero.json +530 -0
  587. package/workflow_nodes/xml.json +129 -0
  588. package/workflow_nodes/youTube.json +578 -0
  589. package/workflow_nodes/yourls.json +71 -0
  590. package/workflow_nodes/zammad.json +406 -0
  591. package/workflow_nodes/zendesk.json +526 -0
  592. package/workflow_nodes/zendeskTrigger.json +187 -0
  593. package/workflow_nodes/zohoCrm.json +721 -0
  594. package/workflow_nodes/zoom.json +507 -0
  595. 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
+ };