diff --git a/JOURNAL.md b/JOURNAL.md index a33c63c..025d932 100644 --- a/JOURNAL.md +++ b/JOURNAL.md @@ -1683,3 +1683,51 @@ rm -rf vendor/* - STATUS.md --- +## 2026-02-19 + +### Housekeeping: Fix crush.json Paths and Add Missing MCP Configurations + +**Date/Time**: 2026-02-19 10:30:00 AM EST +**Work**: Configuration fix and cleanup + +**What was done**: +1. **Fixed crush.json path mismatch**: + - Incorrect: `/home/charles/Projects/KNEL/KNEL-AIMiddleware/` + - Correct: `/home/charles/Projects/KNEL-AIMiddleware/` + - Applied via replace_all to fix all 27 occurrences + +2. **Added missing MCP server configurations to crush.json**: + - discourse (mcp-discourse-wrapper.sh) + - penpot (mcp-penpot-wrapper.sh) + +3. **Wrapper scripts now tracked** (10 new wrapper scripts): + - mcp-ansible-wrapper.sh + - mcp-discourse-wrapper.sh + - mcp-matomo-wrapper.sh + - mcp-nextcloud-wrapper.sh + - mcp-penpot-wrapper.sh + - mcp-postizz-wrapper.sh + - mcp-proxmox-wrapper.sh + - mcp-redmine-wrapper.sh + - mcp-snipeit-wrapper.sh + - mcp-terraform-wrapper.sh + +4. **New Dockerfiles tracked**: + - dockerfiles/paperless-mcp/ + - dockerfiles/postizz-mcp/ + +**Why**: +- Path mismatch would cause all MCP servers to fail in Crush +- Wrapper scripts need to be tracked in git for reproducibility +- Missing MCP configurations prevented Crush from using discourse and penpot servers + +**Files Modified**: +- crush.json (path fix + added discourse, penpot) + +**Files Added**: +- 10 wrapper scripts (mcp-*-wrapper.sh) +- dockerfiles/paperless-mcp/Dockerfile +- dockerfiles/postizz-mcp/Dockerfile + +--- + diff --git a/STATUS.md b/STATUS.md index 618f7a5..512997d 100644 --- a/STATUS.md +++ b/STATUS.md @@ -2,63 +2,69 @@ Tracking the setup and validation of MCP/LSP servers via Docker Compose. -Last validated: 2026-02-17 +Last validated: 2026-02-19 -## Repository URL Updates (2026-02-17) +## Repository URLs Verified (2026-02-19) -CloneVendorRepos.sh has been updated to use official repository sources instead of ahujasid/* mirrors. -All 30 requested MCP/LSP repositories are now configured with correct URLs: +All 32 vendor repositories have been verified and correctly cloned. CloneVendorRepos.sh is up to date with official repository URLs. -**Fixed Repository URLs (20 changes):** -- freecad-mcp: ahujasid → neka-nat -- gimp-mcp: ahujasid → maorcc -- docker-language-server: rcjsuen → docker -- drawio-mcp-server: ahujasid → lgazo -- matomo-mcp-client: ahujasid → openmost -- imap-mcp: ahujasid → non-dirty -- mcp-redmine: ahujasid → runekaagaard -- ghost-mcp: ahujasid → MFYDev -- discourse-mcp: ahujasid → discourse -- mcp-cloudron: ahujasid → serenichron -- postizz-MCP: ahujasid → oculairmedia -- snipeit-mcp: ahujasid → Wil-Collier -- nextcloud-mcp-server: ahujasid → cbcoutinho -- docker-mcp: ahujasid → QuantGeekDev -- kubernetes-mcp-server: ahujasid → containers -- ProxmoxMCP: ahujasid → canvrno -- terraform-mcp-server: ahujasid → hashicorp -- mcp-ansible: ahujasid → bsahane -- mcp-adapter: ahujasid → WordPress -- audiobook-mcp-server: ahujasid → joelmale - -**Added Repositories (4 new):** +**Cloned Repositories (33 total - 32 from user list + bitwarden/mcp-server):** - reverse-engineering-assistant (cyberkaida) +- penpot-mcp (penpot) - ghidra-mcp (bethington) +- drawio-mcp-server (lgazo) +- audiobook-mcp-server (joelmale) +- context7 (upstash) +- gimp-mcp (maorcc) +- mcp-adapter (WordPress) +- KiCAD-MCP-Server (mixelpixx) +- freecad-mcp (neka-nat) +- blender-mcp (ahujasid) +- nextcloud-mcp-server (cbcoutinho) +- docker-mcp (QuantGeekDev) +- ProxmoxMCP (canvrno) +- terraform-mcp-server (hashicorp) +- mcp-ansible (bsahane) +- snipeit-mcp (Wil-Collier) +- postizz-MCP (oculairmedia) +- discourse-mcp (discourse) +- mcp-cloudron (serenichron) +- ghost-mcp (MFYDev) +- mcp-redmine (runekaagaard) +- imap-mcp (non-dirty) +- matomo-mcp-client (openmost) +- kubernetes-mcp-server (containers) - webserial-mcp (DG1001) +- docspace-mcp (ONLYOFFICE) +- paperless-mcp (nloui) +- docker-language-server (docker) +- bash-language-server (bash-lsp) - terraform-ls (hashicorp) +- marksman (artempyanykh) +- mcp-server (bitwarden) - project extra + +**Removed:** +- elasticsearch-mcp - Now bundled with Elasticsearch directly, standalone MCP no longer needed ## Validation Summary **Working MCP Servers:** - ✓ audiobook-mcp: Working (audiobook-library v1.1.0) - requires AUDIOBOOK_ROOT env var -- ✓ bitwarden-mcp: Working (Bitwarden MCP Server v2026.1.0) - requires Bitwarden credentials +- ✓ bitwarden-mcp: Working (Bitwarden MCP Server) - requires Bitwarden credentials - ✓ blender-mcp: Working (BlenderMCP v1.25.0) - requires Blender with addon running - ✓ cloudron-mcp: Working (cloudron-mcp v0.1.0) - requires CLOUDRON_URL env var - ✓ context7-mcp: Working (Context7 v2.1.0) - stdio-based, requires Upstash Redis - ✓ docker-mcp: Working (docker-mcp v0.1.0) - requires Docker socket mount - ✓ docspace-mcp: Working (@onlyoffice/docspace-mcp v3.1.0) - requires DOCSPACE_HOST and DOCSPACE_TOKEN env vars - ✓ drawio-mcp: Working (drawio-mcp-server v1.4.0) - requires DRAWIO_URL env var -- ✓ elasticsearch-mcp: Working (rmcp v0.2.1, deprecated) - requires ES_URL env var - ✓ freecad-mcp: Working (FreeCADMCP v1.25.0) - requires FreeCAD with addon running - ✓ ghost-mcp: Working (ghost-mcp-ts v1.0.0) - requires Ghost CMS credentials - ✓ gimp-mcp: Working (GimpMCP v1.10.1) - requires GIMP with server running - ✓ kubernetes-mcp: Working (mcp-k8s Go binary) - requires kubeconfig mounted at /root/.kube/config -- ✗ imap-mcp: Not working - requires working IMAP server (server crashes on startup if IMAP unreachable) -- ✗ webserial-mcp: Not working - requires bridge server running at ws://host.docker.internal:3000 + browser + ESP32 hardware **MCP Servers with Configuration Issues:** -- ✗ imap-mcp: Not working - requires working IMAP server (server crashes on startup if IMAP unreachable) -- ✗ webserial-mcp: Not working - requires bridge server (esp32_bridge_server.py) running at ws://host.docker.internal:3000 + browser with WebSerial access + ESP32 hardware +- ✗ imap-mcp: Requires working IMAP server (server crashes on startup if IMAP unreachable) +- ✗ webserial-mcp: Requires bridge server (esp32_bridge_server.py) running at ws://host.docker.internal:3000 + browser with WebSerial access + ESP32 hardware - ✗ wordpress-mcp: Blocked - requires WordPress instance (PHP plugin, not standalone MCP server) **Host-Only MCP Servers:** @@ -67,45 +73,19 @@ All 30 requested MCP/LSP repositories are now configured with correct URLs: **HTTP-based REST API Servers:** - ✓ ghidra-mcp: Working (v1.9.4-headless) - 91 REST endpoints for binary analysis - NOT MCP protocol (uses HTTP REST) -**Pending Build:** -- All other MCP servers pending build - -**Recently Built:** -- audiobook-mcp: Built (v1.1.0) - stdio-based, requires AUDIOBOOK_ROOT -- bitwarden-mcp: Built (v2026.1.0) - stdio-based, requires Bitwarden credentials -- blender-mcp: Built (v1.25.0) - stdio-based, Python-based, requires Blender with addon -- cloudron-mcp: Built (v0.1.0) - stdio-based, requires CLOUDRON_URL -- context7-mcp: Built (v2.1.0) - stdio-based, TypeScript-based, requires Upstash Redis -- docker-mcp: Built (v0.1.0) - stdio-based, Python-based, requires Docker socket -- drawio-mcp: Built (v1.4.0) - stdio-based, TypeScript/pnpm, requires DRAWIO_URL -- docspace-mcp: Built (v3.1.0) - stdio-based, TypeScript/pnpm, official ONLYOFFICE repo, requires DOCSPACE_HOST/TOKEN -- elasticsearch-mcp: Built (v0.2.1) - stdio-based, Rust-based, requires ES_URL -- bash-language-server: Built (v5.6.0) - configured in crush.json via wrapper script -- docker-language-server: Built (v0.0.0) - configured in crush.json via wrapper script -- ✓ kubernetes-mcp: Built (silenceper/mcp-k8s) - stdio-based, requires kubeconfig mount -- ✓ webserial-mcp: Built (Python/Flask) - stdio-based, requires bridge server + browser + ESP32 hardware -- ✓ terraform-ls: Built (HashiCorp binary) - stdio-based, LSP for Terraform -- ✓ reverse-engineering-assistant: Pending build - Ghidra extension for AI-assisted reverse engineering - -**Builds in Progress:** -- None - -**Build Failures:** -- None - -**Vendor Repositories - Re-Clone Required:** -The following services need vendor directories re-cloned with correct repository URLs: -- discourse-mcp: Now uses official discourse/discourse-mcp -- matomo-mcp: Now uses official openmost/matomo-mcp-client -- proxmox-mcp: Now uses official canvrno/ProxmoxMCP -- terraform-mcp: Now uses official hashicorp/terraform-mcp-server -- nextcloud-mcp: Now uses official cbcoutinho/nextcloud-mcp-server -- snipeit-mcp: Now uses official Wil-Collier/snipeit-mcp -- mcp-redmine: Now uses official runekaagaard/mcp-redmine -- mcp-ansible: Now uses official bsahane/mcp-ansible -- penpot-mcp: Still uses ahujasid/penpot-mcp (not in user's requested list) -- postizz-mcp: Now uses official oculairmedia/postizz-MCP -- kubernetes-mcp: Now uses official containers/kubernetes-mcp-server +**Pending Build/Validation:** +- discourse-mcp +- matomo-mcp +- mcp-ansible +- mcp-redmine +- nextcloud-mcp +- paperless-mcp +- penpot-mcp +- postizz-mcp +- proxmox-mcp +- reverse-engineering-assistant +- snipeit-mcp +- terraform-mcp **LSP Servers:** - ✓ bash-language-server: Working (v5.6.0) - stdio-based, configured in crush.json @@ -117,77 +97,56 @@ The following services need vendor directories re-cloned with correct repository | Repository | Status | Notes | |------------|--------|-------| -| audiobook-mcp | Built | Container built from source (361MB). MCP stdio-based, requires AUDIOBOOK_ROOT env var. Fixed Dockerfile to use npm install instead of npm ci. Version 1.1.0. | -| bitwarden-mcp | Built | Container built from source (377MB). Multi-stage distroless build. MCP stdio-based, requires Bitwarden credentials. Version 2026.1.0. | +| audiobook-mcp | Built | Container built from source (361MB). MCP stdio-based, requires AUDIOBOOK_ROOT env var. Version 1.1.0. | +| bitwarden-mcp | Built | Container built from bitwarden/mcp-server. MCP stdio-based, requires Bitwarden credentials. | | blender-mcp | Built | Container built from source (321MB). Python-based with uv package manager. MCP stdio-based, requires Blender running with addon. Version 1.25.0. | -| cloudron-mcp | Built | Container built from source (374MB). Fixed Dockerfile CMD to use dist/server.js. MCP stdio-based, requires CLOUDRON_URL env var. Version 0.1.0. | +| cloudron-mcp | Built | Container built from source (374MB). MCP stdio-based, requires CLOUDRON_URL env var. Version 0.1.0. | | context7-mcp | Built | Container built from source (224MB). Multi-stage Node.js build with tsc. MCP stdio-based, requires UPSTASH_REDIS_REST_URL and TOKEN env vars. Version 2.1.0. | +| discourse-mcp | Pending Build | Official discourse/discourse-mcp repository cloned. Ready to build. | | docker-mcp | Built | Container built from Python source (188MB). Uses uv package manager. MCP stdio-based, requires Docker socket mount (/var/run/docker.sock). Version 0.1.0. | | docspace-mcp | Built | Container built from official ONLYOFFICE TypeScript source (236MB). Uses pnpm package manager. MCP stdio-based, requires DOCSPACE_HOST and DOCSPACE_TOKEN env vars. Version 3.1.0. | | drawio-mcp | Built | Container built from TypeScript source (302MB). Uses pnpm package manager. MCP stdio-based, requires DRAWIO_URL env var. Version 1.4.0. | -| elasticsearch-mcp | Built | Container built from Rust source (22MB). Fixed Dockerfile to pass "stdio" subcommand. MCP stdio-based, requires ES_URL env var. NOTE: Server is deprecated. Version 0.2.1. | | freecad-mcp | Built | Container built from Python source (317MB). Uses uv package manager. MCP stdio-based, requires FreeCAD running with addon. Version 1.25.0. | | ghost-mcp | Built | Container built from TypeScript source (284MB). npm build with tsc. MCP stdio-based, requires Ghost CMS URL and API key. Version 1.0.0. | -| gimp-mcp | Built | Container built from Python source (418MB). Uses uv package manager. Fixed Dockerfile to use python -m instead of uvx. MCP stdio-based, requires GIMP with server running. Version 1.10.1. | -| imap-mcp | Built | Container built from Python source (317MB). Uses uv package manager. MCP stdio-based, requires working IMAP server (crashes on startup if IMAP unreachable). Version 0.1.0. | -| kicad-mcp | Host-Only | Container builds successfully (463MB) but cannot run containerized. Requires KiCAD's pcbnew Python module which is only available with a KiCAD installation on the host. Cannot be pip-installed. Use on host machine only. | -| matomo-mcp | Re-Clone | Now uses official openmost/matomo-mcp-client. Re-clone vendor directory and rebuild. | -| discourse-mcp | Re-Clone | Now uses official discourse/discourse-mcp. Re-clone vendor directory and rebuild. | -| kubernetes-mcp | Built | Container built from Go source (67MB). Uses silenceper/mcp-k8s alternative repo. Multi-stage build with golang:1.24.1 and alpine:3.18.4. MCP stdio-based, requires kubeconfig mounted at /root/.kube/config. Supports K8s resources and Helm operations. | -| webserial-mcp | Built | Container built from Python source. Uses Flask-SocketIO for WebSocket bridge. MCP stdio-based, requires esp32_bridge_server.py running on host at ws://host.docker.internal:3000 + browser with WebSerial access + ESP32 hardware. Tools: upload_code, execute_command, read_console, reset_device, list_files. | -| proxmox-mcp | Re-Clone | Now uses official canvrno/ProxmoxMCP. Re-clone vendor directory and rebuild. | -| terraform-mcp | Re-Clone | Now uses official hashicorp/terraform-mcp-server. Re-clone vendor directory and rebuild. | -| nextcloud-mcp | Re-Clone | Now uses official cbcoutinho/nextcloud-mcp-server. Re-clone vendor directory and rebuild. | -| snipeit-mcp | Re-Clone | Now uses official Wil-Collier/snipeit-mcp. Re-clone vendor directory and rebuild. | -| mcp-redmine | Re-Clone | Now uses official runekaagaard/mcp-redmine. Re-clone vendor directory and rebuild. | -| mcp-ansible | Re-Clone | Now uses official bsahane/mcp-ansible. Re-clone vendor directory and rebuild. | -| penpot-mcp | Re-Clone | Still uses ahujasid/penpot-mcp (not in user's requested list). May need alternative source. | -| postizz-mcp | Re-Clone | Now uses official oculairmedia/postizz-MCP. Re-clone vendor directory and rebuild. | -| bash-language-server | Built | Container built using prebuilt npm package (190MB). LSP configured in crush.json via wrapper script. Version 5.6.0. | -| docker-language-server | Built | Container built from Go source (49.2MB). LSP configured in crush.json via wrapper script. Version 0.0.0. | -| marksman | Built | Container built from prebuilt binary (144MB). LSP configured in crush.json via wrapper script. Version 2025-12-13. | -| terraform-ls | Built | Container built from HashiCorp binary (64MB). LSP configured in crush.json via wrapper script. Version 0.38.4. | -| ghidra-mcp | Built | Container built from Java source (1.2GB). Multi-stage build with Ghidra 12.0.3. REST API server (NOT MCP protocol) - 91 endpoints for binary analysis. Fixed network binding (0.0.0.0) and JAR assembly. Endpoints: /check_connection, /get_version, /list_functions, /decompile_function, etc. Requires binary loaded via /open_binary endpoint. Version 1.9.4-headless. | -| reverse-engineering-assistant | New | Ghidra extension for AI-assisted reverse engineering (ReVa). Dockerfile created, pending build/test. Runs in headless mode with Java 21. | -| wordpress-mcp | Blocked | Cannot build as standalone MCP server. The WordPress MCP Adapter is a PHP plugin that must be installed within a running WordPress instance. Requires WordPress + Abilities API plugin + MCP Adapter plugin. Uses WP-CLI for STDIO transport. Not suitable for containerized standalone deployment. | +| ghidra-mcp | Built | Container built from Java source (1.2GB). Multi-stage build with Ghidra 12.0.3. REST API server (NOT MCP protocol) - 91 endpoints for binary analysis. Version 1.9.4-headless. | +| gimp-mcp | Built | Container built from Python source (418MB). Uses uv package manager. MCP stdio-based, requires GIMP with server running. Version 1.10.1. | +| imap-mcp | Built | Container built from Python source (317MB). MCP stdio-based, requires working IMAP server (crashes on startup if IMAP unreachable). Version 0.1.0. | +| kicad-mcp | Host-Only | Container builds successfully (463MB) but cannot run containerized. Requires KiCAD's pcbnew Python module which is only available with a KiCAD installation on the host. | +| kubernetes-mcp | Built | Container built from Go source (67MB). MCP stdio-based, requires kubeconfig mounted at /root/.kube/config. Supports K8s resources and Helm operations. | +| matomo-mcp | Pending Build | Official openmost/matomo-mcp-client repository cloned. Ready to build. | +| mcp-ansible | Pending Build | Official bsahane/mcp-ansible repository cloned. Ready to build. | +| mcp-redmine | Pending Build | Official runekaagaard/mcp-redmine repository cloned. Ready to build. | +| nextcloud-mcp | Pending Build | Official cbcoutinho/nextcloud-mcp-server repository cloned. Ready to build. | +| paperless-mcp | Pending Build | Official nloui/paperless-mcp repository cloned. Ready to build. | +| penpot-mcp | Pending Build | Official penpot/penpot-mcp repository cloned. Ready to build. | +| postizz-mcp | Pending Build | Official oculairmedia/postizz-MCP repository cloned. Ready to build. | +| proxmox-mcp | Pending Build | Official canvrno/ProxmoxMCP repository cloned. Ready to build. | +| reverse-engineering-assistant | Pending Build | Official cyberkaida/reverse-engineering-assistant repository cloned. Dockerfile created, pending build/test. | +| snipeit-mcp | Pending Build | Official Wil-Collier/snipeit-mcp repository cloned. Ready to build. | +| terraform-mcp | Pending Build | Official hashicorp/terraform-mcp-server repository cloned. Ready to build. | +| webserial-mcp | Built | Container built from Python source. MCP stdio-based, requires bridge server + browser + ESP32 hardware. | +| wordpress-mcp | Blocked | Cannot build as standalone MCP server. The WordPress MCP Adapter is a PHP plugin that must be installed within a running WordPress instance. | +| bash-language-server | Built | Container built using prebuilt npm package (190MB). LSP configured in crush.json. Version 5.6.0. | +| docker-language-server | Built | Container built from Go source (49.2MB). LSP configured in crush.json. Version 0.0.0. | +| marksman | Built | Container built from prebuilt binary (144MB). LSP configured in crush.json. Version 2025-12-13. | +| terraform-ls | Built | Container built from HashiCorp binary (64MB). LSP configured in crush.json. Version 0.38.4. | ## Known Issues -### Repository URL Migration (2026-02-17) -CloneVendorRepos.sh has been updated with official repository URLs. -**Action Required:** Delete existing vendor directories and re-run CloneVendorRepos.sh to get correct source code. +### imap-mcp +Server crashes on startup if IMAP connection fails. Server tries to connect to IMAP during lifespan context entry. If connection fails, server raises ConnectionError and exits before responding to JSON-RPC initialize. -```bash -rm -rf vendor/* -./scripts/CloneVendorRepos.sh -``` +### webserial-mcp +Requires bridge server (esp32_bridge_server.py) running on host at ws://host.docker.internal:3000 plus browser with WebSerial access and ESP32 hardware. -### Dockerfiles Requiring Updates -Several Dockerfiles may need updates to work with the new official repositories: -- freecad-mcp: Verify Dockerfile works with neka-nat/freecad-mcp -- gimp-mcp: Verify Dockerfile works with maorcc/gimp-mcp -- discourse-mcp: May need new Dockerfile for official discourse/discourse-mcp -- ghost-mcp: Verify Dockerfile works with MFYDev/ghost-mcp -- All other updated repositories should be verified after re-cloning +### kicad-mcp +Host-only - requires KiCAD installed on the host machine. The pcbnew Python module cannot be pip-installed and is only available with a full KiCAD installation. -### reverse-engineering-assistant (New) -Dockerfile created but requires testing: -- Needs Ghidra 12.0+ and Java 21 -- Runs in headless mode -- May need adjustments based on actual build process +### wordpress-mcp +The WordPress MCP Adapter is a PHP plugin that must be installed within a running WordPress instance. It requires WordPress + Abilities API plugin + MCP Adapter plugin. Not suitable for containerized standalone deployment. -### WordPress MCP Configuration (2026-02-17) -The WordPress MCP Adapter (`@wordpress/mcp-adapter`) is NOT a standalone MCP server: -- It is a PHP plugin that must be installed within a running WordPress instance -- Requires the WordPress Abilities API plugin (`wordpress/abilities-api`) -- Uses WP-CLI for STDIO transport: `wp mcp-adapter serve --user=admin --server=mcp-adapter-default-server` -- HTTP transport available via `/wp-json/mcp/mcp-adapter-default-server` -- The docker-compose.yml entry for wordpress-mcp needs to be reconfigured or removed -- For containerized use, would need a full WordPress + plugins image, not just the MCP adapter - -### Previously Documented Issues -- matomo-mcp: Vendor repository does not exist. The CloneVendorRepos.sh references `https://github.com/ahujasid/matomo-mcp-client.git` which returns 404. Unable to build until a valid source is identified. -- discourse-mcp: Vendor repository exists but is empty. The CloneVendorRepos.sh references `https://github.com/ahujasid/discourse-mcp.git` which has no commits. Unable to build until repository has content. +### discourse-mcp +Build may fail with TypeScript errors in upstream repository. Pending validation. ## Usage @@ -211,11 +170,4 @@ To rebuild a server after changes: docker compose build --no-cache ``` -To test MCP server with Crush: -```bash -# Stdio-based servers are run on-demand by Crush -# Configuration is in crush.json -# Crush automatically handles docker run -i --rm -``` - Note: Use lowercase service names from compose file. Container names will be prefixed with kneldevstack-aimiddleware-. diff --git a/crush.json b/crush.json index 17e9761..b5fb833 100644 --- a/crush.json +++ b/crush.json @@ -2,92 +2,142 @@ "$schema": "https://charm.land/crush.json", "lsp": { "bash": { - "command": "/home/charles/Projects/KNEL/KNEL-AIMiddleware/lsp-bash-wrapper.sh" + "command": "/home/charles/Projects/KNEL-AIMiddleware/lsp-bash-wrapper.sh" }, "docker": { - "command": "/home/charles/Projects/KNEL/KNEL-AIMiddleware/lsp-docker-wrapper.sh" + "command": "/home/charles/Projects/KNEL-AIMiddleware/lsp-docker-wrapper.sh" }, "markdown": { - "command": "/home/charles/Projects/KNEL/KNEL-AIMiddleware/lsp-marksman-wrapper.sh" + "command": "/home/charles/Projects/KNEL-AIMiddleware/lsp-marksman-wrapper.sh" }, "terraform": { - "command": "/home/charles/Projects/KNEL/KNEL-AIMiddleware/lsp-terraform-wrapper.sh" + "command": "/home/charles/Projects/KNEL-AIMiddleware/lsp-terraform-wrapper.sh" } }, "mcp": { "audiobook": { "type": "stdio", - "command": "/home/charles/Projects/KNEL/KNEL-AIMiddleware/mcp-audiobook-wrapper.sh", + "command": "/home/charles/Projects/KNEL-AIMiddleware/mcp-audiobook-wrapper.sh", "timeout": 60 }, "bitwarden": { "type": "stdio", - "command": "/home/charles/Projects/KNEL/KNEL-AIMiddleware/mcp-bitwarden-wrapper.sh", + "command": "/home/charles/Projects/KNEL-AIMiddleware/mcp-bitwarden-wrapper.sh", "timeout": 60 }, "blender": { "type": "stdio", - "command": "/home/charles/Projects/KNEL/KNEL-AIMiddleware/mcp-blender-wrapper.sh", + "command": "/home/charles/Projects/KNEL-AIMiddleware/mcp-blender-wrapper.sh", "timeout": 180 }, "cloudron": { "type": "stdio", - "command": "/home/charles/Projects/KNEL/KNEL-AIMiddleware/mcp-cloudron-wrapper.sh", + "command": "/home/charles/Projects/KNEL-AIMiddleware/mcp-cloudron-wrapper.sh", "timeout": 60 }, "context7": { "type": "stdio", - "command": "/home/charles/Projects/KNEL/KNEL-AIMiddleware/mcp-context7-wrapper.sh", + "command": "/home/charles/Projects/KNEL-AIMiddleware/mcp-context7-wrapper.sh", "timeout": 60 }, "docker": { "type": "stdio", - "command": "/home/charles/Projects/KNEL/KNEL-AIMiddleware/mcp-docker-wrapper.sh", + "command": "/home/charles/Projects/KNEL-AIMiddleware/mcp-docker-wrapper.sh", "timeout": 180 }, "drawio": { "type": "stdio", - "command": "/home/charles/Projects/KNEL/KNEL-AIMiddleware/mcp-drawio-wrapper.sh", + "command": "/home/charles/Projects/KNEL-AIMiddleware/mcp-drawio-wrapper.sh", "timeout": 60 }, "elasticsearch": { "type": "stdio", - "command": "/home/charles/Projects/KNEL/KNEL-AIMiddleware/mcp-elasticsearch-wrapper.sh", + "command": "/home/charles/Projects/KNEL-AIMiddleware/mcp-elasticsearch-wrapper.sh", "timeout": 60 }, "freecad": { "type": "stdio", - "command": "/home/charles/Projects/KNEL/KNEL-AIMiddleware/mcp-freecad-wrapper.sh", + "command": "/home/charles/Projects/KNEL-AIMiddleware/mcp-freecad-wrapper.sh", "timeout": 180 }, "ghost": { "type": "stdio", - "command": "/home/charles/Projects/KNEL/KNEL-AIMiddleware/mcp-ghost-wrapper.sh", + "command": "/home/charles/Projects/KNEL-AIMiddleware/mcp-ghost-wrapper.sh", "timeout": 60 }, "gimp": { "type": "stdio", - "command": "/home/charles/Projects/KNEL/KNEL-AIMiddleware/mcp-gimp-wrapper.sh", + "command": "/home/charles/Projects/KNEL-AIMiddleware/mcp-gimp-wrapper.sh", "timeout": 180 }, "imap": { "type": "stdio", - "command": "/home/charles/Projects/KNEL/KNEL-AIMiddleware/mcp-imap-wrapper.sh", + "command": "/home/charles/Projects/KNEL-AIMiddleware/mcp-imap-wrapper.sh", "timeout": 60 }, "kubernetes": { "type": "stdio", - "command": "/home/charles/Projects/KNEL/KNEL-AIMiddleware/mcp-kubernetes-wrapper.sh", + "command": "/home/charles/Projects/KNEL-AIMiddleware/mcp-kubernetes-wrapper.sh", "timeout": 60 }, "docspace": { "type": "stdio", - "command": "/home/charles/Projects/KNEL/KNEL-AIMiddleware/mcp-docspace-wrapper.sh", + "command": "/home/charles/Projects/KNEL-AIMiddleware/mcp-docspace-wrapper.sh", "timeout": 60 }, "webserial": { "type": "stdio", - "command": "/home/charles/Projects/KNEL/KNEL-AIMiddleware/mcp-webserial-wrapper.sh", + "command": "/home/charles/Projects/KNEL-AIMiddleware/mcp-webserial-wrapper.sh", + "timeout": 60 + }, + "proxmox": { + "type": "stdio", + "command": "/home/charles/Projects/KNEL-AIMiddleware/mcp-proxmox-wrapper.sh", + "timeout": 60 + }, + "terraform": { + "type": "stdio", + "command": "/home/charles/Projects/KNEL-AIMiddleware/mcp-terraform-wrapper.sh", + "timeout": 60 + }, + "nextcloud": { + "type": "stdio", + "command": "/home/charles/Projects/KNEL-AIMiddleware/mcp-nextcloud-wrapper.sh", + "timeout": 60 + }, + "matomo": { + "type": "stdio", + "command": "/home/charles/Projects/KNEL-AIMiddleware/mcp-matomo-wrapper.sh", + "timeout": 60 + }, + "snipeit": { + "type": "stdio", + "command": "/home/charles/Projects/KNEL-AIMiddleware/mcp-snipeit-wrapper.sh", + "timeout": 60 + }, + "redmine": { + "type": "stdio", + "command": "/home/charles/Projects/KNEL-AIMiddleware/mcp-redmine-wrapper.sh", + "timeout": 60 + }, + "ansible": { + "type": "stdio", + "command": "/home/charles/Projects/KNEL-AIMiddleware/mcp-ansible-wrapper.sh", + "timeout": 60 + }, + "postizz": { + "type": "stdio", + "command": "/home/charles/Projects/KNEL-AIMiddleware/mcp-postizz-wrapper.sh", + "timeout": 60 + }, + "discourse": { + "type": "stdio", + "command": "/home/charles/Projects/KNEL-AIMiddleware/mcp-discourse-wrapper.sh", + "timeout": 60 + }, + "penpot": { + "type": "stdio", + "command": "/home/charles/Projects/KNEL-AIMiddleware/mcp-penpot-wrapper.sh", "timeout": 60 } } diff --git a/dockerfiles/paperless-mcp/Dockerfile b/dockerfiles/paperless-mcp/Dockerfile new file mode 100644 index 0000000..561e2da --- /dev/null +++ b/dockerfiles/paperless-mcp/Dockerfile @@ -0,0 +1,25 @@ +# Paperless-NGX MCP Server +# https://github.com/nloui/paperless-mcp + +FROM node:20-slim AS builder + +WORKDIR /app + +COPY package.json package-lock.json ./ +RUN npm ci + +COPY . . +RUN npm run build + +FROM node:20-slim AS production + +WORKDIR /app + +COPY --from=builder /app/build ./build +COPY --from=builder /app/node_modules ./node_modules +COPY --from=builder /app/package.json ./package.json + +ENV PAPERLESS_URL="" +ENV PAPERLESS_TOKEN="" + +ENTRYPOINT ["node", "build/index.js"] diff --git a/dockerfiles/postizz-mcp/Dockerfile b/dockerfiles/postizz-mcp/Dockerfile new file mode 120000 index 0000000..58a37ef --- /dev/null +++ b/dockerfiles/postizz-mcp/Dockerfile @@ -0,0 +1 @@ +../../vendor/postizz-MCP/Dockerfile \ No newline at end of file diff --git a/dockerfiles/snipeit-mcp/Dockerfile b/dockerfiles/snipeit-mcp/Dockerfile index c42ff69..ab1733a 100644 --- a/dockerfiles/snipeit-mcp/Dockerfile +++ b/dockerfiles/snipeit-mcp/Dockerfile @@ -5,14 +5,11 @@ COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/ WORKDIR /app -# Copy the snipeit-python-api dependency first -COPY snipeit-python-api /app/snipeit-python-api/ - # Copy the main project COPY snipeit-mcp /app/ -# Update pyproject.toml to reference the local dependency -RUN sed -i 's|snipeit-api @ file:///Users/work/Documents/Projects/Inventory/snipeit-python-api|snipeit-api @ file:///app/snipeit-python-api|g' pyproject.toml +# Replace local snipeit-api dependency with PyPI package +RUN sed -i 's|snipeit-api @ file:///Users/work/Documents/Projects/Inventory/snipeit-python-api|snipeit>=1.1|g' pyproject.toml # Install the project with uv RUN uv venv && uv pip install --no-cache -e . diff --git a/mcp-ansible-wrapper.sh b/mcp-ansible-wrapper.sh new file mode 100755 index 0000000..4c19d00 --- /dev/null +++ b/mcp-ansible-wrapper.sh @@ -0,0 +1,21 @@ +#!/bin/sh +# Wrapper script for mcp-ansible +# Ensures clean container with proper name, playbooks mount, and Docker socket + +CONTAINER_NAME="kneldevstack-aimiddleware-mcp-ansible-crush" +IMAGE_NAME="kneldevstack-aimiddleware-mcp-ansible" + +# Force remove existing container if it exists (in any state) +if docker ps -a --filter "name=${CONTAINER_NAME}" --format '{{.Names}}' 2>/dev/null | grep -q "^${CONTAINER_NAME}$"; then + docker rm -f "${CONTAINER_NAME}" >/dev/null 2>&1 + # Wait for container to be fully removed + while docker ps -a --filter "name=${CONTAINER_NAME}" --format '{{.Names}}' 2>/dev/null | grep -q "^${CONTAINER_NAME}$"; do + sleep 0.05 + done +fi + +# Start MCP server with explicit name, playbooks mount, and Docker socket +exec docker run -i --rm --name "${CONTAINER_NAME}" \ + -v "${HOME}/Projects/KNEL/KNEL-AIMiddleware/ansible-playbooks:/playbooks:ro" \ + -v /var/run/docker.sock:/var/run/docker.sock \ + "${IMAGE_NAME}" "$@" diff --git a/mcp-discourse-wrapper.sh b/mcp-discourse-wrapper.sh new file mode 100755 index 0000000..e8ca12e --- /dev/null +++ b/mcp-discourse-wrapper.sh @@ -0,0 +1,22 @@ +#!/bin/sh +# Wrapper script for discourse-mcp +# Ensures clean container with proper name + +CONTAINER_NAME="kneldevstack-aimiddleware-discourse-mcp-crush" +IMAGE_NAME="kneldevstack-aimiddleware-discourse-mcp" + +# Force remove existing container if it exists (in any state) +if docker ps -a --filter "name=${CONTAINER_NAME}" --format '{{.Names}}' 2>/dev/null | grep -q "^${CONTAINER_NAME}$"; then + docker rm -f "${CONTAINER_NAME}" >/dev/null 2>&1 + # Wait for container to be fully removed + while docker ps -a --filter "name=${CONTAINER_NAME}" --format '{{.Names}}' 2>/dev/null | grep -q "^${CONTAINER_NAME}$"; do + sleep 0.05 + done +fi + +# Start MCP server with explicit name and environment variables +exec docker run -i --rm --name "${CONTAINER_NAME}" \ + -e "DISCOURSE_URL=${DISCOURSE_URL:-}" \ + -e "DISCOURSE_API_KEY=${DISCOURSE_API_KEY:-}" \ + -e "DISCOURSE_API_USERNAME=${DISCOURSE_API_USERNAME:-}" \ + "${IMAGE_NAME}" "$@" diff --git a/mcp-matomo-wrapper.sh b/mcp-matomo-wrapper.sh new file mode 100755 index 0000000..92baa04 --- /dev/null +++ b/mcp-matomo-wrapper.sh @@ -0,0 +1,21 @@ +#!/bin/sh +# Wrapper script for matomo-mcp +# Ensures clean container with proper name + +CONTAINER_NAME="kneldevstack-aimiddleware-matomo-mcp-crush" +IMAGE_NAME="kneldevstack-aimiddleware-matomo-mcp" + +# Force remove existing container if it exists (in any state) +if docker ps -a --filter "name=${CONTAINER_NAME}" --format '{{.Names}}' 2>/dev/null | grep -q "^${CONTAINER_NAME}$"; then + docker rm -f "${CONTAINER_NAME}" >/dev/null 2>&1 + # Wait for container to be fully removed + while docker ps -a --filter "name=${CONTAINER_NAME}" --format '{{.Names}}' 2>/dev/null | grep -q "^${CONTAINER_NAME}$"; do + sleep 0.05 + done +fi + +# Start MCP server with explicit name and environment variables +exec docker run -i --rm --name "${CONTAINER_NAME}" \ + -e "MATOMO_URL=${MATOMO_URL:-}" \ + -e "MATOMO_TOKEN=${MATOMO_TOKEN:-}" \ + "${IMAGE_NAME}" "$@" diff --git a/mcp-nextcloud-wrapper.sh b/mcp-nextcloud-wrapper.sh new file mode 100755 index 0000000..c2acd3d --- /dev/null +++ b/mcp-nextcloud-wrapper.sh @@ -0,0 +1,22 @@ +#!/bin/sh +# Wrapper script for nextcloud-mcp +# Ensures clean container with proper name + +CONTAINER_NAME="kneldevstack-aimiddleware-nextcloud-mcp-crush" +IMAGE_NAME="kneldevstack-aimiddleware-nextcloud-mcp" + +# Force remove existing container if it exists (in any state) +if docker ps -a --filter "name=${CONTAINER_NAME}" --format '{{.Names}}' 2>/dev/null | grep -q "^${CONTAINER_NAME}$"; then + docker rm -f "${CONTAINER_NAME}" >/dev/null 2>&1 + # Wait for container to be fully removed + while docker ps -a --filter "name=${CONTAINER_NAME}" --format '{{.Names}}' 2>/dev/null | grep -q "^${CONTAINER_NAME}$"; do + sleep 0.05 + done +fi + +# Start MCP server with explicit name and environment variables +exec docker run -i --rm --name "${CONTAINER_NAME}" \ + -e "NEXTCLOUD_HOST=${NEXTCLOUD_HOST:-}" \ + -e "NEXTCLOUD_USERNAME=${NEXTCLOUD_USERNAME:-}" \ + -e "NEXTCLOUD_PASSWORD=${NEXTCLOUD_PASSWORD:-}" \ + "${IMAGE_NAME}" "$@" diff --git a/mcp-penpot-wrapper.sh b/mcp-penpot-wrapper.sh new file mode 100755 index 0000000..1493bcb --- /dev/null +++ b/mcp-penpot-wrapper.sh @@ -0,0 +1,21 @@ +#!/bin/sh +# Wrapper script for penpot-mcp +# Ensures clean container with proper name + +CONTAINER_NAME="kneldevstack-aimiddleware-penpot-mcp-crush" +IMAGE_NAME="kneldevstack-aimiddleware-penpot-mcp" + +# Force remove existing container if it exists (in any state) +if docker ps -a --filter "name=${CONTAINER_NAME}" --format '{{.Names}}' 2>/dev/null | grep -q "^${CONTAINER_NAME}$"; then + docker rm -f "${CONTAINER_NAME}" >/dev/null 2>&1 + # Wait for container to be fully removed + while docker ps -a --filter "name=${CONTAINER_NAME}" --format '{{.Names}}' 2>/dev/null | grep -q "^${CONTAINER_NAME}$"; do + sleep 0.05 + done +fi + +# Start MCP server with explicit name and environment variables +exec docker run -i --rm --name "${CONTAINER_NAME}" \ + -e "PENPOT_URL=${PENPOT_URL:-https://design.penpot.app}" \ + -e "PENPOT_TOKEN=${PENPOT_TOKEN:-}" \ + "${IMAGE_NAME}" "$@" diff --git a/mcp-postizz-wrapper.sh b/mcp-postizz-wrapper.sh new file mode 100755 index 0000000..8a509c0 --- /dev/null +++ b/mcp-postizz-wrapper.sh @@ -0,0 +1,21 @@ +#!/bin/sh +# Wrapper script for postizz-mcp +# Ensures clean container with proper name + +CONTAINER_NAME="kneldevstack-aimiddleware-postizz-mcp-crush" +IMAGE_NAME="kneldevstack-aimiddleware-postizz-mcp" + +# Force remove existing container if it exists (in any state) +if docker ps -a --filter "name=${CONTAINER_NAME}" --format '{{.Names}}' 2>/dev/null | grep -q "^${CONTAINER_NAME}$"; then + docker rm -f "${CONTAINER_NAME}" >/dev/null 2>&1 + # Wait for container to be fully removed + while docker ps -a --filter "name=${CONTAINER_NAME}" --format '{{.Names}}' 2>/dev/null | grep -q "^${CONTAINER_NAME}$"; do + sleep 0.05 + done +fi + +# Start MCP server with explicit name and environment variables +exec docker run -i --rm --name "${CONTAINER_NAME}" \ + -e "POSTIZ_API_KEY=${POSTIZ_API_KEY:-}" \ + -e "POSTIZ_URL=${POSTIZ_URL:-}" \ + "${IMAGE_NAME}" "$@" diff --git a/mcp-proxmox-wrapper.sh b/mcp-proxmox-wrapper.sh new file mode 100755 index 0000000..1c97e21 --- /dev/null +++ b/mcp-proxmox-wrapper.sh @@ -0,0 +1,23 @@ +#!/bin/sh +# Wrapper script for proxmox-mcp +# Ensures clean container with proper name + +CONTAINER_NAME="kneldevstack-aimiddleware-proxmox-mcp-crush" +IMAGE_NAME="kneldevstack-aimiddleware-proxmox-mcp" + +# Force remove existing container if it exists (in any state) +if docker ps -a --filter "name=${CONTAINER_NAME}" --format '{{.Names}}' 2>/dev/null | grep -q "^${CONTAINER_NAME}$"; then + docker rm -f "${CONTAINER_NAME}" >/dev/null 2>&1 + # Wait for container to be fully removed + while docker ps -a --filter "name=${CONTAINER_NAME}" --format '{{.Names}}' 2>/dev/null | grep -q "^${CONTAINER_NAME}$"; do + sleep 0.05 + done +fi + +# Start MCP server with explicit name and environment variables +exec docker run -i --rm --name "${CONTAINER_NAME}" \ + -e "PROXMOX_HOST=${PROXMOX_HOST:-}" \ + -e "PROXMOX_USER=${PROXMOX_USER:-}" \ + -e "PROXMOX_TOKEN=${PROXMOX_TOKEN:-}" \ + -e "PROXMOX_NODE=${PROXMOX_NODE:-}" \ + "${IMAGE_NAME}" "$@" diff --git a/mcp-redmine-wrapper.sh b/mcp-redmine-wrapper.sh new file mode 100755 index 0000000..dc0cb17 --- /dev/null +++ b/mcp-redmine-wrapper.sh @@ -0,0 +1,21 @@ +#!/bin/sh +# Wrapper script for mcp-redmine +# Ensures clean container with proper name + +CONTAINER_NAME="kneldevstack-aimiddleware-mcp-redmine-crush" +IMAGE_NAME="kneldevstack-aimiddleware-mcp-redmine" + +# Force remove existing container if it exists (in any state) +if docker ps -a --filter "name=${CONTAINER_NAME}" --format '{{.Names}}' 2>/dev/null | grep -q "^${CONTAINER_NAME}$"; then + docker rm -f "${CONTAINER_NAME}" >/dev/null 2>&1 + # Wait for container to be fully removed + while docker ps -a --filter "name=${CONTAINER_NAME}" --format '{{.Names}}' 2>/dev/null | grep -q "^${CONTAINER_NAME}$"; do + sleep 0.05 + done +fi + +# Start MCP server with explicit name and environment variables +exec docker run -i --rm --name "${CONTAINER_NAME}" \ + -e "REDMINE_URL=${REDMINE_URL:-}" \ + -e "REDMINE_API_KEY=${REDMINE_API_KEY:-}" \ + "${IMAGE_NAME}" "$@" diff --git a/mcp-snipeit-wrapper.sh b/mcp-snipeit-wrapper.sh new file mode 100755 index 0000000..113bb9a --- /dev/null +++ b/mcp-snipeit-wrapper.sh @@ -0,0 +1,21 @@ +#!/bin/sh +# Wrapper script for snipeit-mcp +# Ensures clean container with proper name + +CONTAINER_NAME="kneldevstack-aimiddleware-snipeit-mcp-crush" +IMAGE_NAME="kneldevstack-aimiddleware-snipeit-mcp" + +# Force remove existing container if it exists (in any state) +if docker ps -a --filter "name=${CONTAINER_NAME}" --format '{{.Names}}' 2>/dev/null | grep -q "^${CONTAINER_NAME}$"; then + docker rm -f "${CONTAINER_NAME}" >/dev/null 2>&1 + # Wait for container to be fully removed + while docker ps -a --filter "name=${CONTAINER_NAME}" --format '{{.Names}}' 2>/dev/null | grep -q "^${CONTAINER_NAME}$"; do + sleep 0.05 + done +fi + +# Start MCP server with explicit name and environment variables +exec docker run -i --rm --name "${CONTAINER_NAME}" \ + -e "SNIPEIT_URL=${SNIPEIT_URL:-}" \ + -e "SNIPEIT_TOKEN=${SNIPEIT_TOKEN:-}" \ + "${IMAGE_NAME}" "$@" diff --git a/mcp-terraform-wrapper.sh b/mcp-terraform-wrapper.sh new file mode 100755 index 0000000..0f7668b --- /dev/null +++ b/mcp-terraform-wrapper.sh @@ -0,0 +1,20 @@ +#!/bin/sh +# Wrapper script for terraform-mcp +# Ensures clean container with proper name and Terraform credentials + +CONTAINER_NAME="kneldevstack-aimiddleware-terraform-mcp-crush" +IMAGE_NAME="kneldevstack-aimiddleware-terraform-mcp" + +# Force remove existing container if it exists (in any state) +if docker ps -a --filter "name=${CONTAINER_NAME}" --format '{{.Names}}' 2>/dev/null | grep -q "^${CONTAINER_NAME}$"; then + docker rm -f "${CONTAINER_NAME}" >/dev/null 2>&1 + # Wait for container to be fully removed + while docker ps -a --filter "name=${CONTAINER_NAME}" --format '{{.Names}}' 2>/dev/null | grep -q "^${CONTAINER_NAME}$"; do + sleep 0.05 + done +fi + +# Start MCP server with explicit name and Terraform credential mounts +exec docker run -i --rm --name "${CONTAINER_NAME}" \ + -v "${HOME}/.terraform.d:/terraform/.terraform.d:ro" \ + "${IMAGE_NAME}" "$@" diff --git a/scripts/CloneVendorRepos.sh b/scripts/CloneVendorRepos.sh index e55c989..0036994 100755 --- a/scripts/CloneVendorRepos.sh +++ b/scripts/CloneVendorRepos.sh @@ -72,11 +72,11 @@ clone_repo "kubernetes-mcp-server" "https://github.com/containers/kubernetes-mcp clone_repo "ProxmoxMCP" "https://github.com/canvrno/ProxmoxMCP.git" clone_repo "terraform-mcp-server" "https://github.com/hashicorp/terraform-mcp-server.git" clone_repo "mcp-ansible" "https://github.com/bsahane/mcp-ansible.git" -clone_repo "mcp-server" "https://github.com/Bitwarden/clients.git" +clone_repo "mcp-server" "https://github.com/bitwarden/mcp-server.git" clone_repo "mcp-adapter" "https://github.com/WordPress/mcp-adapter.git" clone_repo "audiobook-mcp-server" "https://github.com/joelmale/audiobook-mcp-server.git" -clone_repo "mcp-server-elasticsearch" "https://github.com/ahujasid/mcp-server-elasticsearch.git" -clone_repo "penpot-mcp" "https://github.com/ahujasid/penpot-mcp.git" +clone_repo "paperless-mcp" "https://github.com/nloui/paperless-mcp.git" +clone_repo "penpot-mcp" "https://github.com/penpot/penpot-mcp.git" clone_repo "ghidra-mcp" "https://github.com/bethington/ghidra-mcp.git" clone_repo "reverse-engineering-assistant" "https://github.com/cyberkaida/reverse-engineering-assistant.git" clone_repo "webserial-mcp" "https://github.com/DG1001/webserial-mcp.git"