@dxheroes/local-mcp-backend 0.3.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.
Files changed (106) hide show
  1. package/.swcrc +22 -0
  2. package/.turbo/turbo-build.log +9 -0
  3. package/AGENTS.md +360 -0
  4. package/CHANGELOG.md +60 -0
  5. package/Dockerfile +71 -0
  6. package/LICENSE +94 -0
  7. package/dist/app.module.js +72 -0
  8. package/dist/app.module.js.map +1 -0
  9. package/dist/common/decorators/request-id.decorator.js +12 -0
  10. package/dist/common/decorators/request-id.decorator.js.map +1 -0
  11. package/dist/common/filters/all-exceptions.filter.js +61 -0
  12. package/dist/common/filters/all-exceptions.filter.js.map +1 -0
  13. package/dist/common/interceptors/logging.interceptor.js +46 -0
  14. package/dist/common/interceptors/logging.interceptor.js.map +1 -0
  15. package/dist/common/pipes/validation.pipe.js +43 -0
  16. package/dist/common/pipes/validation.pipe.js.map +1 -0
  17. package/dist/config/app.config.js +14 -0
  18. package/dist/config/app.config.js.map +1 -0
  19. package/dist/config/database.config.js +30 -0
  20. package/dist/config/database.config.js.map +1 -0
  21. package/dist/main.js +68 -0
  22. package/dist/main.js.map +1 -0
  23. package/dist/modules/database/database.module.js +27 -0
  24. package/dist/modules/database/database.module.js.map +1 -0
  25. package/dist/modules/database/prisma.service.js +122 -0
  26. package/dist/modules/database/prisma.service.js.map +1 -0
  27. package/dist/modules/debug/debug.controller.js +87 -0
  28. package/dist/modules/debug/debug.controller.js.map +1 -0
  29. package/dist/modules/debug/debug.module.js +30 -0
  30. package/dist/modules/debug/debug.module.js.map +1 -0
  31. package/dist/modules/debug/debug.service.js +126 -0
  32. package/dist/modules/debug/debug.service.js.map +1 -0
  33. package/dist/modules/health/health.controller.js +69 -0
  34. package/dist/modules/health/health.controller.js.map +1 -0
  35. package/dist/modules/health/health.module.js +23 -0
  36. package/dist/modules/health/health.module.js.map +1 -0
  37. package/dist/modules/mcp/dto/create-mcp-server.dto.js +74 -0
  38. package/dist/modules/mcp/dto/create-mcp-server.dto.js.map +1 -0
  39. package/dist/modules/mcp/dto/update-mcp-server.dto.js +74 -0
  40. package/dist/modules/mcp/dto/update-mcp-server.dto.js.map +1 -0
  41. package/dist/modules/mcp/mcp-discovery.service.js +176 -0
  42. package/dist/modules/mcp/mcp-discovery.service.js.map +1 -0
  43. package/dist/modules/mcp/mcp-registry.js +67 -0
  44. package/dist/modules/mcp/mcp-registry.js.map +1 -0
  45. package/dist/modules/mcp/mcp-seed.service.js +122 -0
  46. package/dist/modules/mcp/mcp-seed.service.js.map +1 -0
  47. package/dist/modules/mcp/mcp.controller.js +152 -0
  48. package/dist/modules/mcp/mcp.controller.js.map +1 -0
  49. package/dist/modules/mcp/mcp.module.js +70 -0
  50. package/dist/modules/mcp/mcp.module.js.map +1 -0
  51. package/dist/modules/mcp/mcp.service.js +401 -0
  52. package/dist/modules/mcp/mcp.service.js.map +1 -0
  53. package/dist/modules/oauth/oauth.controller.js +116 -0
  54. package/dist/modules/oauth/oauth.controller.js.map +1 -0
  55. package/dist/modules/oauth/oauth.module.js +31 -0
  56. package/dist/modules/oauth/oauth.module.js.map +1 -0
  57. package/dist/modules/oauth/oauth.service.js +183 -0
  58. package/dist/modules/oauth/oauth.service.js.map +1 -0
  59. package/dist/modules/profiles/profiles.controller.js +241 -0
  60. package/dist/modules/profiles/profiles.controller.js.map +1 -0
  61. package/dist/modules/profiles/profiles.module.js +34 -0
  62. package/dist/modules/profiles/profiles.module.js.map +1 -0
  63. package/dist/modules/profiles/profiles.service.js +390 -0
  64. package/dist/modules/profiles/profiles.service.js.map +1 -0
  65. package/dist/modules/proxy/proxy.controller.js +98 -0
  66. package/dist/modules/proxy/proxy.controller.js.map +1 -0
  67. package/dist/modules/proxy/proxy.module.js +36 -0
  68. package/dist/modules/proxy/proxy.module.js.map +1 -0
  69. package/dist/modules/proxy/proxy.service.js +439 -0
  70. package/dist/modules/proxy/proxy.service.js.map +1 -0
  71. package/docker-entrypoint.sh +10 -0
  72. package/nest-cli.json +10 -0
  73. package/package.json +51 -0
  74. package/src/app.module.ts +59 -0
  75. package/src/common/decorators/request-id.decorator.ts +16 -0
  76. package/src/common/filters/all-exceptions.filter.ts +77 -0
  77. package/src/common/interceptors/logging.interceptor.ts +45 -0
  78. package/src/common/pipes/validation.pipe.ts +31 -0
  79. package/src/config/app.config.ts +15 -0
  80. package/src/config/database.config.ts +34 -0
  81. package/src/main.ts +66 -0
  82. package/src/modules/database/database.module.ts +15 -0
  83. package/src/modules/database/prisma.service.ts +110 -0
  84. package/src/modules/debug/debug.controller.ts +53 -0
  85. package/src/modules/debug/debug.module.ts +16 -0
  86. package/src/modules/debug/debug.service.ts +143 -0
  87. package/src/modules/health/health.controller.ts +48 -0
  88. package/src/modules/health/health.module.ts +13 -0
  89. package/src/modules/mcp/dto/create-mcp-server.dto.ts +53 -0
  90. package/src/modules/mcp/dto/update-mcp-server.dto.ts +53 -0
  91. package/src/modules/mcp/mcp-discovery.service.ts +205 -0
  92. package/src/modules/mcp/mcp-registry.ts +73 -0
  93. package/src/modules/mcp/mcp-seed.service.ts +125 -0
  94. package/src/modules/mcp/mcp.controller.ts +98 -0
  95. package/src/modules/mcp/mcp.module.ts +48 -0
  96. package/src/modules/mcp/mcp.service.ts +427 -0
  97. package/src/modules/oauth/oauth.controller.ts +89 -0
  98. package/src/modules/oauth/oauth.module.ts +17 -0
  99. package/src/modules/oauth/oauth.service.ts +212 -0
  100. package/src/modules/profiles/profiles.controller.ts +177 -0
  101. package/src/modules/profiles/profiles.module.ts +18 -0
  102. package/src/modules/profiles/profiles.service.ts +421 -0
  103. package/src/modules/proxy/proxy.controller.ts +61 -0
  104. package/src/modules/proxy/proxy.module.ts +19 -0
  105. package/src/modules/proxy/proxy.service.ts +595 -0
  106. package/tsconfig.json +28 -0
@@ -0,0 +1,67 @@
1
+ /**
2
+ * MCP Registry
3
+ *
4
+ * In-memory registry of discovered MCP packages.
5
+ */ function _ts_decorate(decorators, target, key, desc) {
6
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
7
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
8
+ 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;
9
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
10
+ }
11
+ import { Injectable } from "@nestjs/common";
12
+ export class McpRegistry {
13
+ /**
14
+ * Register a discovered MCP package
15
+ */ register(pkg) {
16
+ this.packages.set(pkg.package.metadata.id, pkg);
17
+ }
18
+ /**
19
+ * Get a package by its ID
20
+ */ get(id) {
21
+ return this.packages.get(id)?.package;
22
+ }
23
+ /**
24
+ * Get full discovered package info by ID
25
+ */ getDiscovered(id) {
26
+ return this.packages.get(id);
27
+ }
28
+ /**
29
+ * Get all registered packages
30
+ */ getAll() {
31
+ return Array.from(this.packages.values()).map((p)=>p.package);
32
+ }
33
+ /**
34
+ * Get all discovered packages
35
+ */ getAllDiscovered() {
36
+ return Array.from(this.packages.values());
37
+ }
38
+ /**
39
+ * Check if a package is registered
40
+ */ has(id) {
41
+ return this.packages.has(id);
42
+ }
43
+ /**
44
+ * Get package metadata for UI
45
+ */ getAllMetadata() {
46
+ return this.getAll().map((pkg)=>({
47
+ id: pkg.metadata.id,
48
+ name: pkg.metadata.name,
49
+ description: pkg.metadata.description,
50
+ version: pkg.metadata.version,
51
+ requiresApiKey: pkg.metadata.requiresApiKey,
52
+ apiKeyHint: pkg.metadata.apiKeyHint,
53
+ requiresOAuth: pkg.metadata.requiresOAuth,
54
+ tags: pkg.metadata.tags,
55
+ icon: pkg.metadata.icon,
56
+ docsUrl: pkg.metadata.docsUrl
57
+ }));
58
+ }
59
+ constructor(){
60
+ this.packages = new Map();
61
+ }
62
+ }
63
+ McpRegistry = _ts_decorate([
64
+ Injectable()
65
+ ], McpRegistry);
66
+
67
+ //# sourceMappingURL=mcp-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/modules/mcp/mcp-registry.ts"],"sourcesContent":["/**\n * MCP Registry\n *\n * In-memory registry of discovered MCP packages.\n */\n\nimport type { DiscoveredMcpPackage, McpPackage } from '@dxheroes/local-mcp-core';\nimport { Injectable } from '@nestjs/common';\n\n@Injectable()\nexport class McpRegistry {\n private readonly packages = new Map<string, DiscoveredMcpPackage>();\n\n /**\n * Register a discovered MCP package\n */\n register(pkg: DiscoveredMcpPackage): void {\n this.packages.set(pkg.package.metadata.id, pkg);\n }\n\n /**\n * Get a package by its ID\n */\n get(id: string): McpPackage | undefined {\n return this.packages.get(id)?.package;\n }\n\n /**\n * Get full discovered package info by ID\n */\n getDiscovered(id: string): DiscoveredMcpPackage | undefined {\n return this.packages.get(id);\n }\n\n /**\n * Get all registered packages\n */\n getAll(): McpPackage[] {\n return Array.from(this.packages.values()).map((p) => p.package);\n }\n\n /**\n * Get all discovered packages\n */\n getAllDiscovered(): DiscoveredMcpPackage[] {\n return Array.from(this.packages.values());\n }\n\n /**\n * Check if a package is registered\n */\n has(id: string): boolean {\n return this.packages.has(id);\n }\n\n /**\n * Get package metadata for UI\n */\n getAllMetadata() {\n return this.getAll().map((pkg) => ({\n id: pkg.metadata.id,\n name: pkg.metadata.name,\n description: pkg.metadata.description,\n version: pkg.metadata.version,\n requiresApiKey: pkg.metadata.requiresApiKey,\n apiKeyHint: pkg.metadata.apiKeyHint,\n requiresOAuth: pkg.metadata.requiresOAuth,\n tags: pkg.metadata.tags,\n icon: pkg.metadata.icon,\n docsUrl: pkg.metadata.docsUrl,\n }));\n }\n}\n"],"names":["Injectable","McpRegistry","register","pkg","packages","set","package","metadata","id","get","getDiscovered","getAll","Array","from","values","map","p","getAllDiscovered","has","getAllMetadata","name","description","version","requiresApiKey","apiKeyHint","requiresOAuth","tags","icon","docsUrl","Map"],"mappings":"AAAA;;;;CAIC;;;;;;AAGD,SAASA,UAAU,QAAQ,iBAAiB;AAG5C,OAAO,MAAMC;IAGX;;GAEC,GACDC,SAASC,GAAyB,EAAQ;QACxC,IAAI,CAACC,QAAQ,CAACC,GAAG,CAACF,IAAIG,OAAO,CAACC,QAAQ,CAACC,EAAE,EAAEL;IAC7C;IAEA;;GAEC,GACDM,IAAID,EAAU,EAA0B;QACtC,OAAO,IAAI,CAACJ,QAAQ,CAACK,GAAG,CAACD,KAAKF;IAChC;IAEA;;GAEC,GACDI,cAAcF,EAAU,EAAoC;QAC1D,OAAO,IAAI,CAACJ,QAAQ,CAACK,GAAG,CAACD;IAC3B;IAEA;;GAEC,GACDG,SAAuB;QACrB,OAAOC,MAAMC,IAAI,CAAC,IAAI,CAACT,QAAQ,CAACU,MAAM,IAAIC,GAAG,CAAC,CAACC,IAAMA,EAAEV,OAAO;IAChE;IAEA;;GAEC,GACDW,mBAA2C;QACzC,OAAOL,MAAMC,IAAI,CAAC,IAAI,CAACT,QAAQ,CAACU,MAAM;IACxC;IAEA;;GAEC,GACDI,IAAIV,EAAU,EAAW;QACvB,OAAO,IAAI,CAACJ,QAAQ,CAACc,GAAG,CAACV;IAC3B;IAEA;;GAEC,GACDW,iBAAiB;QACf,OAAO,IAAI,CAACR,MAAM,GAAGI,GAAG,CAAC,CAACZ,MAAS,CAAA;gBACjCK,IAAIL,IAAII,QAAQ,CAACC,EAAE;gBACnBY,MAAMjB,IAAII,QAAQ,CAACa,IAAI;gBACvBC,aAAalB,IAAII,QAAQ,CAACc,WAAW;gBACrCC,SAASnB,IAAII,QAAQ,CAACe,OAAO;gBAC7BC,gBAAgBpB,IAAII,QAAQ,CAACgB,cAAc;gBAC3CC,YAAYrB,IAAII,QAAQ,CAACiB,UAAU;gBACnCC,eAAetB,IAAII,QAAQ,CAACkB,aAAa;gBACzCC,MAAMvB,IAAII,QAAQ,CAACmB,IAAI;gBACvBC,MAAMxB,IAAII,QAAQ,CAACoB,IAAI;gBACvBC,SAASzB,IAAII,QAAQ,CAACqB,OAAO;YAC/B,CAAA;IACF;;aA5DiBxB,WAAW,IAAIyB;;AA6DlC"}
@@ -0,0 +1,122 @@
1
+ function _ts_decorate(decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ 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;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ }
7
+ function _ts_metadata(k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ }
10
+ /**
11
+ * MCP Seed Service
12
+ *
13
+ * Seeds MCP server records from discovered packages.
14
+ */ import { randomUUID } from "node:crypto";
15
+ import { Injectable, Logger } from "@nestjs/common";
16
+ import { PrismaService } from "../database/prisma.service.js";
17
+ export class McpSeedService {
18
+ constructor(prisma){
19
+ this.prisma = prisma;
20
+ this.logger = new Logger(McpSeedService.name);
21
+ }
22
+ /**
23
+ * Run seed data for all discovered MCP packages
24
+ *
25
+ * Seeding is idempotent - only creates records that don't exist
26
+ */ async runSeeds(packages) {
27
+ this.logger.log(`Running seeds for ${packages.length} MCP packages`);
28
+ // Ensure default profile exists
29
+ await this.ensureDefaultProfile();
30
+ for (const { package: pkg, packageName } of packages){
31
+ try {
32
+ await this.seedPackage(pkg, packageName);
33
+ } catch (error) {
34
+ this.logger.error(`Failed to seed ${packageName}: ${error}`);
35
+ }
36
+ }
37
+ this.logger.log('MCP seeding complete');
38
+ }
39
+ async ensureDefaultProfile() {
40
+ const defaultProfile = await this.prisma.profile.findUnique({
41
+ where: {
42
+ name: 'default'
43
+ }
44
+ });
45
+ if (!defaultProfile) {
46
+ await this.prisma.profile.create({
47
+ data: {
48
+ id: randomUUID(),
49
+ name: 'default',
50
+ description: 'Default MCP profile'
51
+ }
52
+ });
53
+ this.logger.log('Created default profile');
54
+ }
55
+ }
56
+ async seedPackage(pkg, _packageName) {
57
+ const { metadata, seed } = pkg;
58
+ // Check if MCP server already exists (by builtinId in config)
59
+ const existingServer = await this.findServerByBuiltinId(metadata.id);
60
+ if (existingServer) {
61
+ this.logger.debug(`MCP server ${metadata.id} already exists, skipping seed`);
62
+ return;
63
+ }
64
+ // Create the MCP server record
65
+ const serverId = randomUUID();
66
+ await this.prisma.mcpServer.create({
67
+ data: {
68
+ id: serverId,
69
+ name: metadata.name,
70
+ type: 'builtin',
71
+ config: JSON.stringify({
72
+ builtinId: metadata.id
73
+ })
74
+ }
75
+ });
76
+ this.logger.log(`Created MCP server: ${metadata.name} (${metadata.id})`);
77
+ // Link to profile if seed config specifies
78
+ if (seed?.defaultProfile) {
79
+ const profile = await this.prisma.profile.findUnique({
80
+ where: {
81
+ name: seed.defaultProfile
82
+ }
83
+ });
84
+ if (profile) {
85
+ await this.prisma.profileMcpServer.create({
86
+ data: {
87
+ id: randomUUID(),
88
+ profileId: profile.id,
89
+ mcpServerId: serverId,
90
+ order: seed.defaultOrder ?? 0,
91
+ isActive: seed.defaultActive ?? true
92
+ }
93
+ });
94
+ this.logger.log(`Linked ${metadata.name} to profile: ${seed.defaultProfile}`);
95
+ }
96
+ }
97
+ }
98
+ async findServerByBuiltinId(builtinId) {
99
+ const servers = await this.prisma.mcpServer.findMany({
100
+ where: {
101
+ type: 'builtin'
102
+ }
103
+ });
104
+ return servers.some((s)=>{
105
+ try {
106
+ const config = JSON.parse(s.config);
107
+ return config.builtinId === builtinId;
108
+ } catch {
109
+ return false;
110
+ }
111
+ });
112
+ }
113
+ }
114
+ McpSeedService = _ts_decorate([
115
+ Injectable(),
116
+ _ts_metadata("design:type", Function),
117
+ _ts_metadata("design:paramtypes", [
118
+ typeof PrismaService === "undefined" ? Object : PrismaService
119
+ ])
120
+ ], McpSeedService);
121
+
122
+ //# sourceMappingURL=mcp-seed.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/modules/mcp/mcp-seed.service.ts"],"sourcesContent":["/**\n * MCP Seed Service\n *\n * Seeds MCP server records from discovered packages.\n */\n\nimport { randomUUID } from 'node:crypto';\nimport type { DiscoveredMcpPackage } from '@dxheroes/local-mcp-core';\nimport { Injectable, Logger } from '@nestjs/common';\nimport { PrismaService } from '../database/prisma.service.js';\n\ninterface McpServerConfig {\n builtinId?: string;\n}\n\n@Injectable()\nexport class McpSeedService {\n private readonly logger = new Logger(McpSeedService.name);\n\n constructor(private readonly prisma: PrismaService) {}\n\n /**\n * Run seed data for all discovered MCP packages\n *\n * Seeding is idempotent - only creates records that don't exist\n */\n async runSeeds(packages: DiscoveredMcpPackage[]): Promise<void> {\n this.logger.log(`Running seeds for ${packages.length} MCP packages`);\n\n // Ensure default profile exists\n await this.ensureDefaultProfile();\n\n for (const { package: pkg, packageName } of packages) {\n try {\n await this.seedPackage(pkg, packageName);\n } catch (error) {\n this.logger.error(`Failed to seed ${packageName}: ${error}`);\n }\n }\n\n this.logger.log('MCP seeding complete');\n }\n\n private async ensureDefaultProfile(): Promise<void> {\n const defaultProfile = await this.prisma.profile.findUnique({\n where: { name: 'default' },\n });\n\n if (!defaultProfile) {\n await this.prisma.profile.create({\n data: {\n id: randomUUID(),\n name: 'default',\n description: 'Default MCP profile',\n },\n });\n this.logger.log('Created default profile');\n }\n }\n\n private async seedPackage(\n pkg: DiscoveredMcpPackage['package'],\n _packageName: string\n ): Promise<void> {\n const { metadata, seed } = pkg;\n\n // Check if MCP server already exists (by builtinId in config)\n const existingServer = await this.findServerByBuiltinId(metadata.id);\n\n if (existingServer) {\n this.logger.debug(`MCP server ${metadata.id} already exists, skipping seed`);\n return;\n }\n\n // Create the MCP server record\n const serverId = randomUUID();\n\n await this.prisma.mcpServer.create({\n data: {\n id: serverId,\n name: metadata.name,\n type: 'builtin',\n config: JSON.stringify({ builtinId: metadata.id }),\n },\n });\n\n this.logger.log(`Created MCP server: ${metadata.name} (${metadata.id})`);\n\n // Link to profile if seed config specifies\n if (seed?.defaultProfile) {\n const profile = await this.prisma.profile.findUnique({\n where: { name: seed.defaultProfile },\n });\n\n if (profile) {\n await this.prisma.profileMcpServer.create({\n data: {\n id: randomUUID(),\n profileId: profile.id,\n mcpServerId: serverId,\n order: seed.defaultOrder ?? 0,\n isActive: seed.defaultActive ?? true,\n },\n });\n\n this.logger.log(`Linked ${metadata.name} to profile: ${seed.defaultProfile}`);\n }\n }\n }\n\n private async findServerByBuiltinId(builtinId: string): Promise<boolean> {\n const servers = await this.prisma.mcpServer.findMany({\n where: { type: 'builtin' },\n });\n\n return servers.some((s) => {\n try {\n const config = JSON.parse(s.config as string) as McpServerConfig;\n return config.builtinId === builtinId;\n } catch {\n return false;\n }\n });\n }\n}\n"],"names":["randomUUID","Injectable","Logger","PrismaService","McpSeedService","prisma","logger","name","runSeeds","packages","log","length","ensureDefaultProfile","package","pkg","packageName","seedPackage","error","defaultProfile","profile","findUnique","where","create","data","id","description","_packageName","metadata","seed","existingServer","findServerByBuiltinId","debug","serverId","mcpServer","type","config","JSON","stringify","builtinId","profileMcpServer","profileId","mcpServerId","order","defaultOrder","isActive","defaultActive","servers","findMany","some","s","parse"],"mappings":"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"}
@@ -0,0 +1,152 @@
1
+ function _ts_decorate(decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ 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;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ }
7
+ function _ts_metadata(k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ }
10
+ function _ts_param(paramIndex, decorator) {
11
+ return function(target, key) {
12
+ decorator(target, key, paramIndex);
13
+ };
14
+ }
15
+ /**
16
+ * MCP Controller
17
+ *
18
+ * REST API endpoints for MCP server management.
19
+ */ import { Body, Controller, Delete, Get, HttpCode, HttpStatus, Param, Post, Put } from "@nestjs/common";
20
+ import { CreateMcpServerDto } from "./dto/create-mcp-server.dto.js";
21
+ import { UpdateMcpServerDto } from "./dto/update-mcp-server.dto.js";
22
+ import { McpService } from "./mcp.service.js";
23
+ import { McpRegistry } from "./mcp-registry.js";
24
+ export class McpController {
25
+ constructor(mcpService, registry){
26
+ this.mcpService = mcpService;
27
+ this.registry = registry;
28
+ }
29
+ /**
30
+ * Get all available MCP packages (discovered)
31
+ */ getAvailablePackages() {
32
+ const metadata = this.registry.getAllMetadata();
33
+ console.log('[McpController] getAllMetadata result:', metadata);
34
+ console.log('[McpController] registry has packages:', this.registry.getAll().length);
35
+ return metadata;
36
+ }
37
+ /**
38
+ * Get all configured MCP servers
39
+ */ async getAll() {
40
+ return this.mcpService.findAll();
41
+ }
42
+ /**
43
+ * Get a specific MCP server
44
+ */ async getOne(id) {
45
+ return this.mcpService.findById(id);
46
+ }
47
+ /**
48
+ * Create a new MCP server configuration
49
+ */ async create(dto) {
50
+ return this.mcpService.create(dto);
51
+ }
52
+ /**
53
+ * Update an MCP server configuration
54
+ */ async update(id, dto) {
55
+ return this.mcpService.update(id, dto);
56
+ }
57
+ /**
58
+ * Delete an MCP server configuration
59
+ */ async delete(id) {
60
+ await this.mcpService.delete(id);
61
+ }
62
+ /**
63
+ * Get tools from an MCP server
64
+ */ async getTools(id) {
65
+ return this.mcpService.getTools(id);
66
+ }
67
+ /**
68
+ * Get MCP server status
69
+ */ async getStatus(id) {
70
+ return this.mcpService.getStatus(id);
71
+ }
72
+ }
73
+ _ts_decorate([
74
+ Get('available'),
75
+ _ts_metadata("design:type", Function),
76
+ _ts_metadata("design:paramtypes", []),
77
+ _ts_metadata("design:returntype", void 0)
78
+ ], McpController.prototype, "getAvailablePackages", null);
79
+ _ts_decorate([
80
+ Get(),
81
+ _ts_metadata("design:type", Function),
82
+ _ts_metadata("design:paramtypes", []),
83
+ _ts_metadata("design:returntype", Promise)
84
+ ], McpController.prototype, "getAll", null);
85
+ _ts_decorate([
86
+ Get(':id'),
87
+ _ts_param(0, Param('id')),
88
+ _ts_metadata("design:type", Function),
89
+ _ts_metadata("design:paramtypes", [
90
+ String
91
+ ]),
92
+ _ts_metadata("design:returntype", Promise)
93
+ ], McpController.prototype, "getOne", null);
94
+ _ts_decorate([
95
+ Post(),
96
+ HttpCode(HttpStatus.CREATED),
97
+ _ts_param(0, Body()),
98
+ _ts_metadata("design:type", Function),
99
+ _ts_metadata("design:paramtypes", [
100
+ typeof CreateMcpServerDto === "undefined" ? Object : CreateMcpServerDto
101
+ ]),
102
+ _ts_metadata("design:returntype", Promise)
103
+ ], McpController.prototype, "create", null);
104
+ _ts_decorate([
105
+ Put(':id'),
106
+ _ts_param(0, Param('id')),
107
+ _ts_param(1, Body()),
108
+ _ts_metadata("design:type", Function),
109
+ _ts_metadata("design:paramtypes", [
110
+ String,
111
+ typeof UpdateMcpServerDto === "undefined" ? Object : UpdateMcpServerDto
112
+ ]),
113
+ _ts_metadata("design:returntype", Promise)
114
+ ], McpController.prototype, "update", null);
115
+ _ts_decorate([
116
+ Delete(':id'),
117
+ HttpCode(HttpStatus.NO_CONTENT),
118
+ _ts_param(0, Param('id')),
119
+ _ts_metadata("design:type", Function),
120
+ _ts_metadata("design:paramtypes", [
121
+ String
122
+ ]),
123
+ _ts_metadata("design:returntype", Promise)
124
+ ], McpController.prototype, "delete", null);
125
+ _ts_decorate([
126
+ Get(':id/tools'),
127
+ _ts_param(0, Param('id')),
128
+ _ts_metadata("design:type", Function),
129
+ _ts_metadata("design:paramtypes", [
130
+ String
131
+ ]),
132
+ _ts_metadata("design:returntype", Promise)
133
+ ], McpController.prototype, "getTools", null);
134
+ _ts_decorate([
135
+ Get(':id/status'),
136
+ _ts_param(0, Param('id')),
137
+ _ts_metadata("design:type", Function),
138
+ _ts_metadata("design:paramtypes", [
139
+ String
140
+ ]),
141
+ _ts_metadata("design:returntype", Promise)
142
+ ], McpController.prototype, "getStatus", null);
143
+ McpController = _ts_decorate([
144
+ Controller('mcp-servers'),
145
+ _ts_metadata("design:type", Function),
146
+ _ts_metadata("design:paramtypes", [
147
+ typeof McpService === "undefined" ? Object : McpService,
148
+ typeof McpRegistry === "undefined" ? Object : McpRegistry
149
+ ])
150
+ ], McpController);
151
+
152
+ //# sourceMappingURL=mcp.controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/modules/mcp/mcp.controller.ts"],"sourcesContent":["/**\n * MCP Controller\n *\n * REST API endpoints for MCP server management.\n */\n\nimport {\n Body,\n Controller,\n Delete,\n Get,\n HttpCode,\n HttpStatus,\n Param,\n Post,\n Put,\n} from '@nestjs/common';\nimport { CreateMcpServerDto } from './dto/create-mcp-server.dto.js';\nimport { UpdateMcpServerDto } from './dto/update-mcp-server.dto.js';\nimport { McpService } from './mcp.service.js';\nimport { McpRegistry } from './mcp-registry.js';\n\n@Controller('mcp-servers')\nexport class McpController {\n constructor(\n private readonly mcpService: McpService,\n private readonly registry: McpRegistry\n ) {}\n\n /**\n * Get all available MCP packages (discovered)\n */\n @Get('available')\n getAvailablePackages() {\n const metadata = this.registry.getAllMetadata();\n console.log('[McpController] getAllMetadata result:', metadata);\n console.log('[McpController] registry has packages:', this.registry.getAll().length);\n return metadata;\n }\n\n /**\n * Get all configured MCP servers\n */\n @Get()\n async getAll() {\n return this.mcpService.findAll();\n }\n\n /**\n * Get a specific MCP server\n */\n @Get(':id')\n async getOne(@Param('id') id: string) {\n return this.mcpService.findById(id);\n }\n\n /**\n * Create a new MCP server configuration\n */\n @Post()\n @HttpCode(HttpStatus.CREATED)\n async create(@Body() dto: CreateMcpServerDto) {\n return this.mcpService.create(dto);\n }\n\n /**\n * Update an MCP server configuration\n */\n @Put(':id')\n async update(@Param('id') id: string, @Body() dto: UpdateMcpServerDto) {\n return this.mcpService.update(id, dto);\n }\n\n /**\n * Delete an MCP server configuration\n */\n @Delete(':id')\n @HttpCode(HttpStatus.NO_CONTENT)\n async delete(@Param('id') id: string) {\n await this.mcpService.delete(id);\n }\n\n /**\n * Get tools from an MCP server\n */\n @Get(':id/tools')\n async getTools(@Param('id') id: string) {\n return this.mcpService.getTools(id);\n }\n\n /**\n * Get MCP server status\n */\n @Get(':id/status')\n async getStatus(@Param('id') id: string) {\n return this.mcpService.getStatus(id);\n }\n}\n"],"names":["Body","Controller","Delete","Get","HttpCode","HttpStatus","Param","Post","Put","CreateMcpServerDto","UpdateMcpServerDto","McpService","McpRegistry","McpController","mcpService","registry","getAvailablePackages","metadata","getAllMetadata","console","log","getAll","length","findAll","getOne","id","findById","create","dto","update","delete","getTools","getStatus","CREATED","NO_CONTENT"],"mappings":";;;;;;;;;;;;;;AAAA;;;;CAIC,GAED,SACEA,IAAI,EACJC,UAAU,EACVC,MAAM,EACNC,GAAG,EACHC,QAAQ,EACRC,UAAU,EACVC,KAAK,EACLC,IAAI,EACJC,GAAG,QACE,iBAAiB;AACxB,SAASC,kBAAkB,QAAQ,iCAAiC;AACpE,SAASC,kBAAkB,QAAQ,iCAAiC;AACpE,SAASC,UAAU,QAAQ,mBAAmB;AAC9C,SAASC,WAAW,QAAQ,oBAAoB;AAGhD,OAAO,MAAMC;IACX,YACE,AAAiBC,UAAsB,EACvC,AAAiBC,QAAqB,CACtC;aAFiBD,aAAAA;aACAC,WAAAA;IAChB;IAEH;;GAEC,GACD,AACAC,uBAAuB;QACrB,MAAMC,WAAW,IAAI,CAACF,QAAQ,CAACG,cAAc;QAC7CC,QAAQC,GAAG,CAAC,0CAA0CH;QACtDE,QAAQC,GAAG,CAAC,0CAA0C,IAAI,CAACL,QAAQ,CAACM,MAAM,GAAGC,MAAM;QACnF,OAAOL;IACT;IAEA;;GAEC,GACD,MACMI,SAAS;QACb,OAAO,IAAI,CAACP,UAAU,CAACS,OAAO;IAChC;IAEA;;GAEC,GACD,MACMC,OAAO,AAAaC,EAAU,EAAE;QACpC,OAAO,IAAI,CAACX,UAAU,CAACY,QAAQ,CAACD;IAClC;IAEA;;GAEC,GACD,MAEME,OAAO,AAAQC,GAAuB,EAAE;QAC5C,OAAO,IAAI,CAACd,UAAU,CAACa,MAAM,CAACC;IAChC;IAEA;;GAEC,GACD,MACMC,OAAO,AAAaJ,EAAU,EAAE,AAAQG,GAAuB,EAAE;QACrE,OAAO,IAAI,CAACd,UAAU,CAACe,MAAM,CAACJ,IAAIG;IACpC;IAEA;;GAEC,GACD,MAEME,OAAO,AAAaL,EAAU,EAAE;QACpC,MAAM,IAAI,CAACX,UAAU,CAACgB,MAAM,CAACL;IAC/B;IAEA;;GAEC,GACD,MACMM,SAAS,AAAaN,EAAU,EAAE;QACtC,OAAO,IAAI,CAACX,UAAU,CAACiB,QAAQ,CAACN;IAClC;IAEA;;GAEC,GACD,MACMO,UAAU,AAAaP,EAAU,EAAE;QACvC,OAAO,IAAI,CAACX,UAAU,CAACkB,SAAS,CAACP;IACnC;AACF;;;;;;;;;;;;;;;;;;;;;;;;wBArCuBQ;;;;;;;;;;;;;;;;;;;;;wBAiBAC"}
@@ -0,0 +1,70 @@
1
+ function _ts_decorate(decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ 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;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ }
7
+ function _ts_metadata(k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ }
10
+ /**
11
+ * MCP Module
12
+ *
13
+ * Handles MCP server management, discovery, seeding, and registry.
14
+ */ import { Logger, Module } from "@nestjs/common";
15
+ import { DebugModule } from "../debug/debug.module.js";
16
+ import { McpController } from "./mcp.controller.js";
17
+ import { McpService } from "./mcp.service.js";
18
+ import { McpDiscoveryService } from "./mcp-discovery.service.js";
19
+ import { McpRegistry } from "./mcp-registry.js";
20
+ import { McpSeedService } from "./mcp-seed.service.js";
21
+ export class McpModule {
22
+ constructor(discoveryService, seedService, registry){
23
+ this.discoveryService = discoveryService;
24
+ this.seedService = seedService;
25
+ this.registry = registry;
26
+ this.logger = new Logger(McpModule.name);
27
+ }
28
+ async onModuleInit() {
29
+ this.logger.log('Initializing MCP Module...');
30
+ // 1. Discover all MCP packages
31
+ const packages = await this.discoveryService.discoverPackages();
32
+ this.logger.log(`Discovered ${packages.length} MCP packages`);
33
+ // 2. Register them in the in-memory registry
34
+ for (const pkg of packages){
35
+ this.registry.register(pkg);
36
+ this.logger.log(`Registered: ${pkg.package.metadata.name} (${pkg.package.metadata.id})`);
37
+ }
38
+ // 3. Run seed data for all packages
39
+ await this.seedService.runSeeds(packages);
40
+ this.logger.log('MCP Module initialization complete');
41
+ }
42
+ }
43
+ McpModule = _ts_decorate([
44
+ Module({
45
+ imports: [
46
+ DebugModule
47
+ ],
48
+ controllers: [
49
+ McpController
50
+ ],
51
+ providers: [
52
+ McpService,
53
+ McpDiscoveryService,
54
+ McpSeedService,
55
+ McpRegistry
56
+ ],
57
+ exports: [
58
+ McpService,
59
+ McpRegistry
60
+ ]
61
+ }),
62
+ _ts_metadata("design:type", Function),
63
+ _ts_metadata("design:paramtypes", [
64
+ typeof McpDiscoveryService === "undefined" ? Object : McpDiscoveryService,
65
+ typeof McpSeedService === "undefined" ? Object : McpSeedService,
66
+ typeof McpRegistry === "undefined" ? Object : McpRegistry
67
+ ])
68
+ ], McpModule);
69
+
70
+ //# sourceMappingURL=mcp.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/modules/mcp/mcp.module.ts"],"sourcesContent":["/**\n * MCP Module\n *\n * Handles MCP server management, discovery, seeding, and registry.\n */\n\nimport { Logger, Module, OnModuleInit } from '@nestjs/common';\nimport { DebugModule } from '../debug/debug.module.js';\nimport { McpController } from './mcp.controller.js';\nimport { McpService } from './mcp.service.js';\nimport { McpDiscoveryService } from './mcp-discovery.service.js';\nimport { McpRegistry } from './mcp-registry.js';\nimport { McpSeedService } from './mcp-seed.service.js';\n\n@Module({\n imports: [DebugModule],\n controllers: [McpController],\n providers: [McpService, McpDiscoveryService, McpSeedService, McpRegistry],\n exports: [McpService, McpRegistry],\n})\nexport class McpModule implements OnModuleInit {\n private readonly logger = new Logger(McpModule.name);\n\n constructor(\n private readonly discoveryService: McpDiscoveryService,\n private readonly seedService: McpSeedService,\n private readonly registry: McpRegistry\n ) {}\n\n async onModuleInit(): Promise<void> {\n this.logger.log('Initializing MCP Module...');\n\n // 1. Discover all MCP packages\n const packages = await this.discoveryService.discoverPackages();\n this.logger.log(`Discovered ${packages.length} MCP packages`);\n\n // 2. Register them in the in-memory registry\n for (const pkg of packages) {\n this.registry.register(pkg);\n this.logger.log(`Registered: ${pkg.package.metadata.name} (${pkg.package.metadata.id})`);\n }\n\n // 3. Run seed data for all packages\n await this.seedService.runSeeds(packages);\n\n this.logger.log('MCP Module initialization complete');\n }\n}\n"],"names":["Logger","Module","DebugModule","McpController","McpService","McpDiscoveryService","McpRegistry","McpSeedService","McpModule","discoveryService","seedService","registry","logger","name","onModuleInit","log","packages","discoverPackages","length","pkg","register","package","metadata","id","runSeeds","imports","controllers","providers","exports"],"mappings":";;;;;;;;;AAAA;;;;CAIC,GAED,SAASA,MAAM,EAAEC,MAAM,QAAsB,iBAAiB;AAC9D,SAASC,WAAW,QAAQ,2BAA2B;AACvD,SAASC,aAAa,QAAQ,sBAAsB;AACpD,SAASC,UAAU,QAAQ,mBAAmB;AAC9C,SAASC,mBAAmB,QAAQ,6BAA6B;AACjE,SAASC,WAAW,QAAQ,oBAAoB;AAChD,SAASC,cAAc,QAAQ,wBAAwB;AAQvD,OAAO,MAAMC;IAGX,YACE,AAAiBC,gBAAqC,EACtD,AAAiBC,WAA2B,EAC5C,AAAiBC,QAAqB,CACtC;aAHiBF,mBAAAA;aACAC,cAAAA;aACAC,WAAAA;aALFC,SAAS,IAAIZ,OAAOQ,UAAUK,IAAI;IAMhD;IAEH,MAAMC,eAA8B;QAClC,IAAI,CAACF,MAAM,CAACG,GAAG,CAAC;QAEhB,+BAA+B;QAC/B,MAAMC,WAAW,MAAM,IAAI,CAACP,gBAAgB,CAACQ,gBAAgB;QAC7D,IAAI,CAACL,MAAM,CAACG,GAAG,CAAC,CAAC,WAAW,EAAEC,SAASE,MAAM,CAAC,aAAa,CAAC;QAE5D,6CAA6C;QAC7C,KAAK,MAAMC,OAAOH,SAAU;YAC1B,IAAI,CAACL,QAAQ,CAACS,QAAQ,CAACD;YACvB,IAAI,CAACP,MAAM,CAACG,GAAG,CAAC,CAAC,YAAY,EAAEI,IAAIE,OAAO,CAACC,QAAQ,CAACT,IAAI,CAAC,EAAE,EAAEM,IAAIE,OAAO,CAACC,QAAQ,CAACC,EAAE,CAAC,CAAC,CAAC;QACzF;QAEA,oCAAoC;QACpC,MAAM,IAAI,CAACb,WAAW,CAACc,QAAQ,CAACR;QAEhC,IAAI,CAACJ,MAAM,CAACG,GAAG,CAAC;IAClB;AACF;;;QAhCEU,SAAS;YAACvB;SAAY;QACtBwB,aAAa;YAACvB;SAAc;QAC5BwB,WAAW;YAACvB;YAAYC;YAAqBE;YAAgBD;SAAY;QACzEsB,SAAS;YAACxB;YAAYE;SAAY"}