n8n 1.119.1 → 1.120.1
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/dist/auth/auth.service.js +1 -0
- package/dist/auth/auth.service.js.map +1 -1
- package/dist/build.tsbuildinfo +1 -1
- package/dist/controller.registry.d.ts +1 -0
- package/dist/controller.registry.js +37 -12
- package/dist/controller.registry.js.map +1 -1
- package/dist/controllers/auth.controller.js +3 -1
- package/dist/controllers/auth.controller.js.map +1 -1
- package/dist/events/maps/relay.event-map.d.ts +1 -1
- package/dist/middlewares/list-query/dtos/workflow.filter.dto.d.ts +1 -1
- package/dist/middlewares/list-query/dtos/workflow.filter.dto.js +1 -1
- package/dist/middlewares/list-query/dtos/workflow.filter.dto.js.map +1 -1
- package/dist/middlewares/list-query/dtos/workflow.select.dto.js +1 -0
- package/dist/middlewares/list-query/dtos/workflow.select.dto.js.map +1 -1
- package/dist/modules/breaking-changes/breaking-changes.controller.d.ts +7 -3
- package/dist/modules/breaking-changes/breaking-changes.controller.js +39 -6
- package/dist/modules/breaking-changes/breaking-changes.controller.js.map +1 -1
- package/dist/modules/breaking-changes/breaking-changes.service.d.ts +9 -6
- package/dist/modules/breaking-changes/breaking-changes.service.js +67 -38
- package/dist/modules/breaking-changes/breaking-changes.service.js.map +1 -1
- package/dist/modules/breaking-changes/rules/v2/file-access.rule.d.ts +5 -4
- package/dist/modules/breaking-changes/rules/v2/file-access.rule.js +4 -3
- package/dist/modules/breaking-changes/rules/v2/file-access.rule.js.map +1 -1
- package/dist/modules/breaking-changes/rules/v2/process-env-access.rule.d.ts +5 -4
- package/dist/modules/breaking-changes/rules/v2/process-env-access.rule.js +11 -13
- package/dist/modules/breaking-changes/rules/v2/process-env-access.rule.js.map +1 -1
- package/dist/modules/breaking-changes/rules/v2/removed-nodes.rule.d.ts +5 -4
- package/dist/modules/breaking-changes/rules/v2/removed-nodes.rule.js +4 -3
- package/dist/modules/breaking-changes/rules/v2/removed-nodes.rule.js.map +1 -1
- package/dist/modules/breaking-changes/types/detection.types.d.ts +9 -10
- package/dist/modules/breaking-changes/types/rule.types.d.ts +9 -48
- package/dist/modules/breaking-changes/types/rule.types.js +1 -14
- package/dist/modules/breaking-changes/types/rule.types.js.map +1 -1
- package/dist/modules/insights/database/repositories/insights-by-period-query.helper.d.ts +9 -2
- package/dist/modules/insights/database/repositories/insights-by-period-query.helper.js +28 -64
- package/dist/modules/insights/database/repositories/insights-by-period-query.helper.js.map +1 -1
- package/dist/modules/insights/insights.controller.js +1 -1
- package/dist/modules/mcp/database/entities/oauth-access-token.entity.d.ts +9 -0
- package/dist/modules/mcp/database/entities/oauth-access-token.entity.js +44 -0
- package/dist/modules/mcp/database/entities/oauth-access-token.entity.js.map +1 -0
- package/dist/modules/mcp/database/entities/oauth-authorization-code.entity.d.ts +15 -0
- package/dist/modules/mcp/database/entities/oauth-authorization-code.entity.js +69 -0
- package/dist/modules/mcp/database/entities/oauth-authorization-code.entity.js.map +1 -0
- package/dist/modules/mcp/database/entities/oauth-client.entity.d.ts +18 -0
- package/dist/modules/mcp/database/entities/oauth-client.entity.js +65 -0
- package/dist/modules/mcp/database/entities/oauth-client.entity.js.map +1 -0
- package/dist/modules/mcp/database/entities/oauth-refresh-token.entity.d.ts +10 -0
- package/dist/modules/mcp/database/entities/oauth-refresh-token.entity.js +49 -0
- package/dist/modules/mcp/database/entities/oauth-refresh-token.entity.js.map +1 -0
- package/dist/modules/mcp/database/entities/oauth-user-consent.entity.d.ts +10 -0
- package/dist/modules/mcp/database/entities/oauth-user-consent.entity.js +49 -0
- package/dist/modules/mcp/database/entities/oauth-user-consent.entity.js.map +1 -0
- package/dist/modules/mcp/database/repositories/oauth-access-token.repository.d.ts +5 -0
- package/dist/modules/mcp/database/repositories/oauth-access-token.repository.js +26 -0
- package/dist/modules/mcp/database/repositories/oauth-access-token.repository.js.map +1 -0
- package/dist/modules/mcp/database/repositories/oauth-authorization-code.repository.d.ts +5 -0
- package/dist/modules/mcp/database/repositories/oauth-authorization-code.repository.js +26 -0
- package/dist/modules/mcp/database/repositories/oauth-authorization-code.repository.js.map +1 -0
- package/dist/modules/mcp/database/repositories/oauth-client.repository.d.ts +5 -0
- package/dist/modules/mcp/database/repositories/oauth-client.repository.js +26 -0
- package/dist/modules/mcp/database/repositories/oauth-client.repository.js.map +1 -0
- package/dist/modules/mcp/database/repositories/oauth-refresh-token.repository.d.ts +5 -0
- package/dist/modules/mcp/database/repositories/oauth-refresh-token.repository.js +26 -0
- package/dist/modules/mcp/database/repositories/oauth-refresh-token.repository.js.map +1 -0
- package/dist/modules/mcp/database/repositories/oauth-user-consent.repository.d.ts +6 -0
- package/dist/modules/mcp/database/repositories/oauth-user-consent.repository.js +33 -0
- package/dist/modules/mcp/database/repositories/oauth-user-consent.repository.js.map +1 -0
- package/dist/modules/mcp/dto/approve-consent-request.dto.d.ts +8 -0
- package/dist/modules/mcp/dto/approve-consent-request.dto.js +11 -0
- package/dist/modules/mcp/dto/approve-consent-request.dto.js.map +1 -0
- package/dist/modules/mcp/mcp-api-key.service.d.ts +6 -9
- package/dist/modules/mcp/mcp-api-key.service.js +32 -61
- package/dist/modules/mcp/mcp-api-key.service.js.map +1 -1
- package/dist/modules/mcp/mcp-oauth-authorization-code.service.d.ts +11 -0
- package/dist/modules/mcp/mcp-oauth-authorization-code.service.js +76 -0
- package/dist/modules/mcp/mcp-oauth-authorization-code.service.js.map +1 -0
- package/dist/modules/mcp/mcp-oauth-consent.service.d.ts +20 -0
- package/dist/modules/mcp/mcp-oauth-consent.service.js +87 -0
- package/dist/modules/mcp/mcp-oauth-consent.service.js.map +1 -0
- package/dist/modules/mcp/mcp-oauth-service.d.ts +31 -0
- package/dist/modules/mcp/mcp-oauth-service.js +164 -0
- package/dist/modules/mcp/mcp-oauth-service.js.map +1 -0
- package/dist/modules/mcp/mcp-oauth-token.service.d.ts +28 -0
- package/dist/modules/mcp/mcp-oauth-token.service.js +182 -0
- package/dist/modules/mcp/mcp-oauth-token.service.js.map +1 -0
- package/dist/modules/mcp/mcp-oauth.helpers.d.ts +4 -0
- package/dist/modules/mcp/mcp-oauth.helpers.js +24 -0
- package/dist/modules/mcp/mcp-oauth.helpers.js.map +1 -0
- package/dist/modules/mcp/mcp-server-middleware.service.d.ts +18 -0
- package/dist/modules/mcp/mcp-server-middleware.service.js +95 -0
- package/dist/modules/mcp/mcp-server-middleware.service.js.map +1 -0
- package/dist/modules/mcp/mcp.auth.consent.controller.d.ts +17 -0
- package/dist/modules/mcp/mcp.auth.consent.controller.js +120 -0
- package/dist/modules/mcp/mcp.auth.consent.controller.js.map +1 -0
- package/dist/modules/mcp/mcp.controller.d.ts +4 -2
- package/dist/modules/mcp/mcp.controller.js +25 -3
- package/dist/modules/mcp/mcp.controller.js.map +1 -1
- package/dist/modules/mcp/mcp.module.d.ts +1 -0
- package/dist/modules/mcp/mcp.module.js +11 -0
- package/dist/modules/mcp/mcp.module.js.map +1 -1
- package/dist/modules/mcp/mcp.oauth-clients.controller.d.ts +12 -0
- package/dist/modules/mcp/mcp.oauth-clients.controller.js +93 -0
- package/dist/modules/mcp/mcp.oauth-clients.controller.js.map +1 -0
- package/dist/modules/mcp/mcp.oauth.controller.d.ts +13 -0
- package/dist/modules/mcp/mcp.oauth.controller.js +124 -0
- package/dist/modules/mcp/mcp.oauth.controller.js.map +1 -0
- package/dist/modules/mcp/mcp.types.d.ts +1 -2
- package/dist/modules/mcp/oauth-session.service.d.ts +16 -0
- package/dist/modules/mcp/oauth-session.service.js +48 -0
- package/dist/modules/mcp/oauth-session.service.js.map +1 -0
- package/dist/modules/mcp/tools/search-workflows.tool.d.ts +2 -3
- package/dist/modules/mcp/tools/search-workflows.tool.js +11 -10
- package/dist/modules/mcp/tools/search-workflows.tool.js.map +1 -1
- package/dist/modules/provisioning.ee/provisioning.service.ee.d.ts +4 -2
- package/dist/modules/provisioning.ee/provisioning.service.ee.js +20 -1
- package/dist/modules/provisioning.ee/provisioning.service.ee.js.map +1 -1
- package/dist/public-api/v1/handlers/users/users.service.ee.d.ts +6 -2
- package/dist/public-api/v1/handlers/users/users.service.ee.js +10 -3
- package/dist/public-api/v1/handlers/users/users.service.ee.js.map +1 -1
- package/dist/public-api/v1/openapi.yml +1 -1
- package/dist/services/import.service.js +0 -5
- package/dist/services/import.service.js.map +1 -1
- package/dist/services/jwt.service.d.ts +1 -1
- package/dist/services/jwt.service.js.map +1 -1
- package/dist/sso.ee/oidc/oidc.service.ee.js +6 -4
- package/dist/sso.ee/oidc/oidc.service.ee.js.map +1 -1
- package/dist/sso.ee/saml/routes/saml.controller.ee.d.ts +2 -10
- package/dist/sso.ee/saml/routes/saml.controller.ee.js +2 -9
- package/dist/sso.ee/saml/routes/saml.controller.ee.js.map +1 -1
- package/dist/sso.ee/saml/saml-helpers.d.ts +4 -1
- package/dist/sso.ee/saml/saml-helpers.js +10 -3
- package/dist/sso.ee/saml/saml-helpers.js.map +1 -1
- package/dist/sso.ee/saml/saml.service.ee.d.ts +4 -1
- package/dist/sso.ee/saml/saml.service.ee.js +20 -12
- package/dist/sso.ee/saml/saml.service.ee.js.map +1 -1
- package/dist/sso.ee/saml/types.d.ts +2 -2
- package/dist/telemetry/index.js +17 -3
- package/dist/telemetry/index.js.map +1 -1
- package/dist/utils/validate-database-type.d.ts +3 -1
- package/dist/utils/validate-database-type.js +26 -4
- package/dist/utils/validate-database-type.js.map +1 -1
- package/dist/workflows/workflow-finder.service.d.ts +1 -0
- package/dist/workflows/workflow.request.d.ts +1 -0
- package/dist/workflows/workflow.service.d.ts +2 -1
- package/dist/workflows/workflow.service.js +1 -0
- package/dist/workflows/workflow.service.js.map +1 -1
- package/dist/workflows/workflows.controller.d.ts +4 -0
- package/package.json +26 -26
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.McpOAuthHelpers = void 0;
|
|
4
|
+
class McpOAuthHelpers {
|
|
5
|
+
static buildSuccessRedirectUrl(redirectUri, code, state) {
|
|
6
|
+
const targetUrl = new URL(redirectUri);
|
|
7
|
+
targetUrl.searchParams.set('code', code);
|
|
8
|
+
if (state) {
|
|
9
|
+
targetUrl.searchParams.set('state', state);
|
|
10
|
+
}
|
|
11
|
+
return targetUrl.toString();
|
|
12
|
+
}
|
|
13
|
+
static buildErrorRedirectUrl(redirectUri, error, errorDescription, state) {
|
|
14
|
+
const targetUrl = new URL(redirectUri);
|
|
15
|
+
targetUrl.searchParams.set('error', error);
|
|
16
|
+
targetUrl.searchParams.set('error_description', errorDescription);
|
|
17
|
+
if (state) {
|
|
18
|
+
targetUrl.searchParams.set('state', state);
|
|
19
|
+
}
|
|
20
|
+
return targetUrl.toString();
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
exports.McpOAuthHelpers = McpOAuthHelpers;
|
|
24
|
+
//# sourceMappingURL=mcp-oauth.helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-oauth.helpers.js","sourceRoot":"","sources":["../../../src/modules/mcp/mcp-oauth.helpers.ts"],"names":[],"mappings":";;;AAGA,MAAa,eAAe;IAK3B,MAAM,CAAC,uBAAuB,CAAC,WAAmB,EAAE,IAAY,EAAE,KAAoB;QACrF,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;QACvC,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACzC,IAAI,KAAK,EAAE,CAAC;YACX,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,SAAS,CAAC,QAAQ,EAAE,CAAC;IAC7B,CAAC;IAMD,MAAM,CAAC,qBAAqB,CAC3B,WAAmB,EACnB,KAAa,EACb,gBAAwB,EACxB,KAAoB;QAEpB,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,CAAC;QACvC,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC3C,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,mBAAmB,EAAE,gBAAgB,CAAC,CAAC;QAClE,IAAI,KAAK,EAAE,CAAC;YACX,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,SAAS,CAAC,QAAQ,EAAE,CAAC;IAC7B,CAAC;CACD;AAhCD,0CAgCC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { User } from '@n8n/db';
|
|
2
|
+
import { NextFunction, Response, Request } from 'express';
|
|
3
|
+
import { JwtService } from '../../services/jwt.service';
|
|
4
|
+
import { Telemetry } from '../../telemetry';
|
|
5
|
+
import { McpServerApiKeyService } from './mcp-api-key.service';
|
|
6
|
+
import { McpOAuthTokenService } from './mcp-oauth-token.service';
|
|
7
|
+
export declare class McpServerMiddlewareService {
|
|
8
|
+
private readonly mcpServerApiKeyService;
|
|
9
|
+
private readonly mcpAuthTokenService;
|
|
10
|
+
private readonly jwtService;
|
|
11
|
+
private readonly telemetry;
|
|
12
|
+
constructor(mcpServerApiKeyService: McpServerApiKeyService, mcpAuthTokenService: McpOAuthTokenService, jwtService: JwtService, telemetry: Telemetry);
|
|
13
|
+
getUserForToken(token: string): Promise<User | null>;
|
|
14
|
+
getAuthMiddleware(): (req: Request, res: Response, next: NextFunction) => Promise<void>;
|
|
15
|
+
private extractBearerToken;
|
|
16
|
+
private responseWithUnauthorized;
|
|
17
|
+
private trackUnauthorizedEvent;
|
|
18
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
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.McpServerMiddlewareService = void 0;
|
|
13
|
+
const di_1 = require("@n8n/di");
|
|
14
|
+
const auth_error_1 = require("../../errors/response-errors/auth.error");
|
|
15
|
+
const jwt_service_1 = require("../../services/jwt.service");
|
|
16
|
+
const telemetry_1 = require("../../telemetry");
|
|
17
|
+
const mcp_api_key_service_1 = require("./mcp-api-key.service");
|
|
18
|
+
const mcp_oauth_token_service_1 = require("./mcp-oauth-token.service");
|
|
19
|
+
const mcp_constants_1 = require("./mcp.constants");
|
|
20
|
+
const mcp_utils_1 = require("./mcp.utils");
|
|
21
|
+
let McpServerMiddlewareService = class McpServerMiddlewareService {
|
|
22
|
+
constructor(mcpServerApiKeyService, mcpAuthTokenService, jwtService, telemetry) {
|
|
23
|
+
this.mcpServerApiKeyService = mcpServerApiKeyService;
|
|
24
|
+
this.mcpAuthTokenService = mcpAuthTokenService;
|
|
25
|
+
this.jwtService = jwtService;
|
|
26
|
+
this.telemetry = telemetry;
|
|
27
|
+
}
|
|
28
|
+
async getUserForToken(token) {
|
|
29
|
+
let decoded;
|
|
30
|
+
try {
|
|
31
|
+
decoded = this.jwtService.decode(token);
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
if (decoded?.meta?.isOAuth === true) {
|
|
37
|
+
return await this.mcpAuthTokenService.verifyOAuthAccessToken(token);
|
|
38
|
+
}
|
|
39
|
+
return await this.mcpServerApiKeyService.verifyApiKey(token);
|
|
40
|
+
}
|
|
41
|
+
getAuthMiddleware() {
|
|
42
|
+
return async (req, res, next) => {
|
|
43
|
+
const authorizationHeader = req.header('authorization');
|
|
44
|
+
if (!authorizationHeader) {
|
|
45
|
+
this.responseWithUnauthorized(res, req);
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const token = this.extractBearerToken(authorizationHeader);
|
|
49
|
+
if (!token) {
|
|
50
|
+
this.responseWithUnauthorized(res, req);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
const user = await this.getUserForToken(token);
|
|
54
|
+
if (!user) {
|
|
55
|
+
this.responseWithUnauthorized(res, req);
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
req.user = user;
|
|
59
|
+
next();
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
extractBearerToken(headerValue) {
|
|
63
|
+
if (!headerValue.startsWith('Bearer')) {
|
|
64
|
+
throw new auth_error_1.AuthError('Invalid authorization header format');
|
|
65
|
+
}
|
|
66
|
+
const tokenMatch = headerValue.match(/^Bearer\s+(.+)$/i);
|
|
67
|
+
if (tokenMatch) {
|
|
68
|
+
return tokenMatch[1];
|
|
69
|
+
}
|
|
70
|
+
throw new auth_error_1.AuthError('Invalid authorization header format');
|
|
71
|
+
}
|
|
72
|
+
responseWithUnauthorized(res, req) {
|
|
73
|
+
this.trackUnauthorizedEvent(req);
|
|
74
|
+
res.header('WWW-Authenticate', 'Bearer realm="n8n MCP Server"');
|
|
75
|
+
res.status(401).send({ message: mcp_constants_1.UNAUTHORIZED_ERROR_MESSAGE });
|
|
76
|
+
}
|
|
77
|
+
trackUnauthorizedEvent(req) {
|
|
78
|
+
const clientInfo = (0, mcp_utils_1.getClientInfo)(req);
|
|
79
|
+
this.telemetry.track(mcp_constants_1.USER_CONNECTED_TO_MCP_EVENT, {
|
|
80
|
+
mcp_connection_status: 'error',
|
|
81
|
+
error: mcp_constants_1.UNAUTHORIZED_ERROR_MESSAGE,
|
|
82
|
+
client_name: clientInfo?.name,
|
|
83
|
+
client_version: clientInfo?.version,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
exports.McpServerMiddlewareService = McpServerMiddlewareService;
|
|
88
|
+
exports.McpServerMiddlewareService = McpServerMiddlewareService = __decorate([
|
|
89
|
+
(0, di_1.Service)(),
|
|
90
|
+
__metadata("design:paramtypes", [mcp_api_key_service_1.McpServerApiKeyService,
|
|
91
|
+
mcp_oauth_token_service_1.McpOAuthTokenService,
|
|
92
|
+
jwt_service_1.JwtService,
|
|
93
|
+
telemetry_1.Telemetry])
|
|
94
|
+
], McpServerMiddlewareService);
|
|
95
|
+
//# sourceMappingURL=mcp-server-middleware.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-server-middleware.service.js","sourceRoot":"","sources":["../../../src/modules/mcp/mcp-server-middleware.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Logger } from '@n8n/backend-common';
|
|
2
|
+
import type { AuthenticatedRequest } from '@n8n/db';
|
|
3
|
+
import type { Response } from 'express';
|
|
4
|
+
import { ApproveConsentRequestDto } from './dto/approve-consent-request.dto';
|
|
5
|
+
import { McpOAuthConsentService } from './mcp-oauth-consent.service';
|
|
6
|
+
import { OAuthSessionService } from './oauth-session.service';
|
|
7
|
+
export declare class McpConsentController {
|
|
8
|
+
private readonly logger;
|
|
9
|
+
private readonly consentService;
|
|
10
|
+
private readonly oauthSessionService;
|
|
11
|
+
constructor(logger: Logger, consentService: McpOAuthConsentService, oauthSessionService: OAuthSessionService);
|
|
12
|
+
getConsentDetails(req: AuthenticatedRequest, res: Response): Promise<void>;
|
|
13
|
+
approveConsent(req: AuthenticatedRequest, res: Response, payload: ApproveConsentRequestDto): Promise<void>;
|
|
14
|
+
private sendErrorResponse;
|
|
15
|
+
private sendInvalidSessionError;
|
|
16
|
+
private getAndValidateSessionToken;
|
|
17
|
+
}
|
|
@@ -0,0 +1,120 @@
|
|
|
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.McpConsentController = void 0;
|
|
16
|
+
const backend_common_1 = require("@n8n/backend-common");
|
|
17
|
+
const decorators_1 = require("@n8n/decorators");
|
|
18
|
+
const approve_consent_request_dto_1 = require("./dto/approve-consent-request.dto");
|
|
19
|
+
const mcp_oauth_consent_service_1 = require("./mcp-oauth-consent.service");
|
|
20
|
+
const oauth_session_service_1 = require("./oauth-session.service");
|
|
21
|
+
let McpConsentController = class McpConsentController {
|
|
22
|
+
constructor(logger, consentService, oauthSessionService) {
|
|
23
|
+
this.logger = logger;
|
|
24
|
+
this.consentService = consentService;
|
|
25
|
+
this.oauthSessionService = oauthSessionService;
|
|
26
|
+
}
|
|
27
|
+
async getConsentDetails(req, res) {
|
|
28
|
+
try {
|
|
29
|
+
const sessionToken = this.getAndValidateSessionToken(req, res);
|
|
30
|
+
if (!sessionToken)
|
|
31
|
+
return;
|
|
32
|
+
const consentDetails = await this.consentService.getConsentDetails(sessionToken);
|
|
33
|
+
if (!consentDetails) {
|
|
34
|
+
this.sendInvalidSessionError(res, true);
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
res.json({
|
|
38
|
+
data: {
|
|
39
|
+
clientName: consentDetails.clientName,
|
|
40
|
+
clientId: consentDetails.clientId,
|
|
41
|
+
},
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
catch (error) {
|
|
45
|
+
this.logger.error('Failed to get consent details', { error });
|
|
46
|
+
this.oauthSessionService.clearSession(res);
|
|
47
|
+
this.sendErrorResponse(res, 500, 'Failed to load authorization details');
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
async approveConsent(req, res, payload) {
|
|
51
|
+
try {
|
|
52
|
+
const sessionToken = this.getAndValidateSessionToken(req, res);
|
|
53
|
+
if (!sessionToken)
|
|
54
|
+
return;
|
|
55
|
+
const result = await this.consentService.handleConsentDecision(sessionToken, req.user.id, payload.approved);
|
|
56
|
+
this.oauthSessionService.clearSession(res);
|
|
57
|
+
res.json({
|
|
58
|
+
data: {
|
|
59
|
+
status: 'success',
|
|
60
|
+
redirectUrl: result.redirectUrl,
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
catch (error) {
|
|
65
|
+
this.logger.error('Failed to process consent', { error });
|
|
66
|
+
this.oauthSessionService.clearSession(res);
|
|
67
|
+
const message = error instanceof Error ? error.message : 'Failed to process authorization';
|
|
68
|
+
this.sendErrorResponse(res, 500, message);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
sendErrorResponse(res, statusCode, message) {
|
|
72
|
+
res.status(statusCode).json({
|
|
73
|
+
status: 'error',
|
|
74
|
+
message,
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
sendInvalidSessionError(res, clearCookie = false) {
|
|
78
|
+
if (clearCookie) {
|
|
79
|
+
this.oauthSessionService.clearSession(res);
|
|
80
|
+
}
|
|
81
|
+
this.sendErrorResponse(res, 400, 'Invalid or expired authorization session');
|
|
82
|
+
}
|
|
83
|
+
getAndValidateSessionToken(req, res) {
|
|
84
|
+
const sessionToken = this.oauthSessionService.getSessionToken(req.cookies);
|
|
85
|
+
if (!sessionToken) {
|
|
86
|
+
this.sendInvalidSessionError(res);
|
|
87
|
+
return null;
|
|
88
|
+
}
|
|
89
|
+
try {
|
|
90
|
+
this.oauthSessionService.verifySession(sessionToken);
|
|
91
|
+
return sessionToken;
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
this.logger.debug('Invalid session token', { error });
|
|
95
|
+
this.sendInvalidSessionError(res, true);
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
exports.McpConsentController = McpConsentController;
|
|
101
|
+
__decorate([
|
|
102
|
+
(0, decorators_1.Get)('/details', { usesTemplates: true }),
|
|
103
|
+
__metadata("design:type", Function),
|
|
104
|
+
__metadata("design:paramtypes", [Object, Object]),
|
|
105
|
+
__metadata("design:returntype", Promise)
|
|
106
|
+
], McpConsentController.prototype, "getConsentDetails", null);
|
|
107
|
+
__decorate([
|
|
108
|
+
(0, decorators_1.Post)('/approve', { usesTemplates: true }),
|
|
109
|
+
__param(2, decorators_1.Body),
|
|
110
|
+
__metadata("design:type", Function),
|
|
111
|
+
__metadata("design:paramtypes", [Object, Object, approve_consent_request_dto_1.ApproveConsentRequestDto]),
|
|
112
|
+
__metadata("design:returntype", Promise)
|
|
113
|
+
], McpConsentController.prototype, "approveConsent", null);
|
|
114
|
+
exports.McpConsentController = McpConsentController = __decorate([
|
|
115
|
+
(0, decorators_1.RestController)('/consent'),
|
|
116
|
+
__metadata("design:paramtypes", [backend_common_1.Logger,
|
|
117
|
+
mcp_oauth_consent_service_1.McpOAuthConsentService,
|
|
118
|
+
oauth_session_service_1.OAuthSessionService])
|
|
119
|
+
], McpConsentController);
|
|
120
|
+
//# sourceMappingURL=mcp.auth.consent.controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.auth.consent.controller.js","sourceRoot":"","sources":["../../../src/modules/mcp/mcp.auth.consent.controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { AuthenticatedRequest } from '@n8n/db';
|
|
2
|
-
import type { Response } from 'express';
|
|
2
|
+
import type { Request, Response } from 'express';
|
|
3
3
|
import { ErrorReporter } from 'n8n-core';
|
|
4
|
+
import { Telemetry } from '../../telemetry';
|
|
4
5
|
import { McpService } from './mcp.service';
|
|
5
6
|
import { McpSettingsService } from './mcp.settings.service';
|
|
6
|
-
import { Telemetry } from '../../telemetry';
|
|
7
7
|
export type FlushableResponse = Response & {
|
|
8
8
|
flush: () => void;
|
|
9
9
|
};
|
|
@@ -13,6 +13,8 @@ export declare class McpController {
|
|
|
13
13
|
private readonly mcpSettingsService;
|
|
14
14
|
private readonly telemetry;
|
|
15
15
|
constructor(errorReporter: ErrorReporter, mcpService: McpService, mcpSettingsService: McpSettingsService, telemetry: Telemetry);
|
|
16
|
+
private setCorsHeaders;
|
|
17
|
+
discoverAuthSchemeHead(_req: Request, res: Response): Promise<void>;
|
|
16
18
|
build(req: AuthenticatedRequest, res: FlushableResponse): Promise<void>;
|
|
17
19
|
private trackConnectionEvent;
|
|
18
20
|
}
|
|
@@ -14,14 +14,14 @@ const streamableHttp_js_1 = require("@modelcontextprotocol/sdk/server/streamable
|
|
|
14
14
|
const decorators_1 = require("@n8n/decorators");
|
|
15
15
|
const di_1 = require("@n8n/di");
|
|
16
16
|
const n8n_core_1 = require("n8n-core");
|
|
17
|
-
const
|
|
17
|
+
const telemetry_1 = require("../../telemetry");
|
|
18
|
+
const mcp_server_middleware_service_1 = require("./mcp-server-middleware.service");
|
|
18
19
|
const mcp_constants_1 = require("./mcp.constants");
|
|
19
20
|
const mcp_service_1 = require("./mcp.service");
|
|
20
21
|
const mcp_settings_service_1 = require("./mcp.settings.service");
|
|
21
22
|
const mcp_typeguards_1 = require("./mcp.typeguards");
|
|
22
23
|
const mcp_utils_1 = require("./mcp.utils");
|
|
23
|
-
const
|
|
24
|
-
const getAuthMiddleware = () => di_1.Container.get(mcp_api_key_service_1.McpServerApiKeyService).getAuthMiddleware();
|
|
24
|
+
const getAuthMiddleware = () => di_1.Container.get(mcp_server_middleware_service_1.McpServerMiddlewareService).getAuthMiddleware();
|
|
25
25
|
let McpController = class McpController {
|
|
26
26
|
constructor(errorReporter, mcpService, mcpSettingsService, telemetry) {
|
|
27
27
|
this.errorReporter = errorReporter;
|
|
@@ -29,7 +29,20 @@ let McpController = class McpController {
|
|
|
29
29
|
this.mcpSettingsService = mcpSettingsService;
|
|
30
30
|
this.telemetry = telemetry;
|
|
31
31
|
}
|
|
32
|
+
setCorsHeaders(res) {
|
|
33
|
+
res.header('Access-Control-Allow-Origin', '*');
|
|
34
|
+
res.header('Access-Control-Allow-Methods', 'GET, POST, OPTIONS');
|
|
35
|
+
res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization, X-Requested-With');
|
|
36
|
+
res.header('Access-Control-Allow-Credentials', 'true');
|
|
37
|
+
res.header('Access-Control-Max-Age', '86400');
|
|
38
|
+
}
|
|
39
|
+
async discoverAuthSchemeHead(_req, res) {
|
|
40
|
+
this.setCorsHeaders(res);
|
|
41
|
+
res.header('WWW-Authenticate', 'Bearer realm="n8n MCP Server"');
|
|
42
|
+
res.status(401).end();
|
|
43
|
+
}
|
|
32
44
|
async build(req, res) {
|
|
45
|
+
this.setCorsHeaders(res);
|
|
33
46
|
const body = req.body;
|
|
34
47
|
const isInitializationRequest = (0, mcp_typeguards_1.isJSONRPCRequest)(body) ? body.method === 'initialize' : false;
|
|
35
48
|
const clientInfo = (0, mcp_utils_1.getClientInfo)(req);
|
|
@@ -94,6 +107,15 @@ let McpController = class McpController {
|
|
|
94
107
|
}
|
|
95
108
|
};
|
|
96
109
|
exports.McpController = McpController;
|
|
110
|
+
__decorate([
|
|
111
|
+
(0, decorators_1.Head)('/http', {
|
|
112
|
+
skipAuth: true,
|
|
113
|
+
usesTemplates: true,
|
|
114
|
+
}),
|
|
115
|
+
__metadata("design:type", Function),
|
|
116
|
+
__metadata("design:paramtypes", [Object, Object]),
|
|
117
|
+
__metadata("design:returntype", Promise)
|
|
118
|
+
], McpController.prototype, "discoverAuthSchemeHead", null);
|
|
97
119
|
__decorate([
|
|
98
120
|
(0, decorators_1.Post)('/http', {
|
|
99
121
|
rateLimit: { limit: 100 },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp.controller.js","sourceRoot":"","sources":["../../../src/modules/mcp/mcp.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,0FAAmG;AAEnG,
|
|
1
|
+
{"version":3,"file":"mcp.controller.js","sourceRoot":"","sources":["../../../src/modules/mcp/mcp.controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -49,6 +49,9 @@ let McpModule = class McpModule {
|
|
|
49
49
|
async init() {
|
|
50
50
|
await Promise.resolve().then(() => __importStar(require('./mcp.controller')));
|
|
51
51
|
await Promise.resolve().then(() => __importStar(require('./mcp.settings.controller')));
|
|
52
|
+
await Promise.resolve().then(() => __importStar(require('./mcp.oauth.controller')));
|
|
53
|
+
await Promise.resolve().then(() => __importStar(require('./mcp.auth.consent.controller')));
|
|
54
|
+
await Promise.resolve().then(() => __importStar(require('./mcp.oauth-clients.controller')));
|
|
52
55
|
const { McpEventRelay } = await Promise.resolve().then(() => __importStar(require('./mcp.event-relay')));
|
|
53
56
|
di_1.Container.get(McpEventRelay).init();
|
|
54
57
|
}
|
|
@@ -57,6 +60,14 @@ let McpModule = class McpModule {
|
|
|
57
60
|
const mcpAccessEnabled = await di_1.Container.get(McpSettingsService).getEnabled();
|
|
58
61
|
return { mcpAccessEnabled };
|
|
59
62
|
}
|
|
63
|
+
async entities() {
|
|
64
|
+
const { OAuthClient } = await Promise.resolve().then(() => __importStar(require('./database/entities/oauth-client.entity')));
|
|
65
|
+
const { AuthorizationCode } = await Promise.resolve().then(() => __importStar(require('./database/entities/oauth-authorization-code.entity')));
|
|
66
|
+
const { AccessToken } = await Promise.resolve().then(() => __importStar(require('./database/entities/oauth-access-token.entity')));
|
|
67
|
+
const { RefreshToken } = await Promise.resolve().then(() => __importStar(require('./database/entities/oauth-refresh-token.entity')));
|
|
68
|
+
const { UserConsent } = await Promise.resolve().then(() => __importStar(require('./database/entities/oauth-user-consent.entity')));
|
|
69
|
+
return [OAuthClient, AuthorizationCode, AccessToken, RefreshToken, UserConsent];
|
|
70
|
+
}
|
|
60
71
|
async shutdown() { }
|
|
61
72
|
};
|
|
62
73
|
exports.McpModule = McpModule;
|
|
@@ -1 +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;
|
|
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;QAC1C,wDAAa,wBAAwB,GAAC,CAAC;QACvC,wDAAa,+BAA+B,GAAC,CAAC;QAC9C,wDAAa,gCAAgC,GAAC,CAAC;QAG/C,MAAM,EAAE,aAAa,EAAE,GAAG,wDAAa,mBAAmB,GAAC,CAAC;QAC5D,cAAS,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,EAAE,CAAC;IACrC,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;IAED,KAAK,CAAC,QAAQ;QACb,MAAM,EAAE,WAAW,EAAE,GAAG,wDAAa,yCAAyC,GAAC,CAAC;QAChF,MAAM,EAAE,iBAAiB,EAAE,GAAG,wDAC7B,qDAAqD,GACrD,CAAC;QACF,MAAM,EAAE,WAAW,EAAE,GAAG,wDAAa,+CAA+C,GAAC,CAAC;QACtF,MAAM,EAAE,YAAY,EAAE,GAAG,wDAAa,gDAAgD,GAAC,CAAC;QACxF,MAAM,EAAE,WAAW,EAAE,GAAG,wDAAa,+CAA+C,GAAC,CAAC;QAEtF,OAAO,CAAC,WAAW,EAAE,iBAAiB,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,CAAU,CAAC;IAC1F,CAAC;IAGK,AAAN,KAAK,CAAC,QAAQ,KAAI,CAAC;CACnB,CAAA;AAtCY,8BAAS;AAqCf;IADL,IAAA,uBAAU,GAAE;;;;yCACM;oBArCP,SAAS;IADrB,IAAA,0BAAa,EAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;GAClB,SAAS,CAsCrB"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { DeleteOAuthClientResponseDto, ListOAuthClientsResponseDto } from '@n8n/api-types';
|
|
2
|
+
import { Logger } from '@n8n/backend-common';
|
|
3
|
+
import { AuthenticatedRequest } from '@n8n/db';
|
|
4
|
+
import type { Response } from 'express';
|
|
5
|
+
import { McpOAuthService } from './mcp-oauth-service';
|
|
6
|
+
export declare class McpOAuthClientsController {
|
|
7
|
+
private readonly mcpOAuthService;
|
|
8
|
+
private readonly logger;
|
|
9
|
+
constructor(mcpOAuthService: McpOAuthService, logger: Logger);
|
|
10
|
+
getAllClients(req: AuthenticatedRequest, _res: Response): Promise<ListOAuthClientsResponseDto>;
|
|
11
|
+
deleteClient(req: AuthenticatedRequest, _res: Response, clientId: string): Promise<DeleteOAuthClientResponseDto>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
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.McpOAuthClientsController = void 0;
|
|
16
|
+
const backend_common_1 = require("@n8n/backend-common");
|
|
17
|
+
const decorators_1 = require("@n8n/decorators");
|
|
18
|
+
const not_found_error_1 = require("../../errors/response-errors/not-found.error");
|
|
19
|
+
const mcp_oauth_service_1 = require("./mcp-oauth-service");
|
|
20
|
+
let McpOAuthClientsController = class McpOAuthClientsController {
|
|
21
|
+
constructor(mcpOAuthService, logger) {
|
|
22
|
+
this.mcpOAuthService = mcpOAuthService;
|
|
23
|
+
this.logger = logger;
|
|
24
|
+
}
|
|
25
|
+
async getAllClients(req, _res) {
|
|
26
|
+
this.logger.debug('Fetching all OAuth clients for user', { userId: req.user.id });
|
|
27
|
+
const clients = await this.mcpOAuthService.getAllClients(req.user.id);
|
|
28
|
+
this.logger.debug(`Found ${clients.length} OAuth clients`);
|
|
29
|
+
const clientDtos = clients.map((client) => ({
|
|
30
|
+
id: client.id,
|
|
31
|
+
name: client.name,
|
|
32
|
+
redirectUris: client.redirectUris,
|
|
33
|
+
grantTypes: client.grantTypes,
|
|
34
|
+
tokenEndpointAuthMethod: client.tokenEndpointAuthMethod,
|
|
35
|
+
createdAt: client.createdAt.toISOString(),
|
|
36
|
+
updatedAt: client.updatedAt.toISOString(),
|
|
37
|
+
}));
|
|
38
|
+
return {
|
|
39
|
+
data: clientDtos,
|
|
40
|
+
count: clients.length,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
async deleteClient(req, _res, clientId) {
|
|
44
|
+
this.logger.info('Deleting OAuth client', {
|
|
45
|
+
clientId,
|
|
46
|
+
userId: req.user.id,
|
|
47
|
+
userEmail: req.user.email,
|
|
48
|
+
});
|
|
49
|
+
try {
|
|
50
|
+
await this.mcpOAuthService.deleteClient(clientId);
|
|
51
|
+
this.logger.info('OAuth client deleted successfully', {
|
|
52
|
+
clientId,
|
|
53
|
+
userId: req.user.id,
|
|
54
|
+
});
|
|
55
|
+
return {
|
|
56
|
+
success: true,
|
|
57
|
+
message: `OAuth client ${clientId} has been deleted successfully`,
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
if (error instanceof Error && error.message.includes('not found')) {
|
|
62
|
+
this.logger.warn('Attempted to delete non-existent OAuth client', {
|
|
63
|
+
clientId,
|
|
64
|
+
userId: req.user.id,
|
|
65
|
+
});
|
|
66
|
+
throw new not_found_error_1.NotFoundError(`OAuth client with ID ${clientId} not found`);
|
|
67
|
+
}
|
|
68
|
+
throw error;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
exports.McpOAuthClientsController = McpOAuthClientsController;
|
|
73
|
+
__decorate([
|
|
74
|
+
(0, decorators_1.GlobalScope)('mcp:oauth'),
|
|
75
|
+
(0, decorators_1.Get)('/'),
|
|
76
|
+
__metadata("design:type", Function),
|
|
77
|
+
__metadata("design:paramtypes", [Object, Object]),
|
|
78
|
+
__metadata("design:returntype", Promise)
|
|
79
|
+
], McpOAuthClientsController.prototype, "getAllClients", null);
|
|
80
|
+
__decorate([
|
|
81
|
+
(0, decorators_1.GlobalScope)('mcp:oauth'),
|
|
82
|
+
(0, decorators_1.Delete)('/:clientId'),
|
|
83
|
+
__param(2, (0, decorators_1.Param)('clientId')),
|
|
84
|
+
__metadata("design:type", Function),
|
|
85
|
+
__metadata("design:paramtypes", [Object, Object, String]),
|
|
86
|
+
__metadata("design:returntype", Promise)
|
|
87
|
+
], McpOAuthClientsController.prototype, "deleteClient", null);
|
|
88
|
+
exports.McpOAuthClientsController = McpOAuthClientsController = __decorate([
|
|
89
|
+
(0, decorators_1.RestController)('/mcp/oauth-clients'),
|
|
90
|
+
__metadata("design:paramtypes", [mcp_oauth_service_1.McpOAuthService,
|
|
91
|
+
backend_common_1.Logger])
|
|
92
|
+
], McpOAuthClientsController);
|
|
93
|
+
//# sourceMappingURL=mcp.oauth-clients.controller.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.oauth-clients.controller.js","sourceRoot":"","sources":["../../../src/modules/mcp/mcp.oauth-clients.controller.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { StaticRouterMetadata } from '@n8n/decorators';
|
|
2
|
+
import type { Response, Request } from 'express';
|
|
3
|
+
import { UrlService } from '../../services/url.service';
|
|
4
|
+
export declare class McpOAuthController {
|
|
5
|
+
private readonly urlService;
|
|
6
|
+
constructor(urlService: UrlService);
|
|
7
|
+
private setCorsHeaders;
|
|
8
|
+
static routers: StaticRouterMetadata[];
|
|
9
|
+
metadataOptions(_req: Request, res: Response): void;
|
|
10
|
+
metadata(_req: Request, res: Response): void;
|
|
11
|
+
protectedResourceMetadataOptions(_req: Request, res: Response): void;
|
|
12
|
+
protectedResourceMetadata(_req: Request, res: Response): void;
|
|
13
|
+
}
|