easy-mcp-nest 0.2.1 → 0.4.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 (155) hide show
  1. package/README.md +342 -8
  2. package/dist/EasyMCP.js +0 -3
  3. package/dist/EasyMCP.js.map +1 -1
  4. package/dist/adapters/express/express-adapter.d.ts +3 -0
  5. package/dist/adapters/express/express-adapter.js +135 -0
  6. package/dist/adapters/express/express-adapter.js.map +1 -0
  7. package/dist/adapters/express/http-gateway.service.d.ts +13 -0
  8. package/dist/adapters/express/http-gateway.service.js +102 -0
  9. package/dist/adapters/express/http-gateway.service.js.map +1 -0
  10. package/dist/adapters/express/index.d.ts +3 -0
  11. package/dist/adapters/express/index.js +8 -0
  12. package/dist/adapters/express/index.js.map +1 -0
  13. package/dist/adapters/express/types.d.ts +15 -0
  14. package/dist/adapters/express/types.js +3 -0
  15. package/dist/adapters/express/types.js.map +1 -0
  16. package/dist/app.module.js +2 -0
  17. package/dist/app.module.js.map +1 -1
  18. package/dist/auth/oauth/index.d.ts +3 -0
  19. package/dist/auth/oauth/index.js +8 -0
  20. package/dist/auth/oauth/index.js.map +1 -0
  21. package/dist/auth/oauth/oauth-config.interface.d.ts +12 -0
  22. package/dist/auth/oauth/oauth-config.interface.js +3 -0
  23. package/dist/auth/oauth/oauth-config.interface.js.map +1 -0
  24. package/dist/auth/oauth/oauth-middleware.d.ts +3 -0
  25. package/dist/auth/oauth/oauth-middleware.js +54 -0
  26. package/dist/auth/oauth/oauth-middleware.js.map +1 -0
  27. package/dist/auth/oauth/oauth-provider.service.d.ts +8 -0
  28. package/dist/auth/oauth/oauth-provider.service.js +63 -0
  29. package/dist/auth/oauth/oauth-provider.service.js.map +1 -0
  30. package/dist/config/mcp-config.interface.d.ts +1 -1
  31. package/dist/core/batch/batch-executor.service.d.ts +21 -0
  32. package/dist/core/batch/batch-executor.service.js +101 -0
  33. package/dist/core/batch/batch-executor.service.js.map +1 -0
  34. package/dist/core/context/context-provider.service.d.ts +8 -0
  35. package/dist/core/context/context-provider.service.js +55 -0
  36. package/dist/core/context/context-provider.service.js.map +1 -0
  37. package/dist/core/context/mcp-context.interface.d.ts +12 -0
  38. package/dist/core/context/mcp-context.interface.js +3 -0
  39. package/dist/core/context/mcp-context.interface.js.map +1 -0
  40. package/dist/core/documentation/openapi-generator.service.d.ts +13 -0
  41. package/dist/core/documentation/openapi-generator.service.js +116 -0
  42. package/dist/core/documentation/openapi-generator.service.js.map +1 -0
  43. package/dist/core/errors/error-handler.interface.d.ts +11 -0
  44. package/dist/core/errors/error-handler.interface.js +3 -0
  45. package/dist/core/errors/error-handler.interface.js.map +1 -0
  46. package/dist/core/health/health-check.service.d.ts +33 -0
  47. package/dist/core/health/health-check.service.js +71 -0
  48. package/dist/core/health/health-check.service.js.map +1 -0
  49. package/dist/core/mcp-server/mcp-server.service.d.ts +16 -1
  50. package/dist/core/mcp-server/mcp-server.service.js +201 -3
  51. package/dist/core/mcp-server/mcp-server.service.js.map +1 -1
  52. package/dist/core/middleware/middleware-executor.service.d.ts +8 -0
  53. package/dist/core/middleware/middleware-executor.service.js +46 -0
  54. package/dist/core/middleware/middleware-executor.service.js.map +1 -0
  55. package/dist/core/middleware/middleware.interface.d.ts +6 -0
  56. package/dist/core/middleware/middleware.interface.js +3 -0
  57. package/dist/core/middleware/middleware.interface.js.map +1 -0
  58. package/dist/core/observability/metrics.service.d.ts +29 -0
  59. package/dist/core/observability/metrics.service.js +124 -0
  60. package/dist/core/observability/metrics.service.js.map +1 -0
  61. package/dist/core/observability/tracing.service.d.ts +12 -0
  62. package/dist/core/observability/tracing.service.js +88 -0
  63. package/dist/core/observability/tracing.service.js.map +1 -0
  64. package/dist/core/progress/progress-notifier.service.d.ts +16 -0
  65. package/dist/core/progress/progress-notifier.service.js +96 -0
  66. package/dist/core/progress/progress-notifier.service.js.map +1 -0
  67. package/dist/core/rate-limiting/rate-limit.interface.d.ts +11 -0
  68. package/dist/core/rate-limiting/rate-limit.interface.js +3 -0
  69. package/dist/core/rate-limiting/rate-limit.interface.js.map +1 -0
  70. package/dist/core/rate-limiting/rate-limiter.service.d.ts +13 -0
  71. package/dist/core/rate-limiting/rate-limiter.service.js +147 -0
  72. package/dist/core/rate-limiting/rate-limiter.service.js.map +1 -0
  73. package/dist/core/resilience/circuit-breaker.interface.d.ts +15 -0
  74. package/dist/core/resilience/circuit-breaker.interface.js +3 -0
  75. package/dist/core/resilience/circuit-breaker.interface.js.map +1 -0
  76. package/dist/core/resilience/circuit-breaker.service.d.ts +11 -0
  77. package/dist/core/resilience/circuit-breaker.service.js +117 -0
  78. package/dist/core/resilience/circuit-breaker.service.js.map +1 -0
  79. package/dist/core/resilience/retry.service.d.ts +6 -0
  80. package/dist/core/resilience/retry.service.js +66 -0
  81. package/dist/core/resilience/retry.service.js.map +1 -0
  82. package/dist/core/utils/decorator-scanner.d.ts +4 -0
  83. package/dist/core/utils/decorator-scanner.js +112 -0
  84. package/dist/core/utils/decorator-scanner.js.map +1 -0
  85. package/dist/core/utils/sanitize.util.d.ts +2 -0
  86. package/dist/core/utils/sanitize.util.js +48 -0
  87. package/dist/core/utils/sanitize.util.js.map +1 -1
  88. package/dist/decorators/factory-provider.d.ts +2 -0
  89. package/dist/decorators/factory-provider.js +20 -0
  90. package/dist/decorators/factory-provider.js.map +1 -0
  91. package/dist/decorators/index.d.ts +7 -0
  92. package/dist/decorators/index.js +28 -0
  93. package/dist/decorators/index.js.map +1 -0
  94. package/dist/decorators/mcp-context.decorator.d.ts +3 -0
  95. package/dist/decorators/mcp-context.decorator.js +20 -0
  96. package/dist/decorators/mcp-context.decorator.js.map +1 -0
  97. package/dist/decorators/mcp-error-handler.decorator.d.ts +4 -0
  98. package/dist/decorators/mcp-error-handler.decorator.js +15 -0
  99. package/dist/decorators/mcp-error-handler.decorator.js.map +1 -0
  100. package/dist/decorators/mcp-middleware.decorator.d.ts +4 -0
  101. package/dist/decorators/mcp-middleware.decorator.js +17 -0
  102. package/dist/decorators/mcp-middleware.decorator.js.map +1 -0
  103. package/dist/decorators/mcp-param.decorator.d.ts +10 -0
  104. package/dist/decorators/mcp-param.decorator.js +41 -0
  105. package/dist/decorators/mcp-param.decorator.js.map +1 -0
  106. package/dist/decorators/mcp-service.decorator.d.ts +6 -0
  107. package/dist/decorators/mcp-service.decorator.js +27 -0
  108. package/dist/decorators/mcp-service.decorator.js.map +1 -0
  109. package/dist/decorators/mcp-tool.decorator.d.ts +28 -0
  110. package/dist/decorators/mcp-tool.decorator.js +36 -0
  111. package/dist/decorators/mcp-tool.decorator.js.map +1 -0
  112. package/dist/index.d.ts +12 -1
  113. package/dist/index.js +30 -1
  114. package/dist/index.js.map +1 -1
  115. package/dist/interface/interface.interface.d.ts +2 -0
  116. package/dist/interface/jsonrpc.interface.d.ts +8 -0
  117. package/dist/interface/jsonrpc.interface.js.map +1 -1
  118. package/dist/interface/mcp-protocol.interface.d.ts +14 -0
  119. package/dist/interface/mcp-protocol.interface.js.map +1 -1
  120. package/dist/standalone/core-services.d.ts +29 -0
  121. package/dist/standalone/core-services.js +94 -0
  122. package/dist/standalone/core-services.js.map +1 -0
  123. package/dist/standalone/index.d.ts +3 -0
  124. package/dist/standalone/index.js +11 -0
  125. package/dist/standalone/index.js.map +1 -0
  126. package/dist/standalone/standalone-server.d.ts +23 -0
  127. package/dist/standalone/standalone-server.js +366 -0
  128. package/dist/standalone/standalone-server.js.map +1 -0
  129. package/dist/standalone/types.d.ts +14 -0
  130. package/dist/standalone/types.js +3 -0
  131. package/dist/standalone/types.js.map +1 -0
  132. package/dist/testing/index.d.ts +3 -0
  133. package/dist/testing/index.js +14 -0
  134. package/dist/testing/index.js.map +1 -0
  135. package/dist/testing/mock-context.d.ts +2 -0
  136. package/dist/testing/mock-context.js +17 -0
  137. package/dist/testing/mock-context.js.map +1 -0
  138. package/dist/testing/test-app.factory.d.ts +15 -0
  139. package/dist/testing/test-app.factory.js +37 -0
  140. package/dist/testing/test-app.factory.js.map +1 -0
  141. package/dist/testing/test-helpers.d.ts +10 -0
  142. package/dist/testing/test-helpers.js +46 -0
  143. package/dist/testing/test-helpers.js.map +1 -0
  144. package/dist/tooling/tool-registry/tool-registry.service.d.ts +7 -1
  145. package/dist/tooling/tool-registry/tool-registry.service.js +40 -3
  146. package/dist/tooling/tool-registry/tool-registry.service.js.map +1 -1
  147. package/dist/tooling/tool.interface.d.ts +9 -2
  148. package/dist/tsconfig.build.tsbuildinfo +1 -1
  149. package/dist/validation/index.d.ts +1 -0
  150. package/dist/validation/index.js +8 -0
  151. package/dist/validation/index.js.map +1 -0
  152. package/dist/validation/zod-integration.d.ts +11 -0
  153. package/dist/validation/zod-integration.js +148 -0
  154. package/dist/validation/zod-integration.js.map +1 -0
  155. package/package.json +4 -2
@@ -0,0 +1,102 @@
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.HttpGatewayService = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const jsonrpc_interface_1 = require("../../interface/jsonrpc.interface");
15
+ const logger_util_1 = require("../../core/utils/logger.util");
16
+ const sanitize_util_1 = require("../../core/utils/sanitize.util");
17
+ const constants_1 = require("../../config/constants");
18
+ let HttpGatewayService = class HttpGatewayService {
19
+ mcpServerService;
20
+ requestContextMap = new Map();
21
+ constructor() {
22
+ logger_util_1.logger.info("HttpGatewayService", "HttpGatewayService initialized", {
23
+ component: "Layer 1: HTTP Interface",
24
+ });
25
+ }
26
+ setMcpServerService(service) {
27
+ this.mcpServerService = service;
28
+ }
29
+ async start() {
30
+ logger_util_1.logger.info("HttpGatewayService", "HTTP gateway ready (handled by Express)", {
31
+ component: "Layer 1: HTTP Interface",
32
+ });
33
+ }
34
+ async sendMessage(sessionId, output) {
35
+ logger_util_1.logger.debug("HttpGatewayService", "sendMessage called", {
36
+ component: "Layer 1: HTTP Interface",
37
+ sessionId,
38
+ });
39
+ }
40
+ async handleHttpRequest(req, res, context) {
41
+ const requestId = req.headers["x-request-id"] || String(Date.now());
42
+ if (context) {
43
+ this.requestContextMap.set(String(requestId), context);
44
+ }
45
+ try {
46
+ const contentLength = req.get("content-length");
47
+ if (contentLength && parseInt(contentLength, 10) > constants_1.MAX_MESSAGE_SIZE_BYTES) {
48
+ const errorResponse = (0, jsonrpc_interface_1.createJsonRpcError)(null, jsonrpc_interface_1.JsonRpcErrorCode.InvalidRequest, "Request body too large");
49
+ res.status(413).json(errorResponse);
50
+ return;
51
+ }
52
+ const body = req.body;
53
+ if (!body || typeof body !== "object") {
54
+ const errorResponse = (0, jsonrpc_interface_1.createJsonRpcError)(null, jsonrpc_interface_1.JsonRpcErrorCode.InvalidRequest, "Request body must be a valid JSON-RPC request");
55
+ res.status(400).json(errorResponse);
56
+ return;
57
+ }
58
+ if (!(0, jsonrpc_interface_1.isValidJsonRpcRequest)(body)) {
59
+ const errorResponse = (0, jsonrpc_interface_1.createJsonRpcError)(body.id || null, jsonrpc_interface_1.JsonRpcErrorCode.InvalidRequest, "Invalid JSON-RPC request structure");
60
+ res.status(400).json(errorResponse);
61
+ return;
62
+ }
63
+ const request = {
64
+ ...body,
65
+ metadata: context ? {
66
+ userId: context.userId,
67
+ scopes: context.scopes,
68
+ buildingIds: context.buildingIds,
69
+ sessionId: context.sessionId || String(requestId),
70
+ metadata: {
71
+ ip: req.ip || req.socket.remoteAddress,
72
+ userAgent: req.get("user-agent"),
73
+ },
74
+ } : undefined,
75
+ };
76
+ if (!this.mcpServerService) {
77
+ const errorResponse = (0, jsonrpc_interface_1.createJsonRpcError)(request.id, jsonrpc_interface_1.JsonRpcErrorCode.InternalError, "McpServerService not initialized");
78
+ res.status(500).json(errorResponse);
79
+ return;
80
+ }
81
+ const response = await this.mcpServerService.handleRequest(request);
82
+ res.status(200).json(response);
83
+ }
84
+ catch (error) {
85
+ logger_util_1.logger.error("HttpGatewayService", "Error handling HTTP request", {
86
+ component: "Layer 1: HTTP Interface",
87
+ error: (0, sanitize_util_1.sanitizeErrorMessage)(error),
88
+ });
89
+ const errorResponse = (0, jsonrpc_interface_1.createJsonRpcError)(req.body?.id || null, jsonrpc_interface_1.JsonRpcErrorCode.InternalError, "Internal error during request handling");
90
+ res.status(500).json(errorResponse);
91
+ }
92
+ finally {
93
+ this.requestContextMap.delete(String(requestId));
94
+ }
95
+ }
96
+ };
97
+ exports.HttpGatewayService = HttpGatewayService;
98
+ exports.HttpGatewayService = HttpGatewayService = __decorate([
99
+ (0, common_1.Injectable)(),
100
+ __metadata("design:paramtypes", [])
101
+ ], HttpGatewayService);
102
+ //# sourceMappingURL=http-gateway.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-gateway.service.js","sourceRoot":"","sources":["../../../src/adapters/express/http-gateway.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { createMcpExpressRouter } from "./express-adapter";
2
+ export type { CreateMcpExpressRouterOptions, McpAuthMiddleware } from "./types";
3
+ export { HttpGatewayService } from "./http-gateway.service";
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.HttpGatewayService = exports.createMcpExpressRouter = void 0;
4
+ var express_adapter_1 = require("./express-adapter");
5
+ Object.defineProperty(exports, "createMcpExpressRouter", { enumerable: true, get: function () { return express_adapter_1.createMcpExpressRouter; } });
6
+ var http_gateway_service_1 = require("./http-gateway.service");
7
+ Object.defineProperty(exports, "HttpGatewayService", { enumerable: true, get: function () { return http_gateway_service_1.HttpGatewayService; } });
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/adapters/express/index.ts"],"names":[],"mappings":";;;AAAA,qDAA2D;AAAlD,yHAAA,sBAAsB,OAAA;AAE/B,+DAA4D;AAAnD,0HAAA,kBAAkB,OAAA"}
@@ -0,0 +1,15 @@
1
+ import { Request, Response, NextFunction } from "express";
2
+ import { OAuthProviderConfig } from "../../auth/oauth/oauth-config.interface";
3
+ export type McpAuthMiddleware = (req: Request, res: Response, next: NextFunction) => void | Promise<void>;
4
+ export interface CreateMcpExpressRouterOptions {
5
+ tools?: any[];
6
+ resources?: any[];
7
+ prompts?: any[];
8
+ auth?: McpAuthMiddleware;
9
+ oauth?: OAuthProviderConfig;
10
+ serverInfo?: {
11
+ name: string;
12
+ version: string;
13
+ };
14
+ pathPrefix?: string;
15
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/adapters/express/types.ts"],"names":[],"mappings":""}
@@ -15,6 +15,7 @@ const constants_1 = require("./config/constants");
15
15
  const interface_module_1 = require("./interface/interface.module");
16
16
  const resource_module_1 = require("./resources/resource.module");
17
17
  const prompt_module_1 = require("./prompts/prompt.module");
18
+ const context_provider_service_1 = require("./core/context/context-provider.service");
18
19
  let AppModule = class AppModule {
19
20
  };
20
21
  exports.AppModule = AppModule;
@@ -25,6 +26,7 @@ exports.AppModule = AppModule = __decorate([
25
26
  mcp_server_service_1.McpServerService,
26
27
  tool_registry_service_1.ToolRegistryService,
27
28
  config_holder_service_1.ConfigHolderService,
29
+ context_provider_service_1.ContextProviderService,
28
30
  {
29
31
  provide: constants_1.CONFIG_TOKEN,
30
32
  useExisting: config_holder_service_1.ConfigHolderService,
@@ -1 +1 @@
1
- {"version":3,"file":"app.module.js","sourceRoot":"","sources":["../src/app.module.ts"],"names":[],"mappings":";;;;;;;;;AAEA,2CAAwC;AACxC,6EAAwE;AACxE,yFAAoF;AACpF,0EAAqE;AACrE,kDAAkD;AAClD,mEAA+D;AAC/D,iEAA6D;AAC7D,2DAAuD;AAsBhD,IAAM,SAAS,GAAf,MAAM,SAAS;CAAG,CAAA;AAAZ,8BAAS;oBAAT,SAAS;IAhBrB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,kCAAe,EAAE,gCAAc,EAAE,4BAAY,CAAC;QACxD,SAAS,EAAE;YAET,qCAAgB;YAEhB,2CAAmB;YACnB,2CAAmB;YAEnB;gBACE,OAAO,EAAE,wBAAY;gBACrB,WAAW,EAAE,2CAAmB;aACjC;SACF;QACD,OAAO,EAAE,CAAC,qCAAgB,CAAC;KAC5B,CAAC;GACW,SAAS,CAAG"}
1
+ {"version":3,"file":"app.module.js","sourceRoot":"","sources":["../src/app.module.ts"],"names":[],"mappings":";;;;;;;;;AAEA,2CAAwC;AACxC,6EAAwE;AACxE,yFAAoF;AACpF,0EAAqE;AACrE,kDAAkD;AAClD,mEAA+D;AAC/D,iEAA6D;AAC7D,2DAAuD;AACvD,sFAAiF;AAwB1E,IAAM,SAAS,GAAf,MAAM,SAAS;CAAG,CAAA;AAAZ,8BAAS;oBAAT,SAAS;IAlBrB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE,CAAC,kCAAe,EAAE,gCAAc,EAAE,4BAAY,CAAC;QACxD,SAAS,EAAE;YAET,qCAAgB;YAEhB,2CAAmB;YACnB,2CAAmB;YAEnB,iDAAsB;YAEtB;gBACE,OAAO,EAAE,wBAAY;gBACrB,WAAW,EAAE,2CAAmB;aACjC;SACF;QACD,OAAO,EAAE,CAAC,qCAAgB,CAAC;KAC5B,CAAC;GACW,SAAS,CAAG"}
@@ -0,0 +1,3 @@
1
+ export { OAuthProviderService } from "./oauth-provider.service";
2
+ export { createOAuthMiddleware } from "./oauth-middleware";
3
+ export type { OAuthProviderConfig, OAuthConfig, OAuthTokenValidator, OAuthContextExtractor, } from "./oauth-config.interface";
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createOAuthMiddleware = exports.OAuthProviderService = void 0;
4
+ var oauth_provider_service_1 = require("./oauth-provider.service");
5
+ Object.defineProperty(exports, "OAuthProviderService", { enumerable: true, get: function () { return oauth_provider_service_1.OAuthProviderService; } });
6
+ var oauth_middleware_1 = require("./oauth-middleware");
7
+ Object.defineProperty(exports, "createOAuthMiddleware", { enumerable: true, get: function () { return oauth_middleware_1.createOAuthMiddleware; } });
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/auth/oauth/index.ts"],"names":[],"mappings":";;;AAAA,mEAAgE;AAAvD,8HAAA,oBAAoB,OAAA;AAC7B,uDAA2D;AAAlD,yHAAA,qBAAqB,OAAA"}
@@ -0,0 +1,12 @@
1
+ import { McpContext } from "../../core/context/mcp-context.interface";
2
+ export type OAuthTokenValidator = (token: string) => Promise<any> | any;
3
+ export type OAuthContextExtractor = (payload: any) => McpContext;
4
+ export interface OAuthProviderConfig {
5
+ provider: string;
6
+ validateToken: OAuthTokenValidator;
7
+ extractContext: OAuthContextExtractor;
8
+ extractToken?: (req: any) => string | null;
9
+ }
10
+ export interface OAuthConfig {
11
+ oauth: OAuthProviderConfig;
12
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=oauth-config.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-config.interface.js","sourceRoot":"","sources":["../../../src/auth/oauth/oauth-config.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ import { Request, Response, NextFunction } from "express";
2
+ import { OAuthProviderService } from "./oauth-provider.service";
3
+ export declare function createOAuthMiddleware(oauthProvider: OAuthProviderService): (req: Request, res: Response, next: NextFunction) => Promise<void>;
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createOAuthMiddleware = createOAuthMiddleware;
4
+ const logger_util_1 = require("../../core/utils/logger.util");
5
+ const sanitize_util_1 = require("../../core/utils/sanitize.util");
6
+ function createOAuthMiddleware(oauthProvider) {
7
+ return async (req, res, next) => {
8
+ const requestId = req.headers["x-request-id"] || req.body?.id || null;
9
+ const clientIp = req.ip || req.socket.remoteAddress || "unknown";
10
+ try {
11
+ const token = oauthProvider.extractTokenFromRequest(req);
12
+ if (!token) {
13
+ logger_util_1.logger.audit("OAuthMiddleware", "oauth/authenticate", "failure", {
14
+ reason: "No token provided",
15
+ clientIp,
16
+ }, requestId, clientIp);
17
+ res.status(401).json({
18
+ jsonrpc: "2.0",
19
+ id: null,
20
+ error: {
21
+ code: -32000,
22
+ message: "Unauthorized: No token provided",
23
+ },
24
+ });
25
+ return;
26
+ }
27
+ const context = await oauthProvider.validateAndExtractContext(token);
28
+ const actorId = (0, sanitize_util_1.sanitizeActorId)(context.sessionId || context.userId || undefined);
29
+ logger_util_1.logger.audit("OAuthMiddleware", "oauth/authenticate", "success", {
30
+ clientIp,
31
+ }, requestId, actorId);
32
+ req.mcpContext = context;
33
+ next();
34
+ }
35
+ catch (error) {
36
+ logger_util_1.logger.error("OAuthMiddleware", "Token validation failed", {
37
+ error: (0, sanitize_util_1.sanitizeErrorMessage)(error),
38
+ });
39
+ logger_util_1.logger.audit("OAuthMiddleware", "oauth/authenticate", "failure", {
40
+ reason: "Token validation failed",
41
+ clientIp,
42
+ }, requestId, clientIp);
43
+ res.status(401).json({
44
+ jsonrpc: "2.0",
45
+ id: null,
46
+ error: {
47
+ code: -32000,
48
+ message: "Unauthorized: Invalid token",
49
+ },
50
+ });
51
+ }
52
+ };
53
+ }
54
+ //# sourceMappingURL=oauth-middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-middleware.js","sourceRoot":"","sources":["../../../src/auth/oauth/oauth-middleware.ts"],"names":[],"mappings":";;AAkBA,sDAuFC;AAtGD,8DAAsD;AACtD,kEAAuF;AAcvF,SAAgB,qBAAqB,CACnC,aAAmC;IAEnC,OAAO,KAAK,EAAE,GAAY,EAAE,GAAa,EAAE,IAAkB,EAAE,EAAE;QAE/D,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,EAAE,IAAI,IAAI,CAAC;QACtE,MAAM,QAAQ,GAAG,GAAG,CAAC,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,aAAa,IAAI,SAAS,CAAC;QAEjE,IAAI,CAAC;YAEH,MAAM,KAAK,GAAG,aAAa,CAAC,uBAAuB,CAAC,GAAG,CAAC,CAAC;YAEzD,IAAI,CAAC,KAAK,EAAE,CAAC;gBAEX,oBAAM,CAAC,KAAK,CACV,iBAAiB,EACjB,oBAAoB,EACpB,SAAS,EACT;oBACE,MAAM,EAAE,mBAAmB;oBAC3B,QAAQ;iBACT,EACD,SAAS,EACT,QAAQ,CACT,CAAC;gBAEF,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;oBACnB,OAAO,EAAE,KAAK;oBACd,EAAE,EAAE,IAAI;oBACR,KAAK,EAAE;wBACL,IAAI,EAAE,CAAC,KAAK;wBACZ,OAAO,EAAE,iCAAiC;qBAC3C;iBACF,CAAC,CAAC;gBACH,OAAO;YACT,CAAC;YAGD,MAAM,OAAO,GAAG,MAAM,aAAa,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC;YAGrE,MAAM,OAAO,GAAG,IAAA,+BAAe,EAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,MAAM,IAAI,SAAS,CAAC,CAAC;YAGlF,oBAAM,CAAC,KAAK,CACV,iBAAiB,EACjB,oBAAoB,EACpB,SAAS,EACT;gBACE,QAAQ;aACT,EACD,SAAS,EACT,OAAO,CACR,CAAC;YAGD,GAAW,CAAC,UAAU,GAAG,OAAO,CAAC;YAElC,IAAI,EAAE,CAAC;QACT,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,oBAAM,CAAC,KAAK,CAAC,iBAAiB,EAAE,yBAAyB,EAAE;gBACzD,KAAK,EAAE,IAAA,oCAAoB,EAAC,KAAK,CAAC;aACnC,CAAC,CAAC;YAGH,oBAAM,CAAC,KAAK,CACV,iBAAiB,EACjB,oBAAoB,EACpB,SAAS,EACT;gBACE,MAAM,EAAE,yBAAyB;gBACjC,QAAQ;aACT,EACD,SAAS,EACT,QAAQ,CACT,CAAC;YAEF,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;gBACnB,OAAO,EAAE,KAAK;gBACd,EAAE,EAAE,IAAI;gBACR,KAAK,EAAE;oBACL,IAAI,EAAE,CAAC,KAAK;oBACZ,OAAO,EAAE,6BAA6B;iBACvC;aACF,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { OAuthProviderConfig } from "./oauth-config.interface";
2
+ import { McpContext } from "../../core/context/mcp-context.interface";
3
+ export declare class OAuthProviderService {
4
+ private config;
5
+ setConfig(config: OAuthProviderConfig): void;
6
+ validateAndExtractContext(token: string): Promise<McpContext>;
7
+ extractTokenFromRequest(req: any): string | null;
8
+ }
@@ -0,0 +1,63 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.OAuthProviderService = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const logger_util_1 = require("../../core/utils/logger.util");
12
+ const sanitize_util_1 = require("../../core/utils/sanitize.util");
13
+ let OAuthProviderService = class OAuthProviderService {
14
+ config = null;
15
+ setConfig(config) {
16
+ this.config = config;
17
+ logger_util_1.logger.info("OAuthProviderService", `OAuth provider configured: ${config.provider}`, {
18
+ component: "OAuth",
19
+ });
20
+ }
21
+ async validateAndExtractContext(token) {
22
+ if (!this.config) {
23
+ throw new Error("OAuth provider not configured");
24
+ }
25
+ try {
26
+ const payload = await this.config.validateToken(token);
27
+ const context = this.config.extractContext(payload);
28
+ logger_util_1.logger.debug("OAuthProviderService", "Token validated and context extracted", {
29
+ component: "OAuth",
30
+ });
31
+ return context;
32
+ }
33
+ catch (error) {
34
+ logger_util_1.logger.error("OAuthProviderService", "Token validation failed", {
35
+ component: "OAuth",
36
+ error: (0, sanitize_util_1.sanitizeErrorMessage)(error),
37
+ });
38
+ throw error;
39
+ }
40
+ }
41
+ extractTokenFromRequest(req) {
42
+ if (!this.config) {
43
+ return null;
44
+ }
45
+ if (this.config.extractToken) {
46
+ return this.config.extractToken(req);
47
+ }
48
+ const authHeader = req.get?.("Authorization") || req.headers?.authorization || req.headers?.Authorization;
49
+ if (!authHeader) {
50
+ return null;
51
+ }
52
+ const parts = String(authHeader).split(" ");
53
+ if (parts.length === 2 && parts[0] === "Bearer") {
54
+ return parts[1];
55
+ }
56
+ return null;
57
+ }
58
+ };
59
+ exports.OAuthProviderService = OAuthProviderService;
60
+ exports.OAuthProviderService = OAuthProviderService = __decorate([
61
+ (0, common_1.Injectable)()
62
+ ], OAuthProviderService);
63
+ //# sourceMappingURL=oauth-provider.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-provider.service.js","sourceRoot":"","sources":["../../../src/auth/oauth/oauth-provider.service.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA4C;AAG5C,8DAAsD;AACtD,kEAAsE;AAM/D,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;IACvB,MAAM,GAA+B,IAAI,CAAC;IAKlD,SAAS,CAAC,MAA2B;QACnC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,oBAAM,CAAC,IAAI,CAAC,sBAAsB,EAAE,8BAA8B,MAAM,CAAC,QAAQ,EAAE,EAAE;YACnF,SAAS,EAAE,OAAO;SACnB,CAAC,CAAC;IACL,CAAC;IAQD,KAAK,CAAC,yBAAyB,CAAC,KAAa;QAC3C,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnD,CAAC;QAED,IAAI,CAAC;YAEH,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAGvD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YAEpD,oBAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE,uCAAuC,EAAE;gBAC5E,SAAS,EAAE,OAAO;aAEnB,CAAC,CAAC;YAEH,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,oBAAM,CAAC,KAAK,CAAC,sBAAsB,EAAE,yBAAyB,EAAE;gBAC9D,SAAS,EAAE,OAAO;gBAClB,KAAK,EAAE,IAAA,oCAAoB,EAAC,KAAK,CAAC;aACnC,CAAC,CAAC;YACH,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAKD,uBAAuB,CAAC,GAAQ;QAC9B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,OAAO,IAAI,CAAC;QACd,CAAC;QAGD,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QACvC,CAAC;QAGD,MAAM,UAAU,GAAG,GAAG,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,IAAI,GAAG,CAAC,OAAO,EAAE,aAAa,IAAI,GAAG,CAAC,OAAO,EAAE,aAAa,CAAC;QAC1G,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,IAAI,CAAC;QACd,CAAC;QAGD,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC5C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;YAChD,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAGD,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAA;AA1EY,oDAAoB;+BAApB,oBAAoB;IADhC,IAAA,mBAAU,GAAE;GACA,oBAAoB,CA0EhC"}
@@ -1,5 +1,5 @@
1
1
  export interface JsonSchema2020_12 {
2
- type: "object" | "string" | "number" | "integer" | "boolean" | "array";
2
+ type?: "object" | "string" | "number" | "integer" | "boolean" | "array" | "null";
3
3
  properties?: Record<string, JsonSchema2020_12>;
4
4
  items?: JsonSchema2020_12 | JsonSchema2020_12[];
5
5
  required?: string[];
@@ -0,0 +1,21 @@
1
+ import { ToolRegistryService } from "../../tooling/tool-registry/tool-registry.service";
2
+ import { CancellationToken } from "../../tooling/tool.interface";
3
+ import { McpContext } from "../context/mcp-context.interface";
4
+ import { ProgressCallback } from "../progress/progress-notifier.service";
5
+ export interface BatchToolRequest {
6
+ tool: string;
7
+ args: Record<string, any>;
8
+ }
9
+ export interface BatchToolResult {
10
+ tool: string;
11
+ success: boolean;
12
+ result?: any;
13
+ error?: string;
14
+ }
15
+ export declare class BatchExecutorService {
16
+ private readonly toolRegistry;
17
+ private static readonly MAX_BATCH_SIZE;
18
+ private static readonly MAX_CONCURRENCY;
19
+ constructor(toolRegistry: ToolRegistryService);
20
+ executeBatch(requests: BatchToolRequest[], cancellationToken?: CancellationToken, context?: McpContext, progress?: ProgressCallback): Promise<BatchToolResult[]>;
21
+ }
@@ -0,0 +1,101 @@
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 BatchExecutorService_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.BatchExecutorService = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const tool_registry_service_1 = require("../../tooling/tool-registry/tool-registry.service");
16
+ const logger_util_1 = require("../utils/logger.util");
17
+ const sanitize_util_1 = require("../utils/sanitize.util");
18
+ let BatchExecutorService = class BatchExecutorService {
19
+ static { BatchExecutorService_1 = this; }
20
+ toolRegistry;
21
+ static MAX_BATCH_SIZE = 100;
22
+ static MAX_CONCURRENCY = 10;
23
+ constructor(toolRegistry) {
24
+ this.toolRegistry = toolRegistry;
25
+ }
26
+ async executeBatch(requests, cancellationToken, context, progress) {
27
+ if (requests.length === 0) {
28
+ return [];
29
+ }
30
+ if (requests.length > BatchExecutorService_1.MAX_BATCH_SIZE) {
31
+ logger_util_1.logger.warn("BatchExecutorService", `Batch size ${requests.length} exceeds maximum ${BatchExecutorService_1.MAX_BATCH_SIZE}`, {
32
+ component: "Batch",
33
+ batchSize: requests.length,
34
+ maxBatchSize: BatchExecutorService_1.MAX_BATCH_SIZE,
35
+ });
36
+ return requests.slice(0, BatchExecutorService_1.MAX_BATCH_SIZE).map((request) => ({
37
+ tool: request.tool,
38
+ success: false,
39
+ error: "Batch size limit exceeded",
40
+ }));
41
+ }
42
+ progress?.({ progress: 0, message: `Executing ${requests.length} tools...` });
43
+ const results = [];
44
+ const concurrency = Math.min(BatchExecutorService_1.MAX_CONCURRENCY, requests.length);
45
+ for (let i = 0; i < requests.length; i += concurrency) {
46
+ const batch = requests.slice(i, i + concurrency);
47
+ const batchPromises = batch.map(async (request, batchIndex) => {
48
+ const index = i + batchIndex;
49
+ if (cancellationToken?.isCancelled) {
50
+ return {
51
+ tool: request.tool,
52
+ success: false,
53
+ error: "Batch cancelled",
54
+ };
55
+ }
56
+ try {
57
+ const result = await this.toolRegistry.executeTool(request.tool, request.args, cancellationToken, context, progress
58
+ ? (p) => {
59
+ const baseProgress = index / requests.length;
60
+ const toolProgress = p.progress / requests.length;
61
+ progress({
62
+ progress: baseProgress + toolProgress,
63
+ message: p.message || `Executing ${request.tool}...`,
64
+ });
65
+ }
66
+ : undefined);
67
+ return {
68
+ tool: request.tool,
69
+ success: true,
70
+ result,
71
+ };
72
+ }
73
+ catch (error) {
74
+ const sanitizedError = (0, sanitize_util_1.sanitizeErrorMessage)(error);
75
+ logger_util_1.logger.error("BatchExecutorService", `Batch tool execution failed: ${request.tool}`, {
76
+ component: "Batch",
77
+ tool: request.tool,
78
+ error: sanitizedError,
79
+ });
80
+ return {
81
+ tool: request.tool,
82
+ success: false,
83
+ error: "Tool execution failed",
84
+ };
85
+ }
86
+ });
87
+ const batchResults = await Promise.all(batchPromises);
88
+ results.push(...batchResults);
89
+ const currentProgress = Math.min((i + batch.length) / requests.length, 1);
90
+ progress?.({ progress: currentProgress, message: `Executing ${requests.length} tools...` });
91
+ }
92
+ progress?.({ progress: 1, message: `Completed ${requests.length} tools` });
93
+ return results;
94
+ }
95
+ };
96
+ exports.BatchExecutorService = BatchExecutorService;
97
+ exports.BatchExecutorService = BatchExecutorService = BatchExecutorService_1 = __decorate([
98
+ (0, common_1.Injectable)(),
99
+ __metadata("design:paramtypes", [tool_registry_service_1.ToolRegistryService])
100
+ ], BatchExecutorService);
101
+ //# sourceMappingURL=batch-executor.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch-executor.service.js","sourceRoot":"","sources":["../../../src/core/batch/batch-executor.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { McpContext } from "./mcp-context.interface";
2
+ import { JsonRpcRequest } from "../../interface/jsonrpc.interface";
3
+ export declare class ContextProviderService {
4
+ private contextExtractors;
5
+ registerExtractor(extractor: (request: JsonRpcRequest) => Partial<McpContext>): void;
6
+ extractContext(request: JsonRpcRequest): McpContext;
7
+ createDefaultExtractor(): (request: JsonRpcRequest) => Partial<McpContext>;
8
+ }
@@ -0,0 +1,55 @@
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
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.ContextProviderService = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ let ContextProviderService = class ContextProviderService {
12
+ contextExtractors = [];
13
+ registerExtractor(extractor) {
14
+ this.contextExtractors.push(extractor);
15
+ }
16
+ extractContext(request) {
17
+ let context = {};
18
+ for (const extractor of this.contextExtractors) {
19
+ const partialContext = extractor(request);
20
+ context = { ...context, ...partialContext };
21
+ }
22
+ if (!context.sessionId && request.id !== null && request.id !== undefined) {
23
+ context.sessionId = String(request.id);
24
+ }
25
+ return context;
26
+ }
27
+ createDefaultExtractor() {
28
+ return (request) => {
29
+ const context = {};
30
+ if (request.metadata) {
31
+ if (request.metadata.userId) {
32
+ context.userId = request.metadata.userId;
33
+ }
34
+ if (request.metadata.scopes) {
35
+ context.scopes = request.metadata.scopes;
36
+ }
37
+ if (request.metadata.buildingIds) {
38
+ context.buildingIds = request.metadata.buildingIds;
39
+ }
40
+ if (request.metadata.sessionId) {
41
+ context.sessionId = request.metadata.sessionId;
42
+ }
43
+ if (request.metadata.metadata) {
44
+ context.metadata = request.metadata.metadata;
45
+ }
46
+ }
47
+ return context;
48
+ };
49
+ }
50
+ };
51
+ exports.ContextProviderService = ContextProviderService;
52
+ exports.ContextProviderService = ContextProviderService = __decorate([
53
+ (0, common_1.Injectable)()
54
+ ], ContextProviderService);
55
+ //# sourceMappingURL=context-provider.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-provider.service.js","sourceRoot":"","sources":["../../../src/core/context/context-provider.service.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAA4C;AASrC,IAAM,sBAAsB,GAA5B,MAAM,sBAAsB;IACzB,iBAAiB,GAA4D,EAAE,CAAC;IAMxF,iBAAiB,CAAC,SAA2D;QAC3E,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACzC,CAAC;IAMD,cAAc,CAAC,OAAuB;QACpC,IAAI,OAAO,GAAe,EAAE,CAAC;QAG7B,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,iBAAiB,EAAE,CAAC;YAC/C,MAAM,cAAc,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC;YAC1C,OAAO,GAAG,EAAE,GAAG,OAAO,EAAE,GAAG,cAAc,EAAE,CAAC;QAC9C,CAAC;QAGD,IAAI,CAAC,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,EAAE,KAAK,IAAI,IAAI,OAAO,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;YAC1E,OAAO,CAAC,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACzC,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAKD,sBAAsB;QACpB,OAAO,CAAC,OAAuB,EAAE,EAAE;YACjC,MAAM,OAAO,GAAwB,EAAE,CAAC;YAGxC,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACrB,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;oBAC5B,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAC3C,CAAC;gBACD,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;oBAC5B,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC;gBAC3C,CAAC;gBACD,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;oBACjC,OAAO,CAAC,WAAW,GAAG,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;gBACrD,CAAC;gBACD,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;oBAC/B,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;gBACjD,CAAC;gBACD,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;oBAC9B,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAC/C,CAAC;YACH,CAAC;YAED,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC;IACJ,CAAC;CACF,CAAA;AA7DY,wDAAsB;iCAAtB,sBAAsB;IADlC,IAAA,mBAAU,GAAE;GACA,sBAAsB,CA6DlC"}
@@ -0,0 +1,12 @@
1
+ export interface McpContext {
2
+ userId?: string;
3
+ scopes?: string[];
4
+ buildingIds?: string[];
5
+ sessionId?: string;
6
+ metadata?: {
7
+ ip?: string;
8
+ userAgent?: string;
9
+ [key: string]: any;
10
+ };
11
+ [key: string]: any;
12
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=mcp-context.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-context.interface.js","sourceRoot":"","sources":["../../../src/core/context/mcp-context.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,13 @@
1
+ import { ToolRegistryService } from "../../tooling/tool-registry/tool-registry.service";
2
+ export declare class OpenApiGeneratorService {
3
+ private readonly toolRegistry;
4
+ constructor(toolRegistry: ToolRegistryService);
5
+ generateOpenApiSpec(info: {
6
+ title: string;
7
+ version: string;
8
+ }): any;
9
+ generateMarkdownDocs(info: {
10
+ title: string;
11
+ version: string;
12
+ }): string;
13
+ }