diff --git a/src/mcpd/src/services/instance.service.ts b/src/mcpd/src/services/instance.service.ts index 893ef17..1e55d42 100644 --- a/src/mcpd/src/services/instance.service.ts +++ b/src/mcpd/src/services/instance.service.ts @@ -5,7 +5,7 @@ import { NotFoundError } from './mcp-server.service.js'; import { resolveServerEnv } from './env-resolver.js'; /** Default image for npm-based MCP servers (STDIO with packageName, no dockerImage). */ -const DEFAULT_NODE_RUNNER_IMAGE = process.env['MCPD_NODE_RUNNER_IMAGE'] ?? 'mcpctl-node-runner:latest'; +const DEFAULT_NODE_RUNNER_IMAGE = process.env['MCPD_NODE_RUNNER_IMAGE'] ?? 'mysources.co.uk/michal/mcpctl-node-runner:latest'; /** Network for MCP server containers (matches docker-compose mcp-servers network). */ const MCP_SERVERS_NETWORK = process.env['MCPD_MCP_NETWORK'] ?? 'mcp-servers'; @@ -206,6 +206,13 @@ export class InstanceService { } } + // Pull image if not available locally + try { + await this.orchestrator.pullImage(image); + } catch { + // Image may already be available locally + } + const containerInfo = await this.orchestrator.createContainer(spec); const updateFields: { containerId: string; port?: number } = { diff --git a/stack/docker-compose.yml b/stack/docker-compose.yml index 780064f..bf151e0 100644 --- a/stack/docker-compose.yml +++ b/stack/docker-compose.yml @@ -28,6 +28,8 @@ services: MCPD_PORT: "3100" MCPD_HOST: "0.0.0.0" MCPD_LOG_LEVEL: ${MCPD_LOG_LEVEL:-info} + MCPD_NODE_RUNNER_IMAGE: mysources.co.uk/michal/mcpctl-node-runner:latest + MCPD_MCP_NETWORK: mcp-servers depends_on: postgres: condition: service_healthy @@ -47,8 +49,10 @@ networks: mcpctl: driver: bridge mcp-servers: + name: mcp-servers driver: bridge - internal: true + # Not internal — MCP servers need outbound access for external APIs. + # Isolation enforced by not binding host ports on MCP containers. volumes: mcpctl-pgdata: