Files
2026-07-13 13:34:48 +08:00

134 lines
4.5 KiB
TypeScript

import { z, IntegrationDefinition } from '@botpress/sdk'
export default new IntegrationDefinition({
name: 'n8n',
title: 'n8n',
description: 'This integration allows you to interact with n8n workflows.',
version: '0.1.1',
readme: 'hub.md',
icon: 'icon.svg',
configuration: {
schema: z.object({
baseUrl: z
.string()
.url()
.title('Base URL')
.describe('The base URL of your n8n instance, for example https://example.app.n8n.cloud'),
accessKey: z
.string()
.min(1)
.title('Access Key')
.describe('Your n8n API key. Found in n8n under Settings → n8n API.'),
}),
},
actions: {
listWorkflows: {
title: 'List Workflows',
description: 'Retrieves workflows from n8n.',
input: {
schema: z.object({
active: z.boolean().optional().title('Active').describe('Filter by workflow active state'),
name: z.string().optional().title('Name').describe('Filter by workflow name'),
tags: z.string().optional().title('Tags').describe('Comma-separated tag filter'),
projectId: z.string().optional().title('Project ID').describe('Filter by project ID'),
excludePinnedData: z
.boolean()
.optional()
.default(true)
.title('Exclude Pinned Data')
.describe('Exclude pinned data from the response'),
limit: z
.number()
.int()
.max(250)
.optional()
.title('Limit')
.describe('Maximum number of workflows to return (1-250)'),
cursor: z.string().optional().title('Cursor').describe('Pagination cursor from a previous request'),
}),
},
output: {
schema: z.object({
data: z.array(z.any()).title('Workflows').describe('List of workflows returned by n8n'),
nextCursor: z
.string()
.optional()
.title('Next Cursor')
.describe('Cursor for fetching the next page of results'),
}),
},
},
getWorkflow: {
title: 'Get Workflow',
description: 'Retrieves a single workflow from n8n by ID.',
input: {
schema: z.object({
workflowId: z.string().min(1).title('Workflow ID').describe('The workflow ID'),
excludePinnedData: z
.boolean()
.optional()
.default(true)
.title('Exclude Pinned Data')
.describe('Exclude pinned data from the response'),
}),
},
output: {
schema: z.object({
workflow: z.any().title('Workflow').describe('The full workflow object returned by n8n'),
}),
},
},
triggerWorkflow: {
title: 'Trigger Workflow',
description: 'Resolves an n8n workflow webhook and posts data to it.',
input: {
schema: z.object({
workflowIdOrName: z.string().min(1).title('Workflow ID or Name').describe('The workflow ID or name'),
conversationId: z
.string()
.min(1)
.placeholder('{{ event.conversationId }}')
.title('Conversation ID')
.describe('The current Botpress conversation ID — use {{event.conversationId}}'),
payload: z
.record(z.string(), z.any())
.optional()
.default({})
.title('Payload')
.describe('The JSON payload to send to the workflow'),
}),
},
output: {
schema: z.object({
workflowId: z.string().optional().title('Workflow ID').describe('The ID of the triggered workflow'),
workflowName: z.string().optional().title('Workflow Name').describe('The name of the triggered workflow'),
response: z.any().optional().title('Response').describe('The response body returned by the n8n webhook'),
}),
},
},
},
events: {
n8nEvent: {
title: 'n8n event',
description: 'Triggered when n8n posts data back to Botpress.',
schema: z.object({
workflowId: z
.string()
.optional()
.title('Workflow ID')
.describe('The ID of the workflow that posted this event'),
workflowName: z
.string()
.optional()
.title('Workflow Name')
.describe('The name of the workflow that posted this event'),
data: z.record(z.string(), z.any()).title('Data').describe('Arbitrary data payload sent by the n8n workflow'),
}),
},
},
attributes: {
category: 'Developer Tools',
repo: 'botpress',
},
})