Files
KNEL-AIMiddleware/docker-compose.yml
Charles N Wyble a3c3358d5e feat: Add context7-mcp with custom Dockerfile
- Create dockerfiles/context7/Dockerfile for monorepo build
- Update docker-compose.yml to use custom Dockerfile context
- Build approach: copy all source, then pnpm install workspaces, then build:mcp
- Requires UPSTASH_REDIS_REST_URL and UPSTASH_REDIS_REST_TOKEN env vars
- Follows AGENTS.md guidelines for Dockerfile management

Note: Monorepo structure requires full source copy before dependency resolution
to properly install workspace dependencies across packages/mcp, packages/sdk, etc.
2026-01-21 19:39:23 -05:00

448 lines
12 KiB
YAML

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:
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:
build:
context: ./vendor/blender-mcp
dockerfile: Dockerfile
container_name: KNELDevStack-AIMiddleware-blender-mcp
restart: unless-stopped
environment:
- PYTHONUNBUFFERED=1
command: ["uvx", "blender-mcp"]
profiles:
- dev
# FreeCAD MCP - CAD modeling
freecad-mcp:
build:
context: ./vendor/freecad-mcp
dockerfile: Dockerfile
container_name: KNELDevStack-AIMiddleware-freecad-mcp
restart: unless-stopped
environment:
- PYTHONUNBUFFERED=1
command: ["uvx", "freecad-mcp"]
profiles:
- dev
# ==========================================
# Hosting & Infrastructure (5 servers)
# ==========================================
# Kubernetes MCP - K8s/OpenShift management
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:
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:
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:
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:
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
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:
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:
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 management
ghost-mcp:
build:
context: ./vendor/ghost-mcp
dockerfile: Dockerfile
container_name: KNELDevStack-AIMiddleware-ghost-mcp
restart: unless-stopped
environment:
- GHOST_API_URL=${GHOST_API_URL}
- GHOST_ADMIN_API_KEY=${GHOST_ADMIN_API_KEY}
command: ["npx", "-y", "@fanyangmeng/ghost-mcp"]
profiles:
- ops
# ONLYOFFICE DocSpace MCP - Room and file management
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:
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:
build:
context: ./vendor/discourse-mcp
dockerfile: 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}
command: ["npx", "-y", "@discourse/mcp"]
profiles:
- ops
# IMAP MCP - Email processing
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:
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:
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:
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:
build:
context: ./vendor/gimp-mcp
dockerfile: Dockerfile
container_name: KNELDevStack-AIMiddleware-gimp-mcp
restart: unless-stopped
environment:
- PYTHONUNBUFFERED=1
command: ["uvx", "gimp-mcp"]
profiles:
- dev
# Snipe-IT MCP - Asset inventory
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:
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:
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:
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:
build:
context: ./vendor/audiobook-mcp-server
dockerfile: Dockerfile
container_name: KNELDevStack-AIMiddleware-audiobook-mcp
restart: unless-stopped
environment:
- AUDIOBOOK_LIBRARY_PATH=${AUDIOBOOK_LIBRARY_PATH:-/audiobooks}
volumes:
- ${AUDIOBOOK_LIBRARY_PATH:-/audiobooks}:/audiobooks
command: ["npx", "-y", "audiobook-mcp-server"]
profiles:
- dev
# ==========================================
# Additional Tools (3 servers)
# ==========================================
# Draw.io MCP Server
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
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
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:
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