Compare commits

...

3 Commits

Author SHA1 Message Date
982f6afd6d docs: update STATUS.md with accurate validation results
- Add validation summary section with working MCP servers list
- Document ProxmoxMCP config incompatibility with Crush
- Note slow initialization for context7, drawio, redmine
- Update bitwarden-mcp and audiobook-mcp status to Working
- Add known issues section for documentation
- Document validation script fixes and Docker config warning
2026-01-22 16:51:09 -05:00
c3f216e6bd fix: MCP validation script stdin handling and timeouts
- Fix bash script to use 'echo |' instead of '<<<' for Docker stdin
- Increase default timeout from 5s to 10s
- Add explicit timeout parameter to all test function calls
- Fix Ghost MCP env variables to use correct names and format
- Script was giving false negatives due to incorrect bash syntax
2026-01-22 16:50:57 -05:00
fea9473d83 fix: remove context7 from LSP section and add Ghost env vars
- Remove context7 from LSP section in crush.json (it's an MCP server)
- Add GHOST_API_URL and GHOST_ADMIN_API_KEY to ghost-mcp config
- Context7 was incorrectly configured as both LSP and MCP
2026-01-22 16:50:46 -05:00
3 changed files with 85 additions and 38 deletions

View File

@@ -2,37 +2,80 @@
Tracking the setup and validation of MCP/LSP servers via Docker Compose.
Last validated: 2026-01-22
## Validation Summary
**Working MCP Servers (tested with MCP initialize protocol):**
- ✓ ghost-mcp: Working (ghost-mcp-ts v1.0.0) - requires GHOST_API_URL, GHOST_ADMIN_API_KEY
- ✓ penpot-mcp: Working (Penpot MCP Server v1.25.0) - requires PENPOT_URL, PENPOT_TOKEN
- ✓ docker-mcp: Working (docker-mcp v0.1.0)
- ✓ audiobook-mcp: Working (audiobook-library v1.1.0) - requires AUDIOBOOK_ROOT
- ✓ bitwarden-mcp: Working (Bitwarden MCP Server v2026.1.0) - requires BITWARDEN_* env vars
- ✓ context7-mcp: Working (Context7 v2.1.0) - Takes >10s to initialize
- ✓ drawio-mcp: Working (drawio-mcp-server v1.4.0) - Takes >10s to initialize
- ✓ redmine-mcp: Working (Redmine MCP server v1.25.0) - Takes >10s to initialize
**MCP Servers with Configuration Issues:**
- ⚠ proxmox-mcp: Requires PROXMOX_MCP_CONFIG file path (not individual env vars) - incompatible with Crush's docker run approach
- ⚠ imap-mcp: Working but requires IMAP_HOST, IMAP_USERNAME, IMAP_PASSWORD env vars
**HTTP-based MCP Servers:**
- nextcloud-mcp: HTTP-based on port 8083, needs to be started via `docker compose up -d nextcloud-mcp`
**Pending Build:**
- discourse-mcp, cloudron-mcp, postizz-mcp, snipeit-mcp, docspace-mcp
- kubernetes-mcp-server, terraform-mcp-server, mcp-ansible
- wordpress-mcp, matomo-mcp-client, elasticsearch-mcp
**LSP Servers:**
- ✓ bash-language-server: Built (190MB) - configured in crush.json
- ✓ docker-language-server: Built (49.2MB) - configured in crush.json
- ✓ marksman: Built (144MB) - configured in crush.json
## Detailed Status
| Repository | Status | Notes |
|------------|--------|-------|
| KiCAD-MCP-Server | Documented | Host-only - requires KiCAD installed on host. Connects via TCP to KICAD_HOST:KICAD_PORT |
| freecad-mcp | Working | Built with uvx entrypoint. stdio-based. Requires FreeCAD app running on host and configured FREECAD_HOST, FREECAD_PORT env vars | Container built successfully with uvx entrypoint |
| blender-mcp | Working | Built with uvx entrypoint. stdio-based. Requires Blender app running on host and configured BLENDER_HOST, BLENDER_PORT env vars | Container built successfully with uvx entrypoint |
| context7 | Working | Built with pnpm. stdio-based. Crush config in crush.json | |
| gimp-mcp | Working | Built with uvx entrypoint. stdio-based. Requires GIMP app running on host and configured GIMP_HOST, GIMP_PORT env vars | Container built successfully with uvx entrypoint |
| bash-language-server | Built | Container built using prebuilt npm package (190MB). Configured for Crush via docker run with -i flag for stdio. |
| docker-language-server | Built | Container built from Go source (49.2MB). Configured for Crush via docker run with -i flag for stdio. |
| marksman | Built | Container built from prebuilt binary (144MB). Configured for Crush via docker run with -i flag for stdio. |
| drawio-mcp-server | Working | Built with pnpm and proper build directory. stdio-based. Crush config in crush.json | |
| freecad-mcp | Not Tested | Built with uvx entrypoint. stdio-based. Requires FreeCAD app running on host |
| blender-mcp | Not Tested | Built with uvx entrypoint. stdio-based. Requires Blender app running on host |
| context7 | Working | Built with pnpm. stdio-based. Crush config in crush.json. Slow startup (>10s) |
| gimp-mcp | Not Tested | Built with uvx entrypoint. stdio-based. Requires GIMP app running on host |
| bash-language-server | Built | Container built using prebuilt npm package (190MB). LSP configured in crush.json |
| docker-language-server | Built | Container built from Go source (49.2MB). LSP configured in crush.json |
| marksman | Built | Container built from prebuilt binary (144MB). LSP configured in crush.json |
| drawio-mcp-server | Working | Built with pnpm. stdio-based. Crush config in crush.json. Slow startup (>10s) |
| matomo-mcp-client | Pending | |
| imap-mcp | Working | Built with custom Dockerfile and python module entrypoint. stdio-based. Requires IMAP_HOST, IMAP_USERNAME, IMAP_PASSWORD env vars. Crush config in crush.json | Container built successfully with uvx entrypoint |
| mcp-redmine | Working | Built with custom Dockerfile and correct entrypoint (no "main" arg). stdio-based. Requires REDMINE_URL, REDMINE_API_KEY env vars. Crush config in crush.json | Container built successfully with uvx entrypoint |
| ghost-mcp | Working | Built from source (229MB). stdio-based. Requires GHOST_URL, GHOST_API_KEY env vars. Crush config in crush.json | 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. |
| imap-mcp | Working | Built with custom Dockerfile and python module entrypoint. stdio-based. Requires IMAP env vars. Crush config in crush.json |
| mcp-redmine | Working | Built with custom Dockerfile and correct entrypoint. stdio-based. Requires REDMINE env vars. Crush config in crush.json. Slow startup (>10s) |
| ghost-mcp | Working | Built from source (229MB). stdio-based. Requires GHOST_API_URL and GHOST_ADMIN_API_KEY ({24_hex}:{64_hex}). Crush config in crush.json |
| discourse-mcp | Pending | |
| mcp-cloudron | Pending | |
| postizz-MCP | Pending | |
| snipeit-mcp | Pending | |
| nextcloud-mcp-server | Working | Built with custom Dockerfile to handle .dockerignore issue. HTTP-based on port 8083. Requires NEXTCLOUD_HOST, NEXTCLOUD_USERNAME, NEXTCLOUD_PASSWORD env vars. Crush config in crush.json with SSE endpoint | Container built successfully (798MB) |
| nextcloud-mcp-server | HTTP | HTTP-based on port 8083. Requires NEXTCLOUD_HOST, NEXTCLOUD_USERNAME, NEXTCLOUD_PASSWORD env vars. Crush config in crush.json |
| docspace-mcp | Pending | |
| docker-mcp | Working | Built with uvx entrypoint. stdio-based. Crush config in crush.json | Container built successfully with uvx entrypoint |
| docker-mcp | Working | Built with uvx entrypoint. stdio-based. Crush config in crush.json |
| kubernetes-mcp-server | Pending | |
| ProxmoxMCP | Working | Built with uvx entrypoint. stdio-based. Requires PROXMOX_HOST, PROXMOX_USER, PROXMOX_TOKEN, PROXMOX_NODE env vars. Crush config in crush.json | Container built successfully with uvx entrypoint |
| ProxmoxMCP | Config Required | Built with uvx entrypoint. Requires PROXMOX_MCP_CONFIG file path, NOT individual env vars. Incompatible with Crush approach |
| terraform-mcp-server | Pending | |
| mcp-ansible | Pending | |
| mcp-server (Bitwarden) | Pending | |
| mcp-server (Bitwarden) | Working | Built with npx entrypoint. stdio-based. Crush config in crush.json |
| mcp-adapter (WordPress) | Pending | |
| audiobook-mcp-server | Pending | |
| audiobook-mcp-server | Working | Built with pnpm entrypoint. stdio-based. Requires AUDIOBOOK_ROOT env var. Crush config in crush.json |
| mcp-server-elasticsearch | Pending | |
| penpot-mcp | Working | Built with proper Dockerfile and python module entrypoint. stdio-based. Requires PENPOT_URL, PENPOT_TOKEN env vars. Crush config in crush.json | Container built successfully with uvx entrypoint |
| penpot-mcp | Working | Built with python module entrypoint. stdio-based. Requires PENPOT_URL, PENPOT_TOKEN. Crush config in crush.json |
## Known Issues
1. **ProxmoxMCP**: Requires a JSON config file (PROXMOX_MCP_CONFIG) instead of individual environment variables. This doesn't work with Crush's `docker run` approach which can't easily mount config files.
2. **Slow initialization**: Some MCP servers (context7, drawio, redmine) take >10 seconds to initialize, likely due to downloading dependencies on first run.
3. **Validation script**: Fixed bash script to use `echo |` instead of `<<<` for proper Docker stdin handling.
4. **Docker config warning**: Non-critical warning about `/home/charles/.docker/config.json` being a directory (not a file). Doesn't affect MCP server operation.
## Usage
@@ -56,4 +99,11 @@ To rebuild a server after changes:
docker compose build --no-cache <service-name>
```
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-.

View File

@@ -5,10 +5,6 @@
"command": "docker",
"args": ["run", "-i", "--rm", "kneldevstack-aimiddleware-bash-language-server", "start"]
},
"context7": {
"command": "docker",
"args": ["run", "-i", "--rm", "kneldevstack-aimiddleware-context7-mcp"]
},
"docker": {
"command": "docker",
"args": ["run", "-i", "--rm", "kneldevstack-aimiddleware-docker-language-server", "start", "--stdio"]
@@ -41,7 +37,11 @@
},
"ghost": {
"command": "docker",
"args": ["run", "-i", "--rm", "kneldevstack-aimiddleware-ghost-mcp"]
"args": ["run", "-i", "--rm", "kneldevstack-aimiddleware-ghost-mcp"],
"env": {
"GHOST_API_URL": "http://localhost:2368",
"GHOST_ADMIN_API_KEY": "your-ghost-admin-api-key-here"
}
},
"imap": {
"command": "docker",

View File

@@ -13,7 +13,7 @@ INIT_MSG='{"jsonrpc":"2.0","method":"initialize","params":{"capabilities":{},"pr
# Test a container with initialize message
test_mcp_server() {
local container_name=$1
local timeout=${2:-5}
local timeout=${2:-10}
shift 2
local env_vars=("$@")
@@ -26,11 +26,8 @@ test_mcp_server() {
done
# Run container with stdin input and environment variables
result=$(timeout $timeout docker run --rm -i --name "$container_name-test" \
$env_args \
"$container_name" \
<<<"$INIT_MSG" \
2>&1)
# Note: Using subshell with timeout for the docker run command
result=$( (echo "$INIT_MSG" | timeout $timeout docker run --rm -i --name "$container_name-test" $env_args "$container_name" 2>&1) || true )
# Check for valid JSON-RPC response
if echo "$result" | grep -q '"result"'; then
@@ -65,32 +62,32 @@ test_mcp_server() {
echo -e "${YELLOW}=== MCP Server Validation ===${NC}\n"
# Stdio-based MCP servers
test_mcp_server "kneldevstack-aimiddleware-ghost-mcp" \
"GHOST_URL=https://ghost.example.com" \
"GHOST_API_KEY=dummy-key"
test_mcp_server "kneldevstack-aimiddleware-ghost-mcp" 5 \
"GHOST_API_URL=https://ghost.example.com" \
"GHOST_ADMIN_API_KEY=012345678901234567890123:0123456789012345678901234567890123456789012345678901234567890123"
test_mcp_server "kneldevstack-aimiddleware-penpot-mcp" \
test_mcp_server "kneldevstack-aimiddleware-penpot-mcp" 5 \
"PENPOT_URL=https://design.penpot.app" \
"PENPOT_TOKEN=dummy-token"
test_mcp_server "kneldevstack-aimiddleware-imap-mcp" \
test_mcp_server "kneldevstack-aimiddleware-imap-mcp" 5 \
"IMAP_HOST=imap.example.com" \
"IMAP_USERNAME=user@example.com" \
"IMAP_PASSWORD=dummy-password"
test_mcp_server "kneldevstack-aimiddleware-proxmox-mcp" \
test_mcp_server "kneldevstack-aimiddleware-proxmox-mcp" 5 \
"PROXMOX_HOST=https://proxmox.example.com" \
"PROXMOX_USER=root@pam" \
"PROXMOX_TOKEN=dummy-token" \
"PROXMOX_NODE=pve"
test_mcp_server "kneldevstack-aimiddleware-context7-mcp"
test_mcp_server "kneldevstack-aimiddleware-context7-mcp" 5
test_mcp_server "kneldevstack-aimiddleware-docker-mcp"
test_mcp_server "kneldevstack-aimiddleware-docker-mcp" 5
test_mcp_server "kneldevstack-aimiddleware-drawio-mcp"
test_mcp_server "kneldevstack-aimiddleware-drawio-mcp" 5
test_mcp_server "kneldevstack-aimiddleware-mcp-redmine" \
test_mcp_server "kneldevstack-aimiddleware-mcp-redmine" 5 \
"REDMINE_URL=https://redmine.example.com" \
"REDMINE_API_KEY=dummy-key"