UNPKG

n8n-mcp

Version:

Integration between n8n workflow automation and Model Context Protocol (MCP)

759 lines 35.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.DESTRUCTIVE_TOOL_OPERATIONS = exports.TOOL_OPERATION_PARAM = exports.n8nManagementTools = void 0; exports.n8nManagementTools = [ { name: 'n8n_create_workflow', description: `Create workflow. Requires: name, nodes[], connections{}. Created inactive. Returns workflow with ID.`, inputSchema: { type: 'object', properties: { name: { type: 'string', description: 'Workflow name (required)' }, nodes: { type: 'array', description: 'Array of workflow nodes. Each node must have: id, name, type, typeVersion, position, and parameters', items: { type: 'object', required: ['id', 'name', 'type', 'typeVersion', 'position', 'parameters'], properties: { id: { type: 'string' }, name: { type: 'string' }, type: { type: 'string' }, typeVersion: { type: 'number' }, position: { type: 'array', items: { type: 'number' }, minItems: 2, maxItems: 2 }, parameters: { type: 'object' }, credentials: { type: 'object' }, disabled: { type: 'boolean' }, notes: { type: 'string' }, continueOnFail: { type: 'boolean' }, retryOnFail: { type: 'boolean' }, maxTries: { type: 'number' }, waitBetweenTries: { type: 'number' } } } }, connections: { type: 'object', description: 'Workflow connections object. Keys are source node names (the name field, not id), values define output connections' }, settings: { type: 'object', description: 'Optional workflow settings (execution order, timezone, error handling)', properties: { executionOrder: { type: 'string', enum: ['v0', 'v1'] }, timezone: { type: 'string' }, saveDataErrorExecution: { type: 'string', enum: ['all', 'none'] }, saveDataSuccessExecution: { type: 'string', enum: ['all', 'none'] }, saveManualExecutions: { type: 'boolean' }, saveExecutionProgress: { type: 'boolean' }, executionTimeout: { type: 'number' }, errorWorkflow: { type: 'string' } } }, projectId: { type: 'string', description: 'Optional project ID to create the workflow in (enterprise feature)' } }, required: ['name', 'nodes', 'connections'] }, annotations: { title: 'Create Workflow', readOnlyHint: false, destructiveHint: false, openWorldHint: true, }, }, { name: 'n8n_get_workflow', description: `Get workflow by ID with different detail levels. n8n has a draft/publish model: the workflow body holds the draft (latest edits); use mode='active' to see the published graph that is actually running. Modes: 'full' (draft + metadata), 'details' (full + execution stats), 'active' (published graph only), 'structure' (nodes/connections topology), 'filtered' (full config of only the nodes named in nodeNames - use to read one heavy node without the whole workflow), 'minimal' (id/name/active/tags).`, inputSchema: { type: 'object', properties: { id: { type: 'string', description: 'Workflow ID' }, mode: { type: 'string', enum: ['full', 'details', 'structure', 'minimal', 'active', 'filtered'], default: 'full', description: 'Detail level: full=draft + metadata (activeVersionId pointer kept, heavy activeVersion payload stripped), details=full+execution stats, active=published graph (errors if workflow has no live version), structure=nodes/connections topology, filtered=full config of only the nodes listed in nodeNames, minimal=metadata only' }, nodeNames: { type: 'array', items: { type: 'string' }, minItems: 1, description: "For mode='filtered': node names or node IDs to return with full config. Returns only matching nodes (avoids client-side truncation on large workflows with long Code-node source). Discover names with mode='structure' first." } }, required: ['id'] }, annotations: { title: 'Get Workflow', readOnlyHint: true, idempotentHint: true, openWorldHint: true, }, _meta: { 'anthropic/maxResultSizeChars': 450000, }, }, { name: 'n8n_update_full_workflow', description: `Full workflow update. Requires complete nodes[] and connections{}. For incremental use n8n_update_partial_workflow.`, inputSchema: { type: 'object', properties: { id: { type: 'string', description: 'Workflow ID to update' }, name: { type: 'string', description: 'New workflow name' }, nodes: { type: 'array', description: 'Complete array of workflow nodes (required if modifying workflow structure)', items: { type: 'object', additionalProperties: true } }, connections: { type: 'object', description: 'Complete connections object (required if modifying workflow structure)' }, settings: { type: 'object', description: 'Workflow settings to update' } }, required: ['id'] }, annotations: { title: 'Update Full Workflow', readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true, }, }, { name: 'n8n_update_partial_workflow', description: `Update workflow incrementally with diff operations. Types: addNode, removeNode, updateNode, patchNodeField, moveNode, enable/disableNode, addConnection, removeConnection, updateSettings, updateName, add/removeTag, activate/deactivateWorkflow, transferWorkflow. patchNodeField requires fieldPath (dot path, e.g. "parameters.jsCode") and patches: [{find, replace}]. See tools_documentation("n8n_update_partial_workflow", "full") for details.`, inputSchema: { type: 'object', additionalProperties: true, properties: { id: { type: 'string', description: 'Workflow ID to update' }, operations: { type: 'array', description: 'Array of diff operations to apply. Each operation must have a "type" field and relevant properties for that operation type.', items: { type: 'object', additionalProperties: true } }, validateOnly: { type: 'boolean', description: 'If true, only validate operations without applying them' }, continueOnError: { type: 'boolean', description: 'If true, apply valid operations even if some fail (best-effort mode). Returns applied and failed operation indices. Default: false (atomic)' } }, required: ['id', 'operations'] }, annotations: { title: 'Update Partial Workflow', readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true, }, }, { name: 'n8n_delete_workflow', description: `Permanently delete a workflow. This action cannot be undone.`, inputSchema: { type: 'object', properties: { id: { type: 'string', description: 'Workflow ID to delete' } }, required: ['id'] }, annotations: { title: 'Delete Workflow', readOnlyHint: false, destructiveHint: true, openWorldHint: true, }, }, { name: 'n8n_list_workflows', description: `List workflows (minimal metadata only). Returns id/name/active/dates/tags. Check hasMore/nextCursor for pagination.`, inputSchema: { type: 'object', properties: { limit: { type: 'number', description: 'Number of workflows to return (1-100, default: 100)' }, cursor: { type: 'string', description: 'Pagination cursor from previous response' }, active: { type: 'boolean', description: 'Filter by active status' }, tags: { type: 'array', items: { type: 'string' }, description: 'Filter by tags (exact match)' }, projectId: { type: 'string', description: 'Filter by project ID (enterprise feature)' }, excludePinnedData: { type: 'boolean', description: 'Exclude pinned data from response (default: true)' } } }, annotations: { title: 'List Workflows', readOnlyHint: true, idempotentHint: true, openWorldHint: true, }, }, { name: 'n8n_validate_workflow', description: `Validate workflow by ID. Checks nodes, connections, expressions. Returns errors/warnings/suggestions.`, inputSchema: { type: 'object', properties: { id: { type: 'string', description: 'Workflow ID to validate' }, options: { type: 'object', description: 'Validation options', properties: { validateNodes: { type: 'boolean', description: 'Validate node configurations (default: true)' }, validateConnections: { type: 'boolean', description: 'Validate workflow connections (default: true)' }, validateExpressions: { type: 'boolean', description: 'Validate n8n expressions (default: true)' }, profile: { type: 'string', enum: ['minimal', 'runtime', 'ai-friendly', 'strict'], description: 'Validation profile to use (default: runtime)' } } } }, required: ['id'] }, annotations: { title: 'Validate Workflow', readOnlyHint: true, idempotentHint: true, openWorldHint: true, }, }, { name: 'n8n_autofix_workflow', description: `Automatically fix common workflow validation errors. Preview fixes or apply them. Fixes expression format, typeVersion, error output config, webhook paths, connection structure issues (numeric keys, invalid types, ID-to-name, duplicates, out-of-bounds indices).`, inputSchema: { type: 'object', properties: { id: { type: 'string', description: 'Workflow ID to fix' }, applyFixes: { type: 'boolean', description: 'Apply fixes to workflow (default: false - preview mode)' }, fixTypes: { type: 'array', description: 'Types of fixes to apply (default: all)', items: { type: 'string', enum: ['expression-format', 'typeversion-correction', 'error-output-config', 'node-type-correction', 'webhook-missing-path', 'typeversion-upgrade', 'version-migration', 'tool-variant-correction', 'connection-numeric-keys', 'connection-invalid-type', 'connection-id-to-name', 'connection-duplicate-removal', 'connection-input-index'] } }, confidenceThreshold: { type: 'string', enum: ['high', 'medium', 'low'], description: 'Minimum confidence level for fixes (default: medium)' }, maxFixes: { type: 'number', description: 'Maximum number of fixes to apply (default: 50)' } }, required: ['id'] }, annotations: { title: 'Autofix Workflow', readOnlyHint: false, destructiveHint: false, idempotentHint: true, openWorldHint: true, }, }, { name: 'n8n_test_workflow', description: `Test/trigger workflow execution. Auto-detects trigger type (webhook/form/chat). Supports: webhook (HTTP), form (fields), chat (message). Note: Only workflows with these trigger types can be executed externally.`, inputSchema: { type: 'object', properties: { workflowId: { type: 'string', description: 'Workflow ID to execute (required)' }, triggerType: { type: 'string', enum: ['webhook', 'form', 'chat'], description: 'Trigger type. Auto-detected if not specified. Workflow must have a matching trigger node.' }, httpMethod: { type: 'string', enum: ['GET', 'POST', 'PUT', 'DELETE'], description: 'For webhook: HTTP method (default: from workflow config or POST)' }, webhookPath: { type: 'string', description: 'For webhook: override the webhook path' }, message: { type: 'string', description: 'For chat: message to send (required for chat triggers)' }, sessionId: { type: 'string', description: 'For chat: session ID for conversation continuity' }, data: { type: 'object', description: 'Input data/payload for webhook, form fields, or execution data' }, headers: { type: 'object', description: 'Custom HTTP headers' }, timeout: { type: 'number', description: 'Timeout in ms (default: 120000)' }, waitForResponse: { type: 'boolean', description: 'Wait for workflow completion (default: true)' } }, required: ['workflowId'] }, annotations: { title: 'Test Workflow', readOnlyHint: false, destructiveHint: false, openWorldHint: true, }, }, { name: 'n8n_executions', description: `Manage workflow executions: get details, list, or delete. Use action='get' with id for execution details, action='list' for listing executions, action='delete' to remove execution record.`, inputSchema: { type: 'object', properties: { action: { type: 'string', enum: ['get', 'list', 'delete'], description: 'Operation: get=get execution details, list=list executions, delete=delete execution' }, id: { type: 'string', description: 'Execution ID (required for action=get or action=delete)' }, mode: { type: 'string', enum: ['preview', 'summary', 'filtered', 'full', 'error'], description: 'For action=get: preview=structure only, summary=2 items (default), filtered=custom, full=all data, error=optimized error debugging' }, nodeNames: { type: 'array', items: { type: 'string' }, description: 'For action=get with mode=filtered: filter to specific nodes by name' }, itemsLimit: { type: 'number', description: 'For action=get with mode=filtered: items per node (0=structure, 2=default, -1=unlimited)' }, includeInputData: { type: 'boolean', description: 'For action=get: include input data in addition to output (default: false)' }, errorItemsLimit: { type: 'number', description: 'For action=get with mode=error: sample items from upstream node (default: 2, max: 100)' }, includeStackTrace: { type: 'boolean', description: 'For action=get with mode=error: include full stack trace (default: false, shows truncated)' }, includeExecutionPath: { type: 'boolean', description: 'For action=get with mode=error: include execution path leading to error (default: true)' }, fetchWorkflow: { type: 'boolean', description: 'For action=get with mode=error: fetch workflow for accurate upstream detection (default: true)' }, limit: { type: 'number', description: 'For action=list: number of executions to return (1-100, default: 100)' }, cursor: { type: 'string', description: 'For action=list: pagination cursor from previous response' }, workflowId: { type: 'string', description: 'For action=list: filter by workflow ID' }, projectId: { type: 'string', description: 'For action=list: filter by project ID (enterprise feature)' }, status: { type: 'string', enum: ['success', 'error', 'waiting'], description: 'For action=list: filter by execution status' }, includeData: { type: 'boolean', description: 'For action=list: include execution data (default: false)' } }, required: ['action'] }, annotations: { title: 'Manage Executions', readOnlyHint: false, destructiveHint: true, openWorldHint: true, }, }, { name: 'n8n_evaluations', description: `Read evaluation test runs for a workflow (read-only). Requires n8n >= 2.30 and an API key created on 2.30+ (testRun scopes). Actions: list_runs=list runs for a workflow, get_run=single run with aggregated metrics, list_cases=per-case results (paginate - cases can be large). Triggering runs via API is not yet supported by n8n.`, inputSchema: { type: 'object', properties: { action: { type: 'string', enum: ['list_runs', 'get_run', 'list_cases'], description: 'Operation: list_runs=list test runs, get_run=run details with metrics, list_cases=per-case results' }, workflowId: { type: 'string', description: 'Workflow ID the test runs belong to (required)' }, runId: { type: 'string', description: 'Test run ID (required for action=get_run or action=list_cases)' }, status: { type: 'string', enum: ['new', 'running', 'completed', 'error', 'cancelled'], description: 'For action=list_runs: filter by run status' }, limit: { type: 'number', description: 'Results per page (1-250). Defaults: n8n server default (100) for list_runs, 20 for list_cases (per-case inputs/outputs can be large)' }, cursor: { type: 'string', description: 'Pagination cursor from previous response' } }, required: ['action', 'workflowId'] }, annotations: { title: 'Read Evaluation Test Runs', readOnlyHint: true, destructiveHint: false, openWorldHint: true, }, }, { name: 'n8n_health_check', description: `Check n8n instance health and API connectivity. Use mode='diagnostic' for detailed troubleshooting with env vars and tool status.`, inputSchema: { type: 'object', properties: { mode: { type: 'string', enum: ['status', 'diagnostic'], description: 'Mode: "status" (default) for quick health check, "diagnostic" for detailed debug info including env vars and tool status', default: 'status' }, verbose: { type: 'boolean', description: 'Include extra details in diagnostic mode (default: false)' } } }, annotations: { title: 'Health Check', readOnlyHint: true, idempotentHint: true, openWorldHint: true, }, }, { name: 'n8n_workflow_versions', description: `Manage workflow version history, rollback, and cleanup. Versions are scoped to your n8n instance. Five modes: - list: Show version history for a workflow - get: Get details of specific version - rollback: Restore workflow to previous version (creates backup first) - delete: Delete specific version or all versions for a workflow - prune: Manually trigger pruning to keep N most recent versions Old backups are also pruned automatically (10 most recent per workflow, plus an age-based retention window).`, inputSchema: { type: 'object', properties: { mode: { type: 'string', enum: ['list', 'get', 'rollback', 'delete', 'prune'], description: 'Operation mode' }, workflowId: { type: 'string', description: 'Workflow ID (required for list, rollback, delete, prune)' }, versionId: { type: 'number', description: 'Version ID (required for get mode and single version delete, optional for rollback)' }, limit: { type: 'number', default: 10, description: 'Max versions to return in list mode' }, validateBefore: { type: 'boolean', default: true, description: 'Validate workflow structure before rollback' }, deleteAll: { type: 'boolean', default: false, description: 'Delete all versions for workflow (delete mode only)' }, maxVersions: { type: 'number', default: 10, description: 'Keep N most recent versions (prune mode only)' } }, required: ['mode'] }, annotations: { title: 'Workflow Versions', readOnlyHint: false, destructiveHint: true, openWorldHint: true, }, }, { name: 'n8n_deploy_template', description: `Deploy a workflow template from n8n.io directly to your n8n instance. Deploys first, then auto-fixes common issues (expression format, typeVersions). Returns workflow ID, required credentials, and fixes applied.`, inputSchema: { type: 'object', properties: { templateId: { type: 'number', description: 'Template ID from n8n.io (required)' }, name: { type: 'string', description: 'Custom workflow name (default: template name)' }, autoUpgradeVersions: { type: 'boolean', default: true, description: 'Automatically upgrade node typeVersions to latest supported (default: true)' }, autoFix: { type: 'boolean', default: true, description: 'Auto-apply fixes after deployment for expression format issues, missing = prefix, etc. (default: true)' }, stripCredentials: { type: 'boolean', default: true, description: 'Remove credential references from nodes - user configures in n8n UI (default: true)' } }, required: ['templateId'] }, annotations: { title: 'Deploy Template', readOnlyHint: false, destructiveHint: false, openWorldHint: true, }, }, { name: 'n8n_manage_datatable', description: `Manage n8n data tables and rows. Actions: createTable, listTables, getTable, updateTable, deleteTable, getRows, insertRows, updateRows, upsertRows, deleteRows.`, inputSchema: { type: 'object', properties: { action: { type: 'string', enum: ['createTable', 'listTables', 'getTable', 'updateTable', 'deleteTable', 'getRows', 'insertRows', 'updateRows', 'upsertRows', 'deleteRows'], description: 'Operation to perform', }, tableId: { type: 'string', description: 'Data table ID (required for all actions except createTable and listTables)' }, name: { type: 'string', description: 'For createTable: table name. For updateTable: new name (rename only — schema is immutable after creation)' }, columns: { type: 'array', description: 'For createTable (required, at least one): column definitions. Schema is immutable after creation via public API.', items: { type: 'object', properties: { name: { type: 'string' }, type: { type: 'string', enum: ['string', 'number', 'boolean', 'date'] }, }, required: ['name'], }, }, data: { description: 'For insertRows: array of row objects. For updateRows/upsertRows: object with column values.' }, filter: { type: 'object', description: 'For getRows/updateRows/upsertRows/deleteRows: {type?: "and"|"or", filters: [{columnName, condition, value}]}', }, limit: { type: 'number', description: 'For listTables/getRows: max results (1-100)' }, cursor: { type: 'string', description: 'For listTables/getRows: pagination cursor' }, sortBy: { type: 'string', description: 'For getRows: "columnName:asc" or "columnName:desc"' }, search: { type: 'string', description: 'For getRows: text search across string columns' }, returnType: { type: 'string', enum: ['count', 'id', 'all'], description: 'For insertRows: what to return (default: count)' }, returnData: { type: 'boolean', description: 'For updateRows/upsertRows/deleteRows: return affected rows (default: false)' }, dryRun: { type: 'boolean', description: 'For updateRows/upsertRows/deleteRows: preview without applying (default: false)' }, projectId: { type: 'string', description: 'For createTable: project ID to create the table in. If omitted, uses the default project.' }, }, required: ['action'], }, annotations: { title: 'Manage Data Tables', readOnlyHint: false, destructiveHint: true, openWorldHint: true, }, }, { name: 'n8n_manage_credentials', description: 'Manage n8n credentials. Actions: list, get, create, update, delete, getSchema. Use getSchema to discover required fields before creating. For list, page beyond 100 results with cursor (from the previous response\'s nextCursor). NOTE: list/get need an n8n deployment whose public API permits credential reads older n8n versions, restricted API keys, or instance settings can reject them, returning NOT_SUPPORTED (create, delete, getSchema and update where the API version supports it still work). SECURITY: credential data values are never logged.', inputSchema: { type: 'object', properties: { action: { type: 'string', enum: ['list', 'get', 'create', 'update', 'delete', 'getSchema'], description: 'Action to perform' }, id: { type: 'string', description: 'Credential ID (required for get, update, delete)' }, name: { type: 'string', description: 'Credential name (required for create)' }, type: { type: 'string', description: 'Credential type e.g. httpHeaderAuth, httpBasicAuth, oAuth2Api (required for create, getSchema)' }, data: { type: 'object', description: 'Credential data fields - use getSchema to discover required fields (required for create, optional for update)' }, includeUsage: { type: 'boolean', description: 'For list/get: also return workflows that reference each credential (id, name, active). On list, triggers a full scan of all credential pages (up to 5000 credentials; ignores cursor/limit, no nextCursor returned). Slower on large instances. Default: false.' }, cursor: { type: 'string', description: 'For list: pagination cursor from a previous response\'s nextCursor. Ignored when includeUsage is true.' }, limit: { type: 'number', description: 'For list: max results per page (1-100, default 100). Ignored when includeUsage is true.' }, }, required: ['action'], }, annotations: { title: 'Manage Credentials', readOnlyHint: false, destructiveHint: false, openWorldHint: true, }, }, { name: 'n8n_audit_instance', description: `Security audit of n8n instance. Combines n8n's built-in audit API (credentials, database, nodes, instance, filesystem risks) with deep workflow scanning (hardcoded secrets via 50+ regex patterns, unauthenticated webhooks, error handling gaps, data retention risks). Returns actionable markdown report with remediation steps using n8n_manage_credentials and n8n_update_partial_workflow.`, inputSchema: { type: 'object', properties: { categories: { type: 'array', items: { type: 'string', enum: ['credentials', 'database', 'nodes', 'instance', 'filesystem'], }, description: 'Built-in audit categories to check (default: all 5)', }, includeCustomScan: { type: 'boolean', description: 'Run deep workflow scanning for secrets, webhooks, error handling (default: true)', }, daysAbandonedWorkflow: { type: 'number', description: 'Days threshold for abandoned workflow detection (default: 90)', }, customChecks: { type: 'array', items: { type: 'string', enum: ['hardcoded_secrets', 'unauthenticated_webhooks', 'error_handling', 'data_retention'], }, description: 'Specific custom checks to run (default: all 4)', }, }, }, annotations: { title: 'Audit Instance Security', readOnlyHint: true, destructiveHint: false, idempotentHint: true, openWorldHint: true, }, }, ]; exports.TOOL_OPERATION_PARAM = { 'n8n_executions': 'action', 'n8n_evaluations': 'action', 'n8n_workflow_versions': 'mode', }; exports.DESTRUCTIVE_TOOL_OPERATIONS = { 'n8n_executions': new Set(['delete']), 'n8n_workflow_versions': new Set(['delete', 'rollback', 'prune']), }; //# sourceMappingURL=tools-n8n-manager.js.map