From 2dc61e493722b4719a1a508bb6e9d74aead0d584 Mon Sep 17 00:00:00 2001 From: Marc Mintel Date: Fri, 6 Mar 2026 15:20:52 +0100 Subject: [PATCH] chore: finalize containerized MCP setup and fix memory-mcp native module issues --- docker-compose.mcps.yml | 62 +++++++++++++++++++++++++++ packages/gitea-mcp/src/start.ts | 4 +- packages/glitchtip-mcp/Dockerfile | 15 +++++++ packages/glitchtip-mcp/src/start.ts | 4 +- packages/klz-payload-mcp/Dockerfile | 15 +++++++ packages/klz-payload-mcp/src/start.ts | 4 +- packages/memory-mcp/Dockerfile | 18 ++++++++ packages/memory-mcp/package.json | 3 +- packages/memory-mcp/src/start.ts | 4 +- packages/serpbear-mcp/Dockerfile | 15 +++++++ packages/serpbear-mcp/src/start.ts | 4 +- packages/umami-mcp/Dockerfile | 15 +++++++ packages/umami-mcp/src/start.ts | 4 +- pnpm-lock.yaml | 7 ++- 14 files changed, 157 insertions(+), 17 deletions(-) create mode 100644 packages/glitchtip-mcp/Dockerfile create mode 100644 packages/klz-payload-mcp/Dockerfile create mode 100644 packages/memory-mcp/Dockerfile create mode 100644 packages/serpbear-mcp/Dockerfile create mode 100644 packages/umami-mcp/Dockerfile diff --git a/docker-compose.mcps.yml b/docker-compose.mcps.yml index 98398fa..7af53a8 100644 --- a/docker-compose.mcps.yml +++ b/docker-compose.mcps.yml @@ -11,6 +11,68 @@ services: networks: - mcp-network + gitea-mcp: + build: + context: ./packages/gitea-mcp + container_name: gitea-mcp + ports: + - "3001:3001" + restart: unless-stopped + networks: + - mcp-network + + memory-mcp: + build: + context: ./packages/memory-mcp + container_name: memory-mcp + ports: + - "3002:3002" + depends_on: + - qdrant + restart: unless-stopped + networks: + - mcp-network + + umami-mcp: + build: + context: ./packages/umami-mcp + container_name: umami-mcp + ports: + - "3003:3003" + restart: unless-stopped + networks: + - mcp-network + + serpbear-mcp: + build: + context: ./packages/serpbear-mcp + container_name: serpbear-mcp + ports: + - "3004:3004" + restart: unless-stopped + networks: + - mcp-network + + glitchtip-mcp: + build: + context: ./packages/glitchtip-mcp + container_name: glitchtip-mcp + ports: + - "3005:3005" + restart: unless-stopped + networks: + - mcp-network + + klz-payload-mcp: + build: + context: ./packages/klz-payload-mcp + container_name: klz-payload-mcp + ports: + - "3006:3006" + restart: unless-stopped + networks: + - mcp-network + networks: mcp-network: driver: bridge diff --git a/packages/gitea-mcp/src/start.ts b/packages/gitea-mcp/src/start.ts index be9ab8a..1ae7cf6 100644 --- a/packages/gitea-mcp/src/start.ts +++ b/packages/gitea-mcp/src/start.ts @@ -5,9 +5,9 @@ import { fileURLToPath } from 'url'; const __dirname = fileURLToPath(new URL('.', import.meta.url)); // Try to load .env.local first (contains credentials usually) -config({ path: resolve(__dirname, '../../../.env.local') }); +config({ quiet: true, path: resolve(__dirname, '../../../.env.local') }); // Fallback to .env (contains defaults) -config({ path: resolve(__dirname, '../../../.env') }); +config({ quiet: true, path: resolve(__dirname, '../../../.env') }); // Now boot the compiled MCP index import('./index.js').catch(err => { diff --git a/packages/glitchtip-mcp/Dockerfile b/packages/glitchtip-mcp/Dockerfile new file mode 100644 index 0000000..a2c659f --- /dev/null +++ b/packages/glitchtip-mcp/Dockerfile @@ -0,0 +1,15 @@ +FROM node:20-bookworm-slim AS builder +WORKDIR /app +COPY package.json ./ +RUN corepack enable pnpm && pnpm install --ignore-workspace +COPY tsconfig.json ./ +COPY src ./src +RUN pnpm build + +FROM node:20-bookworm-slim +WORKDIR /app +COPY --from=builder /app/package.json ./ +COPY --from=builder /app/node_modules ./node_modules +COPY --from=builder /app/dist ./dist + +ENTRYPOINT ["node", "dist/start.js"] diff --git a/packages/glitchtip-mcp/src/start.ts b/packages/glitchtip-mcp/src/start.ts index 70a7a51..08c674d 100644 --- a/packages/glitchtip-mcp/src/start.ts +++ b/packages/glitchtip-mcp/src/start.ts @@ -4,8 +4,8 @@ import { fileURLToPath } from 'url'; const __dirname = fileURLToPath(new URL('.', import.meta.url)); -config({ path: resolve(__dirname, '../../../.env.local') }); -config({ path: resolve(__dirname, '../../../.env') }); +config({ quiet: true, path: resolve(__dirname, '../../../.env.local') }); +config({ quiet: true, path: resolve(__dirname, '../../../.env') }); import('./index.js').catch(err => { console.error('Failed to start GlitchTip MCP Server:', err); diff --git a/packages/klz-payload-mcp/Dockerfile b/packages/klz-payload-mcp/Dockerfile new file mode 100644 index 0000000..a2c659f --- /dev/null +++ b/packages/klz-payload-mcp/Dockerfile @@ -0,0 +1,15 @@ +FROM node:20-bookworm-slim AS builder +WORKDIR /app +COPY package.json ./ +RUN corepack enable pnpm && pnpm install --ignore-workspace +COPY tsconfig.json ./ +COPY src ./src +RUN pnpm build + +FROM node:20-bookworm-slim +WORKDIR /app +COPY --from=builder /app/package.json ./ +COPY --from=builder /app/node_modules ./node_modules +COPY --from=builder /app/dist ./dist + +ENTRYPOINT ["node", "dist/start.js"] diff --git a/packages/klz-payload-mcp/src/start.ts b/packages/klz-payload-mcp/src/start.ts index 0034613..e7e4f07 100644 --- a/packages/klz-payload-mcp/src/start.ts +++ b/packages/klz-payload-mcp/src/start.ts @@ -4,8 +4,8 @@ import { fileURLToPath } from 'url'; const __dirname = fileURLToPath(new URL('.', import.meta.url)); -config({ path: resolve(__dirname, '../../../.env.local') }); -config({ path: resolve(__dirname, '../../../.env') }); +config({ quiet: true, path: resolve(__dirname, '../../../.env.local') }); +config({ quiet: true, path: resolve(__dirname, '../../../.env') }); import('./index.js').catch(err => { console.error('Failed to start KLZ Payload MCP Server:', err); diff --git a/packages/memory-mcp/Dockerfile b/packages/memory-mcp/Dockerfile new file mode 100644 index 0000000..afd03d7 --- /dev/null +++ b/packages/memory-mcp/Dockerfile @@ -0,0 +1,18 @@ +FROM node:20-bookworm-slim AS builder +WORKDIR /app +COPY package.json ./ +RUN corepack enable pnpm && pnpm install --ignore-workspace +RUN for dir in $(find /app/node_modules -type d -name "sharp" | grep "node_modules/sharp$"); do \ + echo "module.exports = {};" > "$dir/lib/index.js" || true; \ + done +COPY tsconfig.json ./ +COPY src ./src +RUN pnpm build + +FROM node:20-bookworm-slim +WORKDIR /app +COPY --from=builder /app/package.json ./ +COPY --from=builder /app/node_modules ./node_modules +COPY --from=builder /app/dist ./dist + +ENTRYPOINT ["node", "dist/start.js"] diff --git a/packages/memory-mcp/package.json b/packages/memory-mcp/package.json index f41211d..dce2619 100644 --- a/packages/memory-mcp/package.json +++ b/packages/memory-mcp/package.json @@ -14,6 +14,7 @@ "@modelcontextprotocol/sdk": "^1.5.0", "@qdrant/js-client-rest": "^1.12.0", "@xenova/transformers": "^2.17.2", + "onnxruntime-node": "^1.14.0", "dotenv": "^17.3.1", "express": "^5.2.1", "zod": "^3.23.8" @@ -25,4 +26,4 @@ "typescript": "^5.5.3", "vitest": "^2.1.3" } -} +} \ No newline at end of file diff --git a/packages/memory-mcp/src/start.ts b/packages/memory-mcp/src/start.ts index be9ab8a..1ae7cf6 100644 --- a/packages/memory-mcp/src/start.ts +++ b/packages/memory-mcp/src/start.ts @@ -5,9 +5,9 @@ import { fileURLToPath } from 'url'; const __dirname = fileURLToPath(new URL('.', import.meta.url)); // Try to load .env.local first (contains credentials usually) -config({ path: resolve(__dirname, '../../../.env.local') }); +config({ quiet: true, path: resolve(__dirname, '../../../.env.local') }); // Fallback to .env (contains defaults) -config({ path: resolve(__dirname, '../../../.env') }); +config({ quiet: true, path: resolve(__dirname, '../../../.env') }); // Now boot the compiled MCP index import('./index.js').catch(err => { diff --git a/packages/serpbear-mcp/Dockerfile b/packages/serpbear-mcp/Dockerfile new file mode 100644 index 0000000..a2c659f --- /dev/null +++ b/packages/serpbear-mcp/Dockerfile @@ -0,0 +1,15 @@ +FROM node:20-bookworm-slim AS builder +WORKDIR /app +COPY package.json ./ +RUN corepack enable pnpm && pnpm install --ignore-workspace +COPY tsconfig.json ./ +COPY src ./src +RUN pnpm build + +FROM node:20-bookworm-slim +WORKDIR /app +COPY --from=builder /app/package.json ./ +COPY --from=builder /app/node_modules ./node_modules +COPY --from=builder /app/dist ./dist + +ENTRYPOINT ["node", "dist/start.js"] diff --git a/packages/serpbear-mcp/src/start.ts b/packages/serpbear-mcp/src/start.ts index 53fd0d5..6ebaec3 100644 --- a/packages/serpbear-mcp/src/start.ts +++ b/packages/serpbear-mcp/src/start.ts @@ -4,8 +4,8 @@ import { fileURLToPath } from 'url'; const __dirname = fileURLToPath(new URL('.', import.meta.url)); -config({ path: resolve(__dirname, '../../../.env.local') }); -config({ path: resolve(__dirname, '../../../.env') }); +config({ quiet: true, path: resolve(__dirname, '../../../.env.local') }); +config({ quiet: true, path: resolve(__dirname, '../../../.env') }); import('./index.js').catch(err => { console.error('Failed to start SerpBear MCP Server:', err); diff --git a/packages/umami-mcp/Dockerfile b/packages/umami-mcp/Dockerfile new file mode 100644 index 0000000..a2c659f --- /dev/null +++ b/packages/umami-mcp/Dockerfile @@ -0,0 +1,15 @@ +FROM node:20-bookworm-slim AS builder +WORKDIR /app +COPY package.json ./ +RUN corepack enable pnpm && pnpm install --ignore-workspace +COPY tsconfig.json ./ +COPY src ./src +RUN pnpm build + +FROM node:20-bookworm-slim +WORKDIR /app +COPY --from=builder /app/package.json ./ +COPY --from=builder /app/node_modules ./node_modules +COPY --from=builder /app/dist ./dist + +ENTRYPOINT ["node", "dist/start.js"] diff --git a/packages/umami-mcp/src/start.ts b/packages/umami-mcp/src/start.ts index 8ce1fb4..0592671 100644 --- a/packages/umami-mcp/src/start.ts +++ b/packages/umami-mcp/src/start.ts @@ -4,8 +4,8 @@ import { fileURLToPath } from 'url'; const __dirname = fileURLToPath(new URL('.', import.meta.url)); -config({ path: resolve(__dirname, '../../../.env.local') }); -config({ path: resolve(__dirname, '../../../.env') }); +config({ quiet: true, path: resolve(__dirname, '../../../.env.local') }); +config({ quiet: true, path: resolve(__dirname, '../../../.env') }); import('./index.js').catch(err => { console.error('Failed to start Umami MCP Server:', err); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e4d774f..2b120db 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -423,9 +423,6 @@ importers: express: specifier: ^5.2.1 version: 5.2.1 - zod: - specifier: ^3.23.8 - version: 3.25.76 devDependencies: '@types/express': specifier: ^5.0.6 @@ -12025,7 +12022,7 @@ snapshots: axios@1.13.5: dependencies: - follow-redirects: 1.15.11(debug@4.3.7) + follow-redirects: 1.15.11 form-data: 4.0.5 proxy-from-env: 1.1.0 transitivePeerDependencies: @@ -13410,6 +13407,8 @@ snapshots: dependencies: tabbable: 6.4.0 + follow-redirects@1.15.11: {} + follow-redirects@1.15.11(debug@4.3.7): optionalDependencies: debug: 4.3.7