n8n 1.114.2 → 1.115.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 (174) hide show
  1. package/README.md +2 -2
  2. package/dist/active-executions.d.ts +2 -1
  3. package/dist/active-executions.js +4 -5
  4. package/dist/active-executions.js.map +1 -1
  5. package/dist/active-workflow-manager.js +3 -4
  6. package/dist/active-workflow-manager.js.map +1 -1
  7. package/dist/auth/auth.service.js +11 -11
  8. package/dist/auth/auth.service.js.map +1 -1
  9. package/dist/build.tsbuildinfo +1 -1
  10. package/dist/commands/export/entities.d.ts +3 -0
  11. package/dist/commands/export/entities.js +21 -7
  12. package/dist/commands/export/entities.js.map +1 -1
  13. package/dist/commands/export/nodes.d.ts +14 -0
  14. package/dist/commands/export/nodes.js +61 -0
  15. package/dist/commands/export/nodes.js.map +1 -0
  16. package/dist/commands/webhook.js +6 -0
  17. package/dist/commands/webhook.js.map +1 -1
  18. package/dist/commands/worker.js +1 -1
  19. package/dist/commands/worker.js.map +1 -1
  20. package/dist/controller.registry.d.ts +1 -1
  21. package/dist/controller.registry.js +3 -3
  22. package/dist/controller.registry.js.map +1 -1
  23. package/dist/controllers/api-keys.controller.d.ts +2 -0
  24. package/dist/controllers/translation.controller.js +4 -4
  25. package/dist/controllers/translation.controller.js.map +1 -1
  26. package/dist/controllers/users.controller.js +8 -3
  27. package/dist/controllers/users.controller.js.map +1 -1
  28. package/dist/environments.ee/source-control/constants.d.ts +1 -0
  29. package/dist/environments.ee/source-control/constants.js +2 -1
  30. package/dist/environments.ee/source-control/constants.js.map +1 -1
  31. package/dist/environments.ee/source-control/source-control-export.service.ee.d.ts +6 -3
  32. package/dist/environments.ee/source-control/source-control-export.service.ee.js +44 -2
  33. package/dist/environments.ee/source-control/source-control-export.service.ee.js.map +1 -1
  34. package/dist/environments.ee/source-control/source-control-git.service.ee.js +2 -1
  35. package/dist/environments.ee/source-control/source-control-git.service.ee.js.map +1 -1
  36. package/dist/environments.ee/source-control/source-control-helper.ee.d.ts +1 -0
  37. package/dist/environments.ee/source-control/source-control-helper.ee.js +4 -0
  38. package/dist/environments.ee/source-control/source-control-helper.ee.js.map +1 -1
  39. package/dist/environments.ee/source-control/source-control-import.service.ee.d.ts +5 -0
  40. package/dist/environments.ee/source-control/source-control-import.service.ee.js +52 -16
  41. package/dist/environments.ee/source-control/source-control-import.service.ee.js.map +1 -1
  42. package/dist/environments.ee/source-control/source-control-status.service.ee.d.ts +3 -3
  43. package/dist/environments.ee/source-control/source-control-status.service.ee.js.map +1 -1
  44. package/dist/environments.ee/source-control/source-control.controller.ee.d.ts +4 -4
  45. package/dist/environments.ee/source-control/source-control.controller.ee.js +2 -0
  46. package/dist/environments.ee/source-control/source-control.controller.ee.js.map +1 -1
  47. package/dist/environments.ee/source-control/source-control.service.ee.d.ts +2 -2
  48. package/dist/environments.ee/source-control/types/exportable-project.d.ts +12 -0
  49. package/dist/environments.ee/source-control/types/exportable-project.js +3 -0
  50. package/dist/environments.ee/source-control/types/exportable-project.js.map +1 -0
  51. package/dist/environments.ee/variables/variables.controller.ee.d.ts +14 -7
  52. package/dist/environments.ee/variables/variables.controller.ee.js +12 -21
  53. package/dist/environments.ee/variables/variables.controller.ee.js.map +1 -1
  54. package/dist/environments.ee/variables/variables.service.ee.d.ts +21 -11
  55. package/dist/environments.ee/variables/variables.service.ee.js +126 -46
  56. package/dist/environments.ee/variables/variables.service.ee.js.map +1 -1
  57. package/dist/evaluation.ee/test-runner/test-runner.service.ee.js +1 -1
  58. package/dist/evaluation.ee/test-runner/test-runner.service.ee.js.map +1 -1
  59. package/dist/eventbus/message-event-bus/message-event-bus.d.ts +1 -0
  60. package/dist/eventbus/message-event-bus/message-event-bus.js +3 -2
  61. package/dist/eventbus/message-event-bus/message-event-bus.js.map +1 -1
  62. package/dist/eventbus/message-event-bus-writer/message-event-bus-log-writer.js +3 -36
  63. package/dist/eventbus/message-event-bus-writer/message-event-bus-log-writer.js.map +1 -1
  64. package/dist/events/maps/relay.event-map.d.ts +1 -0
  65. package/dist/events/relays/telemetry.event-relay.js +2 -1
  66. package/dist/events/relays/telemetry.event-relay.js.map +1 -1
  67. package/dist/execution-lifecycle/execution-lifecycle-hooks.js +1 -2
  68. package/dist/execution-lifecycle/execution-lifecycle-hooks.js.map +1 -1
  69. package/dist/executions/execution.service.js +2 -2
  70. package/dist/executions/execution.service.js.map +1 -1
  71. package/dist/middlewares/list-query/dtos/workflow.filter.dto.d.ts +1 -0
  72. package/dist/middlewares/list-query/dtos/workflow.filter.dto.js +7 -0
  73. package/dist/middlewares/list-query/dtos/workflow.filter.dto.js.map +1 -1
  74. package/dist/middlewares/list-query/dtos/workflow.select.dto.js +1 -0
  75. package/dist/middlewares/list-query/dtos/workflow.select.dto.js.map +1 -1
  76. package/dist/modules/community-packages/community-packages.service.js +1 -1
  77. package/dist/modules/community-packages/community-packages.service.js.map +1 -1
  78. package/dist/modules/community-packages/npm-utils.d.ts +1 -1
  79. package/dist/modules/community-packages/npm-utils.js +66 -20
  80. package/dist/modules/community-packages/npm-utils.js.map +1 -1
  81. package/dist/modules/data-table/data-store-column.repository.d.ts +5 -5
  82. package/dist/modules/data-table/data-store-column.repository.js +39 -37
  83. package/dist/modules/data-table/data-store-column.repository.js.map +1 -1
  84. package/dist/modules/data-table/data-store-proxy.service.js +4 -4
  85. package/dist/modules/data-table/data-store-proxy.service.js.map +1 -1
  86. package/dist/modules/data-table/data-store-rows.repository.d.ts +17 -12
  87. package/dist/modules/data-table/data-store-rows.repository.js +244 -151
  88. package/dist/modules/data-table/data-store-rows.repository.js.map +1 -1
  89. package/dist/modules/data-table/data-store.controller.d.ts +4 -4
  90. package/dist/modules/data-table/data-store.controller.js +23 -5
  91. package/dist/modules/data-table/data-store.controller.js.map +1 -1
  92. package/dist/modules/data-table/data-store.repository.d.ts +5 -5
  93. package/dist/modules/data-table/data-store.repository.js +26 -43
  94. package/dist/modules/data-table/data-store.repository.js.map +1 -1
  95. package/dist/modules/data-table/data-store.service.d.ts +10 -4
  96. package/dist/modules/data-table/data-store.service.js +36 -22
  97. package/dist/modules/data-table/data-store.service.js.map +1 -1
  98. package/dist/modules/data-table/errors/data-store-system-column-name-conflict.error.d.ts +4 -0
  99. package/dist/modules/data-table/errors/data-store-system-column-name-conflict.error.js +13 -0
  100. package/dist/modules/data-table/errors/data-store-system-column-name-conflict.error.js.map +1 -0
  101. package/dist/modules/external-secrets.ee/providers/gcp-secrets-manager/gcp-secrets-manager.js +17 -3
  102. package/dist/modules/external-secrets.ee/providers/gcp-secrets-manager/gcp-secrets-manager.js.map +1 -1
  103. package/dist/modules/mcp/dto/update-mcp-settings.dto.d.ts +8 -0
  104. package/dist/modules/mcp/dto/update-mcp-settings.dto.js +11 -0
  105. package/dist/modules/mcp/dto/update-mcp-settings.dto.js.map +1 -0
  106. package/dist/modules/mcp/mcp-api-key.service.d.ts +22 -0
  107. package/dist/modules/mcp/mcp-api-key.service.js +157 -0
  108. package/dist/modules/mcp/mcp-api-key.service.js.map +1 -0
  109. package/dist/modules/mcp/mcp.controller.d.ts +15 -0
  110. package/dist/modules/mcp/mcp.controller.js +78 -0
  111. package/dist/modules/mcp/mcp.controller.js.map +1 -0
  112. package/dist/modules/mcp/mcp.module.d.ts +8 -0
  113. package/dist/modules/mcp/mcp.module.js +70 -0
  114. package/dist/modules/mcp/mcp.module.js.map +1 -0
  115. package/dist/modules/mcp/mcp.service.d.ts +16 -0
  116. package/dist/modules/mcp/mcp.service.js +54 -0
  117. package/dist/modules/mcp/mcp.service.js.map +1 -0
  118. package/dist/modules/mcp/mcp.settings.controller.d.ts +17 -0
  119. package/dist/modules/mcp/mcp.settings.controller.js +79 -0
  120. package/dist/modules/mcp/mcp.settings.controller.js.map +1 -0
  121. package/dist/modules/mcp/mcp.settings.service.d.ts +9 -0
  122. package/dist/modules/mcp/mcp.settings.service.js +43 -0
  123. package/dist/modules/mcp/mcp.settings.service.js.map +1 -0
  124. package/dist/modules/mcp/mcp.typeguards.d.ts +21 -0
  125. package/dist/modules/mcp/mcp.typeguards.js +41 -0
  126. package/dist/modules/mcp/mcp.typeguards.js.map +1 -0
  127. package/dist/modules/mcp/mcp.types.d.ts +37 -0
  128. package/dist/modules/mcp/mcp.types.js +3 -0
  129. package/dist/modules/mcp/mcp.types.js.map +1 -0
  130. package/dist/modules/mcp/tools/get-workflow-details.tool.d.ts +16 -0
  131. package/dist/modules/mcp/tools/get-workflow-details.tool.js +64 -0
  132. package/dist/modules/mcp/tools/get-workflow-details.tool.js.map +1 -0
  133. package/dist/modules/mcp/tools/schemas.d.ts +179 -0
  134. package/dist/modules/mcp/tools/schemas.js +45 -0
  135. package/dist/modules/mcp/tools/schemas.js.map +1 -0
  136. package/dist/modules/mcp/tools/search-workflows.tool.d.ts +13 -0
  137. package/dist/modules/mcp/tools/search-workflows.tool.js +98 -0
  138. package/dist/modules/mcp/tools/search-workflows.tool.js.map +1 -0
  139. package/dist/modules/mcp/tools/webhook-utils.d.ts +9 -0
  140. package/dist/modules/mcp/tools/webhook-utils.js +141 -0
  141. package/dist/modules/mcp/tools/webhook-utils.js.map +1 -0
  142. package/dist/public-api/v1/handlers/variables/variables.handler.d.ts +5 -4
  143. package/dist/public-api/v1/handlers/variables/variables.handler.js +15 -6
  144. package/dist/public-api/v1/handlers/variables/variables.handler.js.map +1 -1
  145. package/dist/push/index.js +9 -20
  146. package/dist/push/index.js.map +1 -1
  147. package/dist/scaling/scaling.service.d.ts +1 -1
  148. package/dist/scaling/scaling.service.js +3 -3
  149. package/dist/scaling/scaling.service.js.map +1 -1
  150. package/dist/security-audit/constants.d.ts +1 -1
  151. package/dist/security-audit/constants.js +1 -1
  152. package/dist/security-audit/constants.js.map +1 -1
  153. package/dist/services/export.service.d.ts +4 -2
  154. package/dist/services/export.service.js +32 -12
  155. package/dist/services/export.service.js.map +1 -1
  156. package/dist/services/frontend.service.js +5 -0
  157. package/dist/services/frontend.service.js.map +1 -1
  158. package/dist/services/import.service.d.ts +5 -2
  159. package/dist/services/import.service.js +89 -27
  160. package/dist/services/import.service.js.map +1 -1
  161. package/dist/services/project.service.ee.d.ts +1 -0
  162. package/dist/services/project.service.ee.js +19 -0
  163. package/dist/services/project.service.ee.js.map +1 -1
  164. package/dist/services/public-api-key.service.d.ts +2 -1
  165. package/dist/services/public-api-key.service.js +9 -4
  166. package/dist/services/public-api-key.service.js.map +1 -1
  167. package/dist/sso.ee/oidc/oidc.service.ee.js +3 -2
  168. package/dist/sso.ee/oidc/oidc.service.ee.js.map +1 -1
  169. package/dist/utils/compression.util.d.ts +12 -0
  170. package/dist/utils/compression.util.js +181 -0
  171. package/dist/utils/compression.util.js.map +1 -0
  172. package/dist/workflow-runner.js +3 -3
  173. package/dist/workflow-runner.js.map +1 -1
  174. package/package.json +15 -15
@@ -0,0 +1,157 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.McpServerApiKeyService = void 0;
13
+ const db_1 = require("@n8n/db");
14
+ const di_1 = require("@n8n/di");
15
+ const crypto_1 = require("crypto");
16
+ const auth_error_1 = require("../../errors/response-errors/auth.error");
17
+ const jwt_service_1 = require("../../services/jwt.service");
18
+ const API_KEY_AUDIENCE = 'mcp-server-api';
19
+ const API_KEY_ISSUER = 'n8n';
20
+ const REDACT_API_KEY_REVEAL_COUNT = 4;
21
+ const REDACT_API_KEY_MAX_LENGTH = 10;
22
+ const API_KEY_LABEL = 'MCP Server API Key';
23
+ const REDACT_API_KEY_MIN_HIDDEN_CHARS = 6;
24
+ let McpServerApiKeyService = class McpServerApiKeyService {
25
+ constructor(apiKeyRepository, jwtService, userRepository) {
26
+ this.apiKeyRepository = apiKeyRepository;
27
+ this.jwtService = jwtService;
28
+ this.userRepository = userRepository;
29
+ }
30
+ async createMcpServerApiKey(user, trx) {
31
+ const manager = trx ?? this.apiKeyRepository.manager;
32
+ const apiKey = this.jwtService.sign({
33
+ sub: user.id,
34
+ iss: API_KEY_ISSUER,
35
+ aud: API_KEY_AUDIENCE,
36
+ jti: (0, crypto_1.randomUUID)(),
37
+ });
38
+ const apiKeyEntity = this.apiKeyRepository.create({
39
+ userId: user.id,
40
+ apiKey,
41
+ audience: API_KEY_AUDIENCE,
42
+ scopes: [],
43
+ label: API_KEY_LABEL,
44
+ });
45
+ await manager.insert(db_1.ApiKey, apiKeyEntity);
46
+ return await manager.findOneByOrFail(db_1.ApiKey, { apiKey });
47
+ }
48
+ async findServerApiKeyForUser(user, { redact = true } = {}) {
49
+ const apiKey = await this.apiKeyRepository.findOne({
50
+ where: {
51
+ userId: user.id,
52
+ audience: API_KEY_AUDIENCE,
53
+ },
54
+ });
55
+ if (apiKey && redact) {
56
+ apiKey.apiKey = this.redactApiKey(apiKey.apiKey);
57
+ }
58
+ return apiKey;
59
+ }
60
+ async getUserForApiKey(apiKey) {
61
+ return await this.userRepository.findOne({
62
+ where: {
63
+ apiKeys: {
64
+ apiKey,
65
+ audience: API_KEY_AUDIENCE,
66
+ },
67
+ },
68
+ relations: ['role'],
69
+ });
70
+ }
71
+ async deleteAllMcpApiKeysForUser(user, trx) {
72
+ const manager = trx ?? this.apiKeyRepository.manager;
73
+ await manager.delete(db_1.ApiKey, {
74
+ userId: user.id,
75
+ audience: API_KEY_AUDIENCE,
76
+ });
77
+ }
78
+ redactApiKey(apiKey) {
79
+ if (REDACT_API_KEY_REVEAL_COUNT >= apiKey.length - REDACT_API_KEY_MIN_HIDDEN_CHARS) {
80
+ return '*'.repeat(apiKey.length);
81
+ }
82
+ const visiblePart = apiKey.slice(-REDACT_API_KEY_REVEAL_COUNT);
83
+ const redactedPart = '*'.repeat(Math.max(0, REDACT_API_KEY_MAX_LENGTH - REDACT_API_KEY_REVEAL_COUNT));
84
+ return redactedPart + visiblePart;
85
+ }
86
+ extractAPIKeyFromHeader(headerValue) {
87
+ if (!headerValue.startsWith('Bearer')) {
88
+ throw new auth_error_1.AuthError('Invalid authorization header format');
89
+ }
90
+ const apiKeyMatch = headerValue.match(/^Bearer\s+(.+)$/i);
91
+ if (apiKeyMatch) {
92
+ return apiKeyMatch[1];
93
+ }
94
+ throw new auth_error_1.AuthError('Invalid authorization header format');
95
+ }
96
+ getAuthMiddleware() {
97
+ return async (req, res, next) => {
98
+ const authorizationHeader = req.header('authorization');
99
+ if (!authorizationHeader) {
100
+ this.responseWithUnauthorized(res);
101
+ return;
102
+ }
103
+ const apiKey = this.extractAPIKeyFromHeader(authorizationHeader);
104
+ if (!apiKey) {
105
+ this.responseWithUnauthorized(res);
106
+ return;
107
+ }
108
+ const user = await this.getUserForApiKey(apiKey);
109
+ if (!user) {
110
+ this.responseWithUnauthorized(res);
111
+ return;
112
+ }
113
+ try {
114
+ this.jwtService.verify(apiKey, {
115
+ issuer: API_KEY_ISSUER,
116
+ audience: API_KEY_AUDIENCE,
117
+ });
118
+ }
119
+ catch (e) {
120
+ this.responseWithUnauthorized(res);
121
+ return;
122
+ }
123
+ req.user = user;
124
+ next();
125
+ };
126
+ }
127
+ responseWithUnauthorized(res) {
128
+ res.status(401).send({ message: 'Unauthorized' });
129
+ }
130
+ async getOrCreateApiKey(user) {
131
+ const apiKey = await this.apiKeyRepository.findOne({
132
+ where: {
133
+ userId: user.id,
134
+ audience: API_KEY_AUDIENCE,
135
+ },
136
+ });
137
+ if (apiKey) {
138
+ apiKey.apiKey = this.redactApiKey(apiKey.apiKey);
139
+ return apiKey;
140
+ }
141
+ return await this.createMcpServerApiKey(user);
142
+ }
143
+ async rotateMcpServerApiKey(user) {
144
+ return await this.apiKeyRepository.manager.transaction(async (trx) => {
145
+ await this.deleteAllMcpApiKeysForUser(user, trx);
146
+ return await this.createMcpServerApiKey(user, trx);
147
+ });
148
+ }
149
+ };
150
+ exports.McpServerApiKeyService = McpServerApiKeyService;
151
+ exports.McpServerApiKeyService = McpServerApiKeyService = __decorate([
152
+ (0, di_1.Service)(),
153
+ __metadata("design:paramtypes", [db_1.ApiKeyRepository,
154
+ jwt_service_1.JwtService,
155
+ db_1.UserRepository])
156
+ ], McpServerApiKeyService);
157
+ //# sourceMappingURL=mcp-api-key.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-api-key.service.js","sourceRoot":"","sources":["../../../src/modules/mcp/mcp-api-key.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import { AuthenticatedRequest } from '@n8n/db';
2
+ import type { Response } from 'express';
3
+ import { ErrorReporter } from 'n8n-core';
4
+ import { McpService } from './mcp.service';
5
+ import { McpSettingsService } from './mcp.settings.service';
6
+ export type FlushableResponse = Response & {
7
+ flush: () => void;
8
+ };
9
+ export declare class McpController {
10
+ private readonly errorReporter;
11
+ private readonly mcpService;
12
+ private readonly mcpSettingsService;
13
+ constructor(errorReporter: ErrorReporter, mcpService: McpService, mcpSettingsService: McpSettingsService);
14
+ build(req: AuthenticatedRequest, res: FlushableResponse): Promise<void>;
15
+ }
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.McpController = void 0;
13
+ const streamableHttp_js_1 = require("@modelcontextprotocol/sdk/server/streamableHttp.js");
14
+ const decorators_1 = require("@n8n/decorators");
15
+ const di_1 = require("@n8n/di");
16
+ const n8n_core_1 = require("n8n-core");
17
+ const mcp_api_key_service_1 = require("./mcp-api-key.service");
18
+ const mcp_service_1 = require("./mcp.service");
19
+ const mcp_settings_service_1 = require("./mcp.settings.service");
20
+ const getAuthMiddleware = () => di_1.Container.get(mcp_api_key_service_1.McpServerApiKeyService).getAuthMiddleware();
21
+ let McpController = class McpController {
22
+ constructor(errorReporter, mcpService, mcpSettingsService) {
23
+ this.errorReporter = errorReporter;
24
+ this.mcpService = mcpService;
25
+ this.mcpSettingsService = mcpSettingsService;
26
+ }
27
+ async build(req, res) {
28
+ const enabled = await this.mcpSettingsService.getEnabled();
29
+ if (!enabled) {
30
+ res.status(403).json({ message: 'MCP access is disabled' });
31
+ return;
32
+ }
33
+ try {
34
+ const server = this.mcpService.getServer(req.user);
35
+ const transport = new streamableHttp_js_1.StreamableHTTPServerTransport({
36
+ sessionIdGenerator: undefined,
37
+ });
38
+ res.on('close', () => {
39
+ void transport.close();
40
+ void server.close();
41
+ });
42
+ await server.connect(transport);
43
+ await transport.handleRequest(req, res, req.body);
44
+ }
45
+ catch (error) {
46
+ this.errorReporter.error(error);
47
+ if (!res.headersSent) {
48
+ res.status(500).json({
49
+ jsonrpc: '2.0',
50
+ error: {
51
+ code: -32603,
52
+ message: 'Internal server error',
53
+ },
54
+ id: null,
55
+ });
56
+ }
57
+ }
58
+ }
59
+ };
60
+ exports.McpController = McpController;
61
+ __decorate([
62
+ (0, decorators_1.Post)('/http', {
63
+ rateLimit: { limit: 100 },
64
+ middlewares: [getAuthMiddleware()],
65
+ skipAuth: true,
66
+ usesTemplates: true,
67
+ }),
68
+ __metadata("design:type", Function),
69
+ __metadata("design:paramtypes", [Object, Object]),
70
+ __metadata("design:returntype", Promise)
71
+ ], McpController.prototype, "build", null);
72
+ exports.McpController = McpController = __decorate([
73
+ (0, decorators_1.RootLevelController)('/mcp-access'),
74
+ __metadata("design:paramtypes", [n8n_core_1.ErrorReporter,
75
+ mcp_service_1.McpService,
76
+ mcp_settings_service_1.McpSettingsService])
77
+ ], McpController);
78
+ //# sourceMappingURL=mcp.controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.controller.js","sourceRoot":"","sources":["../../../src/modules/mcp/mcp.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,0FAAmG;AAEnG,gDAA4D;AAC5D,gCAAoC;AAEpC,uCAAyC;AAEzC,+DAA+D;AAC/D,+CAA2C;AAC3C,iEAA4D;AAI5D,MAAM,iBAAiB,GAAG,GAAG,EAAE,CAAC,cAAS,CAAC,GAAG,CAAC,4CAAsB,CAAC,CAAC,iBAAiB,EAAE,CAAC;AAGnF,IAAM,aAAa,GAAnB,MAAM,aAAa;IACzB,YACkB,aAA4B,EAC5B,UAAsB,EACtB,kBAAsC;QAFtC,kBAAa,GAAb,aAAa,CAAe;QAC5B,eAAU,GAAV,UAAU,CAAY;QACtB,uBAAkB,GAAlB,kBAAkB,CAAoB;IACrD,CAAC;IAQE,AAAN,KAAK,CAAC,KAAK,CAAC,GAAyB,EAAE,GAAsB;QAE5D,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,UAAU,EAAE,CAAC;QAC3D,IAAI,CAAC,OAAO,EAAE,CAAC;YACd,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,wBAAwB,EAAE,CAAC,CAAC;YAC5D,OAAO;QACR,CAAC;QAID,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACnD,MAAM,SAAS,GAAkC,IAAI,iDAA6B,CAAC;gBAClF,kBAAkB,EAAE,SAAS;aAC7B,CAAC,CAAC;YACH,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBACpB,KAAK,SAAS,CAAC,KAAK,EAAE,CAAC;gBACvB,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC;YACrB,CAAC,CAAC,CAAC;YACH,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAChC,MAAM,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC;QACnD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAChC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;gBACtB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACpB,OAAO,EAAE,KAAK;oBACd,KAAK,EAAE;wBACN,IAAI,EAAE,CAAC,KAAK;wBACZ,OAAO,EAAE,uBAAuB;qBAChC;oBACD,EAAE,EAAE,IAAI;iBACR,CAAC,CAAC;YACJ,CAAC;QACF,CAAC;IACF,CAAC;CACD,CAAA;AAhDY,sCAAa;AAanB;IANL,IAAA,iBAAI,EAAC,OAAO,EAAE;QACd,SAAS,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE;QACzB,WAAW,EAAE,CAAC,iBAAiB,EAAE,CAAC;QAClC,QAAQ,EAAE,IAAI;QACd,aAAa,EAAE,IAAI;KACnB,CAAC;;;;0CAmCD;wBA/CW,aAAa;IADzB,IAAA,gCAAmB,EAAC,aAAa,CAAC;qCAGD,wBAAa;QAChB,wBAAU;QACF,yCAAkB;GAJ5C,aAAa,CAgDzB"}
@@ -0,0 +1,8 @@
1
+ import type { ModuleInterface } from '@n8n/decorators';
2
+ export declare class McpModule implements ModuleInterface {
3
+ init(): Promise<void>;
4
+ settings(): Promise<{
5
+ mcpAccessEnabled: boolean;
6
+ }>;
7
+ shutdown(): Promise<void>;
8
+ }
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
19
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
21
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
22
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
23
+ };
24
+ var __importStar = (this && this.__importStar) || (function () {
25
+ var ownKeys = function(o) {
26
+ ownKeys = Object.getOwnPropertyNames || function (o) {
27
+ var ar = [];
28
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
29
+ return ar;
30
+ };
31
+ return ownKeys(o);
32
+ };
33
+ return function (mod) {
34
+ if (mod && mod.__esModule) return mod;
35
+ var result = {};
36
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
37
+ __setModuleDefault(result, mod);
38
+ return result;
39
+ };
40
+ })();
41
+ var __metadata = (this && this.__metadata) || function (k, v) {
42
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
43
+ };
44
+ Object.defineProperty(exports, "__esModule", { value: true });
45
+ exports.McpModule = void 0;
46
+ const decorators_1 = require("@n8n/decorators");
47
+ const di_1 = require("@n8n/di");
48
+ let McpModule = class McpModule {
49
+ async init() {
50
+ await Promise.resolve().then(() => __importStar(require('./mcp.controller')));
51
+ await Promise.resolve().then(() => __importStar(require('./mcp.settings.controller')));
52
+ }
53
+ async settings() {
54
+ const { McpSettingsService } = await Promise.resolve().then(() => __importStar(require('./mcp.settings.service')));
55
+ const mcpAccessEnabled = await di_1.Container.get(McpSettingsService).getEnabled();
56
+ return { mcpAccessEnabled };
57
+ }
58
+ async shutdown() { }
59
+ };
60
+ exports.McpModule = McpModule;
61
+ __decorate([
62
+ (0, decorators_1.OnShutdown)(),
63
+ __metadata("design:type", Function),
64
+ __metadata("design:paramtypes", []),
65
+ __metadata("design:returntype", Promise)
66
+ ], McpModule.prototype, "shutdown", null);
67
+ exports.McpModule = McpModule = __decorate([
68
+ (0, decorators_1.BackendModule)({ name: 'mcp' })
69
+ ], McpModule);
70
+ //# sourceMappingURL=mcp.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.module.js","sourceRoot":"","sources":["../../../src/modules/mcp/mcp.module.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,gDAA4D;AAC5D,gCAAoC;AAQ7B,IAAM,SAAS,GAAf,MAAM,SAAS;IACrB,KAAK,CAAC,IAAI;QACT,wDAAa,kBAAkB,GAAC,CAAC;QACjC,wDAAa,2BAA2B,GAAC,CAAC;IAC3C,CAAC;IAOD,KAAK,CAAC,QAAQ;QACb,MAAM,EAAE,kBAAkB,EAAE,GAAG,wDAAa,wBAAwB,GAAC,CAAC;QACtE,MAAM,gBAAgB,GAAG,MAAM,cAAS,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,UAAU,EAAE,CAAC;QAC9E,OAAO,EAAE,gBAAgB,EAAE,CAAC;IAC7B,CAAC;IAGK,AAAN,KAAK,CAAC,QAAQ,KAAI,CAAC;CACnB,CAAA;AAnBY,8BAAS;AAkBf;IADL,IAAA,uBAAU,GAAE;;;;yCACM;oBAlBP,SAAS;IADrB,IAAA,0BAAa,EAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;GAClB,SAAS,CAmBrB"}
@@ -0,0 +1,16 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { GlobalConfig } from '@n8n/config';
3
+ import { User } from '@n8n/db';
4
+ import { CredentialsService } from '../../credentials/credentials.service';
5
+ import { UrlService } from '../../services/url.service';
6
+ import { WorkflowFinderService } from '../../workflows/workflow-finder.service';
7
+ import { WorkflowService } from '../../workflows/workflow.service';
8
+ export declare class McpService {
9
+ private readonly workflowFinderService;
10
+ private readonly workflowService;
11
+ private readonly urlService;
12
+ private readonly credentialsService;
13
+ private readonly globalConfig;
14
+ constructor(workflowFinderService: WorkflowFinderService, workflowService: WorkflowService, urlService: UrlService, credentialsService: CredentialsService, globalConfig: GlobalConfig);
15
+ getServer(user: User): McpServer;
16
+ }
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.McpService = void 0;
13
+ const mcp_js_1 = require("@modelcontextprotocol/sdk/server/mcp.js");
14
+ const config_1 = require("@n8n/config");
15
+ const di_1 = require("@n8n/di");
16
+ const get_workflow_details_tool_1 = require("./tools/get-workflow-details.tool");
17
+ const search_workflows_tool_1 = require("./tools/search-workflows.tool");
18
+ const credentials_service_1 = require("../../credentials/credentials.service");
19
+ const url_service_1 = require("../../services/url.service");
20
+ const workflow_finder_service_1 = require("../../workflows/workflow-finder.service");
21
+ const workflow_service_1 = require("../../workflows/workflow.service");
22
+ let McpService = class McpService {
23
+ constructor(workflowFinderService, workflowService, urlService, credentialsService, globalConfig) {
24
+ this.workflowFinderService = workflowFinderService;
25
+ this.workflowService = workflowService;
26
+ this.urlService = urlService;
27
+ this.credentialsService = credentialsService;
28
+ this.globalConfig = globalConfig;
29
+ }
30
+ getServer(user) {
31
+ const server = new mcp_js_1.McpServer({
32
+ name: 'n8n MCP Server',
33
+ version: '1.0.0',
34
+ });
35
+ const workflowSearchTool = (0, search_workflows_tool_1.createSearchWorkflowsTool)(user, this.workflowService);
36
+ server.registerTool(workflowSearchTool.name, workflowSearchTool.config, workflowSearchTool.handler);
37
+ const workflowDetailsTool = (0, get_workflow_details_tool_1.createWorkflowDetailsTool)(user, this.urlService.getWebhookBaseUrl(), this.workflowFinderService, this.credentialsService, {
38
+ webhook: this.globalConfig.endpoints.webhook,
39
+ webhookTest: this.globalConfig.endpoints.webhookTest,
40
+ });
41
+ server.registerTool(workflowDetailsTool.name, workflowDetailsTool.config, workflowDetailsTool.handler);
42
+ return server;
43
+ }
44
+ };
45
+ exports.McpService = McpService;
46
+ exports.McpService = McpService = __decorate([
47
+ (0, di_1.Service)(),
48
+ __metadata("design:paramtypes", [workflow_finder_service_1.WorkflowFinderService,
49
+ workflow_service_1.WorkflowService,
50
+ url_service_1.UrlService,
51
+ credentials_service_1.CredentialsService,
52
+ config_1.GlobalConfig])
53
+ ], McpService);
54
+ //# sourceMappingURL=mcp.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.service.js","sourceRoot":"","sources":["../../../src/modules/mcp/mcp.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,oEAAoE;AACpE,wCAA2C;AAE3C,gCAAkC;AAElC,iFAA8E;AAC9E,yEAA0E;AAE1E,2EAAuE;AACvE,wDAAoD;AACpD,iFAA4E;AAC5E,mEAA+D;AAGxD,IAAM,UAAU,GAAhB,MAAM,UAAU;IACtB,YACkB,qBAA4C,EAC5C,eAAgC,EAChC,UAAsB,EACtB,kBAAsC,EACtC,YAA0B;QAJ1B,0BAAqB,GAArB,qBAAqB,CAAuB;QAC5C,oBAAe,GAAf,eAAe,CAAiB;QAChC,eAAU,GAAV,UAAU,CAAY;QACtB,uBAAkB,GAAlB,kBAAkB,CAAoB;QACtC,iBAAY,GAAZ,YAAY,CAAc;IACzC,CAAC;IAEJ,SAAS,CAAC,IAAU;QACnB,MAAM,MAAM,GAAG,IAAI,kBAAS,CAAC;YAC5B,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,OAAO;SAChB,CAAC,CAAC;QAEH,MAAM,kBAAkB,GAAG,IAAA,iDAAyB,EAAC,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QACjF,MAAM,CAAC,YAAY,CAClB,kBAAkB,CAAC,IAAI,EACvB,kBAAkB,CAAC,MAAM,EACzB,kBAAkB,CAAC,OAAO,CAC1B,CAAC;QAEF,MAAM,mBAAmB,GAAG,IAAA,qDAAyB,EACpD,IAAI,EACJ,IAAI,CAAC,UAAU,CAAC,iBAAiB,EAAE,EACnC,IAAI,CAAC,qBAAqB,EAC1B,IAAI,CAAC,kBAAkB,EACvB;YACC,OAAO,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,OAAO;YAC5C,WAAW,EAAE,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,WAAW;SACpD,CACD,CAAC;QACF,MAAM,CAAC,YAAY,CAClB,mBAAmB,CAAC,IAAI,EACxB,mBAAmB,CAAC,MAAM,EAC1B,mBAAmB,CAAC,OAAO,CAC3B,CAAC;QAEF,OAAO,MAAM,CAAC;IACf,CAAC;CACD,CAAA;AAxCY,gCAAU;qBAAV,UAAU;IADtB,IAAA,YAAO,GAAE;qCAGgC,+CAAqB;QAC3B,kCAAe;QACpB,wBAAU;QACF,wCAAkB;QACxB,qBAAY;GANhC,UAAU,CAwCtB"}
@@ -0,0 +1,17 @@
1
+ import { ModuleRegistry, Logger } from '@n8n/backend-common';
2
+ import { type AuthenticatedRequest } from '@n8n/db';
3
+ import { UpdateMcpSettingsDto } from './dto/update-mcp-settings.dto';
4
+ import { McpServerApiKeyService } from './mcp-api-key.service';
5
+ import { McpSettingsService } from './mcp.settings.service';
6
+ export declare class McpSettingsController {
7
+ private readonly mcpSettingsService;
8
+ private readonly logger;
9
+ private readonly moduleRegistry;
10
+ private readonly mcpServerApiKeyService;
11
+ constructor(mcpSettingsService: McpSettingsService, logger: Logger, moduleRegistry: ModuleRegistry, mcpServerApiKeyService: McpServerApiKeyService);
12
+ updateSettings(_req: AuthenticatedRequest, _res: Response, dto: UpdateMcpSettingsDto): Promise<{
13
+ mcpAccessEnabled: boolean;
14
+ }>;
15
+ getApiKeyForMcpServer(req: AuthenticatedRequest): Promise<import("@n8n/db").ApiKey>;
16
+ rotateApiKeyForMcpServer(req: AuthenticatedRequest): Promise<import("@n8n/db").ApiKey>;
17
+ }
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.McpSettingsController = void 0;
16
+ const backend_common_1 = require("@n8n/backend-common");
17
+ const decorators_1 = require("@n8n/decorators");
18
+ const update_mcp_settings_dto_1 = require("./dto/update-mcp-settings.dto");
19
+ const mcp_api_key_service_1 = require("./mcp-api-key.service");
20
+ const mcp_settings_service_1 = require("./mcp.settings.service");
21
+ let McpSettingsController = class McpSettingsController {
22
+ constructor(mcpSettingsService, logger, moduleRegistry, mcpServerApiKeyService) {
23
+ this.mcpSettingsService = mcpSettingsService;
24
+ this.logger = logger;
25
+ this.moduleRegistry = moduleRegistry;
26
+ this.mcpServerApiKeyService = mcpServerApiKeyService;
27
+ }
28
+ async updateSettings(_req, _res, dto) {
29
+ const enabled = dto.mcpAccessEnabled;
30
+ await this.mcpSettingsService.setEnabled(enabled);
31
+ try {
32
+ await this.moduleRegistry.refreshModuleSettings('mcp');
33
+ }
34
+ catch (error) {
35
+ this.logger.warn('Failed to sync MCP settings to module registry', {
36
+ cause: error instanceof Error ? error.message : String(error),
37
+ });
38
+ }
39
+ return { mcpAccessEnabled: enabled };
40
+ }
41
+ async getApiKeyForMcpServer(req) {
42
+ return await this.mcpServerApiKeyService.getOrCreateApiKey(req.user);
43
+ }
44
+ async rotateApiKeyForMcpServer(req) {
45
+ return await this.mcpServerApiKeyService.rotateMcpServerApiKey(req.user);
46
+ }
47
+ };
48
+ exports.McpSettingsController = McpSettingsController;
49
+ __decorate([
50
+ (0, decorators_1.GlobalScope)('mcp:manage'),
51
+ (0, decorators_1.Patch)('/settings'),
52
+ __param(2, decorators_1.Body),
53
+ __metadata("design:type", Function),
54
+ __metadata("design:paramtypes", [Object, Response,
55
+ update_mcp_settings_dto_1.UpdateMcpSettingsDto]),
56
+ __metadata("design:returntype", Promise)
57
+ ], McpSettingsController.prototype, "updateSettings", null);
58
+ __decorate([
59
+ (0, decorators_1.GlobalScope)('mcpApiKey:create'),
60
+ (0, decorators_1.Get)('/api-key'),
61
+ __metadata("design:type", Function),
62
+ __metadata("design:paramtypes", [Object]),
63
+ __metadata("design:returntype", Promise)
64
+ ], McpSettingsController.prototype, "getApiKeyForMcpServer", null);
65
+ __decorate([
66
+ (0, decorators_1.GlobalScope)('mcpApiKey:rotate'),
67
+ (0, decorators_1.Post)('/api-key/rotate'),
68
+ __metadata("design:type", Function),
69
+ __metadata("design:paramtypes", [Object]),
70
+ __metadata("design:returntype", Promise)
71
+ ], McpSettingsController.prototype, "rotateApiKeyForMcpServer", null);
72
+ exports.McpSettingsController = McpSettingsController = __decorate([
73
+ (0, decorators_1.RestController)('/mcp'),
74
+ __metadata("design:paramtypes", [mcp_settings_service_1.McpSettingsService,
75
+ backend_common_1.Logger,
76
+ backend_common_1.ModuleRegistry,
77
+ mcp_api_key_service_1.McpServerApiKeyService])
78
+ ], McpSettingsController);
79
+ //# sourceMappingURL=mcp.settings.controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.settings.controller.js","sourceRoot":"","sources":["../../../src/modules/mcp/mcp.settings.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,wDAA6D;AAE7D,gDAAsF;AAEtF,2EAAqE;AACrE,+DAA+D;AAC/D,iEAA4D;AAGrD,IAAM,qBAAqB,GAA3B,MAAM,qBAAqB;IACjC,YACkB,kBAAsC,EACtC,MAAc,EACd,cAA8B,EAC9B,sBAA8C;QAH9C,uBAAkB,GAAlB,kBAAkB,CAAoB;QACtC,WAAM,GAAN,MAAM,CAAQ;QACd,mBAAc,GAAd,cAAc,CAAgB;QAC9B,2BAAsB,GAAtB,sBAAsB,CAAwB;IAC7D,CAAC;IAIE,AAAN,KAAK,CAAC,cAAc,CACnB,IAA0B,EAC1B,IAAc,EACR,GAAyB;QAE/B,MAAM,OAAO,GAAG,GAAG,CAAC,gBAAgB,CAAC;QACrC,MAAM,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAClD,IAAI,CAAC;YACJ,MAAM,IAAI,CAAC,cAAc,CAAC,qBAAqB,CAAC,KAAK,CAAC,CAAC;QACxD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,gDAAgD,EAAE;gBAClE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;aAC7D,CAAC,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,gBAAgB,EAAE,OAAO,EAAE,CAAC;IACtC,CAAC;IAIK,AAAN,KAAK,CAAC,qBAAqB,CAAC,GAAyB;QACpD,OAAO,MAAM,IAAI,CAAC,sBAAsB,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACtE,CAAC;IAIK,AAAN,KAAK,CAAC,wBAAwB,CAAC,GAAyB;QACvD,OAAO,MAAM,IAAI,CAAC,sBAAsB,CAAC,qBAAqB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC1E,CAAC;CACD,CAAA;AAtCY,sDAAqB;AAU3B;IAFL,IAAA,wBAAW,EAAC,YAAY,CAAC;IACzB,IAAA,kBAAK,EAAC,WAAW,CAAC;IAIjB,WAAA,iBAAI,CAAA;;6CADC,QAAQ;QACH,8CAAoB;;2DAY/B;AAIK;IAFL,IAAA,wBAAW,EAAC,kBAAkB,CAAC;IAC/B,IAAA,gBAAG,EAAC,UAAU,CAAC;;;;kEAGf;AAIK;IAFL,IAAA,wBAAW,EAAC,kBAAkB,CAAC;IAC/B,IAAA,iBAAI,EAAC,iBAAiB,CAAC;;;;qEAGvB;gCArCW,qBAAqB;IADjC,IAAA,2BAAc,EAAC,MAAM,CAAC;qCAGgB,yCAAkB;QAC9B,uBAAM;QACE,+BAAc;QACN,4CAAsB;GALpD,qBAAqB,CAsCjC"}
@@ -0,0 +1,9 @@
1
+ import { SettingsRepository } from '@n8n/db';
2
+ import { CacheService } from '../../services/cache/cache.service';
3
+ export declare class McpSettingsService {
4
+ private readonly settingsRepository;
5
+ private readonly cacheService;
6
+ constructor(settingsRepository: SettingsRepository, cacheService: CacheService);
7
+ getEnabled(): Promise<boolean>;
8
+ setEnabled(enabled: boolean): Promise<void>;
9
+ }
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.McpSettingsService = void 0;
13
+ const db_1 = require("@n8n/db");
14
+ const di_1 = require("@n8n/di");
15
+ const cache_service_1 = require("../../services/cache/cache.service");
16
+ const KEY = 'mcp.access.enabled';
17
+ let McpSettingsService = class McpSettingsService {
18
+ constructor(settingsRepository, cacheService) {
19
+ this.settingsRepository = settingsRepository;
20
+ this.cacheService = cacheService;
21
+ }
22
+ async getEnabled() {
23
+ const isMcpAccessEnabled = await this.cacheService.get(KEY);
24
+ if (isMcpAccessEnabled !== undefined) {
25
+ return isMcpAccessEnabled === 'true';
26
+ }
27
+ const row = await this.settingsRepository.findByKey(KEY);
28
+ const enabled = row?.value === 'true';
29
+ await this.cacheService.set(KEY, enabled.toString());
30
+ return enabled;
31
+ }
32
+ async setEnabled(enabled) {
33
+ await this.settingsRepository.upsert({ key: KEY, value: enabled.toString(), loadOnStartup: true }, ['key']);
34
+ await this.cacheService.set(KEY, enabled.toString());
35
+ }
36
+ };
37
+ exports.McpSettingsService = McpSettingsService;
38
+ exports.McpSettingsService = McpSettingsService = __decorate([
39
+ (0, di_1.Service)(),
40
+ __metadata("design:paramtypes", [db_1.SettingsRepository,
41
+ cache_service_1.CacheService])
42
+ ], McpSettingsService);
43
+ //# sourceMappingURL=mcp.settings.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.settings.service.js","sourceRoot":"","sources":["../../../src/modules/mcp/mcp.settings.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,gCAA6C;AAC7C,gCAAkC;AAElC,kEAA8D;AAE9D,MAAM,GAAG,GAAG,oBAAoB,CAAC;AAG1B,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;IAC9B,YACkB,kBAAsC,EACtC,YAA0B;QAD1B,uBAAkB,GAAlB,kBAAkB,CAAoB;QACtC,iBAAY,GAAZ,YAAY,CAAc;IACzC,CAAC;IAEJ,KAAK,CAAC,UAAU;QACf,MAAM,kBAAkB,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAS,GAAG,CAAC,CAAC;QAEpE,IAAI,kBAAkB,KAAK,SAAS,EAAE,CAAC;YACtC,OAAO,kBAAkB,KAAK,MAAM,CAAC;QACtC,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAEzD,MAAM,OAAO,GAAG,GAAG,EAAE,KAAK,KAAK,MAAM,CAAC;QAEtC,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;QAErD,OAAO,OAAO,CAAC;IAChB,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,OAAgB;QAChC,MAAM,IAAI,CAAC,kBAAkB,CAAC,MAAM,CACnC,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,OAAO,CAAC,QAAQ,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,EAC5D,CAAC,KAAK,CAAC,CACP,CAAC;QAEF,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IACtD,CAAC;CACD,CAAA;AA9BY,gDAAkB;6BAAlB,kBAAkB;IAD9B,IAAA,YAAO,GAAE;qCAG6B,uBAAkB;QACxB,4BAAY;GAHhC,kBAAkB,CA8B9B"}
@@ -0,0 +1,21 @@
1
+ type UnknownRecord = Record<string, unknown>;
2
+ export type HttpHeaderAuthDecryptedData = {
3
+ name: string;
4
+ value?: unknown;
5
+ };
6
+ export type WithDecryptedData<T> = UnknownRecord & {
7
+ data: T;
8
+ };
9
+ export declare function hasHttpHeaderAuthDecryptedData(value: unknown): value is WithDecryptedData<HttpHeaderAuthDecryptedData>;
10
+ export type JwtPassphraseDecryptedData = {
11
+ keyType?: 'passphrase' | string;
12
+ secret: string;
13
+ };
14
+ export type JwtPemKeyDecryptedData = {
15
+ keyType?: 'pemKey' | string;
16
+ privateKey?: string;
17
+ publicKey?: string;
18
+ };
19
+ export declare function hasJwtSecretDecryptedData(value: unknown): value is WithDecryptedData<JwtPassphraseDecryptedData>;
20
+ export declare function hasJwtPemKeyDecryptedData(value: unknown): value is WithDecryptedData<JwtPemKeyDecryptedData>;
21
+ export {};