services: # ========================================== # Design & Engineering (3 servers) # ========================================== # KiCAD MCP - PCB design automation # NOTE: Requires KiCAD to be installed on host machine # The MCP server connects to an existing KiCAD instance via TCP kicad-mcp: image: kneldevstack-aimiddleware-kicad-mcp build: context: ./vendor/KiCAD-MCP-Server dockerfile: Dockerfile container_name: kneldevstack-aimiddleware-kicad-mcp restart: unless-stopped environment: - NODE_ENV=production - KICAD_HOST=${KICAD_HOST:-host.docker.internal} - KICAD_PORT=${KICAD_PORT:-5555} command: ["node", "dist/index.js"] profiles: - dev # Blender MCP - 3D modeling and materials blender-mcp: image: kneldevstack-aimiddleware-blender-mcp build: context: ./vendor/blender-mcp dockerfile: Dockerfile container_name: kneldevstack-aimiddleware-blender-mcp restart: unless-stopped environment: - PYTHONUNBUFFERED=1 profiles: - dev # FreeCAD MCP - CAD modeling freecad-mcp: image: kneldevstack-aimiddleware-freecad-mcp build: context: ./vendor/freecad-mcp dockerfile: Dockerfile container_name: kneldevstack-aimiddleware-freecad-mcp restart: unless-stopped environment: - PYTHONUNBUFFERED=1 profiles: - dev # ========================================== # Hosting & Infrastructure (5 servers) # ========================================== # Kubernetes MCP - K8s/OpenShift management kubernetes-mcp: image: kneldevstack-aimiddleware-kubernetes-mcp build: context: ./vendor/kubernetes-mcp-server dockerfile: Dockerfile container_name: kneldevstack-aimiddleware-kubernetes-mcp restart: unless-stopped ports: - "8081:8080" volumes: - ~/.kube/config:/root/.kube/config:ro profiles: - ops # Docker MCP - Container and compose management docker-mcp: image: kneldevstack-aimiddleware-docker-mcp build: context: ./vendor/docker-mcp dockerfile: Dockerfile container_name: kneldevstack-aimiddleware-docker-mcp restart: unless-stopped volumes: - /var/run/docker.sock:/var/run/docker.sock - ~/.docker/config.json:/root/.docker/config.json:ro environment: - PYTHONUNBUFFERED=1 command: ["uvx", "docker-mcp"] profiles: - ops # Proxmox MCP - Hypervisor management proxmox-mcp: image: kneldevstack-aimiddleware-proxmox-mcp build: context: ./vendor/ProxmoxMCP dockerfile: Dockerfile container_name: kneldevstack-aimiddleware-proxmox-mcp restart: unless-stopped environment: - PYTHONUNBUFFERED=1 - PROXMOX_HOST=${PROXMOX_HOST} - PROXMOX_USER=${PROXMOX_USER} - PROXMOX_TOKEN=${PROXMOX_TOKEN} - PROXMOX_NODE=${PROXMOX_NODE} command: ["uvx", "proxmox-mcp"] profiles: - ops # Terraform MCP - IaC automation terraform-mcp: image: kneldevstack-aimiddleware-terraform-mcp build: context: ./vendor/terraform-mcp-server dockerfile: Dockerfile target: dev container_name: kneldevstack-aimiddleware-terraform-mcp restart: unless-stopped environment: - HOME=/terraform volumes: - ~/.terraform.d:/terraform/.terraform.d:ro - ./terraform-cache:/terraform/.terraform.cache profiles: - ops # Cloudron MCP - Self-hosted app management cloudron-mcp: image: kneldevstack-aimiddleware-cloudron-mcp build: context: ./vendor/mcp-cloudron dockerfile: Dockerfile container_name: kneldevstack-aimiddleware-cloudron-mcp restart: unless-stopped environment: - CLOUDRON_URL=${CLOUDRON_URL} - CLOUDRON_TOKEN=${CLOUDRON_TOKEN} profiles: - ops # ========================================== # Development Tools (2 servers) # ========================================== # Bash Language Server - LSP for bash # NOTE: This is a stdio-based LSP server, run on-demand by Crush via docker run bash-language-server: image: kneldevstack-aimiddleware-bash-language-server build: context: ./vendor/bash-language-server dockerfile: ../../dockerfiles/bash-language-server/Dockerfile container_name: kneldevstack-aimiddleware-bash-language-server restart: "no" profiles: - dev # Context7 MCP - Documentation framework context7-mcp: image: kneldevstack-aimiddleware-context7-mcp build: context: ./vendor/context7 dockerfile: ../../dockerfiles/context7/Dockerfile container_name: kneldevstack-aimiddleware-context7-mcp restart: unless-stopped environment: - UPSTASH_REDIS_REST_URL=${UPSTASH_REDIS_REST_URL} - UPSTASH_REDIS_REST_TOKEN=${UPSTASH_REDIS_REST_TOKEN} profiles: - dev # ========================================== # Content Management (4 servers) # ========================================== # Nextcloud MCP - 90+ tools across 8 apps nextcloud-mcp: image: kneldevstack-aimiddleware-nextcloud-mcp build: context: ./vendor/nextcloud-mcp-server dockerfile: Dockerfile container_name: kneldevstack-aimiddleware-nextcloud-mcp restart: unless-stopped environment: - PYTHONUNBUFFERED=1 - NEXTCLOUD_HOST=${NEXTCLOUD_HOST} - NEXTCLOUD_USERNAME=${NEXTCLOUD_USERNAME} - NEXTCLOUD_APP_PASSWORD=${NEXTCLOUD_APP_PASSWORD} ports: - "8083:8080" profiles: - ops # Ghost MCP - CMS integration ghost-mcp: image: kneldevstack-aimiddleware-ghost-mcp build: context: ./vendor/ghost-mcp dockerfile: ../../dockerfiles/ghost-mcp/Dockerfile container_name: kneldevstack-aimiddleware-ghost-mcp restart: "no" environment: - GHOST_API_URL=${GHOST_API_URL:-http://localhost:2368} - GHOST_ADMIN_API_KEY=${GHOST_ADMIN_API_KEY:-012345678901234567890123:0123456789012345678901234567890123456789012345678901234567890123} profiles: - ops # ONLYOFFICE DocSpace MCP - Room and file management docspace-mcp: image: kneldevstack-aimiddleware-docspace-mcp build: context: ./vendor/docspace-mcp dockerfile: Dockerfile container_name: kneldevstack-aimiddleware-docspace-mcp restart: unless-stopped environment: - DOCSPACE_HOST=${DOCSPACE_HOST} - DOCSPACE_TOKEN=${DOCSPACE_TOKEN} profiles: - ops # WordPress MCP Adapter wordpress-mcp: image: kneldevstack-aimiddleware-wordpress-mcp build: context: ./vendor/mcp-adapter dockerfile: Dockerfile container_name: kneldevstack-aimiddleware-wordpress-mcp restart: unless-stopped environment: - WORDPRESS_URL=${WORDPRESS_URL} - WORDPRESS_USERNAME=${WORDPRESS_USERNAME} - WORDPRESS_APPLICATION_PASSWORD=${WORDPRESS_APPLICATION_PASSWORD} command: ["npx", "-y", "@wordpress/mcp-adapter"] profiles: - ops # ========================================== # Communication & Collaboration (3 servers) # ========================================== # Discourse MCP - Forum integration discourse-mcp: image: kneldevstack-aimiddleware-discourse-mcp build: context: ./vendor/discourse-mcp dockerfile: ../../dockerfiles/discourse-mcp/Dockerfile container_name: kneldevstack-aimiddleware-discourse-mcp restart: unless-stopped environment: - DISCOURSE_URL=${DISCOURSE_URL} - DISCOURSE_API_KEY=${DISCOURSE_API_KEY} - DISCOURSE_API_USERNAME=${DISCOURSE_API_USERNAME} profiles: - ops # IMAP MCP - Email processing imap-mcp: image: kneldevstack-aimiddleware-imap-mcp build: context: ./vendor/imap-mcp dockerfile: Dockerfile container_name: kneldevstack-aimiddleware-imap-mcp restart: unless-stopped environment: - PYTHONUNBUFFERED=1 - IMAP_SERVER=${IMAP_SERVER} - IMAP_PORT=${IMAP_PORT:-993} - IMAP_USERNAME=${IMAP_USERNAME} - IMAP_PASSWORD=${IMAP_PASSWORD} command: ["uvx", "imap-mcp"] profiles: - ops # Postiz MCP - Social media management postizz-mcp: image: kneldevstack-aimiddleware-postizz-mcp build: context: ./vendor/postizz-MCP dockerfile: Dockerfile container_name: kneldevstack-aimiddleware-postizz-mcp restart: unless-stopped environment: - POSTIZ_API_KEY=${POSTIZ_API_KEY} - POSTIZ_URL=${POSTIZ_URL} profiles: - ops # ========================================== # Analytics & Security (2 servers) # ========================================== # Matomo MCP Client matomo-mcp: image: kneldevstack-aimiddleware-matomo-mcp build: context: ./vendor/matomo-mcp-client dockerfile: Dockerfile container_name: kneldevstack-aimiddleware-matomo-mcp restart: unless-stopped environment: - MATOMO_URL=${MATOMO_URL} - MATOMO_TOKEN=${MATOMO_TOKEN} profiles: - ops # Bitwarden MCP - Password vault bitwarden-mcp: image: kneldevstack-aimiddleware-bitwarden-mcp build: context: ./vendor/mcp-server dockerfile: Dockerfile container_name: kneldevstack-aimiddleware-bitwarden-mcp restart: unless-stopped environment: - BITWARDEN_CLIENT_ID=${BITWARDEN_CLIENT_ID} - BITWARDEN_CLIENT_SECRET=${BITWARDEN_CLIENT_SECRET} - BITWARDEN_PASSWORD=${BITWARDEN_PASSWORD} - BITWARDEN_SERVER_URL=${BITWARDEN_SERVER_URL:-https://vault.bitwarden.com} command: ["npx", "-y", "@bitwarden/mcp-server"] profiles: - ops # ========================================== # Productivity & Automation (6 servers) # ========================================== # GIMP MCP - Image editing gimp-mcp: image: kneldevstack-aimiddleware-gimp-mcp build: context: ./vendor/gimp-mcp dockerfile: ../../dockerfiles/gimp-mcp/Dockerfile container_name: kneldevstack-aimiddleware-gimp-mcp restart: unless-stopped environment: - PYTHONUNBUFFERED=1 profiles: - dev # Snipe-IT MCP - Asset inventory snipeit-mcp: image: kneldevstack-aimiddleware-snipeit-mcp build: context: ./vendor/snipeit-mcp dockerfile: Dockerfile container_name: kneldevstack-aimiddleware-snipeit-mcp restart: unless-stopped environment: - PYTHONUNBUFFERED=1 - SNIPEIT_URL=${SNIPEIT_URL} - SNIPEIT_TOKEN=${SNIPEIT_TOKEN} command: ["uvx", "snipeit-mcp"] profiles: - ops # Redmine MCP - Project management mcp-redmine: image: kneldevstack-aimiddleware-mcp-redmine build: context: ./vendor/mcp-redmine dockerfile: Dockerfile container_name: kneldevstack-aimiddleware-mcp-redmine restart: unless-stopped environment: - PYTHONUNBUFFERED=1 - REDMINE_URL=${REDMINE_URL} - REDMINE_API_KEY=${REDMINE_API_KEY} command: ["uvx", "mcp-redmine"] profiles: - ops # Ansible MCP - IT automation mcp-ansible: image: kneldevstack-aimiddleware-mcp-ansible build: context: ./vendor/mcp-ansible dockerfile: Dockerfile container_name: kneldevstack-aimiddleware-mcp-ansible restart: unless-stopped environment: - PYTHONUNBUFFERED=1 volumes: - ./ansible-playbooks:/playbooks:ro - /var/run/docker.sock:/var/run/docker.sock command: ["uvx", "mcp-ansible"] profiles: - ops # Elasticsearch MCP elasticsearch-mcp: image: kneldevstack-aimiddleware-elasticsearch-mcp build: context: ./vendor/mcp-server-elasticsearch dockerfile: Dockerfile container_name: kneldevstack-aimiddleware-elasticsearch-mcp restart: unless-stopped environment: - ELASTICSEARCH_URL=${ELASTICSEARCH_URL:-http://localhost:9200} - ELASTICSEARCH_USERNAME=${ELASTICSEARCH_USERNAME} - ELASTICSEARCH_PASSWORD=${ELASTICSEARCH_PASSWORD} ports: - "8084:8080" profiles: - ops # Audiobook MCP Server audiobook-mcp: image: kneldevstack-aimiddleware-audiobook-mcp build: context: ./vendor/audiobook-mcp-server dockerfile: ../../dockerfiles/audiobook-mcp/Dockerfile container_name: kneldevstack-aimiddleware-audiobook-mcp restart: unless-stopped environment: - AUDIOBOOK_ROOT=${AUDIOBOOK_ROOT:-/audiobooks} volumes: - ${AUDIOBOOK_ROOT:-/audiobooks}:/audiobooks command: ["node", "dist/index.js"] profiles: - dev # ========================================== # Additional Tools (3 servers) # ========================================== # Draw.io MCP Server drawio-mcp: image: kneldevstack-aimiddleware-drawio-mcp build: context: ./vendor/drawio-mcp-server dockerfile: Dockerfile container_name: kneldevstack-aimiddleware-drawio-mcp restart: unless-stopped environment: - DRAWIO_URL=${DRAWIO_URL:-https://app.diagrams.net} command: ["npx", "-y", "drawio-mcp-server"] profiles: - dev # Docker Language Server # NOTE: This is a stdio-based LSP server, run on-demand by Crush via docker run docker-language-server: image: kneldevstack-aimiddleware-docker-language-server build: context: ./vendor/docker-language-server dockerfile: ../../dockerfiles/docker-language-server/Dockerfile container_name: kneldevstack-aimiddleware-docker-language-server restart: "no" profiles: - dev # Marksman LSP - Markdown language server # NOTE: This is a stdio-based LSP server, run on-demand by Crush via docker run marksman: image: kneldevstack-aimiddleware-marksman build: context: ./vendor/marksman dockerfile: ../../dockerfiles/marksman/Dockerfile container_name: kneldevstack-aimiddleware-marksman restart: "no" profiles: - dev # ========================================== # Design Tools (Added Later) # ========================================== # Penpot MCP - Design collaboration platform penpot-mcp: image: kneldevstack-aimiddleware-penpot-mcp build: context: ./vendor/penpot-mcp dockerfile: Dockerfile container_name: kneldevstack-aimiddleware-penpot-mcp restart: unless-stopped environment: - PENPOT_URL=${PENPOT_URL:-https://design.penpot.app} - PENPOT_TOKEN=${PENPOT_TOKEN} profiles: - dev