diff --git a/.env b/.env index 7e38d7b..5f082d0 100644 --- a/.env +++ b/.env @@ -1,86 +1,14 @@ -# Dummy environment variables for MCP servers -# Replace with actual values as needed +# Nextcloud MCP +NEXTCLOUD_HOST= +NEXTCLOUD_USERNAME= +NEXTCLOUD_APP_PASSWORD= -# KiCAD -KICAD_HOST=host.docker.internal -KICAD_PORT=5555 +# IMAP MCP +IMAP_SERVER= +IMAP_PORT= +IMAP_USERNAME= +IMAP_PASSWORD= -# 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_HOST=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 +# Home Assistant (if needed) +HOMEASSISTANT_URL= +HOMEASSISTANT_TOKEN= diff --git a/STATUS.md b/STATUS.md index 4e93dbc..c9708db 100644 --- a/STATUS.md +++ b/STATUS.md @@ -48,7 +48,7 @@ All 32 vendor repositories have been verified and correctly cloned. CloneVendorR ## Validation Summary -**Working MCP Servers (24 validated with MCP handshake):** +**Working MCP Servers (25 validated with MCP handshake):** - ✓ actual-mcp: Working (Actual Budget MCP) - requires ACTUAL_SERVER_URL, ACTUAL_PASSWORD, ACTUAL_BUDGET_SYNC_ID env vars - ✓ audiobook-mcp: Working (audiobook-library v1.1.0) - requires AUDIOBOOK_ROOT env var - ✓ beszel-mcp: Working (beszel-mcp) - requires BESZEL_URL, BESZEL_USERNAME, BESZEL_PASSWORD env vars @@ -73,6 +73,7 @@ All 32 vendor repositories have been verified and correctly cloned. CloneVendorR - ✓ mcp-redmine: Working (Redmine MCP server v1.25.0) - requires REDMINE_URL for actual usage - ✓ paperless-mcp: Working (paperless-ngx v1.0.0) - requires baseUrl/token CLI args - ✓ superset-mcp: Working (superset-mcp) - requires SUPERSET_URL, SUPERSET_USERNAME, SUPERSET_PASSWORD env vars +- ✓ proxmox-mcp: Working (proxmox_mcp) - requires PROXMOX_MCP_CONFIG env var pointing to config file **Runtime Connection Required (crash before MCP protocol):** - ✗ nextcloud-mcp: Requires reachable OAuth endpoint - crashes on startup with connection refused @@ -91,11 +92,12 @@ All 32 vendor repositories have been verified and correctly cloned. CloneVendorR **MCP Servers with Build/Runtime Issues:** - ✗ discourse-mcp: Build failed - TypeScript TS2345 error (upstream bug) - ✗ reverse-engineering-assistant: Build failed - Ghidra download 404 -- ✗ snipeit-mcp: Build OK, runtime ImportError - API incompatibility with PyPI snipeit package (expects SnipeIT class, library exports Assets/Licenses/Components) -- ✗ proxmox-mcp: Build OK, runtime ModuleNotFoundError - mcp.server.fastmpm module path issue - ✗ penpot-mcp: Build OK, transport mismatch - uses HTTP/WebSocket transport instead of stdio - ✗ mcp-ansible: Build OK, runtime error - package not found in PyPI registry +**Blocked MCP Servers:** +- ✗ snipeit-mcp: Blocked - upstream depends on private 'snipeit-api' package (never published to PyPI) + **LSP Servers:** - ✓ bash-language-server: Working (v5.6.0) - stdio-based, configured in crush.json - ✓ docker-language-server: Working (v0.0.0) - stdio-based, configured in crush.json @@ -129,9 +131,9 @@ All 32 vendor repositories have been verified and correctly cloned. CloneVendorR | paperless-mcp | Built | Container built from Python source. MCP stdio-based, requires baseUrl and token as CLI args. MCP handshake validated without live server. Version 1.0.0. | | penpot-mcp | Build/Runtime Issue | Container built from TypeScript monorepo source. Uses HTTP/WebSocket transport (not stdio). Multiple endpoints: HTTP at :4401/mcp, SSE at :4401/sse, WebSocket at :4402. | | postizz-mcp | Transport Issue | Container built from TypeScript source. Uses HTTP transport (port 3084), not stdio. Not compatible with standard MCP clients. | -| proxmox-mcp | Build/Runtime Issue | Container builds but fails at runtime - ModuleNotFoundError: No module named 'mcp.server.fastmcp'. FastMCP import path changed. | +| proxmox-mcp | Built | Container built from Python source (331MB). MCP stdio-based, requires PROXMOX_MCP_CONFIG env var pointing to config file. Fixed by patching fastmcp imports. | | reverse-engineering-assistant | Build Failed | Ghidra download URL returns 404. Version mismatch in download URL. | -| snipeit-mcp | Build/Runtime Issue | Container builds but fails at runtime - ImportError: cannot import name 'SnipeIT' from 'snipeit'. Upstream depends on private snipeit-api package with different API than public PyPI snipeit package. | +| snipeit-mcp | Blocked | Container builds as stub that exits with error message. Upstream depends on private 'snipeit-api' package (never published to PyPI). Cannot be fixed without upstream changes. | | terraform-mcp | Built | Container built from Go source (27MB). MCP stdio-based, validates with MCP handshake v0.4.0. Requires HCP Terraform credentials for full functionality. | | webserial-mcp | Runtime Issue | Container builds but requires bridge server + browser + ESP32 hardware. Cannot validate MCP protocol without full setup. | | 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. | @@ -164,10 +166,10 @@ Uses HTTP transport (listens on port 3084) instead of stdio MCP. Not compatible Build failed with TypeScript TS2345 error in upstream repository. Cannot fix locally. ### proxmox-mcp -Runtime ModuleNotFoundError: No module named 'mcp.server.fastmcp'. The FastMCP library changed its import paths - needs Dockerfile update to install correct mcp package version. +Fixed by patching pyproject.toml to use 'fastmcp' from PyPI instead of 'mcp @ git+...' and updating imports from 'mcp.server.fastmcp' to 'fastmcp'. Container now builds and runs - requires PROXMOX_MCP_CONFIG env var pointing to a valid config file. ### snipeit-mcp -Runtime ImportError: cannot import name 'SnipeIT' from 'snipeit'. The upstream snipeit-mcp depends on a private 'snipeit-api' package (referenced via local file path) that has a different API than the public PyPI 'snipeit' package. The public package exports Assets/Licenses/Components classes, not SnipeIT. +BLOCKED - The upstream snipeit-mcp depends on a private 'snipeit-api' package (referenced via local file path) that was never published to PyPI. The public PyPI 'snipeit' package (v1.1, archived 2022) has a completely different API. Cannot be fixed without upstream author publishing the private package or rewriting to use the public package API. Created stub Dockerfile that exits with informative error message. ### penpot-mcp Uses HTTP/WebSocket transport instead of stdio MCP. Not compatible with standard MCP client connections. Multiple endpoints: HTTP at :4401/mcp, SSE at :4401/sse, WebSocket at :4402. diff --git a/dockerfiles/proxmox-mcp/Dockerfile b/dockerfiles/proxmox-mcp/Dockerfile index 4e5a354..59acab7 100644 --- a/dockerfiles/proxmox-mcp/Dockerfile +++ b/dockerfiles/proxmox-mcp/Dockerfile @@ -1,23 +1,21 @@ FROM python:3.12-slim -# Install git for git+ dependencies -RUN apt-get update && apt-get install -y git && rm -rf /var/lib/apt/lists/* - -# Install uv for faster package management +# Install uv for faster package management and git for any git dependencies COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/ +RUN apt-get update && apt-get install -y --no-install-recommends git && rm -rf /var/lib/apt/lists/* WORKDIR /app -# Copy dependency files -COPY pyproject.toml ./ - -# Install dependencies -RUN uv sync --no-dev --no-install-project --no-cache - -# Copy source code +# Copy all source code first COPY . . -# Install the project +# Replace mcp git dependency with fastmcp from PyPI +RUN sed -i 's|"mcp @ git+https://github.com/modelcontextprotocol/python-sdk.git"|"fastmcp"|' pyproject.toml + +# Patch imports to use fastmcp instead of mcp.server.fastmcp +RUN find . -name "*.py" -exec sed -i 's/from mcp\.server\.fastmcp/from fastmcp/g' {} \; + +# Install dependencies and project RUN uv sync --no-dev --no-editable --no-cache # Set up environment diff --git a/dockerfiles/snipeit-mcp/Dockerfile b/dockerfiles/snipeit-mcp/Dockerfile index ba616a2..8b7e845 100644 --- a/dockerfiles/snipeit-mcp/Dockerfile +++ b/dockerfiles/snipeit-mcp/Dockerfile @@ -1,21 +1,14 @@ -FROM python:3.12-slim +# snipeit-mcp is BLOCKED - requires private snipeit-api package +# The upstream author created a private package that was never published +# See: https://github.com/ directa-innovations/snipeit-mcp +FROM alpine:3.20 -# Install uv for faster package management -COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/ +RUN echo '#!/bin/sh' > /entrypoint.sh && \ + echo 'echo "ERROR: snipeit-mcp is blocked due to missing private dependency (snipeit-api)"' >> /entrypoint.sh && \ + echo 'echo "The upstream author created a private snipeit-api package that was never published to PyPI."' >> /entrypoint.sh && \ + echo 'echo "Public snipeit package (v1.1, archived 2022) has incompatible API."' >> /entrypoint.sh && \ + echo 'echo "Contact upstream author or rewrite using public snipeit package API."' >> /entrypoint.sh && \ + echo 'exit 1' >> /entrypoint.sh && \ + chmod +x /entrypoint.sh -WORKDIR /app - -# Copy only the snipeit-mcp project -COPY snipeit-mcp /app/ - -# Replace local snipeit-api dependency with PyPI package -RUN sed -i 's|snipeit-api @ file:///Users/work/Documents/Projects/Inventory/snipeit-python-api|snipeit>=0.2.0|g' pyproject.toml - -# Install the project with uv -RUN uv venv && uv pip install --no-cache -e . - -# Set up environment -ENV PYTHONUNBUFFERED=1 -ENV PATH=/app/.venv/bin:$PATH - -ENTRYPOINT ["python", "server.py"] +ENTRYPOINT ["/entrypoint.sh"]