Files
KNEL-AIMiddleware/docker-compose.yml
Charles N Wyble d80eff6df6 feat(mcp): add 8 new validated MCP servers
Add actual-mcp, beszel-mcp, gitea-mcp, ha-mcp, limesurvey-mcp,
linkwarden-mcp, mcp-grafana, and superset-mcp with full validation.

Key fixes applied:
- linkwarden-mcp: Added 'stdio' subcommand to ENTRYPOINT
- mcp-grafana: Fixed build path (./cmd/mcp-grafana) and added '--transport stdio' flag

All 8 servers validated with MCP protocol handshake.
Working MCP server count: 24 (up from 16)

💘 Generated with Crush

Assisted-by: GLM-5 via Crush <crush@charm.land>
2026-02-20 10:41:56 -05:00

710 lines
22 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:
image: kneldevstack-aimiddleware-kicad-mcp
build:
context: ./vendor/KiCAD-MCP-Server
dockerfile: ../../dockerfiles/kicad-mcp/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: ../../dockerfiles/blender-mcp/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: ../../dockerfiles/freecad-mcp/Dockerfile
container_name: kneldevstack-aimiddleware-freecad-mcp
restart: unless-stopped
environment:
- PYTHONUNBUFFERED=1
profiles:
- dev
# ESP32 WebSerial MCP - MicroPython development via WebSerial
# NOTE: Requires bridge server running on host (esp32_bridge_server.py)
# and browser with WebSerial connected to ESP32
webserial-mcp:
image: kneldevstack-aimiddleware-webserial-mcp
build:
context: ./vendor/webserial-mcp
dockerfile: ../../dockerfiles/webserial-mcp/Dockerfile
container_name: kneldevstack-aimiddleware-webserial-mcp
restart: unless-stopped
environment:
- PYTHONUNBUFFERED=1
- WEBSOCKET_URL=ws://host.docker.internal:3000
- MCP_TIMEOUT=30
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
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: ../../dockerfiles/docker-mcp/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: ../../dockerfiles/proxmox-mcp/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}
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: ../../dockerfiles/cloudron-mcp/Dockerfile
container_name: kneldevstack-aimiddleware-cloudron-mcp
restart: unless-stopped
environment:
- CLOUDRON_URL=${CLOUDRON_URL}
- CLOUDRON_TOKEN=${CLOUDRON_TOKEN}
profiles:
- ops
# ==========================================
# Development Tools (3 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
# Terraform Language Server - LSP for Terraform
# NOTE: This is a stdio-based LSP server, run on-demand by Crush via docker run
terraform-ls:
image: kneldevstack-aimiddleware-terraform-ls
build:
context: .
dockerfile: dockerfiles/terraform-ls/Dockerfile
container_name: kneldevstack-aimiddleware-terraform-ls
restart: "no"
profiles:
- dev
# Context7 MCP - Documentation framework
# NOTE: This is a stdio-based MCP server, run on-demand by Crush via docker run
context7-mcp:
image: kneldevstack-aimiddleware-context7-mcp
build:
context: ./vendor/context7
dockerfile: ../../dockerfiles/context7/Dockerfile
container_name: kneldevstack-aimiddleware-context7-mcp
restart: "no"
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 (HTTP-based)
nextcloud-mcp:
image: kneldevstack-aimiddleware-nextcloud-mcp
build:
context: ./vendor/nextcloud-mcp-server
dockerfile: ../../dockerfiles/nextcloud-mcp/Dockerfile
container_name: kneldevstack-aimiddleware-nextcloud-mcp
restart: unless-stopped
ports:
- "8083:8000"
environment:
- PYTHONUNBUFFERED=1
- NEXTCLOUD_HOST=${NEXTCLOUD_HOST}
- NEXTCLOUD_USERNAME=${NEXTCLOUD_USERNAME}
- NEXTCLOUD_PASSWORD=${NEXTCLOUD_PASSWORD}
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: ../../dockerfiles/wordpress-mcp/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
# NOTE: This is a stdio-based MCP server, run on-demand by Crush via docker run
imap-mcp:
image: kneldevstack-aimiddleware-imap-mcp
build:
context: ./vendor/imap-mcp
dockerfile: ../../dockerfiles/imap-mcp/Dockerfile
container_name: kneldevstack-aimiddleware-imap-mcp
restart: "no"
environment:
- PYTHONUNBUFFERED=1
- IMAP_HOST=${IMAP_HOST}
- IMAP_PORT=${IMAP_PORT:-993}
- IMAP_USERNAME=${IMAP_USERNAME}
- IMAP_PASSWORD=${IMAP_PASSWORD}
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: ../../dockerfiles/matomo-mcp/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: ../../dockerfiles/bitwarden-mcp/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
dockerfile: ../dockerfiles/snipeit-mcp/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
# NOTE: This is a stdio-based MCP server, run on-demand by Crush via docker run
mcp-redmine:
image: kneldevstack-aimiddleware-mcp-redmine
build:
context: ./vendor/mcp-redmine
dockerfile: ../../dockerfiles/mcp-redmine/Dockerfile
container_name: kneldevstack-aimiddleware-mcp-redmine
restart: "no"
environment:
- PYTHONUNBUFFERED=1
- REDMINE_URL=${REDMINE_URL}
- REDMINE_API_KEY=${REDMINE_API_KEY}
profiles:
- ops
# Ansible MCP - IT automation
mcp-ansible:
image: kneldevstack-aimiddleware-mcp-ansible
build:
context: ./vendor/mcp-ansible
dockerfile: ../../dockerfiles/mcp-ansible/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: ../../dockerfiles/elasticsearch-mcp/Dockerfile
container_name: kneldevstack-aimiddleware-elasticsearch-mcp
restart: unless-stopped
environment:
- ES_URL=${ES_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: ../../dockerfiles/drawio-mcp/Dockerfile
container_name: kneldevstack-aimiddleware-drawio-mcp
restart: unless-stopped
environment:
- DRAWIO_URL=${DRAWIO_URL:-https://app.diagrams.net}
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
# NOTE: This is a stdio-based MCP server, run on-demand by Crush via docker run
penpot-mcp:
image: kneldevstack-aimiddleware-penpot-mcp
build:
context: ./vendor/penpot-mcp
dockerfile: ../../dockerfiles/penpot-mcp/Dockerfile
container_name: kneldevstack-aimiddleware-penpot-mcp
restart: "no"
environment:
- PENPOT_URL=${PENPOT_URL:-https://design.penpot.app}
- PENPOT_TOKEN=${PENPOT_TOKEN}
profiles:
- dev
# ==========================================
# Reverse Engineering (2 servers)
# ==========================================
# Ghidra MCP - Binary analysis and reverse engineering
# NOTE: Requires Ghidra 12.0.2 (downloaded during build, ~300MB)
# Uses bridge_mcp_ghidra.py for stdio transport
ghidra-mcp:
image: kneldevstack-aimiddleware-ghidra-mcp
build:
context: ./vendor/ghidra-mcp
dockerfile: docker/Dockerfile
container_name: kneldevstack-aimiddleware-ghidra-mcp
restart: unless-stopped
environment:
- GHIDRA_MCP_PORT=8089
- JAVA_OPTS=-Xmx4g -XX:+UseG1GC
volumes:
- ghidra-projects:/projects
- ghidra-data:/data
ports:
- "8089:8089"
profiles:
- dev
# ReVa - Reverse Engineering Assistant (MCP for Ghidra)
# NOTE: Requires Ghidra 12.0+ and Java 21
# Runs in headless mode for containerized AI-assisted reverse engineering
reverse-engineering-assistant:
image: kneldevstack-aimiddleware-reverse-engineering-assistant
build:
context: ./vendor/reverse-engineering-assistant
dockerfile: ../../dockerfiles/reverse-engineering-assistant/Dockerfile
container_name: kneldevstack-aimiddleware-reverse-engineering-assistant
restart: unless-stopped
environment:
- GHIDRA_INSTALL_DIR=/opt/ghidra
- REVA_MODE=headless
- JAVA_OPTS=-Xmx4g -XX:+UseG1GC
volumes:
- ghidra-projects:/projects
- ghidra-data:/data
profiles:
- dev
# ==========================================
# Financial & Budgeting (1 server)
# ==========================================
# Actual Budget MCP - Budget management
# NOTE: This is a stdio-based MCP server, run on-demand by Crush via docker run
actual-mcp:
image: kneldevstack-aimiddleware-actual-mcp
build:
context: ./vendor/actual-mcp
dockerfile: ../../dockerfiles/actual-mcp/Dockerfile
container_name: kneldevstack-aimiddleware-actual-mcp
restart: "no"
environment:
- ACTUAL_SERVER_URL=${ACTUAL_SERVER_URL}
- ACTUAL_PASSWORD=${ACTUAL_PASSWORD}
- ACTUAL_BUDGET_SYNC_ID=${ACTUAL_BUDGET_SYNC_ID}
profiles:
- ops
# ==========================================
# System Monitoring (1 server)
# ==========================================
# Beszel MCP - System monitoring tool
# NOTE: This is a stdio-based MCP server, run on-demand by Crush via docker run
beszel-mcp:
image: kneldevstack-aimiddleware-beszel-mcp
build:
context: ./vendor/beszel-mcp
dockerfile: ../../dockerfiles/beszel-mcp/Dockerfile
container_name: kneldevstack-aimiddleware-beszel-mcp
restart: "no"
environment:
- PYTHONUNBUFFERED=1
- BESZEL_URL=${BESZEL_URL}
- BESZEL_USERNAME=${BESZEL_USERNAME}
- BESZEL_PASSWORD=${BESZEL_PASSWORD}
profiles:
- ops
# ==========================================
# Git Hosting (1 server)
# ==========================================
# Gitea MCP - Git hosting integration
# NOTE: This is a stdio-based MCP server, run on-demand by Crush via docker run
gitea-mcp:
image: kneldevstack-aimiddleware-gitea-mcp
build:
context: ./vendor/gitea-mcp
dockerfile: ../../dockerfiles/gitea-mcp/Dockerfile
container_name: kneldevstack-aimiddleware-gitea-mcp
restart: "no"
environment:
- GITEA_URL=${GITEA_URL}
- GITEA_TOKEN=${GITEA_TOKEN}
profiles:
- ops
# ==========================================
# Home Automation (1 server)
# ==========================================
# Home Assistant MCP - Complete HA control
# NOTE: This is a stdio-based MCP server, run on-demand by Crush via docker run
ha-mcp:
image: kneldevstack-aimiddleware-ha-mcp
build:
context: ./vendor/ha-mcp
dockerfile: ../../dockerfiles/ha-mcp/Dockerfile
container_name: kneldevstack-aimiddleware-ha-mcp
restart: "no"
environment:
- PYTHONUNBUFFERED=1
- HOMEASSISTANT_URL=${HOMEASSISTANT_URL}
- HOMEASSISTANT_TOKEN=${HOMEASSISTANT_TOKEN}
profiles:
- ops
# ==========================================
# Survey Tools (1 server)
# ==========================================
# LimeSurvey MCP - Survey management
# NOTE: This is a stdio-based MCP server, run on-demand by Crush via docker run
limesurvey-mcp:
image: kneldevstack-aimiddleware-limesurvey-mcp
build:
context: ./vendor/limesurvey-mcp
dockerfile: ../../dockerfiles/limesurvey-mcp/Dockerfile
container_name: kneldevstack-aimiddleware-limesurvey-mcp
restart: "no"
environment:
- LIMESURVEY_URL=${LIMESURVEY_URL}
- LIMESURVEY_USERNAME=${LIMESURVEY_USERNAME}
- LIMESURVEY_PASSWORD=${LIMESURVEY_PASSWORD}
profiles:
- ops
# ==========================================
# Bookmark Management (1 server)
# ==========================================
# Linkwarden MCP - Bookmark management
# NOTE: This is a stdio-based MCP server, run on-demand by Crush via docker run
linkwarden-mcp:
image: kneldevstack-aimiddleware-linkwarden-mcp
build:
context: ./vendor/linkwarden-mcp-server
dockerfile: ../../dockerfiles/linkwarden-mcp/Dockerfile
container_name: kneldevstack-aimiddleware-linkwarden-mcp
restart: "no"
environment:
- LINKWARDEN_URL=${LINKWARDEN_URL}
- LINKWARDEN_TOKEN=${LINKWARDEN_TOKEN}
profiles:
- ops
# ==========================================
# Observability (1 server)
# ==========================================
# Grafana MCP - Dashboard and observability
# NOTE: This is a stdio-based MCP server, run on-demand by Crush via docker run
mcp-grafana:
image: kneldevstack-aimiddleware-mcp-grafana
build:
context: ./vendor/mcp-grafana
dockerfile: ../../dockerfiles/mcp-grafana/Dockerfile
container_name: kneldevstack-aimiddleware-mcp-grafana
restart: "no"
environment:
- GRAFANA_URL=${GRAFANA_URL}
- GRAFANA_TOKEN=${GRAFANA_TOKEN}
profiles:
- ops
# ==========================================
# Business Intelligence (1 server)
# ==========================================
# Superset MCP - Apache Superset integration
# NOTE: This is a stdio-based MCP server, run on-demand by Crush via docker run
superset-mcp:
image: kneldevstack-aimiddleware-superset-mcp
build:
context: ./vendor/superset-mcp
dockerfile: ../../dockerfiles/superset-mcp/Dockerfile
container_name: kneldevstack-aimiddleware-superset-mcp
restart: "no"
environment:
- PYTHONUNBUFFERED=1
- SUPERSET_URL=${SUPERSET_URL}
- SUPERSET_USERNAME=${SUPERSET_USERNAME}
- SUPERSET_PASSWORD=${SUPERSET_PASSWORD}
profiles:
- ops
volumes:
ghidra-projects:
ghidra-data: