@hed-hog/core 0.0.327 → 0.0.329

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 (153) hide show
  1. package/dist/ai/ai.service.d.ts +1 -1
  2. package/dist/auth/auth.controller.d.ts +2 -2
  3. package/dist/auth/auth.service.d.ts +2 -2
  4. package/dist/core/system.controller.d.ts +1 -1
  5. package/dist/core/system.service.d.ts +1 -1
  6. package/dist/core.module.d.ts.map +1 -1
  7. package/dist/core.module.js +4 -0
  8. package/dist/core.module.js.map +1 -1
  9. package/dist/dashboard/dashboard/dashboard.controller.d.ts +21 -21
  10. package/dist/dashboard/dashboard/dashboard.service.d.ts +21 -21
  11. package/dist/dashboard/dashboard-component/dashboard-component.controller.d.ts +11 -11
  12. package/dist/dashboard/dashboard-component/dashboard-component.service.d.ts +11 -11
  13. package/dist/dashboard/dashboard-component-role/dashboard-component-role.controller.d.ts +5 -5
  14. package/dist/dashboard/dashboard-component-role/dashboard-component-role.service.d.ts +5 -5
  15. package/dist/dashboard/dashboard-core/dashboard-core.controller.d.ts +4 -4
  16. package/dist/dashboard/dashboard-core/dashboard-core.service.d.ts +4 -4
  17. package/dist/dashboard/dashboard-item/dashboard-item.controller.d.ts +4 -4
  18. package/dist/dashboard/dashboard-item/dashboard-item.service.d.ts +4 -4
  19. package/dist/dashboard/dashboard-role/dashboard-role.controller.d.ts +3 -3
  20. package/dist/dashboard/dashboard-role/dashboard-role.service.d.ts +3 -3
  21. package/dist/file/file.controller.d.ts +6 -6
  22. package/dist/file/file.service.d.ts +12 -12
  23. package/dist/index.d.ts +5 -0
  24. package/dist/index.d.ts.map +1 -1
  25. package/dist/index.js +6 -0
  26. package/dist/index.js.map +1 -1
  27. package/dist/mail/mail.controller.d.ts +2 -2
  28. package/dist/mail/mail.service.d.ts +2 -2
  29. package/dist/mail-sent/mail-sent.controller.d.ts +3 -3
  30. package/dist/mail-sent/mail-sent.service.d.ts +3 -3
  31. package/dist/mcp/decorators/mcp-tool.decorator.d.ts +4 -0
  32. package/dist/mcp/decorators/mcp-tool.decorator.d.ts.map +1 -0
  33. package/dist/mcp/decorators/mcp-tool.decorator.js +8 -0
  34. package/dist/mcp/decorators/mcp-tool.decorator.js.map +1 -0
  35. package/dist/mcp/guards/mcp-auth.guard.d.ts +9 -0
  36. package/dist/mcp/guards/mcp-auth.guard.d.ts.map +1 -0
  37. package/dist/mcp/guards/mcp-auth.guard.js +41 -0
  38. package/dist/mcp/guards/mcp-auth.guard.js.map +1 -0
  39. package/dist/mcp/guards/mcp-permission.guard.d.ts +8 -0
  40. package/dist/mcp/guards/mcp-permission.guard.d.ts.map +1 -0
  41. package/dist/mcp/guards/mcp-permission.guard.js +57 -0
  42. package/dist/mcp/guards/mcp-permission.guard.js.map +1 -0
  43. package/dist/mcp/interfaces/mcp-tool-definition.interface.d.ts +7 -0
  44. package/dist/mcp/interfaces/mcp-tool-definition.interface.d.ts.map +1 -0
  45. package/dist/mcp/interfaces/mcp-tool-definition.interface.js +3 -0
  46. package/dist/mcp/interfaces/mcp-tool-definition.interface.js.map +1 -0
  47. package/dist/mcp/mcp-audit.service.d.ts +17 -0
  48. package/dist/mcp/mcp-audit.service.d.ts.map +1 -0
  49. package/dist/mcp/mcp-audit.service.js +46 -0
  50. package/dist/mcp/mcp-audit.service.js.map +1 -0
  51. package/dist/mcp/mcp-registry.service.d.ts +21 -0
  52. package/dist/mcp/mcp-registry.service.d.ts.map +1 -0
  53. package/dist/mcp/mcp-registry.service.js +69 -0
  54. package/dist/mcp/mcp-registry.service.js.map +1 -0
  55. package/dist/mcp/mcp-server.service.d.ts +12 -0
  56. package/dist/mcp/mcp-server.service.d.ts.map +1 -0
  57. package/dist/mcp/mcp-server.service.js +94 -0
  58. package/dist/mcp/mcp-server.service.js.map +1 -0
  59. package/dist/mcp/mcp.controller.d.ts +8 -0
  60. package/dist/mcp/mcp.controller.d.ts.map +1 -0
  61. package/dist/mcp/mcp.controller.js +54 -0
  62. package/dist/mcp/mcp.controller.js.map +1 -0
  63. package/dist/mcp/mcp.module.d.ts +3 -0
  64. package/dist/mcp/mcp.module.d.ts.map +1 -0
  65. package/dist/mcp/mcp.module.js +49 -0
  66. package/dist/mcp/mcp.module.js.map +1 -0
  67. package/dist/mcp/tools/core-settings.mcp-tools.d.ts +12 -0
  68. package/dist/mcp/tools/core-settings.mcp-tools.d.ts.map +1 -0
  69. package/dist/mcp/tools/core-settings.mcp-tools.js +66 -0
  70. package/dist/mcp/tools/core-settings.mcp-tools.js.map +1 -0
  71. package/dist/mcp/tools/core-users.mcp-tools.d.ts +55 -0
  72. package/dist/mcp/tools/core-users.mcp-tools.d.ts.map +1 -0
  73. package/dist/mcp/tools/core-users.mcp-tools.js +295 -0
  74. package/dist/mcp/tools/core-users.mcp-tools.js.map +1 -0
  75. package/dist/mcp/types/mcp-context.type.d.ts +7 -0
  76. package/dist/mcp/types/mcp-context.type.d.ts.map +1 -0
  77. package/dist/mcp/types/mcp-context.type.js +3 -0
  78. package/dist/mcp/types/mcp-context.type.js.map +1 -0
  79. package/dist/mcp-chat/dto/create-conversation.dto.d.ts +4 -0
  80. package/dist/mcp-chat/dto/create-conversation.dto.d.ts.map +1 -0
  81. package/dist/mcp-chat/dto/create-conversation.dto.js +22 -0
  82. package/dist/mcp-chat/dto/create-conversation.dto.js.map +1 -0
  83. package/dist/mcp-chat/dto/send-message.dto.d.ts +4 -0
  84. package/dist/mcp-chat/dto/send-message.dto.d.ts.map +1 -0
  85. package/dist/mcp-chat/dto/send-message.dto.js +22 -0
  86. package/dist/mcp-chat/dto/send-message.dto.js.map +1 -0
  87. package/dist/mcp-chat/mcp-chat.controller.d.ts +55 -0
  88. package/dist/mcp-chat/mcp-chat.controller.d.ts.map +1 -0
  89. package/dist/mcp-chat/mcp-chat.controller.js +90 -0
  90. package/dist/mcp-chat/mcp-chat.controller.js.map +1 -0
  91. package/dist/mcp-chat/mcp-chat.module.d.ts +3 -0
  92. package/dist/mcp-chat/mcp-chat.module.d.ts.map +1 -0
  93. package/dist/mcp-chat/mcp-chat.module.js +30 -0
  94. package/dist/mcp-chat/mcp-chat.module.js.map +1 -0
  95. package/dist/mcp-chat/mcp-chat.service.d.ts +50 -0
  96. package/dist/mcp-chat/mcp-chat.service.d.ts.map +1 -0
  97. package/dist/mcp-chat/mcp-chat.service.js +290 -0
  98. package/dist/mcp-chat/mcp-chat.service.js.map +1 -0
  99. package/dist/menu/menu.controller.d.ts +3 -3
  100. package/dist/menu/menu.service.d.ts +3 -3
  101. package/dist/profile/profile.controller.d.ts +2 -2
  102. package/dist/profile/profile.service.d.ts +2 -2
  103. package/dist/route/dto/create.dto.d.ts +6 -2
  104. package/dist/route/dto/create.dto.d.ts.map +1 -1
  105. package/dist/route/dto/create.dto.js +19 -1
  106. package/dist/route/dto/create.dto.js.map +1 -1
  107. package/dist/route/dto/update.dto.d.ts +4 -0
  108. package/dist/route/dto/update.dto.d.ts.map +1 -1
  109. package/dist/route/dto/update.dto.js +19 -3
  110. package/dist/route/dto/update.dto.js.map +1 -1
  111. package/dist/route/route.service.d.ts +1 -1
  112. package/dist/route/route.service.d.ts.map +1 -1
  113. package/dist/route/route.service.js +18 -11
  114. package/dist/route/route.service.js.map +1 -1
  115. package/dist/setting/setting.controller.d.ts +5 -5
  116. package/dist/setting/setting.service.d.ts +5 -5
  117. package/dist/user/user.controller.d.ts +3 -3
  118. package/dist/user/user.service.d.ts +6 -6
  119. package/hedhog/data/menu.yaml +40 -26
  120. package/hedhog/data/route.yaml +575 -152
  121. package/hedhog/data/setting_group.yaml +1 -1
  122. package/hedhog/frontend/app/configurations/[slug]/page.tsx.ejs +8 -1
  123. package/hedhog/frontend/app/configurations/layout.tsx.ejs +152 -34
  124. package/hedhog/frontend/app/mcp_chat/page.tsx.ejs +574 -0
  125. package/hedhog/frontend/messages/en.json +17 -0
  126. package/hedhog/frontend/messages/pt.json +17 -0
  127. package/hedhog/table/mcp_conversation.yaml +12 -0
  128. package/hedhog/table/mcp_conversation_message.yaml +23 -0
  129. package/hedhog/table/mcp_tool_call_log.yaml +22 -0
  130. package/hedhog/table/route.yaml +33 -22
  131. package/package.json +5 -4
  132. package/src/core.module.ts +14 -10
  133. package/src/index.ts +17 -10
  134. package/src/mcp/decorators/mcp-tool.decorator.ts +7 -0
  135. package/src/mcp/guards/mcp-auth.guard.ts +32 -0
  136. package/src/mcp/guards/mcp-permission.guard.ts +51 -0
  137. package/src/mcp/interfaces/mcp-tool-definition.interface.ts +6 -0
  138. package/src/mcp/mcp-audit.service.ts +36 -0
  139. package/src/mcp/mcp-registry.service.ts +69 -0
  140. package/src/mcp/mcp-server.service.ts +87 -0
  141. package/src/mcp/mcp.controller.ts +30 -0
  142. package/src/mcp/mcp.module.ts +36 -0
  143. package/src/mcp/tools/core-settings.mcp-tools.ts +53 -0
  144. package/src/mcp/tools/core-users.mcp-tools.ts +267 -0
  145. package/src/mcp/types/mcp-context.type.ts +6 -0
  146. package/src/mcp-chat/dto/create-conversation.dto.ts +7 -0
  147. package/src/mcp-chat/dto/send-message.dto.ts +7 -0
  148. package/src/mcp-chat/mcp-chat.controller.ts +60 -0
  149. package/src/mcp-chat/mcp-chat.module.ts +17 -0
  150. package/src/mcp-chat/mcp-chat.service.ts +332 -0
  151. package/src/route/dto/create.dto.ts +32 -14
  152. package/src/route/dto/update.dto.ts +31 -16
  153. package/src/route/route.service.ts +23 -12
@@ -0,0 +1,57 @@
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.McpPermissionGuard = void 0;
13
+ const api_prisma_1 = require("@hed-hog/api-prisma");
14
+ const common_1 = require("@nestjs/common");
15
+ let McpPermissionGuard = class McpPermissionGuard {
16
+ constructor(prisma) {
17
+ this.prisma = prisma;
18
+ }
19
+ async canActivate(context) {
20
+ var _a, _b;
21
+ const request = context.switchToHttp().getRequest();
22
+ // Only POST requests carry tool invocations
23
+ if (request.method !== 'POST')
24
+ return true;
25
+ const body = request.body;
26
+ const toolName = (body === null || body === void 0 ? void 0 : body.method) === 'tools/call' ? (_a = body === null || body === void 0 ? void 0 : body.params) === null || _a === void 0 ? void 0 : _a.name : undefined;
27
+ // tools/list, initialize, ping, etc. — no per-tool permission check needed
28
+ if (!toolName)
29
+ return true;
30
+ const userId = (_b = request === null || request === void 0 ? void 0 : request.auth) === null || _b === void 0 ? void 0 : _b.sub;
31
+ const count = await this.prisma.route.count({
32
+ where: {
33
+ type: 'MCP',
34
+ tool_name: toolName,
35
+ role_route: {
36
+ some: {
37
+ role: {
38
+ role_user: {
39
+ some: { user_id: userId },
40
+ },
41
+ },
42
+ },
43
+ },
44
+ },
45
+ });
46
+ if (count === 0) {
47
+ throw new common_1.ForbiddenException(`Access denied to MCP tool '${toolName}'`);
48
+ }
49
+ return true;
50
+ }
51
+ };
52
+ exports.McpPermissionGuard = McpPermissionGuard;
53
+ exports.McpPermissionGuard = McpPermissionGuard = __decorate([
54
+ (0, common_1.Injectable)(),
55
+ __metadata("design:paramtypes", [api_prisma_1.PrismaService])
56
+ ], McpPermissionGuard);
57
+ //# sourceMappingURL=mcp-permission.guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-permission.guard.js","sourceRoot":"","sources":["../../../src/mcp/guards/mcp-permission.guard.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,oDAAoD;AACpD,2CAKwB;AAIjB,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;IAC7B,YAA6B,MAAqB;QAArB,WAAM,GAAN,MAAM,CAAe;IAAG,CAAC;IAEtD,KAAK,CAAC,WAAW,CAAC,OAAyB;;QACzC,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,UAAU,EAAW,CAAC;QAE7D,4CAA4C;QAC5C,IAAI,OAAO,CAAC,MAAM,KAAK,MAAM;YAAE,OAAO,IAAI,CAAC;QAE3C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAW,CAAC;QACjC,MAAM,QAAQ,GACZ,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,MAAM,MAAK,YAAY,CAAC,CAAC,CAAC,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,MAAM,0CAAE,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;QAEjE,2EAA2E;QAC3E,IAAI,CAAC,QAAQ;YAAE,OAAO,IAAI,CAAC;QAE3B,MAAM,MAAM,GAAG,MAAC,OAAe,aAAf,OAAO,uBAAP,OAAO,CAAU,IAAI,0CAAE,GAAG,CAAC;QAE3C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;YAC1C,KAAK,EAAE;gBACL,IAAI,EAAE,KAAY;gBAClB,SAAS,EAAE,QAAQ;gBACnB,UAAU,EAAE;oBACV,IAAI,EAAE;wBACJ,IAAI,EAAE;4BACJ,SAAS,EAAE;gCACT,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE;6BAC1B;yBACF;qBACF;iBACF;aACF;SACF,CAAC,CAAC;QAEH,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;YAChB,MAAM,IAAI,2BAAkB,CAAC,8BAA8B,QAAQ,GAAG,CAAC,CAAC;QAC1E,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;CACF,CAAA;AAxCY,gDAAkB;6BAAlB,kBAAkB;IAD9B,IAAA,mBAAU,GAAE;qCAE0B,0BAAa;GADvC,kBAAkB,CAwC9B"}
@@ -0,0 +1,7 @@
1
+ export interface McpToolDefinition {
2
+ name: string;
3
+ description: string;
4
+ inputSchema?: Record<string, any>;
5
+ readOnly?: boolean;
6
+ }
7
+ //# sourceMappingURL=mcp-tool-definition.interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-tool-definition.interface.d.ts","sourceRoot":"","sources":["../../../src/mcp/interfaces/mcp-tool-definition.interface.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAClC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=mcp-tool-definition.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-tool-definition.interface.js","sourceRoot":"","sources":["../../../src/mcp/interfaces/mcp-tool-definition.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,17 @@
1
+ import { PrismaService } from '@hed-hog/api-prisma';
2
+ interface AuditRecord {
3
+ userId: number;
4
+ toolName: string;
5
+ input: Record<string, any>;
6
+ success: boolean;
7
+ error?: string;
8
+ durationMs: number;
9
+ }
10
+ export declare class McpAuditService {
11
+ private readonly prisma;
12
+ private readonly logger;
13
+ constructor(prisma: PrismaService);
14
+ record(data: AuditRecord): Promise<void>;
15
+ }
16
+ export {};
17
+ //# sourceMappingURL=mcp-audit.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-audit.service.d.ts","sourceRoot":"","sources":["../../src/mcp/mcp-audit.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAGpD,UAAU,WAAW;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBACa,eAAe;IAGd,OAAO,CAAC,QAAQ,CAAC,MAAM;IAFnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoC;gBAE9B,MAAM,EAAE,aAAa;IAE5C,MAAM,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;CAiB/C"}
@@ -0,0 +1,46 @@
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 McpAuditService_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.McpAuditService = void 0;
14
+ const api_prisma_1 = require("@hed-hog/api-prisma");
15
+ const common_1 = require("@nestjs/common");
16
+ let McpAuditService = McpAuditService_1 = class McpAuditService {
17
+ constructor(prisma) {
18
+ this.prisma = prisma;
19
+ this.logger = new common_1.Logger(McpAuditService_1.name);
20
+ }
21
+ async record(data) {
22
+ var _a;
23
+ const sanitized = JSON.stringify(data.input).slice(0, 1000);
24
+ try {
25
+ await this.prisma.mcp_tool_call_log.create({
26
+ data: {
27
+ user_id: data.userId || null,
28
+ tool_name: data.toolName,
29
+ input: sanitized,
30
+ success: data.success,
31
+ error: (_a = data.error) !== null && _a !== void 0 ? _a : null,
32
+ duration_ms: data.durationMs,
33
+ },
34
+ });
35
+ }
36
+ catch (e) {
37
+ this.logger.warn(`Failed to persist MCP audit record: ${e.message}`);
38
+ }
39
+ }
40
+ };
41
+ exports.McpAuditService = McpAuditService;
42
+ exports.McpAuditService = McpAuditService = McpAuditService_1 = __decorate([
43
+ (0, common_1.Injectable)(),
44
+ __metadata("design:paramtypes", [api_prisma_1.PrismaService])
45
+ ], McpAuditService);
46
+ //# sourceMappingURL=mcp-audit.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-audit.service.js","sourceRoot":"","sources":["../../src/mcp/mcp-audit.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,oDAAoD;AACpD,2CAAoD;AAY7C,IAAM,eAAe,uBAArB,MAAM,eAAe;IAG1B,YAA6B,MAAqB;QAArB,WAAM,GAAN,MAAM,CAAe;QAFjC,WAAM,GAAG,IAAI,eAAM,CAAC,iBAAe,CAAC,IAAI,CAAC,CAAC;IAEN,CAAC;IAEtD,KAAK,CAAC,MAAM,CAAC,IAAiB;;QAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAC5D,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC;gBACzC,IAAI,EAAE;oBACJ,OAAO,EAAE,IAAI,CAAC,MAAM,IAAI,IAAI;oBAC5B,SAAS,EAAE,IAAI,CAAC,QAAQ;oBACxB,KAAK,EAAE,SAAS;oBAChB,OAAO,EAAE,IAAI,CAAC,OAAO;oBACrB,KAAK,EAAE,MAAA,IAAI,CAAC,KAAK,mCAAI,IAAI;oBACzB,WAAW,EAAE,IAAI,CAAC,UAAU;iBAC7B;aACF,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,CAAM,EAAE,CAAC;YAChB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;CACF,CAAA;AAtBY,0CAAe;0BAAf,eAAe;IAD3B,IAAA,mBAAU,GAAE;qCAI0B,0BAAa;GAHvC,eAAe,CAsB3B"}
@@ -0,0 +1,21 @@
1
+ import { OnModuleInit } from '@nestjs/common';
2
+ import { DiscoveryService } from '@nestjs/core';
3
+ import { Reflector } from '@nestjs/core';
4
+ import { McpToolDefinition } from './interfaces/mcp-tool-definition.interface';
5
+ import { McpContext } from './types/mcp-context.type';
6
+ export interface McpToolEntry {
7
+ definition: McpToolDefinition;
8
+ handler: (args: Record<string, any>, context: McpContext) => Promise<any>;
9
+ }
10
+ export declare class McpRegistryService implements OnModuleInit {
11
+ private readonly discovery;
12
+ private readonly reflector;
13
+ private readonly logger;
14
+ private readonly tools;
15
+ constructor(discovery: DiscoveryService, reflector: Reflector);
16
+ onModuleInit(): void;
17
+ getAll(): McpToolEntry[];
18
+ get(toolName: string): McpToolEntry | undefined;
19
+ has(toolName: string): boolean;
20
+ }
21
+ //# sourceMappingURL=mcp-registry.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-registry.service.d.ts","sourceRoot":"","sources":["../../src/mcp/mcp-registry.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAClE,OAAO,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,4CAA4C,CAAC;AAC/E,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEtD,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,iBAAiB,CAAC;IAC9B,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,UAAU,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;CAC3E;AAED,qBACa,kBAAmB,YAAW,YAAY;IAKnD,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAL5B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuC;IAC9D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmC;gBAGtC,SAAS,EAAE,gBAAgB,EAC3B,SAAS,EAAE,SAAS;IAGvC,YAAY,IAAI,IAAI;IAmCpB,MAAM,IAAI,YAAY,EAAE;IAIxB,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAI/C,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO;CAG/B"}
@@ -0,0 +1,69 @@
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 McpRegistryService_1;
12
+ Object.defineProperty(exports, "__esModule", { value: true });
13
+ exports.McpRegistryService = void 0;
14
+ const common_1 = require("@nestjs/common");
15
+ const core_1 = require("@nestjs/core");
16
+ const core_2 = require("@nestjs/core");
17
+ const mcp_tool_decorator_1 = require("./decorators/mcp-tool.decorator");
18
+ let McpRegistryService = McpRegistryService_1 = class McpRegistryService {
19
+ constructor(discovery, reflector) {
20
+ this.discovery = discovery;
21
+ this.reflector = reflector;
22
+ this.logger = new common_1.Logger(McpRegistryService_1.name);
23
+ this.tools = new Map();
24
+ }
25
+ onModuleInit() {
26
+ const providers = this.discovery.getProviders();
27
+ for (const wrapper of providers) {
28
+ const { instance } = wrapper;
29
+ if (!instance || typeof instance !== 'object')
30
+ continue;
31
+ const prototype = Object.getPrototypeOf(instance);
32
+ if (!prototype)
33
+ continue;
34
+ const methodNames = Object.getOwnPropertyNames(prototype).filter((key) => {
35
+ if (key === 'constructor')
36
+ return false;
37
+ const descriptor = Object.getOwnPropertyDescriptor(prototype, key);
38
+ return descriptor !== undefined && typeof descriptor.value === 'function';
39
+ });
40
+ for (const methodName of methodNames) {
41
+ const definition = this.reflector.get(mcp_tool_decorator_1.MCP_TOOL_METADATA, prototype[methodName]);
42
+ if (!definition)
43
+ continue;
44
+ this.logger.log(`Registered MCP tool: ${definition.name}`);
45
+ this.tools.set(definition.name, {
46
+ definition,
47
+ handler: instance[methodName].bind(instance),
48
+ });
49
+ }
50
+ }
51
+ this.logger.log(`McpRegistryService: ${this.tools.size} tools registered`);
52
+ }
53
+ getAll() {
54
+ return Array.from(this.tools.values());
55
+ }
56
+ get(toolName) {
57
+ return this.tools.get(toolName);
58
+ }
59
+ has(toolName) {
60
+ return this.tools.has(toolName);
61
+ }
62
+ };
63
+ exports.McpRegistryService = McpRegistryService;
64
+ exports.McpRegistryService = McpRegistryService = McpRegistryService_1 = __decorate([
65
+ (0, common_1.Injectable)(),
66
+ __metadata("design:paramtypes", [core_1.DiscoveryService,
67
+ core_2.Reflector])
68
+ ], McpRegistryService);
69
+ //# sourceMappingURL=mcp-registry.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-registry.service.js","sourceRoot":"","sources":["../../src/mcp/mcp-registry.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAAkE;AAClE,uCAAgD;AAChD,uCAAyC;AACzC,wEAAoE;AAU7D,IAAM,kBAAkB,0BAAxB,MAAM,kBAAkB;IAI7B,YACmB,SAA2B,EAC3B,SAAoB;QADpB,cAAS,GAAT,SAAS,CAAkB;QAC3B,cAAS,GAAT,SAAS,CAAW;QALtB,WAAM,GAAG,IAAI,eAAM,CAAC,oBAAkB,CAAC,IAAI,CAAC,CAAC;QAC7C,UAAK,GAAG,IAAI,GAAG,EAAwB,CAAC;IAKtD,CAAC;IAEJ,YAAY;QACV,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,EAAE,CAAC;QAEhD,KAAK,MAAM,OAAO,IAAI,SAAS,EAAE,CAAC;YAChC,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;YAC7B,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ;gBAAE,SAAS;YAExD,MAAM,SAAS,GAAG,MAAM,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC;YAClD,IAAI,CAAC,SAAS;gBAAE,SAAS;YAEzB,MAAM,WAAW,GAAG,MAAM,CAAC,mBAAmB,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;gBACvE,IAAI,GAAG,KAAK,aAAa;oBAAE,OAAO,KAAK,CAAC;gBACxC,MAAM,UAAU,GAAG,MAAM,CAAC,wBAAwB,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;gBACnE,OAAO,UAAU,KAAK,SAAS,IAAI,OAAO,UAAU,CAAC,KAAK,KAAK,UAAU,CAAC;YAC5E,CAAC,CAAC,CAAC;YAEH,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;gBACrC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CACnC,sCAAiB,EACjB,SAAS,CAAC,UAAU,CAAC,CACtB,CAAC;gBAEF,IAAI,CAAC,UAAU;oBAAE,SAAS;gBAE1B,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,wBAAwB,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC3D,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,EAAE;oBAC9B,UAAU;oBACV,OAAO,EAAG,QAAgB,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC;iBACtD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,uBAAuB,IAAI,CAAC,KAAK,CAAC,IAAI,mBAAmB,CAAC,CAAC;IAC7E,CAAC;IAED,MAAM;QACJ,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,GAAG,CAAC,QAAgB;QAClB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;IAED,GAAG,CAAC,QAAgB;QAClB,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;CACF,CAAA;AAvDY,gDAAkB;6BAAlB,kBAAkB;IAD9B,IAAA,mBAAU,GAAE;qCAMmB,uBAAgB;QAChB,gBAAS;GAN5B,kBAAkB,CAuD9B"}
@@ -0,0 +1,12 @@
1
+ import { Request, Response } from 'express';
2
+ import { McpAuditService } from './mcp-audit.service';
3
+ import { McpRegistryService } from './mcp-registry.service';
4
+ import { McpContext } from './types/mcp-context.type';
5
+ export declare class McpServerService {
6
+ private readonly registry;
7
+ private readonly audit;
8
+ constructor(registry: McpRegistryService, audit: McpAuditService);
9
+ handleRequest(req: Request, res: Response, context: McpContext): Promise<void>;
10
+ private buildServer;
11
+ }
12
+ //# sourceMappingURL=mcp-server.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server.service.d.ts","sourceRoot":"","sources":["../../src/mcp/mcp-server.service.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEtD,qBACa,gBAAgB;IAEzB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,KAAK;gBADL,QAAQ,EAAE,kBAAkB,EAC5B,KAAK,EAAE,eAAe;IAGnC,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IASpF,OAAO,CAAC,WAAW;CA0DpB"}
@@ -0,0 +1,94 @@
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.McpServerService = void 0;
13
+ const index_js_1 = require("@modelcontextprotocol/sdk/server/index.js");
14
+ const streamableHttp_js_1 = require("@modelcontextprotocol/sdk/server/streamableHttp.js");
15
+ const types_js_1 = require("@modelcontextprotocol/sdk/types.js");
16
+ const common_1 = require("@nestjs/common");
17
+ const mcp_audit_service_1 = require("./mcp-audit.service");
18
+ const mcp_registry_service_1 = require("./mcp-registry.service");
19
+ let McpServerService = class McpServerService {
20
+ constructor(registry, audit) {
21
+ this.registry = registry;
22
+ this.audit = audit;
23
+ }
24
+ async handleRequest(req, res, context) {
25
+ const server = this.buildServer(context);
26
+ const transport = new streamableHttp_js_1.StreamableHTTPServerTransport({
27
+ sessionIdGenerator: undefined,
28
+ });
29
+ await server.connect(transport);
30
+ await transport.handleRequest(req, res, req.body);
31
+ }
32
+ buildServer(context) {
33
+ const server = new index_js_1.Server({ name: 'hedhog-mcp', version: '1.0.0' }, { capabilities: { tools: {} } });
34
+ server.setRequestHandler(types_js_1.ListToolsRequestSchema, async () => ({
35
+ tools: this.registry.getAll().map((e) => {
36
+ var _a;
37
+ return ({
38
+ name: e.definition.name,
39
+ description: e.definition.description,
40
+ inputSchema: (_a = e.definition.inputSchema) !== null && _a !== void 0 ? _a : {
41
+ type: 'object',
42
+ properties: {},
43
+ },
44
+ });
45
+ }),
46
+ }));
47
+ server.setRequestHandler(types_js_1.CallToolRequestSchema, async (request) => {
48
+ var _a;
49
+ const toolName = request.params.name;
50
+ const args = ((_a = request.params.arguments) !== null && _a !== void 0 ? _a : {});
51
+ const entry = this.registry.get(toolName);
52
+ if (!entry) {
53
+ return {
54
+ isError: true,
55
+ content: [{ type: 'text', text: `Tool '${toolName}' not found` }],
56
+ };
57
+ }
58
+ const start = Date.now();
59
+ try {
60
+ const result = await entry.handler(args, Object.assign(Object.assign({}, context), { toolName }));
61
+ await this.audit.record({
62
+ userId: context.userId,
63
+ toolName,
64
+ input: args,
65
+ success: true,
66
+ durationMs: Date.now() - start,
67
+ });
68
+ return { content: [{ type: 'text', text: JSON.stringify(result) }] };
69
+ }
70
+ catch (e) {
71
+ await this.audit.record({
72
+ userId: context.userId,
73
+ toolName,
74
+ input: args,
75
+ success: false,
76
+ error: e.message,
77
+ durationMs: Date.now() - start,
78
+ });
79
+ return {
80
+ isError: true,
81
+ content: [{ type: 'text', text: e.message }],
82
+ };
83
+ }
84
+ });
85
+ return server;
86
+ }
87
+ };
88
+ exports.McpServerService = McpServerService;
89
+ exports.McpServerService = McpServerService = __decorate([
90
+ (0, common_1.Injectable)(),
91
+ __metadata("design:paramtypes", [mcp_registry_service_1.McpRegistryService,
92
+ mcp_audit_service_1.McpAuditService])
93
+ ], McpServerService);
94
+ //# sourceMappingURL=mcp-server.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp-server.service.js","sourceRoot":"","sources":["../../src/mcp/mcp-server.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import { Request, Response } from 'express';
2
+ import { McpServerService } from './mcp-server.service';
3
+ export declare class McpController {
4
+ private readonly mcpServer;
5
+ constructor(mcpServer: McpServerService);
6
+ handle(req: Request, res: Response): Promise<void>;
7
+ }
8
+ //# sourceMappingURL=mcp.controller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.controller.d.ts","sourceRoot":"","sources":["../../src/mcp/mcp.controller.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAG5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,qBAGa,aAAa;IACZ,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE,gBAAgB;IAGlD,MAAM,CAAQ,GAAG,EAAE,OAAO,EAAS,GAAG,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CAevE"}
@@ -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
+ 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.McpController = void 0;
16
+ const api_1 = require("@hed-hog/api");
17
+ const common_1 = require("@nestjs/common");
18
+ const mcp_auth_guard_1 = require("./guards/mcp-auth.guard");
19
+ const mcp_permission_guard_1 = require("./guards/mcp-permission.guard");
20
+ const mcp_server_service_1 = require("./mcp-server.service");
21
+ let McpController = class McpController {
22
+ constructor(mcpServer) {
23
+ this.mcpServer = mcpServer;
24
+ }
25
+ async handle(req, res) {
26
+ var _a, _b, _c, _d, _e;
27
+ const auth = req.auth;
28
+ const locale = (_c = (_b = (_a = req.headers['accept-language']) === null || _a === void 0 ? void 0 : _a.split(',')[0]) === null || _b === void 0 ? void 0 : _b.split('-')[0]) !== null && _c !== void 0 ? _c : 'en';
29
+ const body = req.body;
30
+ const toolName = (body === null || body === void 0 ? void 0 : body.method) === 'tools/call' ? ((_e = (_d = body === null || body === void 0 ? void 0 : body.params) === null || _d === void 0 ? void 0 : _d.name) !== null && _e !== void 0 ? _e : '') : '';
31
+ await this.mcpServer.handleRequest(req, res, {
32
+ userId: auth.sub,
33
+ sessionId: String(auth.sessionId),
34
+ locale,
35
+ toolName,
36
+ });
37
+ }
38
+ };
39
+ exports.McpController = McpController;
40
+ __decorate([
41
+ (0, common_1.All)(),
42
+ __param(0, (0, common_1.Req)()),
43
+ __param(1, (0, common_1.Res)()),
44
+ __metadata("design:type", Function),
45
+ __metadata("design:paramtypes", [Object, Object]),
46
+ __metadata("design:returntype", Promise)
47
+ ], McpController.prototype, "handle", null);
48
+ exports.McpController = McpController = __decorate([
49
+ (0, api_1.NoRole)(),
50
+ (0, common_1.UseGuards)(mcp_auth_guard_1.McpAuthGuard, mcp_permission_guard_1.McpPermissionGuard),
51
+ (0, common_1.Controller)('mcp'),
52
+ __metadata("design:paramtypes", [mcp_server_service_1.McpServerService])
53
+ ], McpController);
54
+ //# sourceMappingURL=mcp.controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.controller.js","sourceRoot":"","sources":["../../src/mcp/mcp.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,sCAAsC;AACtC,2CAAsE;AAEtE,4DAAuD;AACvD,wEAAmE;AACnE,6DAAwD;AAKjD,IAAM,aAAa,GAAnB,MAAM,aAAa;IACxB,YAA6B,SAA2B;QAA3B,cAAS,GAAT,SAAS,CAAkB;IAAG,CAAC;IAGtD,AAAN,KAAK,CAAC,MAAM,CAAQ,GAAY,EAAS,GAAa;;QACpD,MAAM,IAAI,GAAI,GAAW,CAAC,IAAI,CAAC;QAC/B,MAAM,MAAM,GACV,MAAA,MAAA,MAAA,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAC,0CAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,0CAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,mCAAI,IAAI,CAAC;QACvE,MAAM,IAAI,GAAG,GAAG,CAAC,IAAW,CAAC;QAC7B,MAAM,QAAQ,GACZ,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,MAAM,MAAK,YAAY,CAAC,CAAC,CAAC,CAAC,MAAA,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,MAAM,0CAAE,IAAI,mCAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAElE,MAAM,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE;YAC3C,MAAM,EAAE,IAAI,CAAC,GAAG;YAChB,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC;YACjC,MAAM;YACN,QAAQ;SACT,CAAC,CAAC;IACL,CAAC;CACF,CAAA;AAnBY,sCAAa;AAIlB;IADL,IAAA,YAAG,GAAE;IACQ,WAAA,IAAA,YAAG,GAAE,CAAA;IAAgB,WAAA,IAAA,YAAG,GAAE,CAAA;;;;2CAcvC;wBAlBU,aAAa;IAHzB,IAAA,YAAM,GAAE;IACR,IAAA,kBAAS,EAAC,6BAAY,EAAE,yCAAkB,CAAC;IAC3C,IAAA,mBAAU,EAAC,KAAK,CAAC;qCAEwB,qCAAgB;GAD7C,aAAa,CAmBzB"}
@@ -0,0 +1,3 @@
1
+ export declare class McpModule {
2
+ }
3
+ //# sourceMappingURL=mcp.module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.module.d.ts","sourceRoot":"","sources":["../../src/mcp/mcp.module.ts"],"names":[],"mappings":"AAeA,qBAoBa,SAAS;CAAG"}
@@ -0,0 +1,49 @@
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.McpModule = void 0;
10
+ const api_prisma_1 = require("@hed-hog/api-prisma");
11
+ const common_1 = require("@nestjs/common");
12
+ const core_1 = require("@nestjs/core");
13
+ const setting_module_1 = require("../setting/setting.module");
14
+ const token_module_1 = require("../token/token.module");
15
+ const user_module_1 = require("../user/user.module");
16
+ const mcp_auth_guard_1 = require("./guards/mcp-auth.guard");
17
+ const mcp_permission_guard_1 = require("./guards/mcp-permission.guard");
18
+ const mcp_audit_service_1 = require("./mcp-audit.service");
19
+ const mcp_registry_service_1 = require("./mcp-registry.service");
20
+ const mcp_server_service_1 = require("./mcp-server.service");
21
+ const mcp_controller_1 = require("./mcp.controller");
22
+ const core_settings_mcp_tools_1 = require("./tools/core-settings.mcp-tools");
23
+ const core_users_mcp_tools_1 = require("./tools/core-users.mcp-tools");
24
+ let McpModule = class McpModule {
25
+ };
26
+ exports.McpModule = McpModule;
27
+ exports.McpModule = McpModule = __decorate([
28
+ (0, common_1.Module)({
29
+ imports: [
30
+ core_1.DiscoveryModule,
31
+ (0, common_1.forwardRef)(() => api_prisma_1.PrismaModule),
32
+ (0, common_1.forwardRef)(() => token_module_1.TokenModule),
33
+ (0, common_1.forwardRef)(() => setting_module_1.SettingModule),
34
+ (0, common_1.forwardRef)(() => user_module_1.UserModule),
35
+ ],
36
+ controllers: [mcp_controller_1.McpController],
37
+ providers: [
38
+ mcp_registry_service_1.McpRegistryService,
39
+ mcp_server_service_1.McpServerService,
40
+ mcp_audit_service_1.McpAuditService,
41
+ mcp_auth_guard_1.McpAuthGuard,
42
+ mcp_permission_guard_1.McpPermissionGuard,
43
+ core_settings_mcp_tools_1.CoreSettingsMcpTools,
44
+ core_users_mcp_tools_1.CoreUsersMcpTools,
45
+ ],
46
+ exports: [mcp_registry_service_1.McpRegistryService, mcp_server_service_1.McpServerService],
47
+ })
48
+ ], McpModule);
49
+ //# sourceMappingURL=mcp.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.module.js","sourceRoot":"","sources":["../../src/mcp/mcp.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,oDAAmD;AACnD,2CAAoD;AACpD,uCAA+C;AAC/C,8DAA0D;AAC1D,wDAAoD;AACpD,qDAAiD;AACjD,4DAAuD;AACvD,wEAAmE;AACnE,2DAAsD;AACtD,iEAA4D;AAC5D,6DAAwD;AACxD,qDAAiD;AACjD,6EAAuE;AACvE,uEAAiE;AAsB1D,IAAM,SAAS,GAAf,MAAM,SAAS;CAAG,CAAA;AAAZ,8BAAS;oBAAT,SAAS;IApBrB,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,sBAAe;YACf,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,yBAAY,CAAC;YAC9B,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,0BAAW,CAAC;YAC7B,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,8BAAa,CAAC;YAC/B,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,wBAAU,CAAC;SAC7B;QACD,WAAW,EAAE,CAAC,8BAAa,CAAC;QAC5B,SAAS,EAAE;YACT,yCAAkB;YAClB,qCAAgB;YAChB,mCAAe;YACf,6BAAY;YACZ,yCAAkB;YAClB,8CAAoB;YACpB,wCAAiB;SAClB;QACD,OAAO,EAAE,CAAC,yCAAkB,EAAE,qCAAgB,CAAC;KAChD,CAAC;GACW,SAAS,CAAG"}
@@ -0,0 +1,12 @@
1
+ import { SettingService } from '../../setting/setting.service';
2
+ import { McpContext } from '../types/mcp-context.type';
3
+ export declare class CoreSettingsMcpTools {
4
+ private readonly settingService;
5
+ constructor(settingService: SettingService);
6
+ getEffectiveSettings(_args: Record<string, any>, context: McpContext): Promise<any>;
7
+ setUserSetting(args: {
8
+ slug: string;
9
+ value: string;
10
+ }, context: McpContext): Promise<any>;
11
+ }
12
+ //# sourceMappingURL=core-settings.mcp-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core-settings.mcp-tools.d.ts","sourceRoot":"","sources":["../../../src/mcp/tools/core-settings.mcp-tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAE/D,OAAO,EAAE,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAEvD,qBACa,oBAAoB;IACnB,OAAO,CAAC,QAAQ,CAAC,cAAc;gBAAd,cAAc,EAAE,cAAc;IAQrD,oBAAoB,CACxB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1B,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,GAAG,CAAC;IAuBT,cAAc,CAClB,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,EACrC,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,GAAG,CAAC;CAQhB"}
@@ -0,0 +1,66 @@
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.CoreSettingsMcpTools = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const setting_service_1 = require("../../setting/setting.service");
15
+ const mcp_tool_decorator_1 = require("../decorators/mcp-tool.decorator");
16
+ let CoreSettingsMcpTools = class CoreSettingsMcpTools {
17
+ constructor(settingService) {
18
+ this.settingService = settingService;
19
+ }
20
+ async getEffectiveSettings(_args, context) {
21
+ return this.settingService.getEffectiveSettings(context.userId);
22
+ }
23
+ async setUserSetting(args, context) {
24
+ return this.settingService.setSettingUserValue(context.locale, context.userId, args.slug, args.value);
25
+ }
26
+ };
27
+ exports.CoreSettingsMcpTools = CoreSettingsMcpTools;
28
+ __decorate([
29
+ (0, mcp_tool_decorator_1.McpTool)({
30
+ name: 'core.settings.get',
31
+ description: 'Returns effective settings for the authenticated user',
32
+ inputSchema: { type: 'object', properties: {} },
33
+ readOnly: true,
34
+ }),
35
+ __metadata("design:type", Function),
36
+ __metadata("design:paramtypes", [Object, Object]),
37
+ __metadata("design:returntype", Promise)
38
+ ], CoreSettingsMcpTools.prototype, "getEffectiveSettings", null);
39
+ __decorate([
40
+ (0, mcp_tool_decorator_1.McpTool)({
41
+ name: 'core.settings.set',
42
+ description: 'Updates a user-overridable setting value for the authenticated user. Only settings with user_override=true can be changed.',
43
+ inputSchema: {
44
+ type: 'object',
45
+ properties: {
46
+ slug: {
47
+ type: 'string',
48
+ description: 'The slug identifier of the setting to update',
49
+ },
50
+ value: {
51
+ type: 'string',
52
+ description: 'The new value for the setting',
53
+ },
54
+ },
55
+ required: ['slug', 'value'],
56
+ },
57
+ }),
58
+ __metadata("design:type", Function),
59
+ __metadata("design:paramtypes", [Object, Object]),
60
+ __metadata("design:returntype", Promise)
61
+ ], CoreSettingsMcpTools.prototype, "setUserSetting", null);
62
+ exports.CoreSettingsMcpTools = CoreSettingsMcpTools = __decorate([
63
+ (0, common_1.Injectable)(),
64
+ __metadata("design:paramtypes", [setting_service_1.SettingService])
65
+ ], CoreSettingsMcpTools);
66
+ //# sourceMappingURL=core-settings.mcp-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core-settings.mcp-tools.js","sourceRoot":"","sources":["../../../src/mcp/tools/core-settings.mcp-tools.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,mEAA+D;AAC/D,yEAA2D;AAIpD,IAAM,oBAAoB,GAA1B,MAAM,oBAAoB;IAC/B,YAA6B,cAA8B;QAA9B,mBAAc,GAAd,cAAc,CAAgB;IAAG,CAAC;IAQzD,AAAN,KAAK,CAAC,oBAAoB,CACxB,KAA0B,EAC1B,OAAmB;QAEnB,OAAO,IAAI,CAAC,cAAc,CAAC,oBAAoB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAClE,CAAC;IAqBK,AAAN,KAAK,CAAC,cAAc,CAClB,IAAqC,EACrC,OAAmB;QAEnB,OAAO,IAAI,CAAC,cAAc,CAAC,mBAAmB,CAC5C,OAAO,CAAC,MAAM,EACd,OAAO,CAAC,MAAM,EACd,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,KAAK,CACX,CAAC;IACJ,CAAC;CACF,CAAA;AA9CY,oDAAoB;AASzB;IANL,IAAA,4BAAO,EAAC;QACP,IAAI,EAAE,mBAAmB;QACzB,WAAW,EAAE,uDAAuD;QACpE,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,EAAE;QAC/C,QAAQ,EAAE,IAAI;KACf,CAAC;;;;gEAMD;AAqBK;IAnBL,IAAA,4BAAO,EAAC;QACP,IAAI,EAAE,mBAAmB;QACzB,WAAW,EACT,4HAA4H;QAC9H,WAAW,EAAE;YACX,IAAI,EAAE,QAAQ;YACd,UAAU,EAAE;gBACV,IAAI,EAAE;oBACJ,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,8CAA8C;iBAC5D;gBACD,KAAK,EAAE;oBACL,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,+BAA+B;iBAC7C;aACF;YACD,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC;SAC5B;KACF,CAAC;;;;0DAWD;+BA7CU,oBAAoB;IADhC,IAAA,mBAAU,GAAE;qCAEkC,gCAAc;GADhD,oBAAoB,CA8ChC"}