@dxheroes/local-mcp-backend 0.7.1 → 0.8.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.
@@ -1,9 +1,9 @@
1
1
 
2
- > @dxheroes/local-mcp-backend@0.7.1 build /home/runner/work/local-mcp-gateway/local-mcp-gateway/apps/backend
2
+ > @dxheroes/local-mcp-backend@0.8.0 build /home/runner/work/local-mcp-gateway/local-mcp-gateway/apps/backend
3
3
  > nest build
4
4
 
5
5
  -  TSC  Initializing type checker...
6
6
  ✔  TSC  Initializing type checker...
7
7
  >  TSC  Found 0 issues.
8
8
  >  SWC  Running...
9
- Successfully compiled: 36 files with swc (77.59ms)
9
+ Successfully compiled: 36 files with swc (76.61ms)
package/CHANGELOG.md CHANGED
@@ -1,5 +1,30 @@
1
1
  # Changelog
2
2
 
3
+ ## [0.8.0](https://github.com/DXHeroes/local-mcp-gateway/compare/backend-v0.7.1...backend-v0.8.0) (2026-03-10)
4
+
5
+
6
+ ### Features
7
+
8
+ * **mcp:** add Python/uv to Docker image and re-add Fetch MCP preset ([f4943ea](https://github.com/DXHeroes/local-mcp-gateway/commit/f4943ea91e1dfc1356dab5c0423cb5d26c5f7ecf))
9
+
10
+
11
+ ### Bug Fixes
12
+
13
+ * **mcp:** fix broken external MCP preset package names ([938038f](https://github.com/DXHeroes/local-mcp-gateway/commit/938038f0c3a86283bd91ec7d3066728b350b6c1f))
14
+
15
+
16
+ ### Dependencies
17
+
18
+ * The following workspace dependencies were updated
19
+ * dependencies
20
+ * @dxheroes/local-mcp-core bumped to 0.6.2
21
+ * @dxheroes/local-mcp-database bumped to 0.4.7
22
+ * @dxheroes/mcp-gemini-deep-research bumped to 0.5.2
23
+ * @dxheroes/mcp-merk bumped to 0.3.2
24
+ * @dxheroes/mcp-toggl bumped to 0.3.2
25
+ * devDependencies
26
+ * @dxheroes/local-mcp-config bumped to 0.4.7
27
+
3
28
  ## [0.7.1](https://github.com/DXHeroes/local-mcp-gateway/compare/backend-v0.7.0...backend-v0.7.1) (2026-03-10)
4
29
 
5
30
 
package/Dockerfile CHANGED
@@ -29,6 +29,11 @@ WORKDIR /app
29
29
  # Install pnpm for production
30
30
  RUN corepack enable && corepack prepare pnpm@latest --activate
31
31
 
32
+ # Install Python and uv for Python-based MCP servers (e.g. mcp-server-fetch via uvx)
33
+ RUN apk add --no-cache python3 && \
34
+ wget -qO- https://astral.sh/uv/install.sh | sh
35
+ ENV PATH="/root/.local/bin:$PATH"
36
+
32
37
  # Create data directory
33
38
  RUN mkdir -p /data
34
39
 
@@ -35,7 +35,7 @@ const EXTERNAL_MCP_PRESETS = [
35
35
  command: 'npx',
36
36
  args: [
37
37
  '-y',
38
- '@anthropic/mcp-server-sequential-thinking'
38
+ '@modelcontextprotocol/server-sequential-thinking'
39
39
  ],
40
40
  autoRestart: true
41
41
  }
@@ -78,13 +78,12 @@ const EXTERNAL_MCP_PRESETS = [
78
78
  }
79
79
  },
80
80
  {
81
- name: 'Example: Fetch MCP',
82
- description: 'Example MCP server calling public APIs - use as a template for your own external MCP scripts',
81
+ name: 'Fetch MCP',
82
+ description: 'Web content fetching - retrieve and convert web pages to markdown for AI consumption',
83
83
  config: {
84
- command: 'npx',
84
+ command: 'uvx',
85
85
  args: [
86
- '-y',
87
- '@anthropic/mcp-server-fetch'
86
+ 'mcp-server-fetch'
88
87
  ],
89
88
  autoRestart: true
90
89
  }
@@ -1 +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 and external presets.\n */\n\nimport { randomUUID } from 'node:crypto';\nimport type { DiscoveredMcpPackage, ExternalMcpConfig } from '@dxheroes/local-mcp-core';\nimport { Injectable, Logger } from '@nestjs/common';\nimport { PrismaService } from '../database/prisma.service.js';\nimport { SETTING_KEYS } from '../settings/settings.constants.js';\n\ninterface McpServerConfig {\n builtinId?: string;\n}\n\n/**\n * External MCP server presets - popular NPX-based MCP servers\n * These are seeded but NOT assigned to any profile\n */\ninterface ExternalMcpPreset {\n name: string;\n description: string;\n config: ExternalMcpConfig;\n}\n\nconst EXTERNAL_MCP_PRESETS: ExternalMcpPreset[] = [\n {\n name: 'Playwright MCP',\n description:\n 'Browser automation with Playwright - page interactions, screenshots, PDF generation',\n config: {\n command: 'npx',\n args: ['-y', '@playwright/mcp@latest'],\n autoRestart: true,\n },\n },\n {\n name: 'Sequential Thinking',\n description:\n 'Dynamic problem-solving through structured thoughts - analysis, planning, revision',\n config: {\n command: 'npx',\n args: ['-y', '@anthropic/mcp-server-sequential-thinking'],\n autoRestart: true,\n },\n },\n {\n name: 'Filesystem MCP',\n description: 'File system access - read, write, search, and manage files',\n config: {\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-filesystem', '/tmp'],\n autoRestart: true,\n },\n },\n {\n name: 'Memory MCP',\n description:\n 'Knowledge graph-based persistent memory - store and retrieve entities and relations',\n config: {\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-memory'],\n autoRestart: true,\n },\n },\n {\n name: 'GitHub MCP',\n description: 'GitHub API access - repositories, issues, pull requests, and more',\n config: {\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-github'],\n autoRestart: true,\n },\n },\n {\n name: 'Example: Fetch MCP',\n description:\n 'Example MCP server calling public APIs - use as a template for your own external MCP scripts',\n config: {\n command: 'npx',\n args: ['-y', '@anthropic/mcp-server-fetch'],\n autoRestart: true,\n },\n },\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 and external presets\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 // Seed builtin packages\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 // Seed external presets\n await this.seedExternalPresets();\n\n this.logger.log('MCP seeding complete');\n }\n\n /**\n * Seed external MCP server presets\n * These are NOT assigned to any profile - users manually add them\n */\n private async seedExternalPresets(): Promise<void> {\n this.logger.log(`Seeding ${EXTERNAL_MCP_PRESETS.length} external MCP presets`);\n\n for (const preset of EXTERNAL_MCP_PRESETS) {\n try {\n // Check if this external server already exists (by name)\n const existingServer = await this.prisma.mcpServer.findFirst({\n where: {\n name: preset.name,\n type: 'external',\n },\n });\n\n if (existingServer) {\n this.logger.debug(`External preset ${preset.name} already exists, skipping`);\n continue;\n }\n\n // Create the external MCP server record\n await this.prisma.mcpServer.create({\n data: {\n id: randomUUID(),\n name: preset.name,\n type: 'external',\n config: JSON.stringify(preset.config),\n },\n });\n\n this.logger.log(`Created external MCP preset: ${preset.name}`);\n } catch (error) {\n this.logger.error(`Failed to seed external preset ${preset.name}: ${error}`);\n }\n }\n }\n\n private async ensureDefaultProfile(): Promise<void> {\n // Check if user intentionally deleted the default profile\n const deletedSetting = await this.prisma.gatewaySetting.findUnique({\n where: { key: SETTING_KEYS.DEFAULT_PROFILE_DELETED },\n });\n\n if (deletedSetting?.value === 'true') {\n this.logger.log('Default profile was deleted by user, skipping creation');\n return;\n }\n\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","SETTING_KEYS","EXTERNAL_MCP_PRESETS","name","description","config","command","args","autoRestart","McpSeedService","prisma","logger","runSeeds","packages","log","length","ensureDefaultProfile","package","pkg","packageName","seedPackage","error","seedExternalPresets","preset","existingServer","mcpServer","findFirst","where","type","debug","create","data","id","JSON","stringify","deletedSetting","gatewaySetting","findUnique","key","DEFAULT_PROFILE_DELETED","value","defaultProfile","profile","_packageName","metadata","seed","findServerByBuiltinId","serverId","builtinId","profileMcpServer","profileId","mcpServerId","order","defaultOrder","isActive","defaultActive","servers","findMany","some","s","parse"],"mappings":"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"}
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 and external presets.\n */\n\nimport { randomUUID } from 'node:crypto';\nimport type { DiscoveredMcpPackage, ExternalMcpConfig } from '@dxheroes/local-mcp-core';\nimport { Injectable, Logger } from '@nestjs/common';\nimport { PrismaService } from '../database/prisma.service.js';\nimport { SETTING_KEYS } from '../settings/settings.constants.js';\n\ninterface McpServerConfig {\n builtinId?: string;\n}\n\n/**\n * External MCP server presets - popular NPX-based MCP servers\n * These are seeded but NOT assigned to any profile\n */\ninterface ExternalMcpPreset {\n name: string;\n description: string;\n config: ExternalMcpConfig;\n}\n\nconst EXTERNAL_MCP_PRESETS: ExternalMcpPreset[] = [\n {\n name: 'Playwright MCP',\n description:\n 'Browser automation with Playwright - page interactions, screenshots, PDF generation',\n config: {\n command: 'npx',\n args: ['-y', '@playwright/mcp@latest'],\n autoRestart: true,\n },\n },\n {\n name: 'Sequential Thinking',\n description:\n 'Dynamic problem-solving through structured thoughts - analysis, planning, revision',\n config: {\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-sequential-thinking'],\n autoRestart: true,\n },\n },\n {\n name: 'Filesystem MCP',\n description: 'File system access - read, write, search, and manage files',\n config: {\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-filesystem', '/tmp'],\n autoRestart: true,\n },\n },\n {\n name: 'Memory MCP',\n description:\n 'Knowledge graph-based persistent memory - store and retrieve entities and relations',\n config: {\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-memory'],\n autoRestart: true,\n },\n },\n {\n name: 'GitHub MCP',\n description: 'GitHub API access - repositories, issues, pull requests, and more',\n config: {\n command: 'npx',\n args: ['-y', '@modelcontextprotocol/server-github'],\n autoRestart: true,\n },\n },\n {\n name: 'Fetch MCP',\n description:\n 'Web content fetching - retrieve and convert web pages to markdown for AI consumption',\n config: {\n command: 'uvx',\n args: ['mcp-server-fetch'],\n autoRestart: true,\n },\n },\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 and external presets\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 // Seed builtin packages\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 // Seed external presets\n await this.seedExternalPresets();\n\n this.logger.log('MCP seeding complete');\n }\n\n /**\n * Seed external MCP server presets\n * These are NOT assigned to any profile - users manually add them\n */\n private async seedExternalPresets(): Promise<void> {\n this.logger.log(`Seeding ${EXTERNAL_MCP_PRESETS.length} external MCP presets`);\n\n for (const preset of EXTERNAL_MCP_PRESETS) {\n try {\n // Check if this external server already exists (by name)\n const existingServer = await this.prisma.mcpServer.findFirst({\n where: {\n name: preset.name,\n type: 'external',\n },\n });\n\n if (existingServer) {\n this.logger.debug(`External preset ${preset.name} already exists, skipping`);\n continue;\n }\n\n // Create the external MCP server record\n await this.prisma.mcpServer.create({\n data: {\n id: randomUUID(),\n name: preset.name,\n type: 'external',\n config: JSON.stringify(preset.config),\n },\n });\n\n this.logger.log(`Created external MCP preset: ${preset.name}`);\n } catch (error) {\n this.logger.error(`Failed to seed external preset ${preset.name}: ${error}`);\n }\n }\n }\n\n private async ensureDefaultProfile(): Promise<void> {\n // Check if user intentionally deleted the default profile\n const deletedSetting = await this.prisma.gatewaySetting.findUnique({\n where: { key: SETTING_KEYS.DEFAULT_PROFILE_DELETED },\n });\n\n if (deletedSetting?.value === 'true') {\n this.logger.log('Default profile was deleted by user, skipping creation');\n return;\n }\n\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","SETTING_KEYS","EXTERNAL_MCP_PRESETS","name","description","config","command","args","autoRestart","McpSeedService","prisma","logger","runSeeds","packages","log","length","ensureDefaultProfile","package","pkg","packageName","seedPackage","error","seedExternalPresets","preset","existingServer","mcpServer","findFirst","where","type","debug","create","data","id","JSON","stringify","deletedSetting","gatewaySetting","findUnique","key","DEFAULT_PROFILE_DELETED","value","defaultProfile","profile","_packageName","metadata","seed","findServerByBuiltinId","serverId","builtinId","profileMcpServer","profileId","mcpServerId","order","defaultOrder","isActive","defaultActive","servers","findMany","some","s","parse"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxheroes/local-mcp-backend",
3
- "version": "0.7.1",
3
+ "version": "0.8.0",
4
4
  "description": "NestJS API server providing MCP proxy, server aggregation, OAuth 2.1, and profile management",
5
5
  "license": "Elastic-2.0",
6
6
  "type": "module",
@@ -20,11 +20,11 @@
20
20
  "reflect-metadata": "^0.2.2",
21
21
  "rxjs": "^7.8.2",
22
22
  "zod": "^4.3.5",
23
- "@dxheroes/local-mcp-core": "0.6.1",
24
- "@dxheroes/mcp-gemini-deep-research": "0.5.1",
25
- "@dxheroes/mcp-toggl": "0.3.1",
26
- "@dxheroes/local-mcp-database": "0.4.6",
27
- "@dxheroes/mcp-merk": "0.3.1"
23
+ "@dxheroes/local-mcp-database": "0.4.7",
24
+ "@dxheroes/local-mcp-core": "0.6.2",
25
+ "@dxheroes/mcp-gemini-deep-research": "0.5.2",
26
+ "@dxheroes/mcp-toggl": "0.3.2",
27
+ "@dxheroes/mcp-merk": "0.3.2"
28
28
  },
29
29
  "devDependencies": {
30
30
  "@nestjs/cli": "^11.0.14",
@@ -37,7 +37,7 @@
37
37
  "@types/node": "^25.0.6",
38
38
  "typescript": "^5.9.3",
39
39
  "vitest": "^4.0.17",
40
- "@dxheroes/local-mcp-config": "0.4.6"
40
+ "@dxheroes/local-mcp-config": "0.4.7"
41
41
  },
42
42
  "scripts": {
43
43
  "build": "nest build",
@@ -41,7 +41,7 @@ const EXTERNAL_MCP_PRESETS: ExternalMcpPreset[] = [
41
41
  'Dynamic problem-solving through structured thoughts - analysis, planning, revision',
42
42
  config: {
43
43
  command: 'npx',
44
- args: ['-y', '@anthropic/mcp-server-sequential-thinking'],
44
+ args: ['-y', '@modelcontextprotocol/server-sequential-thinking'],
45
45
  autoRestart: true,
46
46
  },
47
47
  },
@@ -74,12 +74,12 @@ const EXTERNAL_MCP_PRESETS: ExternalMcpPreset[] = [
74
74
  },
75
75
  },
76
76
  {
77
- name: 'Example: Fetch MCP',
77
+ name: 'Fetch MCP',
78
78
  description:
79
- 'Example MCP server calling public APIs - use as a template for your own external MCP scripts',
79
+ 'Web content fetching - retrieve and convert web pages to markdown for AI consumption',
80
80
  config: {
81
- command: 'npx',
82
- args: ['-y', '@anthropic/mcp-server-fetch'],
81
+ command: 'uvx',
82
+ args: ['mcp-server-fetch'],
83
83
  autoRestart: true,
84
84
  },
85
85
  },