@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.
package/.turbo/turbo-build.log
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
|
|
2
|
-
> @dxheroes/local-mcp-backend@0.
|
|
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
|
- [46m[1m TSC [22m[49m[36m Initializing type checker...[39m
|
|
6
6
|
✔ [46m[1m TSC [22m[49m[36m Initializing type checker...[39m
|
|
7
7
|
[32m> [39m[42m[1m TSC [22m[49m[32m Found 0 issues.[39m
|
|
8
8
|
[36m> [39m[46m[1m SWC [22m[49m [36mRunning...[39m
|
|
9
|
-
Successfully compiled: 36 files with swc (
|
|
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
|
-
'@
|
|
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: '
|
|
82
|
-
description: '
|
|
81
|
+
name: 'Fetch MCP',
|
|
82
|
+
description: 'Web content fetching - retrieve and convert web pages to markdown for AI consumption',
|
|
83
83
|
config: {
|
|
84
|
-
command: '
|
|
84
|
+
command: 'uvx',
|
|
85
85
|
args: [
|
|
86
|
-
'-
|
|
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.
|
|
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-
|
|
24
|
-
"@dxheroes/mcp-
|
|
25
|
-
"@dxheroes/mcp-
|
|
26
|
-
"@dxheroes/
|
|
27
|
-
"@dxheroes/mcp-merk": "0.3.
|
|
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.
|
|
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', '@
|
|
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: '
|
|
77
|
+
name: 'Fetch MCP',
|
|
78
78
|
description:
|
|
79
|
-
'
|
|
79
|
+
'Web content fetching - retrieve and convert web pages to markdown for AI consumption',
|
|
80
80
|
config: {
|
|
81
|
-
command: '
|
|
82
|
-
args: ['
|
|
81
|
+
command: 'uvx',
|
|
82
|
+
args: ['mcp-server-fetch'],
|
|
83
83
|
autoRestart: true,
|
|
84
84
|
},
|
|
85
85
|
},
|