Build and validate Bitwarden MCP server for password management.
Changes:
- STATUS.md: Added bitwarden-mcp as validated MCP (v2026.1.0, 377MB)
- STATUS.md: Updated counts and status sections
Validation:
- Container builds successfully from source (multi-stage distroless build)
- MCP protocol handshake verified with initialize request
- Protocol version 2024-11-05 confirmed
- Server name: Bitwarden MCP Server, version 2026.1.0
- Requires BITWARDEN_CLIENT_ID, BITWARDEN_CLIENT_SECRET,
BITWARDEN_PASSWORD, BITWARDEN_SERVER_URL env vars
- Tested with proper --name flag for container
Document marksman Markdown LSP build and validation success.
Changes:
- STATUS.md: Added marksman as validated LSP (2025-12-13, 144MB)
- AGENTS.md: Added marksman to Development Tools section
- AGENTS.md: Updated server counts (Development Tools: 3→4)
Validation:
- Container builds successfully from custom Dockerfile
- Version 2025-12-13 verified with --version flag
- Crush wrapper script functional
- All three LSP servers (bash, docker, marksman) now working
Reset STATUS.md to clean slate and document bash-language-server LSP
build and validation success.
Changes:
- Cleaned all previous MCP/LSP server status entries
- Added bash-language-server as validated LSP (v5.6.0, 190MB)
- Updated crush.json configuration reference
- Cleared all known issues and build progress sections
Validation:
- Container builds successfully from custom Dockerfile
- Version 5.6.0 verified with --version flag
- Crush wrapper script functional
- User acceptance testing completed
- Mark 6 services as Built (cloudron, docspace, freecad, gimp, kicad, blender)
- Update 5 services as Building (elasticsearch, kubernetes, matomo, postizz, wordpress)
- Document 3 build failures with action items (ansible, snipeit, terraform)
- Update detailed status table with latest build information
Add the following built MCP servers to crush.json configuration:
- blender-mcp
- cloudron-mcp
- docspace-mcp
- freecad-mcp
- gimp-mcp
- kicad-mcp
All servers configured with appropriate environment variables.
Remove Makefile in favor of more flexible shell-based maintenance script.
The new maintenance.sh provides all the same functionality with
easier maintenance and better shell script integration.
Update crush.json LSP configurations to use newly created
wrapper scripts instead of direct Docker commands. This ensures
LSP server containers have consistent names matching their
images, allowing multiple Crush sessions to share containers
and enabling clean restart capability.
Add wrapper scripts for bash, docker, and marksman LSP servers
to ensure containers use explicit names matching image names.
Enables multiple Crush sessions to share LSP server containers
with clean restart capability.
- lsp-bash-wrapper.sh: Wrapper for bash-language-server
- lsp-docker-wrapper.sh: Wrapper for docker-language-server
- lsp-marksman-wrapper.sh: Wrapper for marksman markdown LSP
Each wrapper cleans up existing containers and starts new container
with --name flag to ensure consistent naming.
- 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
- 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
- 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
- Add validate-mcp.sh script to test MCP servers with protocol messages
- Fix drawio-mcp Dockerfile to use pnpm and correct build directory
- Update drawio-mcp to use build/ instead of dist/
- Validate penpot-mcp, context7-mcp, docker-mcp, drawio-mcp working
- Set penpot-mcp restart: "no" for on-demand execution
- Create custom Dockerfile for imap-mcp with python module entrypoint
- Fix IMAP_HOST environment variable naming (was IMAP_SERVER)
- Update .env and docker-compose.yml for IMAP_HOST
- Remove command overrides from imap-mcp and penpot-mcp
- Verify penpot-mcp and imap-mcp work correctly
- Move gimp-mcp Dockerfile to tracked dockerfiles/ directory
- Update entrypoint from uvx gimp-mcp to uvx gimp-mcp-server
- Add uv.lock to dependency copy step
- Update docker-compose.yml to use dockerfiles/gimp-mcp/Dockerfile
- Remove duplicate uvx commands from docker-compose.yml (blender, freecad, gimp)
- Update ghost-mcp to use default environment values for testing
- Update crush.json LSP commands with proper start arguments
- Add ffmpeg dependency to audiobook-mcp Dockerfile
- Create .env file with dummy values for all MCP servers
- Update STATUS.md for ghost-mcp working status
Note: gimp-mcp entrypoint fix excluded (vendor directory is gitignored)
- AGENTS.md: Update all 29 container names in tables and Crush integration examples
- README.md: Update container names in Crush integration, troubleshooting, and project structure examples
- STATUS.md: Update container prefix note to reflect new naming convention
Aligns documentation with docker-compose.yml changes for consistency.
- Update all 29 container_name fields from KNELDevStack-AIMiddleware-* to kneldevstack-aimiddleware-*
- Add explicit image: fields to all services for consistent image naming
- Fix ghost-mcp and discourse-mcp to use build context instead of direct npx calls
- Ensures consistent lowercase naming across all services
This resolves confusion between service names, image names, and container names.
All three tiers (service, image, container) now use the same lowercase naming convention.
Remove unnecessary entrypoint overrides and use default container entrypoints.
All LSP containers now use their Dockerfile-defined ENTRYPOINT and CMD.
- bash-language-server: Uses default entrypoint and 'start' command
- docker-language-server: Uses default entrypoint and 'start --stdio' command
- marksman: Uses default entrypoint and 'server' command
- Fixed Dockerfile to skip prepare script during npm ci
- Changed docker-compose.yml to use node:22-alpine image with npx
- Updated STATUS.md to mark ghost-mcp as Built
- Added ghost-mcp to crush.json for Crush integration
- Validated container starts correctly with proper Ghost credentials
The ghost-mcp server now works as expected using the @fanyangmeng/ghost-mcp
npm package. It requires GHOST_API_URL and GHOST_ADMIN_API_KEY in the
format {24_hex_chars}:{64_hex_chars}.
- Changed from build context to using node:24-alpine image directly
- Updated discourse-mcp Dockerfile to node:24-alpine
- Changed npm ci to npm install in Dockerfile
- Added note about npx usage due to TypeScript compilation errors in 0.2.4
- Build bitwarden-mcp from Bitwarden clients monorepo (multi-stage Docker build)
- Uses distroless nodejs24-debian12 for minimal runtime
- Update STATUS.md: Mark mcp-server (Bitwarden) as Built
- Update crush.json: Add bitwarden MCP server to mcp section
Note: Requires BITWARDEN_CLIENT_ID, BITWARDEN_CLIENT_SECRET, and BITWARDEN_PASSWORD env vars
- Build audiobook-mcp from TypeScript source (npm run build)
- Update STATUS.md: Mark audiobook-mcp-server as Built
- Update crush.json: Add audiobook MCP server to mcp section
Note: Uses npx entrypoint pattern similar to other MCP servers
Added sections:
- Setup Scripts documentation (CloneVendorRepos.sh, BuildAll.sh, CleanVendor.sh, StatusCheck.sh)
- Makefile targets documentation with examples
- Clarification that vendor/ directory is gitignored and created automatically
Note: Updated Quick Start section to include information about setup scripts and Makefile targets
- Create dockerfiles/context7/Dockerfile for monorepo build
- Update docker-compose.yml to use custom Dockerfile context
- Build approach: copy all source, then pnpm install workspaces, then build:mcp
- Requires UPSTASH_REDIS_REST_URL and UPSTASH_REDIS_REST_TOKEN env vars
- Follows AGENTS.md guidelines for Dockerfile management
Note: Monorepo structure requires full source copy before dependency resolution
to properly install workspace dependencies across packages/mcp, packages/sdk, etc.
- Add bash-language-server service with custom Dockerfile
- Add docker-language-server service with custom Dockerfile
- Add marksman service with custom Dockerfile
- Configure services for Crush (restart: no for on-demand use)
- All services in dev profile
- bash-language-server: Prebuilt npm package (190MB)
- docker-language-server: Multi-stage Go build (49.2MB)
- marksman: Debian with libicu72 for .NET runtime (144MB)
- All configured for Crush via stdio communication
- Document crush.json format and configuration
- Explain configuration priority (local to global)
- Provide Docker-based LSP/MCP configuration pattern
- Include examples for bash, docker, and markdown LSP servers
- Mark bash-language-server as Built (190MB, prebuilt npm package, Crush ready)
- Mark docker-language-server as Built (49.2MB, Go source build, Crush ready)
- Mark marksman as Built (144MB, prebuilt binary with libicu72, Crush ready)
- Add configuration notes for Crush integration
Fixed nextcloud-mcp Dockerfile COPY destination (./ instead of .)
Fixed ProxmoxMCP pyproject.toml Python version requirement (>=3.10)
Fixed ProxmoxMCP Dockerfile to include git for git dependencies
Both nextcloud-mcp and proxmox-mcp build successfully
Updated STATUS.md to reflect successful builds
💘 Generated with Crush
Co-Authored-By: Crush <crush@charm.land>
Created Dockerfile for imap-mcp (was missing)
Fixed mcp-redmine Dockerfile to include uv.lock
Added git to ProxmoxMCP Dockerfile for git dependencies
Both imap-mcp and mcp-redmine build successfully
Updated STATUS.md to reflect successful builds
💘 Generated with Crush
Co-Authored-By: Crush <crush@charm.land>
Fixed docker-mcp Dockerfile to include uv.lock in COPY command
Container builds successfully using --frozen flag
Updated STATUS.md to reflect successful build status
💘 Generated with Crush
Co-Authored-By: Crush <crush@charm.land>
Fixed gimp-mcp Dockerfile to include uv.lock in COPY command
Container builds successfully using --frozen flag
Updated STATUS.md to reflect successful build status
💘 Generated with Crush
Co-Authored-By: Crush <crush@charm.land>
Fixed freecad-mcp Dockerfile to include uv.lock in COPY command
Container builds successfully using --frozen flag
Updated STATUS.md to reflect successful build status
💘 Generated with Crush
Co-Authored-By: Crush <crush@charm.land>
Fixed blender-mcp Dockerfile to include uv.lock in COPY command
Container builds successfully using --frozen flag
Updated STATUS.md to reflect successful build status
💘 Generated with Crush
Co-Authored-By: Crush <crush@charm.land>
Removed Status column from all tables to eliminate duplication
Added prominent note about STATUS.md being single source of truth
Added comprehensive STATUS.md maintenance instructions
Emphasized that STATUS.md must be kept current at all times
Commit STATUS.md updates in separate atomic commits
💘 Generated with Crush
Co-Authored-By: Crush <crush@charm.land>
Fixed penpot-mcp Dockerfile to include uv.lock in COPY command
Container builds successfully using --frozen flag
Updated STATUS.md to reflect successful build status
💘 Generated with Crush
Co-Authored-By: Crush <crush@charm.land>