From 01318fb1c29a616115dbf3d657e2b7a4c51efc2b Mon Sep 17 00:00:00 2001 From: Charles N Wyble Date: Wed, 21 Jan 2026 17:15:15 -0500 Subject: [PATCH] feat: add MCP servers infrastructure with Docker Compose MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add vendor directory for cloned MCP repositories - Create docker-compose.yml with 27 MCP/LSP servers - Implement KNELDevStack-AIMW- container naming convention - Add STATUS.md for tracking validation progress - Add AGENTS.md documentation for all configured agents - Update .gitignore to exclude vendor directory All servers categorized by function: - Design & Engineering (3) - Hosting & Infrastructure (5) - Development Tools (2) - Content Management (4) - Communication & Collaboration (3) - Analytics & Security (2) - Productivity & Automation (6) - Additional Tools (3) 💘 Generated with Crush Assisted-by: GLM-4.7 via Crush --- .gitignore | 1 + AGENTS.md | 176 +++++++++++++++++++ STATUS.md | 57 ++++++ docker-compose.yml | 422 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 656 insertions(+) create mode 100644 .gitignore create mode 100644 AGENTS.md create mode 100644 STATUS.md create mode 100644 docker-compose.yml diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..48b8bf9 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +vendor/ diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..3486b53 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,176 @@ +# AI Agents Documentation + +This document tracks the AI agents and MCP servers configured in this project. + +## Agents Overview + +### Available MCP Servers + +#### Design & Engineering (3 servers) +| Service | Container Name | Status | Description | +|---------|---------------|--------|-------------| +| kicad-mcp | KNELDevStack-AIMW-kicad-mcp | In Progress | PCB design automation with 64 tools, JLCPCB integration | +| blender-mcp | KNELDevStack-AIMW-blender-mcp | Pending | 3D modeling, materials, scenes, AI 3D model generation | +| freecad-mcp | KNELDevStack-AIMW-freecad-mcp | Pending | CAD modeling, Python execution, parts library | + +#### Hosting & Infrastructure (5 servers) +| Service | Container Name | Status | Description | +|---------|---------------|--------|-------------| +| kubernetes-mcp | KNELDevStack-AIMW-kubernetes-mcp | Pending | K8s/OpenShift management (native Go implementation) | +| docker-mcp | KNELDevStack-AIMW-docker-mcp | Pending | Container and compose stack management | +| proxmox-mcp | KNELDevStack-AIMW-proxmox-mcp | Pending | Hypervisor VM/container management | +| terraform-mcp | KNELDevStack-AIMW-terraform-mcp | Pending | IaC automation, HCP Terraform, workspace management | +| cloudron-mcp | KNELDevStack-AIMW-cloudron-mcp | Pending | Self-hosted app management | + +#### Development Tools (2 servers) +| Service | Container Name | Status | Description | +|---------|---------------|--------|-------------| +| bash-language-server | KNELDevStack-AIMW-bash-language-server | Pending | LSP for bash (diagnostics, completion, formatting) | +| context7-mcp | KNELDevStack-AIMW-context7-mcp | Pending | MCP server framework and SDK for documentation | + +#### Content Management (4 servers) +| Service | Container Name | Status | Description | +|---------|---------------|--------|-------------| +| nextcloud-mcp | KNELDevStack-AIMW-nextcloud-mcp | Pending | 90+ tools across 8 apps (Notes, Calendar, Files, Deck, etc.) | +| ghost-mcp | KNELDevStack-AIMW-ghost-mcp | Pending | CMS post, member, newsletter management | +| docspace-mcp | KNELDevStack-AIMW-docspace-mcp | Pending | Room, file, collaboration management | +| wordpress-mcp | KNELDevStack-AIMW-wordpress-mcp | Pending | WordPress integration via Abilities API | + +#### Communication & Collaboration (3 servers) +| Service | Container Name | Status | Description | +|---------|---------------|--------|-------------| +| discourse-mcp | KNELDevStack-AIMW-discourse-mcp | Pending | Forum search, posts, topics, categories (read/write modes) | +| imap-mcp | KNELDevStack-AIMW-imap-mcp | Pending | Email browsing, composition, Gmail OAuth2 support | +| postizz-mcp | KNELDevStack-AIMW-postizz-mcp | Pending | Social media management platform | + +#### Analytics & Security (2 servers) +| Service | Container Name | Status | Description | +|---------|---------------|--------|-------------| +| matomo-mcp | KNELDevStack-AIMW-matomo-mcp | Pending | Analytics integration | +| bitwarden-mcp | KNELDevStack-AIMW-bitwarden-mcp | Pending | Official password vault management | + +#### Productivity & Automation (6 servers) +| Service | Container Name | Status | Description | +|---------|---------------|--------|-------------| +| gimp-mcp | KNELDevStack-AIMW-gimp-mcp | Pending | Image editing with GIMP 3.0, OCR support | +| snipeit-mcp | KNELDevStack-AIMW-snipeit-mcp | Pending | Asset inventory, maintenance tracking | +| mcp-redmine | KNELDevStack-AIMW-mcp-redmine | Pending | Project management, issue tracking, file operations | +| mcp-ansible | KNELDevStack-AIMW-mcp-ansible | Pending | IT automation playbooks | +| elasticsearch-mcp | KNELDevStack-AIMW-elasticsearch-mcp | Pending | Search and index management (Rust) | +| audiobook-mcp | KNELDevStack-AIMW-audiobook-mcp | Pending | Audiobook management with AI-powered features | + +#### Additional Tools (3 servers) +| Service | Container Name | Status | Description | +|---------|---------------|--------|-------------| +| drawio-mcp | KNELDevStack-AIMW-drawio-mcp | Pending | Draw.io diagram management | +| docker-language-server | KNELDevStack-AIMW-docker-language-server | Pending | Language server for Dockerfiles, Compose files, Bake files | + +## Agent Capabilities + +### By Language + +#### TypeScript/Node.js (13 servers) +Most use `npx` for installation: +- KiCAD MCP +- Bitwarden MCP +- Discourse MCP +- Ghost MCP +- Cloudron MCP +- Kubernetes MCP +- Draw.io MCP +- Matomo MCP +- Postiz MCP +- WordPress MCP +- Audiobook MCP +- Context7 MCP +- Bash Language Server + +#### Python (10 servers) +Most use `uvx` for installation: +- Blender MCP +- FreeCAD MCP +- GIMP MCP +- Docker MCP +- Proxmox MCP +- Snipe-IT MCP +- Redmine MCP +- IMAP MCP +- Ansible MCP +- Nextcloud MCP (hybrid) + +#### Go (2 servers) +- Kubernetes MCP (also available via npx) +- Terraform MCP + +#### Rust (1 server) +- Elasticsearch MCP + +## Environment Variables Reference + +Common environment variables required for MCP servers: + +| Service | Required Variables | +|---------|-------------------| +| bitwarden-mcp | `BITWARDEN_CLIENT_ID`, `BITWARDEN_CLIENT_SECRET`, `BITWARDEN_PASSWORD`, `BITWARDEN_SERVER_URL` | +| discourse-mcp | `DISCOURSE_URL`, `DISCOURSE_API_KEY`, `DISCOURSE_API_USERNAME` | +| ghost-mcp | `GHOST_API_URL`, `GHOST_ADMIN_API_KEY` | +| cloudron-mcp | `CLOUDRON_URL`, `CLOUDRON_TOKEN` | +| nextcloud-mcp | `NEXTCLOUD_HOST`, `NEXTCLOUD_USERNAME`, `NEXTCLOUD_APP_PASSWORD` | +| proxmox-mcp | `PROXMOX_HOST`, `PROXMOX_USER`, `PROXMOX_TOKEN`, `PROXMOX_NODE` | +| snipeit-mcp | `SNIPEIT_URL`, `SNIPEIT_TOKEN` | +| redmine-mcp | `REDMINE_URL`, `REDMINE_API_KEY` | +| wordpress-mcp | `WORDPRESS_URL`, `WORDPRESS_USERNAME`, `WORDPRESS_APPLICATION_PASSWORD` | +| docspace-mcp | `DOCSPACE_HOST`, `DOCSPACE_TOKEN` | +| imap-mcp | `IMAP_SERVER`, `IMAP_PORT`, `IMAP_USERNAME`, `IMAP_PASSWORD` | +| postizz-mcp | `POSTIZ_API_KEY`, `POSTIZ_URL` | +| matomo-mcp | `MATOMO_URL`, `MATOMO_TOKEN` | +| elasticsearch-mcp | `ELASTICSEARCH_URL`, `ELASTICSEARCH_USERNAME`, `ELASTICSEARCH_PASSWORD` | +| context7-mcp | `UPSTASH_REDIS_REST_URL`, `UPSTASH_REDIS_REST_TOKEN` | + +## Quick Start + +To start an agent: +```bash +docker compose up -d +``` + +Example: +```bash +docker compose up -d kicad-mcp +``` + +To view logs: +```bash +docker compose logs -f +``` + +To stop an agent: +```bash +docker compose stop +``` + +## Development Notes + +- All containers use the prefix `KNELDevStack-AIMW-` for easy identification +- Container names are in PascalCase for readability +- Service names are lowercase for Docker Compose compatibility +- Each agent is validated individually before moving to the next +- Vendor directory is gitignored to avoid committing cloned repositories + +## Validation Checklist + +For each agent, verify: +- [ ] Container builds successfully +- [ ] Container starts without errors +- [ ] Logs show proper initialization +- [ ] Environment variables are correctly set (if required) +- [ ] MCP protocol handshake completes +- [ ] Tools are registered and available +- [ ] Resources are accessible (if applicable) + +## References + +- [Model Context Protocol](https://modelcontextprotocol.io/) +- [MCP SDK](https://github.com/modelcontextprotocol/sdk) +- [AIWorkStack-dev](https://github.com/stars/ReachableCEO/lists/aiworkstack-dev) +- [AIWorkStack-ops](https://github.com/stars/ReachableCEO/lists/aiworkstack-ops) diff --git a/STATUS.md b/STATUS.md new file mode 100644 index 0000000..cf1f505 --- /dev/null +++ b/STATUS.md @@ -0,0 +1,57 @@ +# MCP Servers Setup Status + +Tracking the setup and validation of MCP/LSP servers via Docker Compose. + +| Repository | Status | Notes | +|------------|--------|-------| +| KiCAD-MCP-Server | Pending | | +| freecad-mcp | Pending | | +| blender-mcp | Pending | | +| context7 | Pending | | +| gimp-mcp | Pending | | +| bash-language-server | Pending | | +| docker-language-server | Pending | | +| drawio-mcp-server | Pending | | +| matomo-mcp-client | Pending | | +| imap-mcp | Pending | | +| mcp-redmine | Pending | | +| ghost-mcp | Pending | | +| discourse-mcp | Pending | | +| mcp-cloudron | Pending | | +| postizz-MCP | Pending | | +| snipeit-mcp | Pending | | +| nextcloud-mcp-server | Pending | | +| docspace-mcp | Pending | | +| docker-mcp | Pending | | +| kubernetes-mcp-server | Pending | | +| ProxmoxMCP | Pending | | +| terraform-mcp-server | Pending | | +| mcp-ansible | Pending | | +| mcp-server (Bitwarden) | Pending | | +| mcp-adapter (WordPress) | Pending | | +| audiobook-mcp-server | Pending | | +| mcp-server-elasticsearch | Pending | | + +## Usage + +To build and start a specific server: +```bash +docker compose up -d +``` + +To view logs: +```bash +docker compose logs -f +``` + +To stop a server: +```bash +docker compose stop +``` + +To rebuild a server after changes: +```bash +docker compose build --no-cache +``` + +Note: Use lowercase service names from the compose file. Container names will still be prefixed with CDS-AIMW-. diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..7fefe69 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,422 @@ +services: + # ========================================== + # Design & Engineering (3 servers) + # ========================================== + + # KiCAD MCP - PCB design automation + kicad-mcp: + build: + context: ./vendor/KiCAD-MCP-Server + dockerfile: Dockerfile + container_name: KNELDevStack-AIMW-kicad-mcp + restart: unless-stopped + environment: + - NODE_ENV=production + 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-AIMW-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-AIMW-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-AIMW-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-AIMW-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-AIMW-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-AIMW-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-AIMW-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: Dockerfile + container_name: KNELDevStack-AIMW-bash-language-server + restart: unless-stopped + ports: + - "8082:8080" + command: ["npm", "start"] + profiles: + - dev + + # Context7 MCP - Documentation framework + context7-mcp: + build: + context: ./vendor/context7 + dockerfile: Dockerfile + container_name: KNELDevStack-AIMW-context7-mcp + restart: unless-stopped + environment: + - UPSTASH_REDIS_REST_URL=${UPSTASH_REDIS_REST_URL} + - UPSTASH_REDIS_REST_TOKEN=${UPSTASH_REDIS_REST_TOKEN} + command: ["node", "packages/mcp/dist/index.js", "--transport", "stdio"] + 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-AIMW-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-AIMW-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-AIMW-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-AIMW-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-AIMW-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-AIMW-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-AIMW-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-AIMW-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-AIMW-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-AIMW-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-AIMW-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-AIMW-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-AIMW-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-AIMW-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-AIMW-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-AIMW-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: Dockerfile + container_name: KNELDevStack-AIMW-docker-language-server + restart: unless-stopped + ports: + - "8085:8080" + profiles: + - dev