name: mcp-supergateway # NOTE: copy this file to .env and fill in the keys for the servers you enable. services: # Multi-server MCP gateway (supergateway --config). # One port, one Streamable HTTP endpoint per server: http://localhost:8000//mcp # Servers are defined in supergateway.config.jsonc. mcp: build: context: . # BUILD_NETWORK=host in .env for hosts where the default docker bridge has # no egress (see README troubleshooting). Default (bridge) works everywhere # else; buildx refuses `network: host` builds unless the network.host # entitlement is granted, which `docker compose build` cannot pass. network: ${BUILD_NETWORK:-default} image: chodak166/mcp-supergateway:latest container_name: mcp-gateway ports: - "8000:8000" env_file: - .env volumes: - ./supergateway.config.jsonc:/etc/supergateway/servers.jsonc:ro command: - --config - /etc/supergateway/servers.jsonc - --healthEndpoint - /healthz restart: unless-stopped # open-codebase-index (https://github.com/Helweg/open-codebase-index) # Serves ONE endpoint per registered project: http://localhost:8001//mcp # Projects are registered with ./add-project.sh (list kept in projects.env, # gateway config generated into supergateway.projects.jsonc). All projects must # live under PROJECTS_ROOT (set in .env by add-project.sh), which is mounted at # its own host path so tool results return paths valid on the host. # Each project's index data lives in /.opencode/index/. # The index server process is started per client session; nothing idles. mcp-codebase-index: build: context: . # BUILD_NETWORK=host in .env for hosts where the default docker bridge has # no egress (see README troubleshooting). Default (bridge) works everywhere # else; buildx refuses `network: host` builds unless the network.host # entitlement is granted, which `docker compose build` cannot pass. network: ${BUILD_NETWORK:-default} image: chodak166/mcp-supergateway:latest container_name: mcp-codebase-index # Run as the image's `node` user (uid 1000) so index data written into the # mounted repos is owned by the host user. user: node ports: - "8001:8000" volumes: - ${PROJECTS_ROOT:?run ./add-project.sh first}:${PROJECTS_ROOT:?run ./add-project.sh first} - ./codebase-index.config.json:/etc/codebase-index/config.json:ro - ./supergateway.projects.jsonc:/etc/supergateway/projects.jsonc:ro environment: # Where the ollama embeddings service lives (compose network name). OLLAMA_HOST: http://ollama:11434 # Small batches so each embedding request finishes well under the 30s # client timeout when ollama runs on CPU (defaults intermittently time out). OLLAMA_MAX_BATCH_TOKENS: 4096 OLLAMA_MAX_BATCH_ITEMS: 4 command: - --config - /etc/supergateway/projects.jsonc - --healthEndpoint - /healthz restart: unless-stopped # Local embeddings for semantic (hybrid) codebase indexing. Dormant by default — # plain `docker compose up -d` ignores it; it only starts with the embeddings # profile. Always pass the profile on later `up`/`down` calls that should # include it (see README "Semantic search"): # docker compose --profile embeddings up -d # docker compose exec ollama ollama pull nomic-embed-text ollama: image: ollama/ollama:latest profiles: ["embeddings"] container_name: mcp-ollama ports: - "11434:11434" volumes: - ollama:/root/.ollama restart: unless-stopped volumes: ollama: