# Core MCP Stack: Neo4j + MCP Server + FastAPI Backend
services:
neo4j:
image: neo4j:5.18
container_name: ml-mcp-neo4j
networks:
- mcp_network
ports:
- "7474:7474"
- "7687:7687"
environment:
- NEO4J_AUTH=neo4j/${NEO4J_PASSWORD:?Set NEO4J_PASSWORD in .env}
- NEO4J_PLUGINS=["apoc"]
- NEO4J_dbms_security_procedures_unrestricted=apoc.*
- NEO4J_dbms_security_procedures_allowlist=apoc.*
- NEO4J_apoc_export_file_enabled=true
- NEO4J_apoc_import_file_enabled=true
volumes:
- neo4j_data:/data
- neo4j_logs:/logs
- neo4j_import:/var/lib/neo4j/import
- neo4j_plugins:/plugins
restart: unless-stopped
healthcheck:
test: [ "CMD-SHELL", "cypher-shell -u neo4j -p ${NEO4J_PASSWORD} 'RETURN 1' || exit 1" ]
interval: 10s
timeout: 10s
retries: 10
start_period: 30s
mcp-server:
build:
context: ..
dockerfile: docker/Dockerfile.mcp
container_name: ml-mcp-server
networks:
- mcp_network
ports:
- "8005:8005"
env_file:
- ../.env
depends_on:
neo4j:
condition: service_healthy
restart: unless-stopped
healthcheck:
test: [ "CMD-SHELL", "python3 -c \"import socket; s=socket.socket(); s.connect(('localhost',8005)); s.close()\"" ]
interval: 10s
timeout: 5s
retries: 5
start_period: 15s
topwr-api:
build:
context: ..
dockerfile: docker/Dockerfile.api
container_name: ml-mcp-api
networks:
- mcp_network
ports:
- "8000:8000"
depends_on:
mcp-server:
condition: service_healthy
restart: unless-stopped
healthcheck:
test: [ "CMD-SHELL", "curl -f http://localhost:8000/health || exit 1" ]
interval: 10s
timeout: 5s
retries: 5
volumes:
neo4j_data:
neo4j_logs:
neo4j_import:
neo4j_plugins:
networks:
mcp_network:
driver: bridge