New MCP servers added to the gateway stack: - memory-bank-mcp (port 8700): Persistent key-value memory storage with tags, categories, and search - puppeteer-mcp (port 8800): Headless browser automation via Pyppeteer (navigate, screenshot, click, JS eval, PDF gen) - sequential-thinking-mcp (port 8900): Structured step-by-step reasoning with branching hypotheses and synthesis - docker-mcp (port 9000): Docker container/image/network/volume management via Docker socket All servers follow the existing Python/FastMCP pattern with streamable-http transport. docker-compose.yml updated with service definitions and gateway backend routes.
268 lines
7.6 KiB
YAML
268 lines
7.6 KiB
YAML
networks:
|
|
mcpnet:
|
|
driver: bridge
|
|
|
|
services:
|
|
|
|
gateway:
|
|
build:
|
|
context: ./gateway-proxy
|
|
dockerfile: Dockerfile
|
|
container_name: mcp-gateway
|
|
restart: unless-stopped
|
|
ports:
|
|
- "${GATEWAY_PORT:-4444}:4444"
|
|
volumes:
|
|
- gateway-data:/data
|
|
environment:
|
|
- PORT=4444
|
|
- OAUTH_ISSUER_URL=${OAUTH_ISSUER_URL}
|
|
- OAUTH_PASSWORD=${OAUTH_PASSWORD}
|
|
- OAUTH_ACCESS_TOKEN_TTL=${OAUTH_ACCESS_TOKEN_TTL:-3600}
|
|
- OAUTH_REFRESH_TOKEN_TTL=${OAUTH_REFRESH_TOKEN_TTL:-2592000}
|
|
- MCP_BACKEND_ERPNEXT=http://mcp-erpnext:32802/mcp
|
|
- MCP_BACKEND_TRUENAS=http://mcp-truenas:8100/mcp
|
|
- MCP_BACKEND_HOMEASSISTANT=http://mcp-homeassistant:8200/mcp
|
|
- MCP_BACKEND_WAVE=http://mcp-wave:8300/mcp
|
|
- MCP_BACKEND_LINKEDIN=http://mcp-linkedin:8500/mcp
|
|
- MCP_BACKEND_FORGEJO=http://mcp-forgejo:8400/mcp
|
|
- MCP_BACKEND_SSH=http://mcp-ssh:8600/mcp
|
|
- MCP_BACKEND_MEMORY_BANK=http://mcp-memory-bank:8700/mcp
|
|
- MCP_BACKEND_PUPPETEER=http://mcp-puppeteer:8800/mcp
|
|
- MCP_BACKEND_SEQUENTIAL_THINKING=http://mcp-sequential-thinking:8900/mcp
|
|
- MCP_BACKEND_DOCKER=http://mcp-docker:9000/mcp
|
|
- GATEWAY_STATIC_API_KEY=${GATEWAY_STATIC_API_KEY}
|
|
depends_on:
|
|
- erpnext-mcp
|
|
- truenas-mcp
|
|
- homeassistant-mcp
|
|
- wave-mcp
|
|
- linkedin-mcp
|
|
- forgejo-mcp
|
|
- ssh-mcp
|
|
- memory-bank-mcp
|
|
- puppeteer-mcp
|
|
- sequential-thinking-mcp
|
|
- docker-mcp
|
|
networks: [mcpnet]
|
|
healthcheck:
|
|
test: ["CMD", "python3", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:4444/health', timeout=5)"]
|
|
interval: 15s
|
|
timeout: 5s
|
|
start_period: 15s
|
|
retries: 3
|
|
|
|
erpnext-mcp:
|
|
build:
|
|
context: ./erpnext-mcp
|
|
dockerfile: Dockerfile
|
|
container_name: mcp-erpnext
|
|
restart: unless-stopped
|
|
environment:
|
|
- TRANSPORT=http
|
|
- PORT=32802
|
|
- ERPNEXT_URL=${ERPNEXT_URL}
|
|
- ERPNEXT_API_KEY=${ERPNEXT_API_KEY}
|
|
- ERPNEXT_API_SECRET=${ERPNEXT_API_SECRET}
|
|
networks: [mcpnet]
|
|
healthcheck:
|
|
test: ["CMD", "wget", "-qO-", "http://localhost:32802/health"]
|
|
interval: 30s
|
|
timeout: 5s
|
|
start_period: 15s
|
|
retries: 3
|
|
|
|
truenas-mcp:
|
|
build:
|
|
context: ./truenas-mcp
|
|
dockerfile: Dockerfile
|
|
container_name: mcp-truenas
|
|
restart: unless-stopped
|
|
environment:
|
|
- TRUENAS_URL=${TRUENAS_URL}
|
|
- TRUENAS_API_KEY=${TRUENAS_API_KEY}
|
|
- PORT=8100
|
|
networks: [mcpnet]
|
|
healthcheck:
|
|
test: ["CMD", "python3", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8100/mcp', timeout=5)"]
|
|
interval: 30s
|
|
timeout: 5s
|
|
start_period: 15s
|
|
retries: 3
|
|
|
|
homeassistant-mcp:
|
|
build:
|
|
context: ./homeassistant-mcp
|
|
dockerfile: Dockerfile
|
|
container_name: mcp-homeassistant
|
|
restart: unless-stopped
|
|
environment:
|
|
- HASS_URL=${HASS_URL}
|
|
- HASS_TOKEN=${HASS_TOKEN}
|
|
- PORT=8200
|
|
networks: [mcpnet]
|
|
healthcheck:
|
|
test: ["CMD", "python3", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8200/mcp', timeout=5)"]
|
|
interval: 30s
|
|
timeout: 5s
|
|
start_period: 15s
|
|
retries: 3
|
|
|
|
wave-mcp:
|
|
build:
|
|
context: ./wave-mcp
|
|
dockerfile: Dockerfile
|
|
container_name: mcp-wave
|
|
restart: unless-stopped
|
|
environment:
|
|
- TRANSPORT=http
|
|
- PORT=8300
|
|
- WAVE_ACCESS_TOKEN=${WAVE_ACCESS_TOKEN}
|
|
networks: [mcpnet]
|
|
healthcheck:
|
|
test: ["CMD", "wget", "-qO-", "http://localhost:8300/health"]
|
|
interval: 30s
|
|
timeout: 5s
|
|
start_period: 15s
|
|
retries: 3
|
|
|
|
linkedin-mcp:
|
|
build:
|
|
context: ./linkedin-mcp
|
|
dockerfile: Dockerfile
|
|
container_name: mcp-linkedin
|
|
restart: unless-stopped
|
|
environment:
|
|
- PORT=8500
|
|
- LINKEDIN_CLIENT_ID=${LINKEDIN_CLIENT_ID}
|
|
- LINKEDIN_CLIENT_SECRET=${LINKEDIN_CLIENT_SECRET}
|
|
- LINKEDIN_REDIRECT_URI=${LINKEDIN_REDIRECT_URI}
|
|
volumes:
|
|
- linkedin-data:/data
|
|
networks: [mcpnet]
|
|
healthcheck:
|
|
test: ["CMD", "python3", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8500/health', timeout=5)"]
|
|
interval: 30s
|
|
timeout: 5s
|
|
start_period: 10s
|
|
retries: 3
|
|
|
|
forgejo-mcp:
|
|
build:
|
|
context: ./forgejo-mcp
|
|
dockerfile: Dockerfile
|
|
container_name: mcp-forgejo
|
|
restart: unless-stopped
|
|
environment:
|
|
- TRANSPORT=http
|
|
- PORT=8400
|
|
- FORGEJO_URL=${FORGEJO_URL:-https://forge.wilddragon.net}
|
|
- FORGEJO_ACCESS_TOKEN=${FORGEJO_ACCESS_TOKEN:-9b80e9ea5e1d1955585fab22fb86e740951940b4}
|
|
networks: [mcpnet]
|
|
healthcheck:
|
|
test: ["CMD", "python3", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8400/mcp', timeout=5)"]
|
|
interval: 30s
|
|
timeout: 5s
|
|
start_period: 15s
|
|
retries: 3
|
|
|
|
ssh-mcp:
|
|
build:
|
|
context: ./ssh-mcp
|
|
dockerfile: Dockerfile
|
|
container_name: mcp-ssh
|
|
restart: unless-stopped
|
|
environment:
|
|
- PORT=8600
|
|
- SSH_HOST=${SSH_HOST}
|
|
- SSH_PORT=${SSH_PORT:-22}
|
|
- SSH_USER=${SSH_USER:-root}
|
|
- SSH_PASSWORD=${SSH_PASSWORD:-}
|
|
- SSH_KEY_PATH=${SSH_KEY_PATH:-}
|
|
- SSH_PASSPHRASE=${SSH_PASSPHRASE:-}
|
|
networks: [mcpnet]
|
|
healthcheck:
|
|
test: ["CMD", "python3", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8600/mcp', timeout=5)"]
|
|
interval: 30s
|
|
timeout: 5s
|
|
start_period: 15s
|
|
retries: 3
|
|
|
|
memory-bank-mcp:
|
|
build:
|
|
context: ./memory-bank-mcp
|
|
dockerfile: Dockerfile
|
|
container_name: mcp-memory-bank
|
|
restart: unless-stopped
|
|
environment:
|
|
- PORT=8700
|
|
- MEMORY_DIR=/data/memories
|
|
- MAX_MEMORIES=${MAX_MEMORIES:-10000}
|
|
volumes:
|
|
- memory-bank-data:/data
|
|
networks: [mcpnet]
|
|
healthcheck:
|
|
test: ["CMD", "python3", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8700/mcp', timeout=5)"]
|
|
interval: 30s
|
|
timeout: 5s
|
|
start_period: 15s
|
|
retries: 3
|
|
|
|
puppeteer-mcp:
|
|
build:
|
|
context: ./puppeteer-mcp
|
|
dockerfile: Dockerfile
|
|
container_name: mcp-puppeteer
|
|
restart: unless-stopped
|
|
environment:
|
|
- PORT=8800
|
|
- VIEWPORT_WIDTH=${PUPPETEER_VIEWPORT_WIDTH:-1280}
|
|
- VIEWPORT_HEIGHT=${PUPPETEER_VIEWPORT_HEIGHT:-720}
|
|
- PAGE_TIMEOUT=${PUPPETEER_PAGE_TIMEOUT:-30000}
|
|
networks: [mcpnet]
|
|
healthcheck:
|
|
test: ["CMD", "python3", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8800/mcp', timeout=5)"]
|
|
interval: 30s
|
|
timeout: 5s
|
|
start_period: 20s
|
|
retries: 3
|
|
|
|
sequential-thinking-mcp:
|
|
build:
|
|
context: ./sequential-thinking-mcp
|
|
dockerfile: Dockerfile
|
|
container_name: mcp-sequential-thinking
|
|
restart: unless-stopped
|
|
environment:
|
|
- PORT=8900
|
|
networks: [mcpnet]
|
|
healthcheck:
|
|
test: ["CMD", "python3", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8900/mcp', timeout=5)"]
|
|
interval: 30s
|
|
timeout: 5s
|
|
start_period: 15s
|
|
retries: 3
|
|
|
|
docker-mcp:
|
|
build:
|
|
context: ./docker-mcp
|
|
dockerfile: Dockerfile
|
|
container_name: mcp-docker
|
|
restart: unless-stopped
|
|
environment:
|
|
- PORT=9000
|
|
- DOCKER_HOST=${DOCKER_HOST:-unix:///var/run/docker.sock}
|
|
volumes:
|
|
- /var/run/docker.sock:/var/run/docker.sock
|
|
networks: [mcpnet]
|
|
healthcheck:
|
|
test: ["CMD", "python3", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:9000/mcp', timeout=5)"]
|
|
interval: 30s
|
|
timeout: 5s
|
|
start_period: 15s
|
|
retries: 3
|
|
|
|
volumes:
|
|
gateway-data:
|
|
linkedin-data:
|
|
memory-bank-data:
|