diff --git a/.env b/.env new file mode 100644 index 0000000..a763500 --- /dev/null +++ b/.env @@ -0,0 +1,86 @@ +# Dummy environment variables for MCP servers +# Replace with actual values as needed + +# KiCAD +KICAD_HOST=host.docker.internal +KICAD_PORT=5555 + +# Proxmox +PROXMOX_HOST=https://proxmox.example.com:8006 +PROXMOX_USER=root@pam +PROXMOX_TOKEN=dummy-token-replace-with-real-token +PROXMOX_NODE=pve + +# Cloudron +CLOUDRON_URL=https://cloudron.example.com +CLOUDRON_TOKEN=dummy-cloudron-token-replace-with-real + +# Context7 (Upstash Redis) +UPSTASH_REDIS_REST_URL=https://dummy-redis-url.upstash.io +UPSTASH_REDIS_REST_TOKEN=dummy-redis-token-replace-with-real + +# Nextcloud +NEXTCLOUD_HOST=https://nextcloud.example.com +NEXTCLOUD_USERNAME=admin +NEXTCLOUD_APP_PASSWORD=dummy-app-password-replace-with-real + +# Ghost (defaults already set in docker-compose) +GHOST_API_URL=http://localhost:2368 +GHOST_ADMIN_API_KEY=012345678901234567890123:0123456789012345678901234567890123456789012345678901234567890123 + +# DocSpace +DOCSPACE_HOST=https://docspace.example.com +DOCSPACE_TOKEN=dummy-docspace-token-replace-with-real + +# WordPress +WORDPRESS_URL=https://wordpress.example.com +WORDPRESS_USERNAME=admin +WORDPRESS_APPLICATION_PASSWORD=dummy-app-password-replace-with-real + +# Discourse +DISCOURSE_URL=https://discourse.example.com +DISCOURSE_API_KEY=dummy-api-key-replace-with-real +DISCOURSE_API_USERNAME=admin + +# IMAP +IMAP_SERVER=imap.example.com +IMAP_PORT=993 +IMAP_USERNAME=user@example.com +IMAP_PASSWORD=dummy-password-replace-with-real + +# Postiz +POSTIZ_URL=https://postiz.example.com +POSTIZ_API_KEY=dummy-api-key-replace-with-real + +# Matomo +MATOMO_URL=https://matomo.example.com +MATOMO_TOKEN=dummy-token-replace-with-real + +# Bitwarden +BITWARDEN_CLIENT_ID=dummy-client-id +BITWARDEN_CLIENT_SECRET=dummy-client-secret +BITWARDEN_PASSWORD=dummy-password +BITWARDEN_SERVER_URL=https://vault.bitwarden.com + +# Snipe-IT +SNIPEIT_URL=https://snipeit.example.com +SNIPEIT_TOKEN=dummy-token-replace-with-real + +# Redmine +REDMINE_URL=https://redmine.example.com +REDMINE_API_KEY=dummy-api-key-replace-with-real + +# Elasticsearch +ELASTICSEARCH_URL=http://localhost:9200 +ELASTICSEARCH_USERNAME=elastic +ELASTICSEARCH_PASSWORD=dummy-password-replace-with-real + +# Audiobook +AUDIOBOOK_ROOT=/audiobooks + +# Draw.io (default in compose) +DRAWIO_URL=https://app.diagrams.net + +# Penpot (default URL in compose) +PENPOT_URL=https://design.penpot.app +PENPOT_TOKEN=dummy-penpot-token-replace-with-real diff --git a/STATUS.md b/STATUS.md index 4180d08..949ec6c 100644 --- a/STATUS.md +++ b/STATUS.md @@ -16,7 +16,7 @@ Tracking the setup and validation of MCP/LSP servers via Docker Compose. | matomo-mcp-client | Pending | | | imap-mcp | Built | Container built successfully with uvx entrypoint | | mcp-redmine | Built | Container built successfully with uvx entrypoint | -| ghost-mcp | Built | Using npx with @fanyangmeng/ghost-mcp package (node:22-alpine). Requires GHOST_API_URL and GHOST_ADMIN_API_KEY ({24_hex}:{64_hex} format). Container starts successfully with valid credentials. | +| ghost-mcp | Working | Built from source (229MB). MCP server initializes and starts properly. Requires GHOST_API_URL and GHOST_ADMIN_API_KEY ({24_hex}:{64_hex} format). Uses default dummy values for testing. Crush can connect via `docker run -i --rm`. Updated docker-compose.yml with restart: "no" for stdio-based containers. | | discourse-mcp | Pending | | | mcp-cloudron | Pending | | | postizz-MCP | Pending | | diff --git a/crush.json b/crush.json index d30599c..4a9c4d6 100644 --- a/crush.json +++ b/crush.json @@ -3,15 +3,15 @@ "lsp": { "bash": { "command": "docker", - "args": ["run", "-i", "--rm", "kneldevstack-aimiddleware-bash-language-server"] + "args": ["run", "-i", "--rm", "kneldevstack-aimiddleware-bash-language-server", "start"] }, "docker": { "command": "docker", - "args": ["run", "-i", "--rm", "kneldevstack-aimiddleware-docker-language-server"] + "args": ["run", "-i", "--rm", "kneldevstack-aimiddleware-docker-language-server", "start", "--stdio"] }, "markdown": { "command": "docker", - "args": ["run", "-i", "--rm", "kneldevstack-aimiddleware-marksman"] + "args": ["run", "-i", "--rm", "kneldevstack-aimiddleware-marksman", "server"] } }, "mcp": { diff --git a/docker-compose.yml b/docker-compose.yml index 8e3b7db..4c05a59 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -31,7 +31,6 @@ services: restart: unless-stopped environment: - PYTHONUNBUFFERED=1 - command: ["uvx", "blender-mcp"] profiles: - dev @@ -45,7 +44,6 @@ services: restart: unless-stopped environment: - PYTHONUNBUFFERED=1 - command: ["uvx", "freecad-mcp"] profiles: - dev @@ -139,6 +137,7 @@ services: # ========================================== # 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: @@ -192,10 +191,10 @@ services: context: ./vendor/ghost-mcp dockerfile: ../../dockerfiles/ghost-mcp/Dockerfile container_name: kneldevstack-aimiddleware-ghost-mcp - restart: unless-stopped + restart: "no" environment: - - GHOST_API_URL=${GHOST_API_URL} - - GHOST_ADMIN_API_KEY=${GHOST_ADMIN_API_KEY} + - GHOST_API_URL=${GHOST_API_URL:-http://localhost:2368} + - GHOST_ADMIN_API_KEY=${GHOST_ADMIN_API_KEY:-012345678901234567890123:0123456789012345678901234567890123456789012345678901234567890123} profiles: - ops @@ -329,7 +328,6 @@ services: restart: unless-stopped environment: - PYTHONUNBUFFERED=1 - command: ["uvx", "gimp-mcp"] profiles: - dev @@ -404,14 +402,14 @@ services: image: kneldevstack-aimiddleware-audiobook-mcp build: context: ./vendor/audiobook-mcp-server - dockerfile: Dockerfile + dockerfile: ../../dockerfiles/audiobook-mcp/Dockerfile container_name: kneldevstack-aimiddleware-audiobook-mcp restart: unless-stopped environment: - - AUDIOBOOK_LIBRARY_PATH=${AUDIOBOOK_LIBRARY_PATH:-/audiobooks} + - AUDIOBOOK_ROOT=${AUDIOBOOK_ROOT:-/audiobooks} volumes: - - ${AUDIOBOOK_LIBRARY_PATH:-/audiobooks}:/audiobooks - command: ["npx", "-y", "audiobook-mcp-server"] + - ${AUDIOBOOK_ROOT:-/audiobooks}:/audiobooks + command: ["node", "dist/index.js"] profiles: - dev @@ -434,6 +432,7 @@ services: - 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: @@ -445,6 +444,7 @@ services: - 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: diff --git a/dockerfiles/audiobook-mcp/Dockerfile b/dockerfiles/audiobook-mcp/Dockerfile index cdda738..28e13d5 100644 --- a/dockerfiles/audiobook-mcp/Dockerfile +++ b/dockerfiles/audiobook-mcp/Dockerfile @@ -1,5 +1,7 @@ FROM node:22-alpine +RUN apk add --no-cache ffmpeg + WORKDIR /app COPY package.json package-lock.json* ./