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,542 @@
1
+ /**
2
+ * n8n Integration Module
3
+ *
4
+ * Provides communication and workflow management functionality for n8n instances.
5
+ * Supports both REST API and filesystem integration methods.
6
+ */
7
+
8
+ const fs = require('fs').promises;
9
+ const path = require('path');
10
+ const fetch = require('node-fetch');
11
+ const { logger } = require('../utils/logger');
12
+ const config = require('../../config/default');
13
+ const { workflowStorage } = require('./storage');
14
+
15
+ /**
16
+ * Determines the integration type based on configuration
17
+ * Returns 'api' if n8n.apiKey is configured or 'api' is explicitly configured
18
+ * Returns 'filesystem' if configured or if apiKey is not set
19
+ */
20
+ const getIntegrationType = () => {
21
+ const configType = config.n8n.integrationType;
22
+
23
+ // If explicitly configured, use that
24
+ if (configType === 'api') {
25
+ return 'api';
26
+ }
27
+
28
+ if (configType === 'filesystem') {
29
+ return 'filesystem';
30
+ }
31
+
32
+ // Auto-detection (default)
33
+ if (config.n8n.apiKey) {
34
+ return 'api';
35
+ }
36
+
37
+ return 'filesystem';
38
+ };
39
+
40
+ /**
41
+ * n8n Integration Service
42
+ */
43
+ const n8nIntegration = {
44
+ /**
45
+ * Deploy a workflow to n8n
46
+ *
47
+ * @param {string} workflowIdOrPath - ID or path of the workflow to deploy
48
+ * @returns {Promise<Object>} Result of the deployment operation
49
+ */
50
+ async deployWorkflow(workflowIdOrPath) {
51
+ try {
52
+ // Load workflow from storage
53
+ const workflow = await workflowStorage.loadWorkflow(workflowIdOrPath);
54
+ if (!workflow) {
55
+ throw new Error(`Workflow with ID/path ${workflowIdOrPath} not found`);
56
+ }
57
+
58
+ const integrationType = getIntegrationType();
59
+ logger.info('Deploying workflow', {
60
+ id: workflowIdOrPath,
61
+ integrationType,
62
+ name: workflow.name || 'Unnamed Workflow'
63
+ });
64
+
65
+ if (integrationType === 'api') {
66
+ // Deploy via n8n API
67
+ const response = await fetch(`${config.n8n.apiUrl}workflows`, {
68
+ method: 'POST',
69
+ headers: {
70
+ 'Content-Type': 'application/json',
71
+ 'X-N8N-API-KEY': config.n8n.apiKey
72
+ },
73
+ body: JSON.stringify(workflow)
74
+ });
75
+
76
+ if (!response.ok) {
77
+ const errorData = await response.json().catch(() => ({}));
78
+ logger.error('n8n API error during deployment', {
79
+ status: response.status,
80
+ error: errorData
81
+ });
82
+ throw new Error(`Failed to deploy workflow: ${response.status} ${response.statusText}`);
83
+ }
84
+
85
+ const result = await response.json();
86
+ logger.info('Workflow deployed successfully via API', { id: result.id });
87
+ return {
88
+ success: true,
89
+ id: result.id,
90
+ message: 'Workflow deployed successfully via API',
91
+ n8nId: result.id
92
+ };
93
+ } else if (integrationType === 'filesystem') {
94
+ // If workflow doesn't have an id, generate one
95
+ if (!workflow.id) {
96
+ workflow.id = path.basename(workflowIdOrPath, '.json');
97
+ }
98
+
99
+ // Ensure the n8n workflows directory exists in the config
100
+ if (!config.n8n.workflowsPath) {
101
+ throw new Error('n8n.workflowsPath is not configured');
102
+ }
103
+
104
+ // Deploy via filesystem
105
+ const n8nWorkflowsDir = path.resolve(process.cwd(), config.n8n.workflowsPath || './n8n-workflows');
106
+ await fs.mkdir(n8nWorkflowsDir, { recursive: true });
107
+
108
+ const filePath = path.join(n8nWorkflowsDir, `${workflow.id}.json`);
109
+ await fs.writeFile(filePath, JSON.stringify(workflow, null, 2));
110
+
111
+ logger.info('Workflow deployed successfully via filesystem', {
112
+ id: workflow.id,
113
+ path: filePath
114
+ });
115
+
116
+ return {
117
+ success: true,
118
+ id: workflow.id,
119
+ path: filePath,
120
+ message: 'Workflow deployed successfully via filesystem'
121
+ };
122
+ } else {
123
+ throw new Error('Invalid integration type');
124
+ }
125
+ } catch (error) {
126
+ logger.error('Failed to deploy workflow', { error: error.message });
127
+ throw new Error(`Failed to deploy workflow: ${error.message}`);
128
+ }
129
+ },
130
+
131
+ /**
132
+ * Activate or deactivate a workflow in n8n
133
+ *
134
+ * @param {string} workflowIdOrPath - ID or path of the workflow
135
+ * @param {boolean} [activate=true] - Whether to activate or deactivate
136
+ * @returns {Promise<Object>} Result of the operation
137
+ */
138
+ async activateWorkflow(workflowIdOrPath, activate = true) {
139
+ try {
140
+ const integrationType = getIntegrationType();
141
+ logger.info(`${activate ? 'Activating' : 'Deactivating'} workflow`, {
142
+ id: workflowIdOrPath,
143
+ integrationType
144
+ });
145
+
146
+ if (integrationType === 'api') {
147
+ // Determine the n8n workflow ID
148
+ let n8nWorkflowId;
149
+
150
+ // If the input looks like a path, extract the filename without extension
151
+ if (workflowIdOrPath.includes('/') || workflowIdOrPath.includes('\\')) {
152
+ n8nWorkflowId = path.basename(workflowIdOrPath, '.json');
153
+ } else {
154
+ n8nWorkflowId = workflowIdOrPath;
155
+ }
156
+
157
+ // Activate via n8n API
158
+ const response = await fetch(`${config.n8n.apiUrl}workflows/${n8nWorkflowId}/activate`, {
159
+ method: 'POST',
160
+ headers: {
161
+ 'Content-Type': 'application/json',
162
+ 'X-N8N-API-KEY': config.n8n.apiKey
163
+ },
164
+ body: JSON.stringify({ active: activate })
165
+ });
166
+
167
+ if (!response.ok) {
168
+ const errorData = await response.json().catch(() => ({}));
169
+ logger.error('n8n API error during activation', {
170
+ status: response.status,
171
+ error: errorData
172
+ });
173
+ throw new Error(`Failed to ${activate ? 'activate' : 'deactivate'} workflow: ${response.status} ${response.statusText}`);
174
+ }
175
+
176
+ const result = await response.json();
177
+ logger.info(`Workflow ${activate ? 'activated' : 'deactivated'} successfully via API`, {
178
+ id: result.id
179
+ });
180
+
181
+ return {
182
+ success: true,
183
+ id: result.id,
184
+ active: activate,
185
+ message: `Workflow ${activate ? 'activated' : 'deactivated'} successfully`
186
+ };
187
+ } else if (integrationType === 'filesystem') {
188
+ // Load the workflow
189
+ const workflow = await workflowStorage.loadWorkflow(workflowIdOrPath);
190
+ if (!workflow) {
191
+ throw new Error(`Workflow with ID/path ${workflowIdOrPath} not found`);
192
+ }
193
+
194
+ // Update workflow active status
195
+ workflow.active = activate;
196
+
197
+ // Save back to original location
198
+ if (workflowIdOrPath.includes('/') || workflowIdOrPath.includes('\\')) {
199
+ await fs.writeFile(workflowIdOrPath, JSON.stringify(workflow, null, 2));
200
+ } else {
201
+ // For backward compatibility, save to the default location
202
+ const filePath = path.join(config.storage.workflowsPath, `${workflowIdOrPath}.json`);
203
+ await fs.writeFile(filePath, JSON.stringify(workflow, null, 2));
204
+ }
205
+
206
+ // If n8n workflows directory is configured, also update there
207
+ if (config.n8n.workflowsPath) {
208
+ const n8nWorkflowsDir = path.resolve(process.cwd(), config.n8n.workflowsPath);
209
+ const n8nFilePath = path.join(n8nWorkflowsDir, `${workflow.id || path.basename(workflowIdOrPath, '.json')}.json`);
210
+
211
+ // Check if the file exists in n8n workflows directory
212
+ try {
213
+ await fs.access(n8nFilePath);
214
+ await fs.writeFile(n8nFilePath, JSON.stringify(workflow, null, 2));
215
+ logger.info(`Updated workflow in n8n directory: ${activate ? 'active' : 'inactive'}`, {
216
+ path: n8nFilePath
217
+ });
218
+ } catch (err) {
219
+ logger.warn('Workflow not found in n8n directory, not updated', {
220
+ path: n8nFilePath
221
+ });
222
+ }
223
+ }
224
+
225
+ logger.info(`Workflow ${activate ? 'activated' : 'deactivated'} successfully via filesystem`, {
226
+ id: workflow.id || workflowIdOrPath
227
+ });
228
+
229
+ return {
230
+ success: true,
231
+ id: workflow.id || path.basename(workflowIdOrPath, '.json'),
232
+ active: activate,
233
+ message: `Workflow ${activate ? 'activated' : 'deactivated'} successfully`
234
+ };
235
+ } else {
236
+ throw new Error('Invalid integration type');
237
+ }
238
+ } catch (error) {
239
+ logger.error(`Failed to ${activate ? 'activate' : 'deactivate'} workflow`, {
240
+ error: error.message
241
+ });
242
+ throw new Error(`Failed to ${activate ? 'activate' : 'deactivate'} workflow: ${error.message}`);
243
+ }
244
+ },
245
+
246
+ /**
247
+ * Retrieve a workflow from n8n
248
+ *
249
+ * @param {string} workflowId - ID of the workflow in n8n
250
+ * @returns {Promise<Object>} The retrieved workflow data
251
+ */
252
+ async getWorkflow(workflowId) {
253
+ try {
254
+ const integrationType = getIntegrationType();
255
+ logger.info('Retrieving workflow from n8n', { id: workflowId, integrationType });
256
+
257
+ if (integrationType === 'api') {
258
+ // Retrieve via n8n API
259
+ const response = await fetch(`${config.n8n.apiUrl}workflows/${workflowId}`, {
260
+ method: 'GET',
261
+ headers: {
262
+ 'X-N8N-API-KEY': config.n8n.apiKey
263
+ }
264
+ });
265
+
266
+ if (!response.ok) {
267
+ if (response.status === 404) {
268
+ return { success: false, message: 'Workflow not found in n8n' };
269
+ }
270
+
271
+ const errorData = await response.json().catch(() => ({}));
272
+ logger.error('n8n API error during retrieval', {
273
+ status: response.status,
274
+ error: errorData
275
+ });
276
+ throw new Error(`Failed to retrieve workflow: ${response.status} ${response.statusText}`);
277
+ }
278
+
279
+ const workflow = await response.json();
280
+ logger.info('Workflow retrieved successfully via API', { id: workflow.id });
281
+
282
+ return {
283
+ success: true,
284
+ workflow,
285
+ message: 'Workflow retrieved successfully'
286
+ };
287
+ } else if (integrationType === 'filesystem') {
288
+ // If n8n workflows directory is not configured, return error
289
+ if (!config.n8n.workflowsPath) {
290
+ throw new Error('n8n.workflowsPath is not configured');
291
+ }
292
+
293
+ // Retrieve via filesystem
294
+ const n8nWorkflowsDir = path.resolve(process.cwd(), config.n8n.workflowsPath);
295
+ const filePath = path.join(n8nWorkflowsDir, `${workflowId}.json`);
296
+
297
+ try {
298
+ const data = await fs.readFile(filePath, 'utf8');
299
+ const workflow = JSON.parse(data);
300
+
301
+ logger.info('Workflow retrieved successfully via filesystem', {
302
+ id: workflowId,
303
+ path: filePath
304
+ });
305
+
306
+ return {
307
+ success: true,
308
+ workflow,
309
+ path: filePath,
310
+ message: 'Workflow retrieved successfully'
311
+ };
312
+ } catch (error) {
313
+ if (error.code === 'ENOENT') {
314
+ return { success: false, message: 'Workflow not found in n8n' };
315
+ }
316
+ throw error;
317
+ }
318
+ } else {
319
+ throw new Error('Invalid integration type');
320
+ }
321
+ } catch (error) {
322
+ logger.error('Failed to retrieve workflow from n8n', { error: error.message });
323
+ throw new Error(`Failed to retrieve workflow from n8n: ${error.message}`);
324
+ }
325
+ },
326
+
327
+ /**
328
+ * Check the execution status of a workflow in n8n
329
+ *
330
+ * @param {string} workflowId - ID of the workflow in n8n
331
+ * @returns {Promise<Object>} The status information
332
+ */
333
+ async checkExecutionStatus(workflowId) {
334
+ try {
335
+ // Only available via API
336
+ if (getIntegrationType() !== 'api') {
337
+ return {
338
+ success: false,
339
+ message: 'Execution status check is only available with API integration'
340
+ };
341
+ }
342
+
343
+ logger.info('Checking workflow execution status', { id: workflowId });
344
+
345
+ // Get most recent executions
346
+ const response = await fetch(`${config.n8n.apiUrl}executions?workflowId=${workflowId}&limit=1`, {
347
+ method: 'GET',
348
+ headers: {
349
+ 'X-N8N-API-KEY': config.n8n.apiKey
350
+ }
351
+ });
352
+
353
+ if (!response.ok) {
354
+ const errorData = await response.json().catch(() => ({}));
355
+ logger.error('n8n API error during execution status check', {
356
+ status: response.status,
357
+ error: errorData
358
+ });
359
+ throw new Error(`Failed to check execution status: ${response.status} ${response.statusText}`);
360
+ }
361
+
362
+ const data = await response.json();
363
+ const executions = data.data || [];
364
+
365
+ if (executions.length === 0) {
366
+ return {
367
+ success: true,
368
+ hasExecutions: false,
369
+ message: 'No executions found for this workflow'
370
+ };
371
+ }
372
+
373
+ const latestExecution = executions[0];
374
+ logger.info('Workflow execution status retrieved', {
375
+ id: workflowId,
376
+ executionId: latestExecution.id,
377
+ status: latestExecution.status
378
+ });
379
+
380
+ return {
381
+ success: true,
382
+ hasExecutions: true,
383
+ latestExecution: {
384
+ id: latestExecution.id,
385
+ status: latestExecution.status,
386
+ startedAt: latestExecution.startedAt,
387
+ finishedAt: latestExecution.finishedAt,
388
+ mode: latestExecution.mode
389
+ },
390
+ message: 'Execution status retrieved successfully'
391
+ };
392
+ } catch (error) {
393
+ logger.error('Failed to check workflow execution status', { error: error.message });
394
+ throw new Error(`Failed to check workflow execution status: ${error.message}`);
395
+ }
396
+ },
397
+
398
+ /**
399
+ * List workflows from n8n
400
+ *
401
+ * @param {Object} [options] - Optional parameters for filtering and pagination
402
+ * @returns {Promise<Object>} The list of workflows
403
+ */
404
+ async listWorkflows(options = {}) {
405
+ try {
406
+ const integrationType = getIntegrationType();
407
+ logger.info('Listing workflows from n8n', { integrationType });
408
+
409
+ if (integrationType === 'api') {
410
+ // Construct query parameters
411
+ const queryParams = new URLSearchParams();
412
+ if (options.active !== undefined) {
413
+ queryParams.append('active', options.active);
414
+ }
415
+ if (options.limit) {
416
+ queryParams.append('limit', options.limit);
417
+ }
418
+ if (options.offset) {
419
+ queryParams.append('offset', options.offset);
420
+ }
421
+
422
+ // List via n8n API
423
+ const response = await fetch(`${config.n8n.apiUrl}workflows?${queryParams.toString()}`, {
424
+ method: 'GET',
425
+ headers: {
426
+ 'X-N8N-API-KEY': config.n8n.apiKey
427
+ }
428
+ });
429
+
430
+ if (!response.ok) {
431
+ const errorData = await response.json().catch(() => ({}));
432
+ logger.error('n8n API error during workflow listing', {
433
+ status: response.status,
434
+ error: errorData
435
+ });
436
+ throw new Error(`Failed to list workflows: ${response.status} ${response.statusText}`);
437
+ }
438
+
439
+ const data = await response.json();
440
+ const workflows = data.data || [];
441
+
442
+ logger.info('Workflows listed successfully via API', { count: workflows.length });
443
+
444
+ return {
445
+ success: true,
446
+ workflows: workflows.map(w => ({
447
+ id: w.id,
448
+ name: w.name,
449
+ active: w.active,
450
+ createdAt: w.createdAt,
451
+ updatedAt: w.updatedAt
452
+ })),
453
+ count: workflows.length,
454
+ message: `Retrieved ${workflows.length} workflows from n8n`
455
+ };
456
+ } else if (integrationType === 'filesystem') {
457
+ // If n8n workflows directory is not configured, return error
458
+ if (!config.n8n.workflowsPath) {
459
+ throw new Error('n8n.workflowsPath is not configured');
460
+ }
461
+
462
+ // List via filesystem
463
+ const n8nWorkflowsDir = path.resolve(process.cwd(), config.n8n.workflowsPath);
464
+
465
+ try {
466
+ await fs.access(n8nWorkflowsDir);
467
+ } catch (error) {
468
+ if (error.code === 'ENOENT') {
469
+ logger.warn('n8n workflows directory not found', { path: n8nWorkflowsDir });
470
+ return {
471
+ success: true,
472
+ workflows: [],
473
+ count: 0,
474
+ message: 'n8n workflows directory not found'
475
+ };
476
+ }
477
+ throw error;
478
+ }
479
+
480
+ const files = await fs.readdir(n8nWorkflowsDir);
481
+ const jsonFiles = files.filter(file => file.endsWith('.json'));
482
+
483
+ // Apply pagination if options provided
484
+ const { limit, offset } = options;
485
+ const paginatedFiles = limit
486
+ ? jsonFiles.slice(offset || 0, (offset || 0) + limit)
487
+ : jsonFiles;
488
+
489
+ // Process each workflow file
490
+ const workflowPromises = paginatedFiles.map(async (file) => {
491
+ const filePath = path.join(n8nWorkflowsDir, file);
492
+ try {
493
+ const data = await fs.readFile(filePath, 'utf8');
494
+ const workflow = JSON.parse(data);
495
+
496
+ return {
497
+ id: workflow.id || path.basename(file, '.json'),
498
+ name: workflow.name || 'Unnamed Workflow',
499
+ active: workflow.active || false,
500
+ createdAt: workflow.createdAt,
501
+ updatedAt: workflow.updatedAt,
502
+ path: filePath
503
+ };
504
+ } catch (error) {
505
+ logger.error('Error reading workflow file', { path: filePath, error: error.message });
506
+ return null;
507
+ }
508
+ });
509
+
510
+ // Wait for all files to be processed
511
+ const workflows = (await Promise.all(workflowPromises)).filter(w => w !== null);
512
+
513
+ // Apply active filter if provided
514
+ const filteredWorkflows = options.active !== undefined
515
+ ? workflows.filter(w => w.active === options.active)
516
+ : workflows;
517
+
518
+ logger.info('Workflows listed successfully via filesystem', {
519
+ count: filteredWorkflows.length,
520
+ path: n8nWorkflowsDir
521
+ });
522
+
523
+ return {
524
+ success: true,
525
+ workflows: filteredWorkflows,
526
+ count: filteredWorkflows.length,
527
+ message: `Retrieved ${filteredWorkflows.length} workflows from n8n`
528
+ };
529
+ } else {
530
+ throw new Error('Invalid integration type');
531
+ }
532
+ } catch (error) {
533
+ logger.error('Failed to list workflows from n8n', { error: error.message });
534
+ throw new Error(`Failed to list workflows from n8n: ${error.message}`);
535
+ }
536
+ }
537
+ };
538
+
539
+ module.exports = {
540
+ n8nIntegration,
541
+ getIntegrationType
542
+ };