n8n-workflow-builder-mcp 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.cursor/rules/cursor_rules.mdc +53 -0
- package/.cursor/rules/dev_workflow.mdc +219 -0
- package/.cursor/rules/mcp.mdc +430 -0
- package/.cursor/rules/self_improve.mdc +72 -0
- package/.cursor/rules/taskmaster.mdc +382 -0
- package/.cursorignore +1 -0
- package/.cursorrules +4 -0
- package/.env.example +23 -0
- package/.eslintrc.json +38 -0
- package/.github/workflows/npm-publish-github-packages.yml +55 -0
- package/.prettierrc +9 -0
- package/.roo/rules/dev_workflow.md +219 -0
- package/.roo/rules/mcp.md +430 -0
- package/.roo/rules/roo_rules.md +53 -0
- package/.roo/rules/self_improve.md +72 -0
- package/.roo/rules/taskmaster.md +382 -0
- package/.roo/rules-architect/architect-rules +93 -0
- package/.roo/rules-ask/ask-rules +89 -0
- package/.roo/rules-boomerang/boomerang-rules +181 -0
- package/.roo/rules-code/code-rules +61 -0
- package/.roo/rules-debug/debug-rules +68 -0
- package/.roo/rules-test/test-rules +61 -0
- package/.roomodes +63 -0
- package/.taskmasterconfig +31 -0
- package/.windsurfrules +2382 -0
- package/LICENSE +21 -0
- package/README.md +210 -0
- package/config/credentials/credentials.json +1 -0
- package/config/default.js +41 -0
- package/package.json +56 -0
- package/scripts/demo-n8n-integration.js +161 -0
- package/scripts/demo-workflow-generator.js +102 -0
- package/scripts/init.sh +36 -0
- package/scripts/prd.txt +197 -0
- package/src/index.ts +1440 -0
- package/src/middleware/auth.js +273 -0
- package/src/middleware/authorize.js +183 -0
- package/src/middleware/logging.js +64 -0
- package/src/middleware/mcp.js +187 -0
- package/src/middleware/rateLimiter.js +82 -0
- package/src/middleware/validation.js +241 -0
- package/src/models/credential.js +359 -0
- package/src/models/llmService.js +236 -0
- package/src/models/n8nIntegration.js +542 -0
- package/src/models/storage.js +196 -0
- package/src/models/tool.js +148 -0
- package/src/models/user.js +164 -0
- package/src/models/workflow.js +229 -0
- package/src/routes/toolDefinitions.js +62 -0
- package/src/routes/toolExecution.js +79 -0
- package/src/tools/__index.js +242 -0
- package/src/tools/connectionManagement.js +500 -0
- package/src/tools/n8nIntegration.js +370 -0
- package/src/tools/nodeDiscovery.js +488 -0
- package/src/tools/nodeManagement.js +674 -0
- package/src/tools/toolDefinitions.js +660 -0
- package/src/tools/workflowCreation.js +100 -0
- package/src/tools/workflowGenerator.js +152 -0
- package/src/tools/workflowStorage.js +113 -0
- package/src/tools/workflowTesting.js +285 -0
- package/src/utils/encryption.js +164 -0
- package/src/utils/logger.js +84 -0
- package/src/utils/mcp.js +85 -0
- package/src/utils/securityLogger.js +109 -0
- package/tests/auth.test.js +402 -0
- package/tests/authorize.test.js +208 -0
- package/tests/run-memory-tests.js +55 -0
- package/tests/run-tests.js +55 -0
- package/tests/server.test.js +203 -0
- package/tests/unit/add-ai-connections.test.js +385 -0
- package/tests/unit/connectionManagement.test.js +309 -0
- package/tests/unit/langchain-llm-format.test.js +259 -0
- package/tests/unit/memory-connection.test.js +140 -0
- package/tests/unit/memory-integration.test.js +253 -0
- package/tests/unit/n8nIntegration.test.js +291 -0
- package/tests/unit/nodeDiscovery.test.js +270 -0
- package/tests/unit/nodeManagement.test.js +522 -0
- package/tests/unit/utils/mcp-test-utils.js +94 -0
- package/tests/unit/workflowCreation.test.js +110 -0
- package/tests/unit/workflowTesting.test.js +269 -0
- package/tests/user.test.js +181 -0
- package/tsconfig.json +20 -0
- package/workflow_nodes/Brandfetch.json +85 -0
- package/workflow_nodes/WorkflowTrigger.json +28 -0
- package/workflow_nodes/actionNetwork.json +218 -0
- package/workflow_nodes/activeCampaign.json +722 -0
- package/workflow_nodes/activeCampaignTrigger.json +52 -0
- package/workflow_nodes/acuitySchedulingTrigger.json +8 -0
- package/workflow_nodes/adalo.json +123 -0
- package/workflow_nodes/affinity.json +203 -0
- package/workflow_nodes/affinityTrigger.json +124 -0
- package/workflow_nodes/aggregate.json +119 -0
- package/workflow_nodes/agileCrm.json +503 -0
- package/workflow_nodes/aiTransform.json +17 -0
- package/workflow_nodes/airtable.json +226 -0
- package/workflow_nodes/airtableTrigger.json +120 -0
- package/workflow_nodes/airtop.json +10 -0
- package/workflow_nodes/amqp.json +62 -0
- package/workflow_nodes/amqpTrigger.json +8 -0
- package/workflow_nodes/apiTemplateIo.json +147 -0
- package/workflow_nodes/asana.json +446 -0
- package/workflow_nodes/asanaTrigger.json +52 -0
- package/workflow_nodes/automizy.json +195 -0
- package/workflow_nodes/autopilot.json +287 -0
- package/workflow_nodes/autopilotTrigger.json +8 -0
- package/workflow_nodes/awsCertificateManager.json +223 -0
- package/workflow_nodes/awsComprehend.json +125 -0
- package/workflow_nodes/awsDynamoDb.json +251 -0
- package/workflow_nodes/awsElb.json +174 -0
- package/workflow_nodes/awsLambda.json +69 -0
- package/workflow_nodes/awsRekognition.json +191 -0
- package/workflow_nodes/awsS3.json +32 -0
- package/workflow_nodes/awsSes.json +302 -0
- package/workflow_nodes/awsSns.json +110 -0
- package/workflow_nodes/awsSnsTrigger.json +47 -0
- package/workflow_nodes/awsSqs.json +140 -0
- package/workflow_nodes/awsTextract.json +43 -0
- package/workflow_nodes/awsTranscribe.json +217 -0
- package/workflow_nodes/azureCosmosDb.json +8 -0
- package/workflow_nodes/azureStorage.json +17 -0
- package/workflow_nodes/bambooHr.json +8 -0
- package/workflow_nodes/bannerbear.json +126 -0
- package/workflow_nodes/baserow.json +277 -0
- package/workflow_nodes/beeminder.json +146 -0
- package/workflow_nodes/bitbucketTrigger.json +62 -0
- package/workflow_nodes/bitly.json +130 -0
- package/workflow_nodes/bitwarden.json +224 -0
- package/workflow_nodes/box.json +457 -0
- package/workflow_nodes/boxTrigger.json +8 -0
- package/workflow_nodes/brevo.json +41 -0
- package/workflow_nodes/brevoTrigger.json +145 -0
- package/workflow_nodes/bubble.json +212 -0
- package/workflow_nodes/calTrigger.json +91 -0
- package/workflow_nodes/calendlyTrigger.json +71 -0
- package/workflow_nodes/chargebee.json +217 -0
- package/workflow_nodes/chargebeeTrigger.json +187 -0
- package/workflow_nodes/circleCi.json +89 -0
- package/workflow_nodes/ciscoWebex.json +593 -0
- package/workflow_nodes/ciscoWebexTrigger.json +159 -0
- package/workflow_nodes/clearbit.json +138 -0
- package/workflow_nodes/clickUp.json +793 -0
- package/workflow_nodes/clickUpTrigger.json +188 -0
- package/workflow_nodes/clockify.json +372 -0
- package/workflow_nodes/clockifyTrigger.json +26 -0
- package/workflow_nodes/cloudflare.json +103 -0
- package/workflow_nodes/cockpit.json +161 -0
- package/workflow_nodes/coda.json +242 -0
- package/workflow_nodes/code.json +40 -0
- package/workflow_nodes/coinGecko.json +363 -0
- package/workflow_nodes/compareDatasets.json +14 -0
- package/workflow_nodes/compression.json +66 -0
- package/workflow_nodes/contentful.json +29 -0
- package/workflow_nodes/convertKit.json +159 -0
- package/workflow_nodes/convertKitTrigger.json +109 -0
- package/workflow_nodes/convertToFile.json +64 -0
- package/workflow_nodes/copper.json +239 -0
- package/workflow_nodes/copperTrigger.json +8 -0
- package/workflow_nodes/cortex.json +348 -0
- package/workflow_nodes/crateDb.json +90 -0
- package/workflow_nodes/cron.json +23 -0
- package/workflow_nodes/crowdDev.json +8 -0
- package/workflow_nodes/crowdDevTrigger.json +8 -0
- package/workflow_nodes/crypto.json +147 -0
- package/workflow_nodes/customerIo.json +206 -0
- package/workflow_nodes/customerIoTrigger.json +185 -0
- package/workflow_nodes/dateTime.json +39 -0
- package/workflow_nodes/debughelper.json +162 -0
- package/workflow_nodes/deepL.json +103 -0
- package/workflow_nodes/demio.json +187 -0
- package/workflow_nodes/dhl.json +53 -0
- package/workflow_nodes/discord.json +81 -0
- package/workflow_nodes/discourse.json +319 -0
- package/workflow_nodes/disqus.json +254 -0
- package/workflow_nodes/drift.json +112 -0
- package/workflow_nodes/dropbox.json +258 -0
- package/workflow_nodes/dropcontact.json +154 -0
- package/workflow_nodes/e2eTest.json +70 -0
- package/workflow_nodes/editImage.json +132 -0
- package/workflow_nodes/egoi.json +220 -0
- package/workflow_nodes/elasticSecurity.json +401 -0
- package/workflow_nodes/elasticsearch.json +422 -0
- package/workflow_nodes/emailReadImap.json +88 -0
- package/workflow_nodes/emailSend.json +38 -0
- package/workflow_nodes/emelia.json +201 -0
- package/workflow_nodes/emeliaTrigger.json +57 -0
- package/workflow_nodes/erpNext.json +139 -0
- package/workflow_nodes/errorTrigger.json +15 -0
- package/workflow_nodes/evaluationMetrics.json +21 -0
- package/workflow_nodes/eventbriteTrigger.json +125 -0
- package/workflow_nodes/executeCommand.json +25 -0
- package/workflow_nodes/executeWorkflow.json +102 -0
- package/workflow_nodes/executeWorkflowTrigger.json +65 -0
- package/workflow_nodes/executionData.json +35 -0
- package/workflow_nodes/extractFromFile.json +71 -0
- package/workflow_nodes/facebookGraphApi.json +234 -0
- package/workflow_nodes/facebookLeadAdsTrigger.json +8 -0
- package/workflow_nodes/facebookTrigger.json +112 -0
- package/workflow_nodes/figmaTrigger.json +8 -0
- package/workflow_nodes/filemaker.json +268 -0
- package/workflow_nodes/filter.json +24 -0
- package/workflow_nodes/flow.json +323 -0
- package/workflow_nodes/flowTrigger.json +52 -0
- package/workflow_nodes/form.json +25 -0
- package/workflow_nodes/formIoTrigger.json +59 -0
- package/workflow_nodes/formTrigger.json +8 -0
- package/workflow_nodes/formstackTrigger.json +8 -0
- package/workflow_nodes/freshdesk.json +584 -0
- package/workflow_nodes/freshservice.json +899 -0
- package/workflow_nodes/freshworksCrm.json +772 -0
- package/workflow_nodes/ftp.json +127 -0
- package/workflow_nodes/function.json +22 -0
- package/workflow_nodes/functionItem.json +22 -0
- package/workflow_nodes/gSuiteAdmin.json +562 -0
- package/workflow_nodes/getResponse.json +310 -0
- package/workflow_nodes/getResponseTrigger.json +82 -0
- package/workflow_nodes/ghost.json +290 -0
- package/workflow_nodes/git.json +184 -0
- package/workflow_nodes/github.json +732 -0
- package/workflow_nodes/githubTrigger.json +317 -0
- package/workflow_nodes/gitlab.json +544 -0
- package/workflow_nodes/gitlabTrigger.json +61 -0
- package/workflow_nodes/gmail.json +62 -0
- package/workflow_nodes/gmailTrigger.json +127 -0
- package/workflow_nodes/goToWebinar.json +430 -0
- package/workflow_nodes/gong.json +22 -0
- package/workflow_nodes/googleAds.json +116 -0
- package/workflow_nodes/googleAnalytics.json +28 -0
- package/workflow_nodes/googleBigQuery.json +38 -0
- package/workflow_nodes/googleBooks.json +154 -0
- package/workflow_nodes/googleBusinessProfile.json +277 -0
- package/workflow_nodes/googleBusinessProfileTrigger.json +55 -0
- package/workflow_nodes/googleCalendar.json +474 -0
- package/workflow_nodes/googleCalendarTrigger.json +72 -0
- package/workflow_nodes/googleChat.json +187 -0
- package/workflow_nodes/googleCloudNaturalLanguage.json +171 -0
- package/workflow_nodes/googleCloudStorage.json +466 -0
- package/workflow_nodes/googleContacts.json +481 -0
- package/workflow_nodes/googleDocs.json +312 -0
- package/workflow_nodes/googleDrive.json +920 -0
- package/workflow_nodes/googleDriveTrigger.json +181 -0
- package/workflow_nodes/googleFirebaseCloudFirestore.json +156 -0
- package/workflow_nodes/googleFirebaseRealtimeDatabase.json +75 -0
- package/workflow_nodes/googlePerspective.json +94 -0
- package/workflow_nodes/googleSheets.json +98 -0
- package/workflow_nodes/googleSheetsTrigger.json +192 -0
- package/workflow_nodes/googleSlides.json +186 -0
- package/workflow_nodes/googleTasks.json +198 -0
- package/workflow_nodes/googleTranslate.json +80 -0
- package/workflow_nodes/gotify.json +110 -0
- package/workflow_nodes/grafana.json +155 -0
- package/workflow_nodes/graphql.json +165 -0
- package/workflow_nodes/grist.json +13 -0
- package/workflow_nodes/gumroadTrigger.json +8 -0
- package/workflow_nodes/hackerNews.json +100 -0
- package/workflow_nodes/haloPSA.json +286 -0
- package/workflow_nodes/harvest.json +699 -0
- package/workflow_nodes/helpScout.json +629 -0
- package/workflow_nodes/helpScoutTrigger.json +8 -0
- package/workflow_nodes/highLevel.json +8 -0
- package/workflow_nodes/homeAssistant.json +201 -0
- package/workflow_nodes/html.json +118 -0
- package/workflow_nodes/htmlExtract.json +87 -0
- package/workflow_nodes/httpRequest.json +472 -0
- package/workflow_nodes/hubspot.json +62 -0
- package/workflow_nodes/hubspotTrigger.json +138 -0
- package/workflow_nodes/humanticAi.json +82 -0
- package/workflow_nodes/hunter.json +168 -0
- package/workflow_nodes/iCal.json +20 -0
- package/workflow_nodes/if.json +24 -0
- package/workflow_nodes/intercom.json +335 -0
- package/workflow_nodes/interval.json +8 -0
- package/workflow_nodes/invoiceNinja.json +882 -0
- package/workflow_nodes/invoiceNinjaTrigger.json +11 -0
- package/workflow_nodes/itemLists.json +313 -0
- package/workflow_nodes/iterable.json +168 -0
- package/workflow_nodes/jenkins.json +172 -0
- package/workflow_nodes/jira.json +529 -0
- package/workflow_nodes/jiraTrigger.json +308 -0
- package/workflow_nodes/jotFormTrigger.json +44 -0
- package/workflow_nodes/jwt.json +195 -0
- package/workflow_nodes/kafka.json +132 -0
- package/workflow_nodes/kafkaTrigger.json +11 -0
- package/workflow_nodes/keap.json +915 -0
- package/workflow_nodes/keapTrigger.json +37 -0
- package/workflow_nodes/kitemaker.json +153 -0
- package/workflow_nodes/koBoToolbox.json +337 -0
- package/workflow_nodes/koBoToolboxTrigger.json +8 -0
- package/workflow_nodes/langchain_Summarization Chain.json +60 -0
- package/workflow_nodes/langchain_agent.json +145 -0
- package/workflow_nodes/langchain_allowFileUploads.json +180 -0
- package/workflow_nodes/langchain_chainLlm.json +16 -0
- package/workflow_nodes/langchain_chainSummarization.json +119 -0
- package/workflow_nodes/langchain_code.json +62 -0
- package/workflow_nodes/langchain_documentBinaryInputLoader.json +8 -0
- package/workflow_nodes/langchain_documentDefaultDataLoader.json +8 -0
- package/workflow_nodes/langchain_documentGithubLoader.json +8 -0
- package/workflow_nodes/langchain_documentJsonInputLoader.json +8 -0
- package/workflow_nodes/langchain_embeddingDimensions.json +17 -0
- package/workflow_nodes/langchain_embeddingsAwsBedrock.json +8 -0
- package/workflow_nodes/langchain_embeddingsAzureOpenAi.json +151 -0
- package/workflow_nodes/langchain_embeddingsCohere.json +8 -0
- package/workflow_nodes/langchain_embeddingsGoogleGemini.json +8 -0
- package/workflow_nodes/langchain_embeddingsGoogleVertex.json +8 -0
- package/workflow_nodes/langchain_embeddingsHuggingFaceInference.json +8 -0
- package/workflow_nodes/langchain_embeddingsMistralCloud.json +8 -0
- package/workflow_nodes/langchain_embeddingsOllama.json +8 -0
- package/workflow_nodes/langchain_informationExtractor.json +81 -0
- package/workflow_nodes/langchain_lmChatAwsBedrock.json +8 -0
- package/workflow_nodes/langchain_lmChatAzureOpenAi.json +151 -0
- package/workflow_nodes/langchain_lmChatDeepSeek.json +10 -0
- package/workflow_nodes/langchain_lmChatGoogleGemini.json +31 -0
- package/workflow_nodes/langchain_lmChatGoogleVertex.json +32 -0
- package/workflow_nodes/langchain_lmChatGroq.json +8 -0
- package/workflow_nodes/langchain_lmChatMistralCloud.json +8 -0
- package/workflow_nodes/langchain_lmChatOllama.json +8 -0
- package/workflow_nodes/langchain_lmChatOpenAi.json +155 -0
- package/workflow_nodes/langchain_lmChatOpenRouter.json +10 -0
- package/workflow_nodes/langchain_lmChatXAiGrok.json +10 -0
- package/workflow_nodes/langchain_lmCohere.json +8 -0
- package/workflow_nodes/langchain_lmOllama.json +8 -0
- package/workflow_nodes/langchain_lmOpenAi.json +251 -0
- package/workflow_nodes/langchain_lmOpenHuggingFaceInference.json +8 -0
- package/workflow_nodes/langchain_manualChatTrigger.json +11 -0
- package/workflow_nodes/langchain_mcpClientTool.json +86 -0
- package/workflow_nodes/langchain_mcpTrigger.json +8 -0
- package/workflow_nodes/langchain_memoryBufferWindow.json +13 -0
- package/workflow_nodes/langchain_memoryChatRetriever.json +22 -0
- package/workflow_nodes/langchain_memoryManager.json +106 -0
- package/workflow_nodes/langchain_memoryMongoDbChat.json +10 -0
- package/workflow_nodes/langchain_memoryMotorhead.json +13 -0
- package/workflow_nodes/langchain_memoryPostgresChat.json +13 -0
- package/workflow_nodes/langchain_memoryRedisChat.json +15 -0
- package/workflow_nodes/langchain_memoryXata.json +14 -0
- package/workflow_nodes/langchain_memoryZep.json +13 -0
- package/workflow_nodes/langchain_model.json +155 -0
- package/workflow_nodes/langchain_mongoCollection.json +16 -0
- package/workflow_nodes/langchain_notice.json +22 -0
- package/workflow_nodes/langchain_openAiAssistant.json +132 -0
- package/workflow_nodes/langchain_options.json +17 -0
- package/workflow_nodes/langchain_outputParserAutofixing.json +8 -0
- package/workflow_nodes/langchain_outputParserItemList.json +8 -0
- package/workflow_nodes/langchain_outputParserStructured.json +12 -0
- package/workflow_nodes/langchain_pineconeNamespace.json +16 -0
- package/workflow_nodes/langchain_queryName.json +16 -0
- package/workflow_nodes/langchain_retrieverContextualCompression.json +8 -0
- package/workflow_nodes/langchain_retrieverMultiQuery.json +8 -0
- package/workflow_nodes/langchain_retrieverVectorStore.json +8 -0
- package/workflow_nodes/langchain_retrieverWorkflow.json +103 -0
- package/workflow_nodes/langchain_sentimentAnalysis.json +52 -0
- package/workflow_nodes/langchain_systemPromptTemplate.json +47 -0
- package/workflow_nodes/langchain_tableName.json +23 -0
- package/workflow_nodes/langchain_textClassifier.json +66 -0
- package/workflow_nodes/langchain_textSplitterCharacterTextSplitter.json +8 -0
- package/workflow_nodes/langchain_textSplitterRecursiveCharacterTextSplitter.json +8 -0
- package/workflow_nodes/langchain_textSplitterTokenSplitter.json +8 -0
- package/workflow_nodes/langchain_toolCalculator.json +8 -0
- package/workflow_nodes/langchain_toolCode.json +12 -0
- package/workflow_nodes/langchain_toolHttpRequest.json +232 -0
- package/workflow_nodes/langchain_toolSearXng.json +8 -0
- package/workflow_nodes/langchain_toolSerpApi.json +8 -0
- package/workflow_nodes/langchain_toolThink.json +8 -0
- package/workflow_nodes/langchain_toolVectorStore.json +11 -0
- package/workflow_nodes/langchain_toolWikipedia.json +8 -0
- package/workflow_nodes/langchain_toolWolframAlpha.json +8 -0
- package/workflow_nodes/langchain_toolWorkflow.json +8 -0
- package/workflow_nodes/langchain_vectorStoreInMemoryInsert.json +29 -0
- package/workflow_nodes/langchain_vectorStoreInMemoryLoad.json +8 -0
- package/workflow_nodes/langchain_vectorStorePineconeInsert.json +37 -0
- package/workflow_nodes/langchain_vectorStorePineconeLoad.json +8 -0
- package/workflow_nodes/langchain_vectorStoreSupabaseInsert.json +32 -0
- package/workflow_nodes/langchain_vectorStoreSupabaseLoad.json +8 -0
- package/workflow_nodes/langchain_vectorStoreZepInsert.json +46 -0
- package/workflow_nodes/langchain_vectorStoreZepLoad.json +8 -0
- package/workflow_nodes/ldap.json +182 -0
- package/workflow_nodes/lemlist.json +44 -0
- package/workflow_nodes/lemlistTrigger.json +45 -0
- package/workflow_nodes/limit.json +26 -0
- package/workflow_nodes/line.json +95 -0
- package/workflow_nodes/linear.json +151 -0
- package/workflow_nodes/linearTrigger.json +71 -0
- package/workflow_nodes/lingvaNex.json +66 -0
- package/workflow_nodes/linkedIn.json +142 -0
- package/workflow_nodes/localFileTrigger.json +120 -0
- package/workflow_nodes/lonescale.json +171 -0
- package/workflow_nodes/lonescaleTrigger.json +8 -0
- package/workflow_nodes/magento2.json +164 -0
- package/workflow_nodes/mailcheck.json +46 -0
- package/workflow_nodes/mailchimp.json +507 -0
- package/workflow_nodes/mailchimpTrigger.json +100 -0
- package/workflow_nodes/mailerLite.json +24 -0
- package/workflow_nodes/mailerLiteTrigger.json +74 -0
- package/workflow_nodes/mailgun.json +81 -0
- package/workflow_nodes/mailjet.json +201 -0
- package/workflow_nodes/mailjetTrigger.json +8 -0
- package/workflow_nodes/mandrill.json +372 -0
- package/workflow_nodes/manualTrigger.json +8 -0
- package/workflow_nodes/markdown.json +376 -0
- package/workflow_nodes/marketstack.json +126 -0
- package/workflow_nodes/matrix.json +264 -0
- package/workflow_nodes/mattermost.json +8 -0
- package/workflow_nodes/mautic.json +564 -0
- package/workflow_nodes/mauticTrigger.json +54 -0
- package/workflow_nodes/medium.json +209 -0
- package/workflow_nodes/merge.json +125 -0
- package/workflow_nodes/messageBird.json +182 -0
- package/workflow_nodes/metabase.json +175 -0
- package/workflow_nodes/microsoftDynamicsCrm.json +100 -0
- package/workflow_nodes/microsoftEntra.json +51 -0
- package/workflow_nodes/microsoftExcel.json +35 -0
- package/workflow_nodes/microsoftGraphSecurity.json +113 -0
- package/workflow_nodes/microsoftOneDrive.json +232 -0
- package/workflow_nodes/microsoftOneDriveTrigger.json +80 -0
- package/workflow_nodes/microsoftOutlook.json +40 -0
- package/workflow_nodes/microsoftOutlookTrigger.json +24 -0
- package/workflow_nodes/microsoftSql.json +81 -0
- package/workflow_nodes/microsoftTeams.json +36 -0
- package/workflow_nodes/microsoftToDo.json +181 -0
- package/workflow_nodes/mindee.json +86 -0
- package/workflow_nodes/misp.json +399 -0
- package/workflow_nodes/mocean.json +103 -0
- package/workflow_nodes/mondayCom.json +290 -0
- package/workflow_nodes/mongoDb.json +16 -0
- package/workflow_nodes/monicaCrm.json +543 -0
- package/workflow_nodes/moveBinaryData.json +121 -0
- package/workflow_nodes/mqtt.json +67 -0
- package/workflow_nodes/mqttTrigger.json +47 -0
- package/workflow_nodes/msg91.json +65 -0
- package/workflow_nodes/mySql.json +111 -0
- package/workflow_nodes/n8n.json +75 -0
- package/workflow_nodes/n8nTrigger.json +27 -0
- package/workflow_nodes/nasa.json +310 -0
- package/workflow_nodes/netlify.json +87 -0
- package/workflow_nodes/netlifyTrigger.json +68 -0
- package/workflow_nodes/netscalerAdc.json +243 -0
- package/workflow_nodes/nextCloud.json +312 -0
- package/workflow_nodes/noOp.json +8 -0
- package/workflow_nodes/nocoDb.json +276 -0
- package/workflow_nodes/notion.json +8 -0
- package/workflow_nodes/notionTrigger.json +75 -0
- package/workflow_nodes/npm.json +64 -0
- package/workflow_nodes/odoo.json +344 -0
- package/workflow_nodes/okta.json +97 -0
- package/workflow_nodes/oneSimpleApi.json +281 -0
- package/workflow_nodes/onfleet.json +316 -0
- package/workflow_nodes/onfleetTrigger.json +8 -0
- package/workflow_nodes/openAi.json +154 -0
- package/workflow_nodes/openThesaurus.json +81 -0
- package/workflow_nodes/openWeatherMap.json +129 -0
- package/workflow_nodes/orbit.json +375 -0
- package/workflow_nodes/oura.json +74 -0
- package/workflow_nodes/paddle.json +403 -0
- package/workflow_nodes/pagerDuty.json +351 -0
- package/workflow_nodes/payPal.json +196 -0
- package/workflow_nodes/payPalTrigger.json +40 -0
- package/workflow_nodes/peekalink.json +41 -0
- package/workflow_nodes/phantombuster.json +172 -0
- package/workflow_nodes/philipsHue.json +177 -0
- package/workflow_nodes/pipedrive.json +860 -0
- package/workflow_nodes/pipedriveTrigger.json +11 -0
- package/workflow_nodes/plivo.json +91 -0
- package/workflow_nodes/postHog.json +122 -0
- package/workflow_nodes/postbin.json +60 -0
- package/workflow_nodes/postgres.json +109 -0
- package/workflow_nodes/postgresTrigger.json +8 -0
- package/workflow_nodes/postmarkTrigger.json +72 -0
- package/workflow_nodes/profitWell.json +305 -0
- package/workflow_nodes/pushbullet.json +186 -0
- package/workflow_nodes/pushcut.json +75 -0
- package/workflow_nodes/pushcutTrigger.json +8 -0
- package/workflow_nodes/pushover.json +159 -0
- package/workflow_nodes/questDb.json +94 -0
- package/workflow_nodes/quickChart.json +188 -0
- package/workflow_nodes/quickbase.json +205 -0
- package/workflow_nodes/quickbooks.json +550 -0
- package/workflow_nodes/rabbitmq.json +165 -0
- package/workflow_nodes/rabbitmqTrigger.json +8 -0
- package/workflow_nodes/raindrop.json +216 -0
- package/workflow_nodes/readBinaryFile.json +26 -0
- package/workflow_nodes/readBinaryFiles.json +26 -0
- package/workflow_nodes/readPDF.json +31 -0
- package/workflow_nodes/readWriteFile.json +27 -0
- package/workflow_nodes/reddit.json +309 -0
- package/workflow_nodes/redis.json +183 -0
- package/workflow_nodes/redisTrigger.json +8 -0
- package/workflow_nodes/removeDuplicates.json +8 -0
- package/workflow_nodes/renameKeys.json +67 -0
- package/workflow_nodes/respondToWebhook.json +126 -0
- package/workflow_nodes/rocketchat.json +216 -0
- package/workflow_nodes/rssFeedRead.json +28 -0
- package/workflow_nodes/rssFeedReadTrigger.json +17 -0
- package/workflow_nodes/rundeck.json +79 -0
- package/workflow_nodes/s3.json +425 -0
- package/workflow_nodes/salesforce.json +1137 -0
- package/workflow_nodes/salesforceTrigger.json +122 -0
- package/workflow_nodes/salesmate.json +467 -0
- package/workflow_nodes/scheduleTrigger.json +270 -0
- package/workflow_nodes/seaTable.json +8 -0
- package/workflow_nodes/seaTableTrigger.json +87 -0
- package/workflow_nodes/securityScorecard.json +459 -0
- package/workflow_nodes/segment.json +219 -0
- package/workflow_nodes/sendGrid.json +359 -0
- package/workflow_nodes/sendy.json +225 -0
- package/workflow_nodes/sentryIo.json +426 -0
- package/workflow_nodes/serviceNow.json +544 -0
- package/workflow_nodes/set.json +124 -0
- package/workflow_nodes/shopify.json +707 -0
- package/workflow_nodes/shopifyTrigger.json +8 -0
- package/workflow_nodes/signl4.json +133 -0
- package/workflow_nodes/simulate.json +30 -0
- package/workflow_nodes/simulateTrigger.json +8 -0
- package/workflow_nodes/slack.json +62 -0
- package/workflow_nodes/slackTrigger.json +135 -0
- package/workflow_nodes/sms77.json +121 -0
- package/workflow_nodes/snowflake.json +65 -0
- package/workflow_nodes/sort.json +57 -0
- package/workflow_nodes/splitInBatches.json +30 -0
- package/workflow_nodes/splitOut.json +62 -0
- package/workflow_nodes/splunk.json +40 -0
- package/workflow_nodes/spontit.json +123 -0
- package/workflow_nodes/spotify.json +285 -0
- package/workflow_nodes/spreadsheetFile.json +8 -0
- package/workflow_nodes/sseTrigger.json +8 -0
- package/workflow_nodes/ssh.json +105 -0
- package/workflow_nodes/stackby.json +85 -0
- package/workflow_nodes/start.json +15 -0
- package/workflow_nodes/stickyNote.json +36 -0
- package/workflow_nodes/stopAndError.json +8 -0
- package/workflow_nodes/storyblok.json +138 -0
- package/workflow_nodes/strapi.json +138 -0
- package/workflow_nodes/strava.json +427 -0
- package/workflow_nodes/stravaTrigger.json +79 -0
- package/workflow_nodes/stripe.json +357 -0
- package/workflow_nodes/stripeTrigger.json +775 -0
- package/workflow_nodes/summarize.json +124 -0
- package/workflow_nodes/supabase.json +136 -0
- package/workflow_nodes/surveyMonkeyTrigger.json +160 -0
- package/workflow_nodes/switch.json +91 -0
- package/workflow_nodes/syncroMsp.json +8 -0
- package/workflow_nodes/taiga.json +340 -0
- package/workflow_nodes/taigaTrigger.json +81 -0
- package/workflow_nodes/tapfiliate.json +241 -0
- package/workflow_nodes/telegram.json +612 -0
- package/workflow_nodes/telegramTrigger.json +142 -0
- package/workflow_nodes/theHive.json +497 -0
- package/workflow_nodes/theHiveProject.json +8 -0
- package/workflow_nodes/theHiveProjectTrigger.json +162 -0
- package/workflow_nodes/theHiveTrigger.json +101 -0
- package/workflow_nodes/timescaleDb.json +95 -0
- package/workflow_nodes/todoist.json +285 -0
- package/workflow_nodes/togglTrigger.json +24 -0
- package/workflow_nodes/totp.json +86 -0
- package/workflow_nodes/travisCi.json +142 -0
- package/workflow_nodes/trello.json +609 -0
- package/workflow_nodes/trelloTrigger.json +8 -0
- package/workflow_nodes/twake.json +76 -0
- package/workflow_nodes/twilio.json +95 -0
- package/workflow_nodes/twilioTrigger.json +46 -0
- package/workflow_nodes/twist.json +376 -0
- package/workflow_nodes/twitter.json +40 -0
- package/workflow_nodes/typeformTrigger.json +62 -0
- package/workflow_nodes/unleashedSoftware.json +154 -0
- package/workflow_nodes/uplead.json +72 -0
- package/workflow_nodes/uproc.json +26 -0
- package/workflow_nodes/uptimeRobot.json +453 -0
- package/workflow_nodes/urlScanIo.json +113 -0
- package/workflow_nodes/venafiTlsProtectCloud.json +310 -0
- package/workflow_nodes/venafiTlsProtectCloudTrigger.json +38 -0
- package/workflow_nodes/venafiTlsProtectDatacenter.json +491 -0
- package/workflow_nodes/vero.json +158 -0
- package/workflow_nodes/vonage.json +125 -0
- package/workflow_nodes/wait.json +71 -0
- package/workflow_nodes/webflow.json +38 -0
- package/workflow_nodes/webflowTrigger.json +8 -0
- package/workflow_nodes/webhook.json +55 -0
- package/workflow_nodes/wekan.json +460 -0
- package/workflow_nodes/whatsApp.json +476 -0
- package/workflow_nodes/whatsAppTrigger.json +103 -0
- package/workflow_nodes/wise.json +330 -0
- package/workflow_nodes/wiseTrigger.json +8 -0
- package/workflow_nodes/wooCommerce.json +812 -0
- package/workflow_nodes/wooCommerceTrigger.json +8 -0
- package/workflow_nodes/wordpress.json +500 -0
- package/workflow_nodes/workableTrigger.json +51 -0
- package/workflow_nodes/writeBinaryFile.json +34 -0
- package/workflow_nodes/wufooTrigger.json +37 -0
- package/workflow_nodes/xero.json +530 -0
- package/workflow_nodes/xml.json +129 -0
- package/workflow_nodes/youTube.json +578 -0
- package/workflow_nodes/yourls.json +71 -0
- package/workflow_nodes/zammad.json +406 -0
- package/workflow_nodes/zendesk.json +526 -0
- package/workflow_nodes/zendeskTrigger.json +187 -0
- package/workflow_nodes/zohoCrm.json +721 -0
- package/workflow_nodes/zoom.json +507 -0
- package/workflow_nodes/zulip.json +371 -0
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workflow Storage Module
|
|
3
|
+
*
|
|
4
|
+
* Provides filesystem-based storage capabilities for n8n workflows,
|
|
5
|
+
* allowing workflows to be saved and retrieved from specified locations.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
const fs = require('fs').promises;
|
|
9
|
+
const path = require('path');
|
|
10
|
+
const { v4: uuidv4 } = require('uuid');
|
|
11
|
+
const { logger } = require('../utils/logger');
|
|
12
|
+
const config = require('../../config/default');
|
|
13
|
+
|
|
14
|
+
// Default storage directory for workflows from config for backward compatibility only
|
|
15
|
+
const DEFAULT_WORKFLOWS_DIR = path.resolve(process.cwd(), config.storage.workflowsPath);
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Ensure a directory exists
|
|
19
|
+
*
|
|
20
|
+
* @param {string} dirPath - Directory path to ensure exists
|
|
21
|
+
*/
|
|
22
|
+
const ensureDirectoryExists = async (dirPath) => {
|
|
23
|
+
try {
|
|
24
|
+
await fs.mkdir(dirPath, { recursive: true });
|
|
25
|
+
return true;
|
|
26
|
+
} catch (error) {
|
|
27
|
+
logger.error('Failed to create directory', { path: dirPath, error: error.message });
|
|
28
|
+
throw error;
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
// Ensure the default directory exists for backward compatibility
|
|
33
|
+
ensureDirectoryExists(DEFAULT_WORKFLOWS_DIR).catch(err => {
|
|
34
|
+
logger.error('Critical error ensuring directory', { error: err.message });
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Workflow Storage Service
|
|
39
|
+
*/
|
|
40
|
+
const workflowStorage = {
|
|
41
|
+
/**
|
|
42
|
+
* Save a workflow to the filesystem
|
|
43
|
+
*
|
|
44
|
+
* @param {string} workflowId - Unique ID for the workflow
|
|
45
|
+
* @param {Object} workflowData - Workflow data to save
|
|
46
|
+
* @param {string} filePath - Required filepath specified by LLM
|
|
47
|
+
* @returns {Promise<Object>} Result with success status and path
|
|
48
|
+
*/
|
|
49
|
+
async saveWorkflow(workflowId, workflowData, filePath) {
|
|
50
|
+
try {
|
|
51
|
+
if (!filePath) {
|
|
52
|
+
throw new Error('filePath is required - workflow must be saved at the location specified by the LLM');
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Make sure the path is valid - use absolute path or resolve relative path
|
|
56
|
+
const targetPath = path.isAbsolute(filePath) ? filePath : path.resolve(process.cwd(), filePath);
|
|
57
|
+
|
|
58
|
+
// Ensure the parent directory exists
|
|
59
|
+
await ensureDirectoryExists(path.dirname(targetPath));
|
|
60
|
+
|
|
61
|
+
// Add timestamp if not present
|
|
62
|
+
if (!workflowData.updatedAt) {
|
|
63
|
+
workflowData.updatedAt = new Date().toISOString();
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Write the workflow file
|
|
67
|
+
await fs.writeFile(targetPath, JSON.stringify(workflowData, null, 2));
|
|
68
|
+
|
|
69
|
+
logger.info('Workflow saved successfully', { workflowId, path: targetPath });
|
|
70
|
+
return { success: true, path: targetPath };
|
|
71
|
+
} catch (error) {
|
|
72
|
+
logger.error('Error saving workflow', { workflowId, error: error.message });
|
|
73
|
+
throw new Error(`Failed to save workflow: ${error.message}`);
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Load a workflow from a specific filepath
|
|
79
|
+
*
|
|
80
|
+
* @param {string} workflowIdOrPath - The complete filepath to the workflow
|
|
81
|
+
* @returns {Promise<Object>} Workflow data or null if not found
|
|
82
|
+
*/
|
|
83
|
+
async loadWorkflow(workflowIdOrPath) {
|
|
84
|
+
try {
|
|
85
|
+
// Determine the file path - treat as a path by default
|
|
86
|
+
let filePath = workflowIdOrPath;
|
|
87
|
+
|
|
88
|
+
// For backward compatibility, check if it looks like just an ID
|
|
89
|
+
if (!workflowIdOrPath.includes('/') && !workflowIdOrPath.includes('\\') && !workflowIdOrPath.endsWith('.json')) {
|
|
90
|
+
logger.warn('Using workflow ID instead of filepath is deprecated, use complete filepath instead', { id: workflowIdOrPath });
|
|
91
|
+
filePath = path.join(DEFAULT_WORKFLOWS_DIR, `${workflowIdOrPath}.json`);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// Make sure the path is valid - use absolute path or resolve relative path
|
|
95
|
+
const targetPath = path.isAbsolute(filePath) ? filePath : path.resolve(process.cwd(), filePath);
|
|
96
|
+
|
|
97
|
+
const data = await fs.readFile(targetPath, 'utf8');
|
|
98
|
+
const workflow = JSON.parse(data);
|
|
99
|
+
logger.info('Workflow loaded successfully', { path: targetPath });
|
|
100
|
+
return workflow;
|
|
101
|
+
} catch (error) {
|
|
102
|
+
if (error.code === 'ENOENT') {
|
|
103
|
+
logger.warn('Workflow not found', { path: workflowIdOrPath });
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
logger.error('Error loading workflow', { path: workflowIdOrPath, error: error.message });
|
|
107
|
+
throw new Error(`Failed to load workflow: ${error.message}`);
|
|
108
|
+
}
|
|
109
|
+
},
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* List workflows from a specific directory
|
|
113
|
+
*
|
|
114
|
+
* @param {string} [directoryPath] - Directory to list workflows from
|
|
115
|
+
* @param {Object} [options] - List options like limit and offset
|
|
116
|
+
* @returns {Promise<Array>} Array of workflow summary objects
|
|
117
|
+
*/
|
|
118
|
+
async listWorkflows(directoryPath = DEFAULT_WORKFLOWS_DIR, options = {}) {
|
|
119
|
+
try {
|
|
120
|
+
// Ensure the directory exists
|
|
121
|
+
await ensureDirectoryExists(directoryPath);
|
|
122
|
+
|
|
123
|
+
const { limit = 100, offset = 0 } = options;
|
|
124
|
+
const files = await fs.readdir(directoryPath);
|
|
125
|
+
const jsonFiles = files.filter(file => file.endsWith('.json'));
|
|
126
|
+
|
|
127
|
+
// Apply pagination
|
|
128
|
+
const paginatedFiles = jsonFiles.slice(offset, offset + limit);
|
|
129
|
+
|
|
130
|
+
// Load each workflow file and extract summary information
|
|
131
|
+
const workflowPromises = paginatedFiles.map(async (file) => {
|
|
132
|
+
const fullPath = path.join(directoryPath, file);
|
|
133
|
+
try {
|
|
134
|
+
const data = await fs.readFile(fullPath, 'utf8');
|
|
135
|
+
const workflow = JSON.parse(data);
|
|
136
|
+
|
|
137
|
+
return {
|
|
138
|
+
id: workflow.id || path.basename(file, '.json'),
|
|
139
|
+
name: workflow.name || 'Unnamed Workflow',
|
|
140
|
+
description: workflow.description || '',
|
|
141
|
+
updatedAt: workflow.updatedAt || null,
|
|
142
|
+
path: fullPath
|
|
143
|
+
};
|
|
144
|
+
} catch (error) {
|
|
145
|
+
logger.error('Error reading workflow file', { path: fullPath, error: error.message });
|
|
146
|
+
return null;
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
// Wait for all files to be processed
|
|
151
|
+
const workflows = await Promise.all(workflowPromises);
|
|
152
|
+
|
|
153
|
+
// Filter out any null entries from failed reads
|
|
154
|
+
return workflows.filter(workflow => workflow !== null);
|
|
155
|
+
} catch (error) {
|
|
156
|
+
logger.error('Error listing workflows', { directory: directoryPath, error: error.message });
|
|
157
|
+
throw new Error(`Failed to list workflows: ${error.message}`);
|
|
158
|
+
}
|
|
159
|
+
},
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Delete a workflow by ID or filepath
|
|
163
|
+
*
|
|
164
|
+
* @param {string} workflowIdOrPath - Workflow ID or complete filepath
|
|
165
|
+
* @returns {Promise<Object>} Result with success status
|
|
166
|
+
*/
|
|
167
|
+
async deleteWorkflow(workflowIdOrPath) {
|
|
168
|
+
let filePath;
|
|
169
|
+
|
|
170
|
+
// Check if the input is a full path or just an ID
|
|
171
|
+
if (workflowIdOrPath.includes('/') || workflowIdOrPath.includes('\\')) {
|
|
172
|
+
filePath = workflowIdOrPath;
|
|
173
|
+
} else {
|
|
174
|
+
filePath = path.join(DEFAULT_WORKFLOWS_DIR, `${workflowIdOrPath}.json`);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
try {
|
|
178
|
+
await fs.unlink(filePath);
|
|
179
|
+
logger.info('Workflow deleted successfully', { path: filePath });
|
|
180
|
+
return { success: true, path: filePath };
|
|
181
|
+
} catch (error) {
|
|
182
|
+
if (error.code === 'ENOENT') {
|
|
183
|
+
logger.warn('Workflow not found for deletion', { path: filePath });
|
|
184
|
+
return { success: false, error: 'Workflow not found' };
|
|
185
|
+
}
|
|
186
|
+
logger.error('Error deleting workflow', { path: filePath, error: error.message });
|
|
187
|
+
throw new Error(`Failed to delete workflow: ${error.message}`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
};
|
|
191
|
+
|
|
192
|
+
module.exports = {
|
|
193
|
+
workflowStorage,
|
|
194
|
+
DEFAULT_WORKFLOWS_DIR,
|
|
195
|
+
ensureDirectoryExists
|
|
196
|
+
};
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tool Model
|
|
3
|
+
*
|
|
4
|
+
* Defines the schema and validation for MCP tools
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
const Ajv = require('ajv');
|
|
8
|
+
const ajv = new Ajv({ allErrors: true });
|
|
9
|
+
|
|
10
|
+
// Schema for MCP tool parameter definitions
|
|
11
|
+
const parameterSchema = {
|
|
12
|
+
type: 'object',
|
|
13
|
+
properties: {
|
|
14
|
+
type: { type: 'string', enum: ['string', 'number', 'boolean', 'object', 'array', 'integer'] },
|
|
15
|
+
description: { type: 'string' },
|
|
16
|
+
optional: { type: 'boolean' },
|
|
17
|
+
properties: { type: 'object' }, // For nested objects
|
|
18
|
+
items: { type: 'object' } // For arrays
|
|
19
|
+
},
|
|
20
|
+
required: ['type']
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
// Schema for MCP tool definitions
|
|
24
|
+
const toolSchema = {
|
|
25
|
+
type: 'object',
|
|
26
|
+
properties: {
|
|
27
|
+
description: { type: 'string' },
|
|
28
|
+
parameters: {
|
|
29
|
+
type: 'object',
|
|
30
|
+
properties: {
|
|
31
|
+
type: { type: 'string', enum: ['object'] },
|
|
32
|
+
properties: {
|
|
33
|
+
type: 'object',
|
|
34
|
+
additionalProperties: parameterSchema
|
|
35
|
+
},
|
|
36
|
+
required: {
|
|
37
|
+
type: 'array',
|
|
38
|
+
items: { type: 'string' }
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
required: ['type', 'properties']
|
|
42
|
+
}
|
|
43
|
+
// Note: We'll validate the execute function separately
|
|
44
|
+
},
|
|
45
|
+
required: ['description', 'parameters']
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
// Validator for tool definitions
|
|
49
|
+
const validateTool = ajv.compile(toolSchema);
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Create a new Tool schema
|
|
53
|
+
*
|
|
54
|
+
* @param {string} description - Tool description
|
|
55
|
+
* @param {Object} parameters - Parameter definitions
|
|
56
|
+
* @param {Function} execute - Implementation function
|
|
57
|
+
* @returns {Object} Validated tool object
|
|
58
|
+
* @throws {Error} If validation fails
|
|
59
|
+
*/
|
|
60
|
+
const createTool = (description, parameters, execute) => {
|
|
61
|
+
// Validate execute is a function
|
|
62
|
+
if (typeof execute !== 'function') {
|
|
63
|
+
throw new Error('Tool execute property must be a function');
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// Create the tool object
|
|
67
|
+
const tool = {
|
|
68
|
+
description,
|
|
69
|
+
parameters: {
|
|
70
|
+
type: 'object',
|
|
71
|
+
properties: parameters,
|
|
72
|
+
required: Object.keys(parameters).filter(key => !parameters[key].optional)
|
|
73
|
+
},
|
|
74
|
+
execute
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
// Validate the tool schema (excluding execute function)
|
|
78
|
+
const { execute: _, ...toolForValidation } = tool;
|
|
79
|
+
const valid = validateTool(toolForValidation);
|
|
80
|
+
|
|
81
|
+
if (!valid) {
|
|
82
|
+
const errors = validateTool.errors.map(err =>
|
|
83
|
+
`${err.instancePath} ${err.message}`
|
|
84
|
+
).join('; ');
|
|
85
|
+
|
|
86
|
+
throw new Error(`Invalid tool definition: ${errors}`);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
return tool;
|
|
90
|
+
};
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Validate tool parameters against schema before execution
|
|
94
|
+
*
|
|
95
|
+
* @param {Object} tool - Tool definition
|
|
96
|
+
* @param {Object} params - Parameters to validate
|
|
97
|
+
* @returns {Object} Validated and processed parameters
|
|
98
|
+
* @throws {Error} If validation fails
|
|
99
|
+
*/
|
|
100
|
+
const validateParameters = (tool, params) => {
|
|
101
|
+
// Create validator for this tool's parameters
|
|
102
|
+
const schema = {
|
|
103
|
+
type: 'object',
|
|
104
|
+
properties: {},
|
|
105
|
+
required: tool.parameters.required
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
// Build properties schema from tool parameters
|
|
109
|
+
for (const [key, def] of Object.entries(tool.parameters.properties)) {
|
|
110
|
+
schema.properties[key] = {
|
|
111
|
+
type: def.type
|
|
112
|
+
};
|
|
113
|
+
|
|
114
|
+
// Add enum if present
|
|
115
|
+
if (def.enum) {
|
|
116
|
+
schema.properties[key].enum = def.enum;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// Add object properties if present
|
|
120
|
+
if (def.properties) {
|
|
121
|
+
schema.properties[key].properties = def.properties;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// Add array items if present
|
|
125
|
+
if (def.items) {
|
|
126
|
+
schema.properties[key].items = def.items;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
const validate = ajv.compile(schema);
|
|
131
|
+
const valid = validate(params);
|
|
132
|
+
|
|
133
|
+
if (!valid) {
|
|
134
|
+
const errors = validate.errors.map(err =>
|
|
135
|
+
`${err.instancePath} ${err.message}`
|
|
136
|
+
).join('; ');
|
|
137
|
+
|
|
138
|
+
throw new Error(`Invalid parameters: ${errors}`);
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
return params;
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
module.exports = {
|
|
145
|
+
createTool,
|
|
146
|
+
validateParameters,
|
|
147
|
+
validateTool
|
|
148
|
+
};
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* User and Permissions Model
|
|
3
|
+
*
|
|
4
|
+
* Defines user roles and permissions for role-based access control.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
// Define permission constants
|
|
8
|
+
const PERMISSIONS = {
|
|
9
|
+
// Workflow permissions
|
|
10
|
+
WORKFLOW_VIEW: 'workflow:view',
|
|
11
|
+
WORKFLOW_CREATE: 'workflow:create',
|
|
12
|
+
WORKFLOW_EDIT: 'workflow:edit',
|
|
13
|
+
WORKFLOW_DELETE: 'workflow:delete',
|
|
14
|
+
WORKFLOW_EXECUTE: 'workflow:execute',
|
|
15
|
+
|
|
16
|
+
// Node permissions
|
|
17
|
+
NODE_VIEW: 'node:view',
|
|
18
|
+
NODE_ADD: 'node:add',
|
|
19
|
+
NODE_EDIT: 'node:edit',
|
|
20
|
+
NODE_DELETE: 'node:delete',
|
|
21
|
+
|
|
22
|
+
// Connection permissions
|
|
23
|
+
CONNECTION_VIEW: 'connection:view',
|
|
24
|
+
CONNECTION_CREATE: 'connection:create',
|
|
25
|
+
CONNECTION_DELETE: 'connection:delete',
|
|
26
|
+
|
|
27
|
+
// Credential permissions
|
|
28
|
+
CREDENTIAL_VIEW: 'credential:view',
|
|
29
|
+
CREDENTIAL_CREATE: 'credential:create',
|
|
30
|
+
CREDENTIAL_EDIT: 'credential:edit',
|
|
31
|
+
CREDENTIAL_DELETE: 'credential:delete',
|
|
32
|
+
|
|
33
|
+
// System permissions
|
|
34
|
+
SYSTEM_ADMIN: 'system:admin'
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
// Define user roles with associated permissions
|
|
38
|
+
const ROLES = {
|
|
39
|
+
ADMIN: 'admin',
|
|
40
|
+
EDITOR: 'editor',
|
|
41
|
+
VIEWER: 'viewer'
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
// Permission sets for each role
|
|
45
|
+
const ROLE_PERMISSIONS = {
|
|
46
|
+
[ROLES.ADMIN]: [
|
|
47
|
+
// System admin has all permissions
|
|
48
|
+
PERMISSIONS.SYSTEM_ADMIN,
|
|
49
|
+
PERMISSIONS.WORKFLOW_VIEW,
|
|
50
|
+
PERMISSIONS.WORKFLOW_CREATE,
|
|
51
|
+
PERMISSIONS.WORKFLOW_EDIT,
|
|
52
|
+
PERMISSIONS.WORKFLOW_DELETE,
|
|
53
|
+
PERMISSIONS.WORKFLOW_EXECUTE,
|
|
54
|
+
PERMISSIONS.NODE_VIEW,
|
|
55
|
+
PERMISSIONS.NODE_ADD,
|
|
56
|
+
PERMISSIONS.NODE_EDIT,
|
|
57
|
+
PERMISSIONS.NODE_DELETE,
|
|
58
|
+
PERMISSIONS.CONNECTION_VIEW,
|
|
59
|
+
PERMISSIONS.CONNECTION_CREATE,
|
|
60
|
+
PERMISSIONS.CONNECTION_DELETE,
|
|
61
|
+
PERMISSIONS.CREDENTIAL_VIEW,
|
|
62
|
+
PERMISSIONS.CREDENTIAL_CREATE,
|
|
63
|
+
PERMISSIONS.CREDENTIAL_EDIT,
|
|
64
|
+
PERMISSIONS.CREDENTIAL_DELETE
|
|
65
|
+
],
|
|
66
|
+
[ROLES.EDITOR]: [
|
|
67
|
+
// Editor can do everything except delete workflows and manage credentials
|
|
68
|
+
PERMISSIONS.WORKFLOW_VIEW,
|
|
69
|
+
PERMISSIONS.WORKFLOW_CREATE,
|
|
70
|
+
PERMISSIONS.WORKFLOW_EDIT,
|
|
71
|
+
PERMISSIONS.WORKFLOW_EXECUTE,
|
|
72
|
+
PERMISSIONS.NODE_VIEW,
|
|
73
|
+
PERMISSIONS.NODE_ADD,
|
|
74
|
+
PERMISSIONS.NODE_EDIT,
|
|
75
|
+
PERMISSIONS.NODE_DELETE,
|
|
76
|
+
PERMISSIONS.CONNECTION_VIEW,
|
|
77
|
+
PERMISSIONS.CONNECTION_CREATE,
|
|
78
|
+
PERMISSIONS.CONNECTION_DELETE,
|
|
79
|
+
PERMISSIONS.CREDENTIAL_VIEW
|
|
80
|
+
],
|
|
81
|
+
[ROLES.VIEWER]: [
|
|
82
|
+
// Viewer has read-only access
|
|
83
|
+
PERMISSIONS.WORKFLOW_VIEW,
|
|
84
|
+
PERMISSIONS.NODE_VIEW,
|
|
85
|
+
PERMISSIONS.CONNECTION_VIEW
|
|
86
|
+
]
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Check if a user has a specific permission
|
|
91
|
+
*
|
|
92
|
+
* @param {Object} user - User object with roles property
|
|
93
|
+
* @param {String} permission - Permission to check
|
|
94
|
+
* @returns {Boolean} - Whether user has the permission
|
|
95
|
+
*/
|
|
96
|
+
const hasPermission = (user, permission) => {
|
|
97
|
+
// If no user or roles provided, no permissions
|
|
98
|
+
if (!user || !user.roles || !Array.isArray(user.roles)) {
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Check if any of the user's roles grant the required permission
|
|
103
|
+
return user.roles.some(role => {
|
|
104
|
+
const rolePermissions = ROLE_PERMISSIONS[role];
|
|
105
|
+
|
|
106
|
+
// If role doesn't exist or has no permissions, skip
|
|
107
|
+
if (!rolePermissions) {
|
|
108
|
+
return false;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// System admin permission grants access to everything
|
|
112
|
+
if (rolePermissions.includes(PERMISSIONS.SYSTEM_ADMIN)) {
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Check for specific permission
|
|
117
|
+
return rolePermissions.includes(permission);
|
|
118
|
+
});
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Get all permissions for a user based on their roles
|
|
123
|
+
*
|
|
124
|
+
* @param {Object} user - User object with roles property
|
|
125
|
+
* @returns {String[]} - Array of permission strings
|
|
126
|
+
*/
|
|
127
|
+
const getUserPermissions = (user) => {
|
|
128
|
+
// If no user or roles provided, no permissions
|
|
129
|
+
if (!user || !user.roles || !Array.isArray(user.roles)) {
|
|
130
|
+
return [];
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// Create a Set to avoid duplicate permissions
|
|
134
|
+
const permissionsSet = new Set();
|
|
135
|
+
|
|
136
|
+
// Add all permissions from all user roles
|
|
137
|
+
user.roles.forEach(role => {
|
|
138
|
+
const rolePermissions = ROLE_PERMISSIONS[role];
|
|
139
|
+
if (rolePermissions) {
|
|
140
|
+
rolePermissions.forEach(permission => permissionsSet.add(permission));
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
return [...permissionsSet];
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Validate if a role exists
|
|
149
|
+
*
|
|
150
|
+
* @param {String} role - Role to validate
|
|
151
|
+
* @returns {Boolean} - Whether the role exists
|
|
152
|
+
*/
|
|
153
|
+
const validateRole = (role) => {
|
|
154
|
+
return Object.values(ROLES).includes(role);
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
module.exports = {
|
|
158
|
+
PERMISSIONS,
|
|
159
|
+
ROLES,
|
|
160
|
+
ROLE_PERMISSIONS,
|
|
161
|
+
hasPermission,
|
|
162
|
+
getUserPermissions,
|
|
163
|
+
validateRole
|
|
164
|
+
};
|