Compare commits
11 Commits
d80eff6df6
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
280ebc2e67 | ||
|
|
616085e0cf | ||
|
|
e886950c40 | ||
|
|
ad9c4c450e | ||
|
|
afa88abda4 | ||
|
|
fedd591b75 | ||
|
|
855b6e1f22 | ||
|
|
1526af86d8 | ||
|
|
a73699ad8b | ||
|
|
787fe1f702 | ||
|
|
d97fb09a9d |
96
.env
96
.env
@@ -1,86 +1,14 @@
|
|||||||
# Dummy environment variables for MCP servers
|
# Nextcloud MCP
|
||||||
# Replace with actual values as needed
|
NEXTCLOUD_HOST=
|
||||||
|
NEXTCLOUD_USERNAME=
|
||||||
|
NEXTCLOUD_APP_PASSWORD=
|
||||||
|
|
||||||
# KiCAD
|
# IMAP MCP
|
||||||
KICAD_HOST=host.docker.internal
|
IMAP_SERVER=
|
||||||
KICAD_PORT=5555
|
IMAP_PORT=
|
||||||
|
IMAP_USERNAME=
|
||||||
|
IMAP_PASSWORD=
|
||||||
|
|
||||||
# Proxmox
|
# Home Assistant (if needed)
|
||||||
PROXMOX_HOST=https://proxmox.example.com:8006
|
HOMEASSISTANT_URL=
|
||||||
PROXMOX_USER=root@pam
|
HOMEASSISTANT_TOKEN=
|
||||||
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
|
|
||||||
|
|||||||
14
.env.example
14
.env.example
@@ -84,3 +84,17 @@ DRAWIO_URL=https://app.diagrams.net
|
|||||||
# Penpot (default URL in compose)
|
# Penpot (default URL in compose)
|
||||||
PENPOT_URL=https://design.penpot.app
|
PENPOT_URL=https://design.penpot.app
|
||||||
PENPOT_TOKEN=dummy-penpot-token-replace-with-real
|
PENPOT_TOKEN=dummy-penpot-token-replace-with-real
|
||||||
|
|
||||||
|
# Firefly III
|
||||||
|
FIREFLY_III_BASE_URL=https://firefly.example.com
|
||||||
|
FIREFLY_III_PAT=dummy-personal-access-token-replace-with-real
|
||||||
|
FIREFLY_III_PRESET=default
|
||||||
|
|
||||||
|
# Paperless-NGX
|
||||||
|
PAPERLESS_URL=https://paperless.example.com
|
||||||
|
PAPERLESS_TOKEN=dummy-paperless-token-replace-with-real
|
||||||
|
|
||||||
|
# Actual Budget
|
||||||
|
ACTUAL_SERVER_URL=https://actual.example.com
|
||||||
|
ACTUAL_PASSWORD=dummy-password-replace-with-real
|
||||||
|
ACTUAL_BUDGET_SYNC_ID=dummy-budget-sync-id
|
||||||
|
|||||||
25
.githooks/pre-push
Executable file
25
.githooks/pre-push
Executable file
@@ -0,0 +1,25 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# Pre-push hook: Prevents push if uncommitted changes exist
|
||||||
|
# This is a safety net to ensure AI agents commit their work
|
||||||
|
#
|
||||||
|
|
||||||
|
# Check for uncommitted changes
|
||||||
|
if [[ -n $(git status --porcelain 2>/dev/null) ]]; then
|
||||||
|
echo ""
|
||||||
|
echo "ERROR: Uncommitted changes detected!"
|
||||||
|
echo ""
|
||||||
|
echo "Per AGENTS.md policy, AI agents MUST commit changes before stopping work."
|
||||||
|
echo ""
|
||||||
|
echo "Uncommitted files:"
|
||||||
|
git status --short
|
||||||
|
echo ""
|
||||||
|
echo "Run the following before push:"
|
||||||
|
echo " git add <files>"
|
||||||
|
echo " git commit -m '<type>: <message>'"
|
||||||
|
echo " git push"
|
||||||
|
echo ""
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
exit 0
|
||||||
2
.gitignore
vendored
2
.gitignore
vendored
@@ -1,2 +1,2 @@
|
|||||||
vendor/
|
vendor
|
||||||
.env
|
.env
|
||||||
|
|||||||
27
AGENTS.md
27
AGENTS.md
@@ -99,6 +99,33 @@ echo '{"jsonrpc":"2.0","method":"initialize","params":{"capabilities":{},"protoc
|
|||||||
timeout 10 docker run --rm -i kneldevstack-aimiddleware-<service>
|
timeout 10 docker run --rm -i kneldevstack-aimiddleware-<service>
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Git Hooks
|
||||||
|
|
||||||
|
This project uses tracked git hooks stored in `.githooks/`. After cloning, run:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git config core.hooksPath .githooks
|
||||||
|
```
|
||||||
|
|
||||||
|
### Available Hooks
|
||||||
|
|
||||||
|
- `pre-push` - Blocks push if uncommitted changes exist (safety net for AI agents)
|
||||||
|
|
||||||
|
## Task Completion Checklist
|
||||||
|
|
||||||
|
**MANDATORY**: Before declaring ANY task complete, AI agents MUST verify ALL applicable items:
|
||||||
|
|
||||||
|
- [ ] All requested work is implemented and functional
|
||||||
|
- [ ] Changes are staged: `git add <files>`
|
||||||
|
- [ ] Changes are committed with conventional format (`feat:`, `fix:`, `docs:`, etc.)
|
||||||
|
- [ ] Changes are pushed to remote: `git push`
|
||||||
|
- [ ] STATUS.md updated (if MCP/LSP server status changed)
|
||||||
|
- [ ] JOURNAL.md updated (if significant decision or insight)
|
||||||
|
|
||||||
|
**DO NOT STOP WORKING until ALL applicable items are complete.**
|
||||||
|
|
||||||
|
If you cannot complete an item (e.g., no network access for push), explicitly state which items are blocked and why.
|
||||||
|
|
||||||
## Related Documentation
|
## Related Documentation
|
||||||
|
|
||||||
- [README.md](README.md) - Project overview, server inventory, installation, usage
|
- [README.md](README.md) - Project overview, server inventory, installation, usage
|
||||||
|
|||||||
65
JOURNAL.md
65
JOURNAL.md
@@ -1833,7 +1833,68 @@ Validated the 8 servers that "require config" to determine if MCP protocol layer
|
|||||||
|
|
||||||
**Registry Location**: `git.knownelement.com/knel/knel-aimiddleware/<service>:latest`
|
**Registry Location**: `git.knownelement.com/knel/knel-aimiddleware/<service>:latest`
|
||||||
|
|
||||||
**Files Added**:
|
---
|
||||||
- run.sh - Shell script for Docker registry management
|
|
||||||
|
## 2026-02-27
|
||||||
|
|
||||||
|
### [MCP Integration] firefly-iii-mcp and paperless-mcp Added
|
||||||
|
|
||||||
|
**Date/Time**: 2026-02-27 14:00:00 EST
|
||||||
|
**Work**: Added two new MCP servers for financial and document management
|
||||||
|
|
||||||
|
**What was done**:
|
||||||
|
|
||||||
|
1. **firefly-iii-mcp (NEW)**:
|
||||||
|
- Repository: https://github.com/etnperlong/firefly-iii-mcp
|
||||||
|
- Build approach: Used npm package `@firefly-iii-mcp/local` instead of building from source
|
||||||
|
- Reason: Source build failed due to Turborepo monorepo complexity with Bun
|
||||||
|
- Container size: ~200MB (node:22-alpine base)
|
||||||
|
- Version: 1.3.0
|
||||||
|
- MCP handshake: Validated successfully
|
||||||
|
- Environment variables: FIREFLY_III_BASE_URL, FIREFLY_III_PAT, FIREFLY_III_PRESET (optional)
|
||||||
|
|
||||||
|
2. **paperless-mcp (validated)**:
|
||||||
|
- Repository: https://github.com/nloui/paperless-mcp (already existed)
|
||||||
|
- Build: Already had Dockerfile, just needed validation
|
||||||
|
- Container size: ~300MB (Python-based)
|
||||||
|
- Version: 1.0.0
|
||||||
|
- MCP handshake: Validated successfully
|
||||||
|
- Configuration: PAPERLESS_URL and PAPERLESS_TOKEN passed as CLI args
|
||||||
|
|
||||||
|
3. **actual-mcp (already configured)**:
|
||||||
|
- Already existed in project with wrapper script
|
||||||
|
- Environment variables: ACTUAL_SERVER_URL, ACTUAL_PASSWORD, ACTUAL_BUDGET_SYNC_ID
|
||||||
|
|
||||||
|
**Validation Commands Used**:
|
||||||
|
```bash
|
||||||
|
# firefly-iii-mcp (requires env vars)
|
||||||
|
echo '{"jsonrpc":"2.0","method":"initialize","params":{"capabilities":{},"protocolVersion":"2024-11-05","clientInfo":{"name":"test","version":"1.0.0"}},"id":1}' | \
|
||||||
|
timeout 15 docker run --rm -i -e FIREFLY_III_PAT=dummy -e FIREFLY_III_BASE_URL=http://localhost:8080 kneldevstack-aimiddleware-firefly-iii-mcp
|
||||||
|
|
||||||
|
# paperless-mcp (requires CLI args)
|
||||||
|
echo '{"jsonrpc":"2.0","method":"initialize","params":{"capabilities":{},"protocolVersion":"2024-11-05","clientInfo":{"name":"test","version":"1.0.0"}},"id":1}' | \
|
||||||
|
timeout 15 docker run --rm -i kneldevstack-aimiddleware-paperless-mcp http://localhost:8000 dummy-token
|
||||||
|
```
|
||||||
|
|
||||||
|
**Files Created**:
|
||||||
|
- dockerfiles/firefly-iii-mcp/Dockerfile
|
||||||
|
- mcp-firefly-iii-wrapper.sh
|
||||||
|
- mcp-paperless-wrapper.sh
|
||||||
|
|
||||||
|
**Files Modified**:
|
||||||
|
- scripts/CloneVendorRepos.sh (added firefly-iii-mcp repo)
|
||||||
|
- docker-compose.yml (added firefly-iii-mcp and paperless-mcp services)
|
||||||
|
- crush.json (added firefly-iii and paperless MCP entries)
|
||||||
|
- .env.example (added environment variables for all three servers)
|
||||||
|
- STATUS.md (updated working servers count to 27)
|
||||||
|
|
||||||
|
**Financial & Budgeting Category**:
|
||||||
|
Now has 3 working MCP servers:
|
||||||
|
1. firefly-iii-mcp - Personal finance management with Firefly III
|
||||||
|
2. actual-mcp - Budget tracking with Actual Budget
|
||||||
|
3. paperless-mcp - Document management for financial documents
|
||||||
|
|
||||||
|
**Pattern Applied**:
|
||||||
|
When npm package exists and works better than source build, prefer npm package installation for reliability and simplicity.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|||||||
206
PRODUCTION-READY.md
Normal file
206
PRODUCTION-READY.md
Normal file
@@ -0,0 +1,206 @@
|
|||||||
|
# Production-Ready MCP/LSP Servers
|
||||||
|
|
||||||
|
This document lists all servers that are validated and ready for production deployment.
|
||||||
|
|
||||||
|
**Last Updated**: 2026-02-27
|
||||||
|
|
||||||
|
## Quick Summary
|
||||||
|
|
||||||
|
| Category | Production Ready | Not Ready |
|
||||||
|
|----------|-----------------|-----------|
|
||||||
|
| MCP Servers | 29 | 9 |
|
||||||
|
| LSP Servers | 4 | 0 |
|
||||||
|
| **Total** | **33** | **9** |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Production-Ready MCP Servers (29)
|
||||||
|
|
||||||
|
These servers have been validated with MCP protocol handshake and are ready for deployment.
|
||||||
|
|
||||||
|
### Design & Engineering (3 servers)
|
||||||
|
|
||||||
|
| Service | Container | Version | Description | Config Required |
|
||||||
|
|---------|-----------|---------|-------------|-----------------|
|
||||||
|
| blender-mcp | `kneldevstack-aimiddleware-blender-mcp` | 1.25.0 | 3D modeling, materials, scenes | Blender with addon running |
|
||||||
|
| freecad-mcp | `kneldevstack-aimiddleware-freecad-mcp` | 1.25.0 | CAD modeling, Python execution | FreeCAD with addon running |
|
||||||
|
| gimp-mcp | `kneldevstack-aimiddleware-gimp-mcp` | 1.10.1 | Image editing with GIMP 3.0 | GIMP with server running |
|
||||||
|
|
||||||
|
### Hosting & Infrastructure (7 servers)
|
||||||
|
|
||||||
|
| Service | Container | Version | Description | Config Required |
|
||||||
|
|---------|-----------|---------|-------------|-----------------|
|
||||||
|
| kubernetes-mcp | `kneldevstack-aimiddleware-kubernetes-mcp` | - | K8s/OpenShift management | kubeconfig mounted |
|
||||||
|
| docker-mcp | `kneldevstack-aimiddleware-docker-mcp` | 0.1.0 | Container and compose management | Docker socket mount |
|
||||||
|
| proxmox-mcp | `kneldevstack-aimiddleware-proxmox-mcp` | - | Hypervisor VM/container management | PROXMOX_MCP_CONFIG |
|
||||||
|
| terraform-mcp | `kneldevstack-aimiddleware-terraform-mcp` | 0.4.0 | IaC automation, HCP Terraform | HCP credentials |
|
||||||
|
| cloudron-mcp | `kneldevstack-aimiddleware-cloudron-mcp` | 0.1.0 | Self-hosted app management | CLOUDRON_URL |
|
||||||
|
| beszel-mcp | `kneldevstack-aimiddleware-beszel-mcp` | - | Server monitoring | BESZEL_URL, credentials |
|
||||||
|
| ansible-mcp | `kneldevstack-aimiddleware-mcp-ansible` | 1.26.0 | Ansible automation, playbook execution | ANSIBLE_VAULT_PASSWORD_FILE |
|
||||||
|
|
||||||
|
### Development Tools (1 server)
|
||||||
|
|
||||||
|
| Service | Container | Version | Description | Config Required |
|
||||||
|
|---------|-----------|---------|-------------|-----------------|
|
||||||
|
| context7-mcp | `kneldevstack-aimiddleware-context7-mcp` | 2.1.0 | Documentation retrieval | Upstash Redis |
|
||||||
|
|
||||||
|
### Content Management (4 servers)
|
||||||
|
|
||||||
|
| Service | Container | Version | Description | Config Required |
|
||||||
|
|---------|-----------|---------|-------------|-----------------|
|
||||||
|
| ghost-mcp | `kneldevstack-aimiddleware-ghost-mcp` | 1.0.0 | CMS post, member management | Ghost CMS credentials |
|
||||||
|
| docspace-mcp | `kneldevstack-aimiddleware-docspace-mcp` | 3.1.0 | Room, file, collaboration | DOCSPACE_HOST, TOKEN |
|
||||||
|
| drawio-mcp | `kneldevstack-aimiddleware-drawio-mcp` | 1.4.0 | Draw.io diagram management | DRAWIO_URL |
|
||||||
|
| postizz-mcp | `kneldevstack-aimiddleware-postizz-mcp` | 1.0.0 | Social media scheduling | POSTIZ_API_KEY |
|
||||||
|
|
||||||
|
### Analytics & Security (2 servers)
|
||||||
|
|
||||||
|
| Service | Container | Version | Description | Config Required |
|
||||||
|
|---------|-----------|---------|-------------|-----------------|
|
||||||
|
| matomo-mcp | `kneldevstack-aimiddleware-matomo-mcp` | 1.0.0 | Analytics (59 tools, 31 prompts) | openmost.io hosted |
|
||||||
|
| bitwarden-mcp | `kneldevstack-aimiddleware-bitwarden-mcp` | - | Password vault management | Bitwarden credentials |
|
||||||
|
|
||||||
|
### Financial & Budgeting (3 servers)
|
||||||
|
|
||||||
|
| Service | Container | Version | Description | Config Required |
|
||||||
|
|---------|-----------|---------|-------------|-----------------|
|
||||||
|
| firefly-iii-mcp | `kneldevstack-aimiddleware-firefly-iii-mcp` | 1.3.0 | Personal finance management | FIREFLY_III_BASE_URL, PAT |
|
||||||
|
| actual-mcp | `kneldevstack-aimiddleware-actual-mcp` | - | Budget tracking | ACTUAL_SERVER_URL, credentials |
|
||||||
|
| paperless-mcp | `kneldevstack-aimiddleware-paperless-mcp` | 1.0.0 | Document management | PAPERLESS_URL, TOKEN |
|
||||||
|
|
||||||
|
### Productivity & Automation (5 servers)
|
||||||
|
|
||||||
|
| Service | Container | Version | Description | Config Required |
|
||||||
|
|---------|-----------|---------|-------------|-----------------|
|
||||||
|
| audiobook-mcp | `kneldevstack-aimiddleware-audiobook-mcp` | 1.1.0 | Audiobook management | AUDIOBOOK_ROOT |
|
||||||
|
| mcp-redmine | `kneldevstack-aimiddleware-mcp-redmine` | 1.25.0 | Project management, issue tracking | REDMINE_URL |
|
||||||
|
| linkwarden-mcp | `kneldevstack-aimiddleware-linkwarden-mcp` | 0.0.1 | Bookmark management | LINKWARDEN_URL, TOKEN |
|
||||||
|
| limesurvey-mcp | `kneldevstack-aimiddleware-limesurvey-mcp` | - | Survey management | LIMESURVEY credentials |
|
||||||
|
| superset-mcp | `kneldevstack-aimiddleware-superset-mcp` | - | Business intelligence | SUPERSET credentials |
|
||||||
|
|
||||||
|
### Additional Services (4 servers)
|
||||||
|
|
||||||
|
| Service | Container | Version | Description | Config Required |
|
||||||
|
|---------|-----------|---------|-------------|-----------------|
|
||||||
|
| gitea-mcp | `kneldevstack-aimiddleware-gitea-mcp` | - | Git hosting integration | GITEA_URL, TOKEN |
|
||||||
|
| grafana-mcp | `kneldevstack-aimiddleware-grafana-mcp` | - | Dashboard and visualization | GRAFANA_URL, TOKEN |
|
||||||
|
| ha-mcp | `kneldevstack-aimiddleware-ha-mcp` | - | Home Assistant integration | HOMEASSISTANT_URL, TOKEN |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Production-Ready LSP Servers (4)
|
||||||
|
|
||||||
|
All LSP servers are production-ready and configured in `crush.json`.
|
||||||
|
|
||||||
|
| Service | Container | Version | Description |
|
||||||
|
|---------|-----------|---------|-------------|
|
||||||
|
| bash-language-server | `kneldevstack-aimiddleware-bash-language-server` | 5.6.0 | Bash LSP (diagnostics, completion, formatting) |
|
||||||
|
| docker-language-server | `kneldevstack-aimiddleware-docker-language-server` | 0.0.0 | Dockerfile, Compose, Bake LSP |
|
||||||
|
| marksman | `kneldevstack-aimiddleware-marksman` | 2025-12-13 | Markdown LSP (diagnostics, completion, navigation) |
|
||||||
|
| terraform-ls | `kneldevstack-aimiddleware-terraform-ls` | 0.38.4 | Terraform LSP (diagnostics, completion, navigation) |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## NOT Production-Ready (9 servers)
|
||||||
|
|
||||||
|
These servers have issues that prevent production deployment.
|
||||||
|
|
||||||
|
### Upstream Bugs (cannot fix locally - 3 servers)
|
||||||
|
|
||||||
|
| Service | Issue | Resolution |
|
||||||
|
|---------|-------|------------|
|
||||||
|
| discourse-mcp | TypeScript TS2345 error in upstream | Wait for upstream fix |
|
||||||
|
| reverse-engineering-assistant | Gradle version mismatch with Ghidra | Complex build, needs specific gradle |
|
||||||
|
| snipeit-mcp | Depends on private PyPI package | Blocked indefinitely |
|
||||||
|
|
||||||
|
### Transport Mismatch (not stdio - 1 server)
|
||||||
|
|
||||||
|
| Service | Issue | Notes |
|
||||||
|
|---------|-------|-------|
|
||||||
|
| penpot-mcp | Uses HTTP/WebSocket transport | Endpoints: :4401/mcp, :4401/sse, :4402 |
|
||||||
|
|
||||||
|
### Runtime Dependencies (crash without backend - 3 servers)
|
||||||
|
|
||||||
|
| Service | Issue | Works When |
|
||||||
|
|---------|-------|------------|
|
||||||
|
| nextcloud-mcp | Crashes without OAuth endpoint | Nextcloud server running |
|
||||||
|
| imap-mcp | Crashes without IMAP server | IMAP server reachable |
|
||||||
|
| webserial-mcp | Crashes without bridge server | Bridge + ESP32 connected |
|
||||||
|
|
||||||
|
### Architecture Mismatch (2 servers)
|
||||||
|
|
||||||
|
| Service | Issue | Notes |
|
||||||
|
|---------|-------|-------|
|
||||||
|
| kicad-mcp | Requires KiCAD on host | Host-only, cannot containerize |
|
||||||
|
| wordpress-mcp | PHP plugin, not container | Must install in WordPress |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Deployment Checklist
|
||||||
|
|
||||||
|
Before deploying to production, ensure:
|
||||||
|
|
||||||
|
- [ ] Copy `.env.example` to `.env` and configure all required variables
|
||||||
|
- [ ] Verify each MCP server's backend service is accessible (if required)
|
||||||
|
- [ ] Test MCP handshake for each server you plan to use
|
||||||
|
- [ ] Mount required volumes (Docker socket, kubeconfig, etc.)
|
||||||
|
- [ ] Configure Crush with `crush.json` for LSP/MCP integration
|
||||||
|
|
||||||
|
### Test MCP Handshake
|
||||||
|
|
||||||
|
```bash
|
||||||
|
echo '{"jsonrpc":"2.0","method":"initialize","params":{"capabilities":{},"protocolVersion":"2024-11-05","clientInfo":{"name":"test","version":"1.0.0"}},"id":1}' | \
|
||||||
|
timeout 10 docker run --rm -i kneldevstack-aimiddleware-<service-name>
|
||||||
|
```
|
||||||
|
|
||||||
|
### Test LSP Server
|
||||||
|
|
||||||
|
```bash
|
||||||
|
echo '{"jsonrpc":"2.0","method":"initialize","params":{"capabilities":{}},"id":1}' | \
|
||||||
|
docker run -i --rm kneldevstack-aimiddleware-<lsp-name>
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Environment Variables Quick Reference
|
||||||
|
|
||||||
|
| Service | Required Variables |
|
||||||
|
|---------|-------------------|
|
||||||
|
| bitwarden-mcp | `BITWARDEN_CLIENT_ID`, `BITWARDEN_CLIENT_SECRET`, `BITWARDEN_PASSWORD`, `BITWARDEN_SERVER_URL` |
|
||||||
|
| ghost-mcp | `GHOST_API_URL`, `GHOST_ADMIN_API_KEY` |
|
||||||
|
| cloudron-mcp | `CLOUDRON_URL`, `CLOUDRON_TOKEN` |
|
||||||
|
| proxmox-mcp | `PROXMOX_MCP_CONFIG` (path to config file) |
|
||||||
|
| terraform-mcp | HCP Terraform credentials |
|
||||||
|
| docspace-mcp | `DOCSPACE_HOST`, `DOCSPACE_TOKEN` |
|
||||||
|
| matomo-mcp | Hosted at openmost.io |
|
||||||
|
| redmine-mcp | `REDMINE_URL`, `REDMINE_API_KEY` |
|
||||||
|
| firefly-iii-mcp | `FIREFLY_III_BASE_URL`, `FIREFLY_III_PAT` |
|
||||||
|
| actual-mcp | `ACTUAL_SERVER_URL`, `ACTUAL_PASSWORD`, `ACTUAL_BUDGET_SYNC_ID` |
|
||||||
|
| paperless-mcp | `PAPERLESS_URL`, `PAPERLESS_TOKEN` |
|
||||||
|
| context7-mcp | `UPSTASH_REDIS_REST_URL`, `UPSTASH_REDIS_REST_TOKEN` |
|
||||||
|
| drawio-mcp | `DRAWIO_URL` |
|
||||||
|
| audiobook-mcp | `AUDIOBOOK_ROOT` |
|
||||||
|
| linkwarden-mcp | `LINKWARDEN_URL`, `LINKWARDEN_TOKEN` |
|
||||||
|
| beszel-mcp | `BESZEL_URL`, `BESZEL_USERNAME`, `BESZEL_PASSWORD` |
|
||||||
|
| limesurvey-mcp | `LIMESURVEY_URL`, `LIMESURVEY_USERNAME`, `LIMESURVEY_PASSWORD` |
|
||||||
|
| superset-mcp | `SUPERSET_URL`, `SUPERSET_USERNAME`, `SUPERSET_PASSWORD` |
|
||||||
|
| gitea-mcp | `GITEA_URL`, `GITEA_TOKEN` |
|
||||||
|
| grafana-mcp | `GRAFANA_URL`, `GRAFANA_TOKEN` |
|
||||||
|
| ha-mcp | `HOMEASSISTANT_URL`, `HOMEASSISTANT_TOKEN` |
|
||||||
|
| postizz-mcp | `POSTIZ_API_KEY` |
|
||||||
|
| ansible-mcp | `ANSIBLE_VAULT_PASSWORD_FILE` |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Container Registry
|
||||||
|
|
||||||
|
All production-ready images are available at:
|
||||||
|
|
||||||
|
```
|
||||||
|
git.knownelement.com/knel/knel-aimiddleware/<service>:latest
|
||||||
|
```
|
||||||
|
|
||||||
|
Example pull:
|
||||||
|
```bash
|
||||||
|
docker pull git.knownelement.com/knel/knel-aimiddleware/docker-mcp:latest
|
||||||
|
```
|
||||||
133
README.md
133
README.md
@@ -4,9 +4,20 @@
|
|||||||
[](LICENSE)
|
[](LICENSE)
|
||||||
[](https://modelcontextprotocol.io/)
|
[](https://modelcontextprotocol.io/)
|
||||||
[](https://microsoft.github.io/language-server-protocol/)
|
[](https://microsoft.github.io/language-server-protocol/)
|
||||||
|
[](PRODUCTION-READY.md)
|
||||||
|
|
||||||
> MCP and LSP infrastructure for OpenWebUI and Crush to utilize
|
> MCP and LSP infrastructure for OpenWebUI and Crush to utilize
|
||||||
|
|
||||||
|
## Production Status
|
||||||
|
|
||||||
|
| Category | Production Ready | Total | Status |
|
||||||
|
|----------|-----------------|-------|--------|
|
||||||
|
| MCP Servers | 27 | 38 | 71% |
|
||||||
|
| LSP Servers | 4 | 4 | 100% |
|
||||||
|
| **Total** | **31** | **42** | **74%** |
|
||||||
|
|
||||||
|
**See [PRODUCTION-READY.md](PRODUCTION-READY.md) for the complete list of deployable servers.**
|
||||||
|
|
||||||
## Overview
|
## Overview
|
||||||
|
|
||||||
KNEL-AIMiddleware is a comprehensive Docker-based infrastructure for running **Model Context Protocol (MCP)** servers and **Language Server Protocol (LSP)** providers. It enables AI assistants like OpenWebUI and Crush to seamlessly integrate with external tools, services, and code intelligence.
|
KNEL-AIMiddleware is a comprehensive Docker-based infrastructure for running **Model Context Protocol (MCP)** servers and **Language Server Protocol (LSP)** providers. It enables AI assistants like OpenWebUI and Crush to seamlessly integrate with external tools, services, and code intelligence.
|
||||||
@@ -31,82 +42,93 @@ KNEL-AIMiddleware is a comprehensive Docker-based infrastructure for running **M
|
|||||||
|
|
||||||
For detailed build and configuration status of all MCP/LSP servers, see [STATUS.md](STATUS.md).
|
For detailed build and configuration status of all MCP/LSP servers, see [STATUS.md](STATUS.md).
|
||||||
|
|
||||||
|
**For production deployment, see [PRODUCTION-READY.md](PRODUCTION-READY.md).**
|
||||||
|
|
||||||
## Available Servers
|
## Available Servers
|
||||||
|
|
||||||
|
Legend: ✅ Production Ready | ⚠️ Config Required | ❌ Not Production Ready
|
||||||
|
|
||||||
### MCP Servers
|
### MCP Servers
|
||||||
|
|
||||||
#### Design & Engineering (4 servers)
|
#### Design & Engineering (4 servers)
|
||||||
| Service | Container Name | Description |
|
| Service | Status | Container Name | Description |
|
||||||
|---------|---------------|-------------|
|
|---------|--------|---------------|-------------|
|
||||||
| kicad-mcp | kneldevstack-aimiddleware-kicad-mcp | PCB design automation with 64 tools, JLCPCB integration (host-only) |
|
| kicad-mcp | ❌ | kneldevstack-aimiddleware-kicad-mcp | PCB design (host-only, requires KiCAD on host) |
|
||||||
| blender-mcp | kneldevstack-aimiddleware-blender-mcp | 3D modeling, materials, scenes, AI 3D model generation |
|
| blender-mcp | ⚠️ | kneldevstack-aimiddleware-blender-mcp | 3D modeling (requires Blender with addon) |
|
||||||
| freecad-mcp | kneldevstack-aimiddleware-freecad-mcp | CAD modeling, Python execution, parts library |
|
| freecad-mcp | ⚠️ | kneldevstack-aimiddleware-freecad-mcp | CAD modeling (requires FreeCAD with addon) |
|
||||||
| gimp-mcp | kneldevstack-aimiddleware-gimp-mcp | Image editing with GIMP 3.0, OCR support |
|
| gimp-mcp | ⚠️ | kneldevstack-aimiddleware-gimp-mcp | Image editing (requires GIMP server) |
|
||||||
|
|
||||||
#### Hosting & Infrastructure (5 servers)
|
#### Hosting & Infrastructure (5 servers)
|
||||||
| Service | Container Name | Description |
|
| Service | Status | Container Name | Description |
|
||||||
|---------|---------------|-------------|
|
|---------|--------|---------------|-------------|
|
||||||
| kubernetes-mcp | kneldevstack-aimiddleware-kubernetes-mcp | K8s/OpenShift management (native Go implementation) |
|
| kubernetes-mcp | ⚠️ | kneldevstack-aimiddleware-kubernetes-mcp | K8s/OpenShift (requires kubeconfig) |
|
||||||
| docker-mcp | kneldevstack-aimiddleware-docker-mcp | Container and compose stack management |
|
| docker-mcp | ⚠️ | kneldevstack-aimiddleware-docker-mcp | Container management (requires Docker socket) |
|
||||||
| proxmox-mcp | kneldevstack-aimiddleware-proxmox-mcp | Hypervisor VM/container management |
|
| proxmox-mcp | ⚠️ | kneldevstack-aimiddleware-proxmox-mcp | Hypervisor management (requires config) |
|
||||||
| terraform-mcp | kneldevstack-aimiddleware-terraform-mcp | IaC automation, HCP Terraform, workspace management |
|
| terraform-mcp | ⚠️ | kneldevstack-aimiddleware-terraform-mcp | IaC automation (requires HCP credentials) |
|
||||||
| cloudron-mcp | kneldevstack-aimiddleware-cloudron-mcp | Self-hosted app management |
|
| cloudron-mcp | ⚠️ | kneldevstack-aimiddleware-cloudron-mcp | Self-hosted apps (requires CLOUDRON_URL) |
|
||||||
|
|
||||||
#### Development Tools (1 server)
|
#### Development Tools (1 server)
|
||||||
| Service | Container Name | Description |
|
| Service | Status | Container Name | Description |
|
||||||
|---------|---------------|-------------|
|
|---------|--------|---------------|-------------|
|
||||||
| context7-mcp | kneldevstack-aimiddleware-context7-mcp | MCP server framework and SDK for documentation |
|
| context7-mcp | ⚠️ | kneldevstack-aimiddleware-context7-mcp | Documentation retrieval (requires Upstash Redis) |
|
||||||
|
|
||||||
#### Content Management (4 servers)
|
#### Content Management (4 servers)
|
||||||
| Service | Container Name | Description |
|
| Service | Status | Container Name | Description |
|
||||||
|---------|---------------|-------------|
|
|---------|--------|---------------|-------------|
|
||||||
| nextcloud-mcp | kneldevstack-aimiddleware-nextcloud-mcp | 90+ tools across 8 apps (Notes, Calendar, Files, Deck, etc.) |
|
| nextcloud-mcp | ❌ | kneldevstack-aimiddleware-nextcloud-mcp | 90+ tools (crashes without live Nextcloud) |
|
||||||
| ghost-mcp | kneldevstack-aimiddleware-ghost-mcp | CMS post, member, newsletter management |
|
| ghost-mcp | ⚠️ | kneldevstack-aimiddleware-ghost-mcp | CMS management (requires Ghost credentials) |
|
||||||
| docspace-mcp | kneldevstack-aimiddleware-docspace-mcp | Room, file, collaboration management |
|
| docspace-mcp | ⚠️ | kneldevstack-aimiddleware-docspace-mcp | Collaboration (requires DOCSPACE credentials) |
|
||||||
| wordpress-mcp | kneldevstack-aimiddleware-wordpress-mcp | WordPress integration via Abilities API |
|
| wordpress-mcp | ❌ | kneldevstack-aimiddleware-wordpress-mcp | WordPress (PHP plugin, not containerizable) |
|
||||||
|
|
||||||
#### Communication & Collaboration (3 servers)
|
#### Communication & Collaboration (3 servers)
|
||||||
| Service | Container Name | Description |
|
| Service | Status | Container Name | Description |
|
||||||
|---------|---------------|-------------|
|
|---------|--------|---------------|-------------|
|
||||||
| discourse-mcp | kneldevstack-aimiddleware-discourse-mcp | Forum search, posts, topics, categories (read/write modes) |
|
| discourse-mcp | ❌ | kneldevstack-aimiddleware-discourse-mcp | Forum (upstream build error) |
|
||||||
| imap-mcp | kneldevstack-aimiddleware-imap-mcp | Email browsing, composition, Gmail OAuth2 support |
|
| imap-mcp | ❌ | kneldevstack-aimiddleware-imap-mcp | Email (crashes without live IMAP) |
|
||||||
| postizz-mcp | kneldevstack-aimiddleware-postizz-mcp | Social media management platform |
|
| postizz-mcp | ❌ | kneldevstack-aimiddleware-postizz-mcp | Social media (HTTP transport, not stdio) |
|
||||||
|
|
||||||
#### Analytics & Security (2 servers)
|
#### Analytics & Security (2 servers)
|
||||||
| Service | Container Name | Description |
|
| Service | Status | Container Name | Description |
|
||||||
|---------|---------------|-------------|
|
|---------|--------|---------------|-------------|
|
||||||
| matomo-mcp | kneldevstack-aimiddleware-matomo-mcp | Analytics integration |
|
| matomo-mcp | ✅ | kneldevstack-aimiddleware-matomo-mcp | Analytics (hosted at openmost.io) |
|
||||||
| bitwarden-mcp | kneldevstack-aimiddleware-bitwarden-mcp | Official password vault management |
|
| bitwarden-mcp | ⚠️ | kneldevstack-aimiddleware-bitwarden-mcp | Password vault (requires Bitwarden credentials) |
|
||||||
|
|
||||||
|
#### Financial & Budgeting (3 servers)
|
||||||
|
| Service | Status | Container Name | Description |
|
||||||
|
|---------|--------|---------------|-------------|
|
||||||
|
| firefly-iii-mcp | ⚠️ | kneldevstack-aimiddleware-firefly-iii-mcp | Finance (requires Firefly III URL + PAT) |
|
||||||
|
| actual-mcp | ⚠️ | kneldevstack-aimiddleware-actual-mcp | Budget (requires Actual server credentials) |
|
||||||
|
| paperless-mcp | ⚠️ | kneldevstack-aimiddleware-paperless-mcp | Documents (requires Paperless URL + token) |
|
||||||
|
|
||||||
#### Productivity & Automation (6 servers)
|
#### Productivity & Automation (6 servers)
|
||||||
| Service | Container Name | Description |
|
| Service | Status | Container Name | Description |
|
||||||
|---------|---------------|-------------|
|
|---------|--------|---------------|-------------|
|
||||||
| audiobook-mcp | kneldevstack-aimiddleware-audiobook-mcp | Audiobook management with AI-powered features |
|
| audiobook-mcp | ⚠️ | kneldevstack-aimiddleware-audiobook-mcp | Audiobooks (requires AUDIOBOOK_ROOT) |
|
||||||
| snipeit-mcp | kneldevstack-aimiddleware-snipeit-mcp | Asset inventory, maintenance tracking |
|
| snipeit-mcp | ❌ | kneldevstack-aimiddleware-snipeit-mcp | Assets (blocked: private PyPI package) |
|
||||||
| mcp-redmine | kneldevstack-aimiddleware-mcp-redmine | Project management, issue tracking, file operations |
|
| mcp-redmine | ⚠️ | kneldevstack-aimiddleware-mcp-redmine | Projects (requires REDMINE_URL) |
|
||||||
| mcp-ansible | kneldevstack-aimiddleware-mcp-ansible | IT automation playbooks |
|
| mcp-ansible | ❌ | kneldevstack-aimiddleware-mcp-ansible | Automation (package not in PyPI) |
|
||||||
| elasticsearch-mcp | kneldevstack-aimiddleware-elasticsearch-mcp | Search and index management (Rust) |
|
| elasticsearch-mcp | ✅ | kneldevstack-aimiddleware-elasticsearch-mcp | Search (bundled with Elasticsearch) |
|
||||||
| drawio-mcp | kneldevstack-aimiddleware-drawio-mcp | Draw.io diagram management |
|
| drawio-mcp | ⚠️ | kneldevstack-aimiddleware-drawio-mcp | Diagrams (requires DRAWIO_URL) |
|
||||||
|
|
||||||
#### Additional Tools (2 servers)
|
#### Additional Tools (2 servers)
|
||||||
| Service | Container Name | Description |
|
| Service | Status | Container Name | Description |
|
||||||
|---------|---------------|-------------|
|
|---------|--------|---------------|-------------|
|
||||||
| penpot-mcp | kneldevstack-aimiddleware-penpot-mcp | Design collaboration platform integration |
|
| penpot-mcp | ❌ | kneldevstack-aimiddleware-penpot-mcp | Design (HTTP/WebSocket transport, not stdio) |
|
||||||
| webserial-mcp | kneldevstack-aimiddleware-webserial-mcp | ESP32 MicroPython development via WebSerial (requires bridge server) |
|
| webserial-mcp | ❌ | kneldevstack-aimiddleware-webserial-mcp | ESP32 dev (requires bridge server + hardware) |
|
||||||
|
|
||||||
#### Reverse Engineering (2 servers)
|
#### Reverse Engineering (2 servers)
|
||||||
| Service | Container Name | Description |
|
| Service | Status | Container Name | Description |
|
||||||
|---------|---------------|-------------|
|
|---------|--------|---------------|-------------|
|
||||||
| ghidra-mcp | kneldevstack-aimiddleware-ghidra-mcp | Binary analysis and reverse engineering (HTTP REST, not MCP) |
|
| ghidra-mcp | ✅ | kneldevstack-aimiddleware-ghidra-mcp | Binary analysis (HTTP REST, not MCP protocol) |
|
||||||
| reverse-engineering-assistant | kneldevstack-aimiddleware-reverse-engineering-assistant | ReVa - AI-assisted reverse engineering via MCP |
|
| reverse-engineering-assistant | ❌ | kneldevstack-aimiddleware-reverse-engineering-assistant | ReVa (upstream build error: Ghidra 404) |
|
||||||
|
|
||||||
### LSP Servers (4 servers)
|
### LSP Servers (4 servers) - All Production Ready ✅
|
||||||
| Service | Container Name | Description |
|
| Service | Status | Container Name | Description |
|
||||||
|---------|---------------|-------------|
|
|---------|--------|---------------|-------------|
|
||||||
| bash-language-server | kneldevstack-aimiddleware-bash-language-server | LSP for bash (diagnostics, completion, formatting) |
|
| bash-language-server | ✅ | kneldevstack-aimiddleware-bash-language-server | LSP for bash (diagnostics, completion, formatting) |
|
||||||
| docker-language-server | kneldevstack-aimiddleware-docker-language-server | LSP for Dockerfiles, Compose files, Bake files |
|
| docker-language-server | ✅ | kneldevstack-aimiddleware-docker-language-server | LSP for Dockerfiles, Compose, Bake |
|
||||||
| marksman | kneldevstack-aimiddleware-marksman | LSP for Markdown (diagnostics, completion, navigation) |
|
| marksman | ✅ | kneldevstack-aimiddleware-marksman | LSP for Markdown |
|
||||||
| terraform-ls | kneldevstack-aimiddleware-terraform-ls | LSP for Terraform (diagnostics, completion, navigation) |
|
| terraform-ls | ✅ | kneldevstack-aimiddleware-terraform-ls | LSP for Terraform |
|
||||||
|
|
||||||
### Server Technologies by Language
|
### Server Technologies by Language
|
||||||
|
|
||||||
@@ -274,6 +296,9 @@ Required variables for MCP servers (see `.env.example`):
|
|||||||
| kicad-mcp | `KICAD_HOST` (default: host.docker.internal), `KICAD_PORT` (default: 5555) |
|
| kicad-mcp | `KICAD_HOST` (default: host.docker.internal), `KICAD_PORT` (default: 5555) |
|
||||||
| context7-mcp | `UPSTASH_REDIS_REST_URL`, `UPSTASH_REDIS_REST_TOKEN` |
|
| context7-mcp | `UPSTASH_REDIS_REST_URL`, `UPSTASH_REDIS_REST_TOKEN` |
|
||||||
| penpot-mcp | `PENPOT_URL` (default: https://design.penpot.app), `PENPOT_TOKEN` |
|
| penpot-mcp | `PENPOT_URL` (default: https://design.penpot.app), `PENPOT_TOKEN` |
|
||||||
|
| firefly-iii-mcp | `FIREFLY_III_BASE_URL`, `FIREFLY_III_PAT`, `FIREFLY_III_PRESET` (optional) |
|
||||||
|
| actual-mcp | `ACTUAL_SERVER_URL`, `ACTUAL_PASSWORD`, `ACTUAL_BUDGET_SYNC_ID` |
|
||||||
|
| paperless-mcp | `PAPERLESS_URL`, `PAPERLESS_TOKEN` |
|
||||||
|
|
||||||
**Security Note**: Never commit `.env` file to version control.
|
**Security Note**: Never commit `.env` file to version control.
|
||||||
|
|
||||||
|
|||||||
59
STATUS.md
59
STATUS.md
@@ -2,7 +2,17 @@
|
|||||||
|
|
||||||
Tracking the setup and validation of MCP/LSP servers via Docker Compose.
|
Tracking the setup and validation of MCP/LSP servers via Docker Compose.
|
||||||
|
|
||||||
Last validated: 2026-02-20
|
Last validated: 2026-02-27
|
||||||
|
|
||||||
|
## Production Readiness Summary
|
||||||
|
|
||||||
|
| Category | Production Ready | Total | Percentage |
|
||||||
|
|----------|-----------------|-------|------------|
|
||||||
|
| MCP Servers | 29 | 38 | 76% |
|
||||||
|
| LSP Servers | 4 | 4 | 100% |
|
||||||
|
| **Total** | **33** | **42** | **79%** |
|
||||||
|
|
||||||
|
**See [PRODUCTION-READY.md](PRODUCTION-READY.md) for the complete list of deployable servers.**
|
||||||
|
|
||||||
## Repository URLs Verified (2026-02-19)
|
## Repository URLs Verified (2026-02-19)
|
||||||
|
|
||||||
@@ -48,8 +58,9 @@ All 32 vendor repositories have been verified and correctly cloned. CloneVendorR
|
|||||||
|
|
||||||
## Validation Summary
|
## Validation Summary
|
||||||
|
|
||||||
**Working MCP Servers (24 validated with MCP handshake):**
|
**Working MCP Servers (29 validated with MCP handshake):**
|
||||||
- ✓ actual-mcp: Working (Actual Budget MCP) - requires ACTUAL_SERVER_URL, ACTUAL_PASSWORD, ACTUAL_BUDGET_SYNC_ID env vars
|
- ✓ actual-mcp: Working (Actual Budget MCP) - requires ACTUAL_SERVER_URL, ACTUAL_PASSWORD, ACTUAL_BUDGET_SYNC_ID env vars
|
||||||
|
- ✓ ansible-mcp: Working (ansible-mcp v1.26.0) - requires ANSIBLE_VAULT_PASSWORD_FILE env var
|
||||||
- ✓ audiobook-mcp: Working (audiobook-library v1.1.0) - requires AUDIOBOOK_ROOT env var
|
- ✓ 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
|
- ✓ beszel-mcp: Working (beszel-mcp) - requires BESZEL_URL, BESZEL_USERNAME, BESZEL_PASSWORD env vars
|
||||||
- ✓ bitwarden-mcp: Working (Bitwarden MCP Server) - requires Bitwarden credentials
|
- ✓ bitwarden-mcp: Working (Bitwarden MCP Server) - requires Bitwarden credentials
|
||||||
@@ -59,6 +70,7 @@ All 32 vendor repositories have been verified and correctly cloned. CloneVendorR
|
|||||||
- ✓ docker-mcp: Working (docker-mcp v0.1.0) - requires Docker socket mount
|
- ✓ 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
|
- ✓ 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
|
- ✓ drawio-mcp: Working (drawio-mcp-server v1.4.0) - requires DRAWIO_URL env var
|
||||||
|
- ✓ firefly-iii-mcp: Working (Firefly III MCP Agent v1.3.0) - requires FIREFLY_III_BASE_URL, FIREFLY_III_PAT env vars
|
||||||
- ✓ freecad-mcp: Working (FreeCADMCP v1.25.0) - requires FreeCAD with addon running
|
- ✓ 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
|
- ✓ 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
|
- ✓ gimp-mcp: Working (GimpMCP v1.10.1) - requires GIMP with server running
|
||||||
@@ -71,8 +83,10 @@ All 32 vendor repositories have been verified and correctly cloned. CloneVendorR
|
|||||||
- ✓ terraform-mcp: Working (terraform-mcp-server v0.4.0) - requires credentials for HCP Terraform
|
- ✓ terraform-mcp: Working (terraform-mcp-server v0.4.0) - requires credentials for HCP Terraform
|
||||||
- ✓ matomo-mcp: Working (matomo-mcp-client v1.0.0) - connects to openmost.io hosted service (59 tools, 31 prompts)
|
- ✓ matomo-mcp: Working (matomo-mcp-client v1.0.0) - connects to openmost.io hosted service (59 tools, 31 prompts)
|
||||||
- ✓ mcp-redmine: Working (Redmine MCP server v1.25.0) - requires REDMINE_URL for actual usage
|
- ✓ 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
|
- ✓ paperless-mcp: Working (paperless-ngx v1.0.0) - requires PAPERLESS_URL and PAPERLESS_TOKEN CLI args
|
||||||
|
- ✓ postizz-mcp: Working (postiz-server v1.0.0) - requires POSTIZ_API_KEY env var (fixed: stdio transport)
|
||||||
- ✓ superset-mcp: Working (superset-mcp) - requires SUPERSET_URL, SUPERSET_USERNAME, SUPERSET_PASSWORD env vars
|
- ✓ 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):**
|
**Runtime Connection Required (crash before MCP protocol):**
|
||||||
- ✗ nextcloud-mcp: Requires reachable OAuth endpoint - crashes on startup with connection refused
|
- ✗ nextcloud-mcp: Requires reachable OAuth endpoint - crashes on startup with connection refused
|
||||||
@@ -82,19 +96,16 @@ All 32 vendor repositories have been verified and correctly cloned. CloneVendorR
|
|||||||
**Host-Only MCP Servers:**
|
**Host-Only MCP Servers:**
|
||||||
- ✗ kicad-mcp: Requires KiCAD installed on host (pcbnew Python module unavailable in container)
|
- ✗ kicad-mcp: Requires KiCAD installed on host (pcbnew Python module unavailable in container)
|
||||||
|
|
||||||
**Transport Mismatch (not stdio MCP):**
|
|
||||||
- ✗ postizz-mcp: Uses HTTP transport (port 3084), not stdio - incompatible with standard MCP clients
|
|
||||||
|
|
||||||
**HTTP-based REST API Servers:**
|
**HTTP-based REST API Servers:**
|
||||||
- ✓ ghidra-mcp: Working (v1.9.4-headless) - 91 REST endpoints for binary analysis - NOT MCP protocol (uses HTTP REST)
|
- ✓ ghidra-mcp: Working (v1.9.4-headless) - 91 REST endpoints for binary analysis - NOT MCP protocol (uses HTTP REST)
|
||||||
|
|
||||||
**MCP Servers with Build/Runtime Issues:**
|
**MCP Servers with Build/Runtime Issues:**
|
||||||
- ✗ discourse-mcp: Build failed - TypeScript TS2345 error (upstream bug)
|
- ✗ discourse-mcp: BLOCKED - TypeScript TS2345 error (upstream SDK incompatibility, cannot fix)
|
||||||
- ✗ reverse-engineering-assistant: Build failed - Ghidra download 404
|
- ✗ reverse-engineering-assistant: BLOCKED - requires specific gradle version matching Ghidra (complex build)
|
||||||
- ✗ 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
|
- ✗ 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:**
|
**LSP Servers:**
|
||||||
- ✓ bash-language-server: Working (v5.6.0) - stdio-based, configured in crush.json
|
- ✓ bash-language-server: Working (v5.6.0) - stdio-based, configured in crush.json
|
||||||
@@ -123,15 +134,16 @@ All 32 vendor repositories have been verified and correctly cloned. CloneVendorR
|
|||||||
| 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. |
|
| 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. |
|
| 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 | Built | Container built from Python source. MCP stdio-based. Connects to openmost.io hosted Matomo service (59 tools, 31 prompts). MCP handshake validated. |
|
| matomo-mcp | Built | Container built from Python source. MCP stdio-based. Connects to openmost.io hosted Matomo service (59 tools, 31 prompts). MCP handshake validated. |
|
||||||
| mcp-ansible | Build/Runtime Issue | Container builds but fails at runtime - package not found in PyPI registry. Upstream issue. |
|
| mcp-ansible | Built | Container built from Python source. MCP stdio-based. Fixed to run local source instead of uvx. Version 1.26.0. |
|
||||||
| mcp-redmine | Built | Container built from Python source. MCP stdio-based, validated with MCP handshake. Requires REDMINE_URL for actual API operations. Version 1.25.0. |
|
| mcp-redmine | Built | Container built from Python source. MCP stdio-based, validated with MCP handshake. Requires REDMINE_URL for actual API operations. Version 1.25.0. |
|
||||||
| nextcloud-mcp | Runtime Issue | Container builds but crashes on startup - requires reachable OAuth endpoint. Cannot validate MCP protocol without live Nextcloud instance. |
|
| nextcloud-mcp | Runtime Issue | Container builds but crashes on startup - requires reachable OAuth endpoint. Cannot validate MCP protocol without live Nextcloud instance. |
|
||||||
| 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. |
|
| paperless-mcp | Built | Container built from Python source. MCP stdio-based, requires PAPERLESS_URL and PAPERLESS_TOKEN as CLI args. MCP handshake validated without live server. Version 1.0.0. |
|
||||||
|
| firefly-iii-mcp | Built | Container built from npm package @firefly-iii-mcp/local. MCP stdio-based, requires FIREFLY_III_BASE_URL and FIREFLY_III_PAT env vars. MCP handshake validated without live server. Version 1.3.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. |
|
| 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. |
|
| postizz-mcp | Built | Container built from TypeScript source. MCP stdio-based. Fixed to use stdio transport instead of HTTP. Version 1.0.0. |
|
||||||
| 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. |
|
| reverse-engineering-assistant | Blocked | Ghidra 12.0.3 download works but gradle version mismatch. Requires specific gradle version matching Ghidra's build system. |
|
||||||
| 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. |
|
| 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. |
|
| 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. |
|
| 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. |
|
||||||
@@ -157,26 +169,23 @@ Host-only - requires KiCAD installed on the host machine. The pcbnew Python modu
|
|||||||
### wordpress-mcp
|
### 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.
|
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.
|
||||||
|
|
||||||
### postizz-mcp
|
|
||||||
Uses HTTP transport (listens on port 3084) instead of stdio MCP. Not compatible with standard MCP clients that expect stdio communication.
|
|
||||||
|
|
||||||
### discourse-mcp
|
### discourse-mcp
|
||||||
Build failed with TypeScript TS2345 error in upstream repository. Cannot fix locally.
|
BLOCKED - Build failed with TypeScript TS2345 error in upstream repository (src/tools/remote/tool_exec_api.ts:58). The code is incompatible with MCP SDK types. Cannot fix locally without upstream changes.
|
||||||
|
|
||||||
### proxmox-mcp
|
### 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
|
### 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
|
### 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.
|
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.
|
||||||
|
|
||||||
### mcp-ansible
|
### mcp-ansible
|
||||||
Package not found in PyPI registry. Upstream issue - the package may not be published.
|
FIXED - Changed Dockerfile entrypoint to run local source (`python src/ansible_mcp/server.py`) instead of uvx. The package is not published to PyPI, so local installation is required. MCP handshake validated with version 1.26.0.
|
||||||
|
|
||||||
### reverse-engineering-assistant
|
### reverse-engineering-assistant
|
||||||
Build failed - Ghidra download URL returns 404. The version number in the Dockerfile download URL is incorrect.
|
BLOCKED - Build requires gradle version matching Ghidra 12.0.3. The gradle version from apt-get is incompatible with Ghidra's build system. Requires either: (1) finding the correct gradle version, or (2) using Ghidra's included gradle wrapper. The project doesn't include gradlew in the repository.
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
|
|||||||
10
crush.json
10
crush.json
@@ -179,6 +179,16 @@
|
|||||||
"type": "stdio",
|
"type": "stdio",
|
||||||
"command": "/home/charles/Projects/KNEL-AIMiddleware/mcp-penpot-wrapper.sh",
|
"command": "/home/charles/Projects/KNEL-AIMiddleware/mcp-penpot-wrapper.sh",
|
||||||
"timeout": 60
|
"timeout": 60
|
||||||
|
},
|
||||||
|
"firefly-iii": {
|
||||||
|
"type": "stdio",
|
||||||
|
"command": "/home/charles/Projects/KNEL-AIMiddleware/mcp-firefly-iii-wrapper.sh",
|
||||||
|
"timeout": 60
|
||||||
|
},
|
||||||
|
"paperless": {
|
||||||
|
"type": "stdio",
|
||||||
|
"command": "/home/charles/Projects/KNEL-AIMiddleware/mcp-paperless-wrapper.sh",
|
||||||
|
"timeout": 60
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -239,6 +239,21 @@ services:
|
|||||||
profiles:
|
profiles:
|
||||||
- ops
|
- ops
|
||||||
|
|
||||||
|
# Paperless-NGX MCP - Document management
|
||||||
|
# NOTE: This is a stdio-based MCP server, run on-demand by Crush via docker run
|
||||||
|
paperless-mcp:
|
||||||
|
image: kneldevstack-aimiddleware-paperless-mcp
|
||||||
|
build:
|
||||||
|
context: ./vendor/paperless-mcp
|
||||||
|
dockerfile: ../../dockerfiles/paperless-mcp/Dockerfile
|
||||||
|
container_name: kneldevstack-aimiddleware-paperless-mcp
|
||||||
|
restart: "no"
|
||||||
|
environment:
|
||||||
|
- PAPERLESS_URL=${PAPERLESS_URL}
|
||||||
|
- PAPERLESS_TOKEN=${PAPERLESS_TOKEN}
|
||||||
|
profiles:
|
||||||
|
- ops
|
||||||
|
|
||||||
# WordPress MCP Adapter
|
# WordPress MCP Adapter
|
||||||
wordpress-mcp:
|
wordpress-mcp:
|
||||||
image: kneldevstack-aimiddleware-wordpress-mcp
|
image: kneldevstack-aimiddleware-wordpress-mcp
|
||||||
@@ -546,7 +561,7 @@ services:
|
|||||||
- dev
|
- dev
|
||||||
|
|
||||||
# ==========================================
|
# ==========================================
|
||||||
# Financial & Budgeting (1 server)
|
# Financial & Budgeting (2 servers)
|
||||||
# ==========================================
|
# ==========================================
|
||||||
|
|
||||||
# Actual Budget MCP - Budget management
|
# Actual Budget MCP - Budget management
|
||||||
@@ -565,6 +580,22 @@ services:
|
|||||||
profiles:
|
profiles:
|
||||||
- ops
|
- ops
|
||||||
|
|
||||||
|
# Firefly III MCP - Personal finance manager
|
||||||
|
# NOTE: This is a stdio-based MCP server, run on-demand by Crush via docker run
|
||||||
|
firefly-iii-mcp:
|
||||||
|
image: kneldevstack-aimiddleware-firefly-iii-mcp
|
||||||
|
build:
|
||||||
|
context: .
|
||||||
|
dockerfile: dockerfiles/firefly-iii-mcp/Dockerfile
|
||||||
|
container_name: kneldevstack-aimiddleware-firefly-iii-mcp
|
||||||
|
restart: "no"
|
||||||
|
environment:
|
||||||
|
- FIREFLY_III_BASE_URL=${FIREFLY_III_BASE_URL}
|
||||||
|
- FIREFLY_III_PAT=${FIREFLY_III_PAT}
|
||||||
|
- FIREFLY_III_PRESET=${FIREFLY_III_PRESET:-default}
|
||||||
|
profiles:
|
||||||
|
- ops
|
||||||
|
|
||||||
# ==========================================
|
# ==========================================
|
||||||
# System Monitoring (1 server)
|
# System Monitoring (1 server)
|
||||||
# ==========================================
|
# ==========================================
|
||||||
|
|||||||
@@ -2,12 +2,17 @@ FROM node:24-alpine
|
|||||||
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
COPY package.json ./
|
# Install pnpm as upstream requires
|
||||||
|
RUN corepack enable && corepack prepare pnpm@10.14.0 --activate
|
||||||
|
|
||||||
RUN npm install
|
COPY package.json pnpm-lock.yaml ./
|
||||||
|
|
||||||
|
# Install dependencies with pinned SDK version
|
||||||
|
RUN pnpm add @modelcontextprotocol/sdk@^1.23.0
|
||||||
|
RUN pnpm install --frozen-lockfile
|
||||||
|
|
||||||
COPY . .
|
COPY . .
|
||||||
|
|
||||||
RUN npm run build
|
RUN pnpm build
|
||||||
|
|
||||||
CMD ["node", "dist/index.js"]
|
CMD ["node", "dist/index.js"]
|
||||||
|
|||||||
18
dockerfiles/firefly-iii-mcp/Dockerfile
Normal file
18
dockerfiles/firefly-iii-mcp/Dockerfile
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
# Firefly III MCP Server
|
||||||
|
# https://github.com/etnperlong/firefly-iii-mcp
|
||||||
|
# Uses published npm package for reliability
|
||||||
|
|
||||||
|
FROM node:22-alpine
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Install the npm package globally
|
||||||
|
RUN npm install -g @firefly-iii-mcp/local
|
||||||
|
|
||||||
|
# Environment variables (to be set at runtime)
|
||||||
|
ENV FIREFLY_III_BASE_URL=""
|
||||||
|
ENV FIREFLY_III_PAT=""
|
||||||
|
ENV FIREFLY_III_PRESET="default"
|
||||||
|
|
||||||
|
# Run the local MCP server
|
||||||
|
ENTRYPOINT ["npx", "@firefly-iii-mcp/local"]
|
||||||
@@ -15,4 +15,5 @@ RUN uv venv && uv pip install --no-cache -e .
|
|||||||
ENV PYTHONUNBUFFERED=1
|
ENV PYTHONUNBUFFERED=1
|
||||||
ENV PATH=/app/.venv/bin:$PATH
|
ENV PATH=/app/.venv/bin:$PATH
|
||||||
|
|
||||||
ENTRYPOINT ["uvx", "mcp-ansible"]
|
# Run directly from local install, not via uvx
|
||||||
|
ENTRYPOINT ["python", "src/ansible_mcp/server.py"]
|
||||||
|
|||||||
@@ -1,23 +1,21 @@
|
|||||||
FROM python:3.12-slim
|
FROM python:3.12-slim
|
||||||
|
|
||||||
# Install git for git+ dependencies
|
# Install uv for faster package management and git for any git dependencies
|
||||||
RUN apt-get update && apt-get install -y git && rm -rf /var/lib/apt/lists/*
|
|
||||||
|
|
||||||
# Install uv for faster package management
|
|
||||||
COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
|
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
|
WORKDIR /app
|
||||||
|
|
||||||
# Copy dependency files
|
# Copy all source code first
|
||||||
COPY pyproject.toml ./
|
|
||||||
|
|
||||||
# Install dependencies
|
|
||||||
RUN uv sync --no-dev --no-install-project --no-cache
|
|
||||||
|
|
||||||
# Copy source code
|
|
||||||
COPY . .
|
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
|
RUN uv sync --no-dev --no-editable --no-cache
|
||||||
|
|
||||||
# Set up environment
|
# Set up environment
|
||||||
|
|||||||
@@ -4,8 +4,8 @@
|
|||||||
|
|
||||||
FROM eclipse-temurin:21-jdk-jammy AS builder
|
FROM eclipse-temurin:21-jdk-jammy AS builder
|
||||||
|
|
||||||
ARG GHIDRA_VERSION=11.2.1
|
ARG GHIDRA_VERSION=12.0.3
|
||||||
ARG GHIDRA_SHA256=1234567890abcdef
|
ARG GHIDRA_DATE=20260210
|
||||||
|
|
||||||
ENV DEBIAN_FRONTEND=noninteractive
|
ENV DEBIAN_FRONTEND=noninteractive
|
||||||
ENV GHIDRA_INSTALL_DIR=/opt/ghidra
|
ENV GHIDRA_INSTALL_DIR=/opt/ghidra
|
||||||
@@ -19,7 +19,7 @@ WORKDIR /build
|
|||||||
|
|
||||||
COPY . /build/reva
|
COPY . /build/reva
|
||||||
|
|
||||||
RUN wget -q "https://github.com/NationalSecurityAgency/ghidra/releases/download/Ghidra_${GHIDRA_VERSION}_build/ghidra_${GHIDRA_VERSION}_PUBLIC.zip" \
|
RUN wget -q "https://github.com/NationalSecurityAgency/ghidra/releases/download/Ghidra_${GHIDRA_VERSION}_build/ghidra_${GHIDRA_VERSION}_PUBLIC_${GHIDRA_DATE}.zip" \
|
||||||
-O /tmp/ghidra.zip \
|
-O /tmp/ghidra.zip \
|
||||||
&& unzip -q /tmp/ghidra.zip -d /opt \
|
&& unzip -q /tmp/ghidra.zip -d /opt \
|
||||||
&& mv /opt/ghidra_${GHIDRA_VERSION}_PUBLIC /opt/ghidra \
|
&& mv /opt/ghidra_${GHIDRA_VERSION}_PUBLIC /opt/ghidra \
|
||||||
@@ -27,7 +27,7 @@ RUN wget -q "https://github.com/NationalSecurityAgency/ghidra/releases/download/
|
|||||||
|
|
||||||
WORKDIR /build/reva
|
WORKDIR /build/reva
|
||||||
|
|
||||||
RUN ./gradlew buildExtension -x test || true
|
RUN gradle buildExtension -x test || true
|
||||||
|
|
||||||
FROM eclipse-temurin:21-jre-jammy
|
FROM eclipse-temurin:21-jre-jammy
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
RUN echo '#!/bin/sh' > /entrypoint.sh && \
|
||||||
COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
|
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
|
ENTRYPOINT ["/entrypoint.sh"]
|
||||||
|
|
||||||
# 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"]
|
|
||||||
|
|||||||
178
docs/audit/2026-02-20/01-dockerfile-security.md
Normal file
178
docs/audit/2026-02-20/01-dockerfile-security.md
Normal file
@@ -0,0 +1,178 @@
|
|||||||
|
# Dockerfile Security Audit
|
||||||
|
|
||||||
|
**Date:** 2026-02-20
|
||||||
|
**Auditor:** External Security Review
|
||||||
|
**Scope:** All Dockerfiles in `dockerfiles/` directory
|
||||||
|
|
||||||
|
## Executive Summary
|
||||||
|
|
||||||
|
| Metric | Value |
|
||||||
|
|--------|-------|
|
||||||
|
| Total Dockerfiles Analyzed | 40 |
|
||||||
|
| High Severity Issues | 38 |
|
||||||
|
| Medium Severity Issues | 33 |
|
||||||
|
| Low Severity Issues | 2 |
|
||||||
|
|
||||||
|
## Detailed Findings
|
||||||
|
|
||||||
|
### 1. Running as Root User (HIGH)
|
||||||
|
|
||||||
|
**Severity:** HIGH
|
||||||
|
**Affected:** 38 of 40 Dockerfiles (95%)
|
||||||
|
**CWE:** CWE-250 (Execution with Unnecessary Privileges)
|
||||||
|
|
||||||
|
#### Description
|
||||||
|
The vast majority of Dockerfiles do not include a `USER` directive, meaning containers run as root by default. If a container is compromised, an attacker gains root-level access within the container namespace.
|
||||||
|
|
||||||
|
#### Affected Files
|
||||||
|
All except:
|
||||||
|
- `dockerfiles/reverse-engineering-assistant/Dockerfile` (creates non-root user)
|
||||||
|
- `dockerfiles/postizz-mcp/Dockerfile` (includes USER directive)
|
||||||
|
|
||||||
|
#### Recommendation
|
||||||
|
Add non-root user creation and USER directive to all Dockerfiles:
|
||||||
|
|
||||||
|
```dockerfile
|
||||||
|
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
|
||||||
|
USER appuser
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Risk Assessment
|
||||||
|
- **Likelihood:** Medium - depends on container escape or service vulnerability
|
||||||
|
- **Impact:** High - root access enables privilege escalation
|
||||||
|
- **Overall:** HIGH
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 2. Missing Multi-Stage Builds (MEDIUM)
|
||||||
|
|
||||||
|
**Severity:** MEDIUM
|
||||||
|
**Affected:** 32 of 40 Dockerfiles (80%)
|
||||||
|
**CWE:** CWE-1026 (Excessive Use of Unmodified Software Components)
|
||||||
|
|
||||||
|
#### Description
|
||||||
|
Most Dockerfiles use single-stage builds, including build tools and dependencies in the final image. This increases:
|
||||||
|
- Attack surface (more packages = more potential vulnerabilities)
|
||||||
|
- Image size
|
||||||
|
- Build time
|
||||||
|
|
||||||
|
#### Files Using Multi-Stage Builds (Good)
|
||||||
|
- `dockerfiles/kicad-mcp/Dockerfile`
|
||||||
|
- `dockerfiles/reverse-engineering-assistant/Dockerfile`
|
||||||
|
- `dockerfiles/mongo-mcp/Dockerfile`
|
||||||
|
- `dockerfiles/inspec-mcp/Dockerfile`
|
||||||
|
- `dockerfiles/postgres-mcp/Dockerfile`
|
||||||
|
- `dockerfiles/ssh-mcp/Dockerfile`
|
||||||
|
- `dockerfiles/steam-mcp/Dockerfile`
|
||||||
|
- `dockerfiles/bruno-mcp/Dockerfile`
|
||||||
|
|
||||||
|
#### Recommendation
|
||||||
|
Convert to multi-stage builds:
|
||||||
|
|
||||||
|
```dockerfile
|
||||||
|
# Build stage
|
||||||
|
FROM golang:1.23-alpine AS builder
|
||||||
|
WORKDIR /app
|
||||||
|
COPY . .
|
||||||
|
RUN go build -o myapp
|
||||||
|
|
||||||
|
# Runtime stage
|
||||||
|
FROM alpine:3.20
|
||||||
|
COPY --from=builder /app/myapp /usr/local/bin/
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3. Missing --no-install-recommends (LOW)
|
||||||
|
|
||||||
|
**Severity:** LOW
|
||||||
|
**Affected:** 2 Dockerfiles
|
||||||
|
|
||||||
|
#### Description
|
||||||
|
Some apt-get commands do not use `--no-install-recommends`, installing unnecessary recommended packages.
|
||||||
|
|
||||||
|
#### Affected Files
|
||||||
|
- `dockerfiles/reverse-engineering-assistant/Dockerfile:11`
|
||||||
|
- `dockerfiles/inspec-mcp/Dockerfile:8`
|
||||||
|
|
||||||
|
#### Recommendation
|
||||||
|
Add `--no-install-recommends` flag and clean up apt cache:
|
||||||
|
|
||||||
|
```dockerfile
|
||||||
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
|
package-name \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 4. Build-Time Secrets in postizz-mcp (MEDIUM)
|
||||||
|
|
||||||
|
**Severity:** MEDIUM
|
||||||
|
**Affected:** `dockerfiles/postizz-mcp/Dockerfile`
|
||||||
|
**CWE:** CWE-525 (Use of Web Browser Cache)
|
||||||
|
|
||||||
|
#### Description
|
||||||
|
The postizz-mcp Dockerfile uses build arguments for API keys:
|
||||||
|
|
||||||
|
```dockerfile
|
||||||
|
# Line 36
|
||||||
|
ARG POSTIZ_WEB_URL=${POSTIZ_WEB_URL}
|
||||||
|
|
||||||
|
# Line 42
|
||||||
|
ENV PORT=${PORT}
|
||||||
|
```
|
||||||
|
|
||||||
|
Build arguments can leak secrets into image layers. If an attacker gains access to the image, they can extract these values using `docker history`.
|
||||||
|
|
||||||
|
#### Recommendation
|
||||||
|
- Pass secrets at runtime via environment variables
|
||||||
|
- Never use ARG for sensitive values
|
||||||
|
- Use Docker BuildKit secrets feature if build-time secrets are required:
|
||||||
|
|
||||||
|
```dockerfile
|
||||||
|
# syntax=docker/dockerfile:1.2
|
||||||
|
RUN --mount=type=secret,id=postiz_token \
|
||||||
|
export POSTIZ_TOKEN=$(cat /run/secrets/postiz_token) && \
|
||||||
|
./configure --token=$POSTIZ_TOKEN
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Base Image Analysis
|
||||||
|
|
||||||
|
### Images Used
|
||||||
|
|
||||||
|
| Base Image | Count | Security Status |
|
||||||
|
|------------|-------|-----------------|
|
||||||
|
| alpine:3.20 | 1 | Clean (0 HIGH/CRITICAL) |
|
||||||
|
| python:3.12-slim | 12 | 2 HIGH (glibc CVE-2026-0861) |
|
||||||
|
| node:22-slim | 5 | 3 HIGH/CRITICAL + 14 Node HIGH |
|
||||||
|
| debian:bookworm-slim | 2 | 3 HIGH/CRITICAL |
|
||||||
|
| golang:1.23-alpine | 4 | 6 HIGH/CRITICAL (OpenSSL) |
|
||||||
|
|
||||||
|
### Recommendations
|
||||||
|
1. Pin base images to specific digests for reproducibility
|
||||||
|
2. Consider Alpine-based images where possible (smaller attack surface)
|
||||||
|
3. Implement automated base image scanning in CI/CD pipeline
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Positive Findings
|
||||||
|
|
||||||
|
1. **No hardcoded credentials** in any Dockerfile
|
||||||
|
2. **Good use of COPY over ADD** (no automatic extraction issues)
|
||||||
|
3. **Proper WORKDIR usage** (avoids root directory operations)
|
||||||
|
4. **Some multi-stage builds** implemented correctly
|
||||||
|
5. **Reasonable base image selection** (official images)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Remediation Priority
|
||||||
|
|
||||||
|
| Priority | Finding | Effort | Impact |
|
||||||
|
|----------|---------|--------|--------|
|
||||||
|
| 1 | Add USER directive to all Dockerfiles | Low | High |
|
||||||
|
| 2 | Implement multi-stage builds | Medium | Medium |
|
||||||
|
| 3 | Remove build-time secrets | Low | Medium |
|
||||||
|
| 4 | Add --no-install-recommends | Low | Low |
|
||||||
230
docs/audit/2026-02-20/02-shell-script-security.md
Normal file
230
docs/audit/2026-02-20/02-shell-script-security.md
Normal file
@@ -0,0 +1,230 @@
|
|||||||
|
# Shell Script Security Audit
|
||||||
|
|
||||||
|
**Date:** 2026-02-20
|
||||||
|
**Auditor:** External Security Review
|
||||||
|
**Scope:** All shell scripts in project root and `scripts/` directory
|
||||||
|
|
||||||
|
## Executive Summary
|
||||||
|
|
||||||
|
| Metric | Value |
|
||||||
|
|--------|-------|
|
||||||
|
| Total Scripts Analyzed | 45+ |
|
||||||
|
| Scripts Missing `set -e` | 38 |
|
||||||
|
| Scripts Missing `set -u` | 45 (all) |
|
||||||
|
| Scripts with Unquoted Variables | 4 |
|
||||||
|
|
||||||
|
## Detailed Findings
|
||||||
|
|
||||||
|
### 1. Missing Error Handling (HIGH)
|
||||||
|
|
||||||
|
**Severity:** HIGH
|
||||||
|
**Affected:** 38 of 45 scripts (84%)
|
||||||
|
**CWE:** CWE-252 (Unchecked Return Value)
|
||||||
|
|
||||||
|
#### Description
|
||||||
|
Most shell scripts lack `set -e` which causes scripts to continue executing even when commands fail. This can lead to:
|
||||||
|
- Silent failures going undetected
|
||||||
|
- Partial/incomplete operations
|
||||||
|
- Security bypasses if validation commands fail
|
||||||
|
|
||||||
|
#### Pattern Found
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
# Script continues even if commands fail
|
||||||
|
docker build ... # If this fails, script continues
|
||||||
|
echo "Build complete" # Misleading success message
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Correct Pattern
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
set -euo pipefail
|
||||||
|
# Script exits immediately on any error
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Affected Script Categories
|
||||||
|
- **Wrapper scripts** (mcp-*-wrapper.sh): 34 scripts
|
||||||
|
- **LSP wrapper scripts** (lsp-*-wrapper.sh): Multiple
|
||||||
|
- **Build scripts** (scripts/BuildAll.sh): 1 script
|
||||||
|
|
||||||
|
#### Recommendation
|
||||||
|
Add to all scripts:
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
set -euo pipefail
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 2. Missing Undefined Variable Protection (HIGH)
|
||||||
|
|
||||||
|
**Severity:** HIGH
|
||||||
|
**Affected:** 45 of 45 scripts (100%)
|
||||||
|
**CWE:** CWE-456 (Missing Initialization of a Variable)
|
||||||
|
|
||||||
|
#### Description
|
||||||
|
No scripts use `set -u` which prevents the use of undefined variables. This can cause:
|
||||||
|
- Commands to execute with empty values
|
||||||
|
- Unexpected behavior with missing environment variables
|
||||||
|
- Potential security issues if variables like paths are empty
|
||||||
|
|
||||||
|
#### Example Risk
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
# If API_KEY is not set, this becomes: curl -H "Authorization: Bearer "
|
||||||
|
curl -H "Authorization: Bearer $API_KEY" https://api.example.com
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Recommendation
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
set -u # Exit on undefined variable
|
||||||
|
|
||||||
|
# Or provide defaults:
|
||||||
|
API_KEY="${API_KEY:-}" # Empty default
|
||||||
|
API_KEY="${API_KEY:-default_value}" # Non-empty default
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3. Unquoted Variables (MEDIUM)
|
||||||
|
|
||||||
|
**Severity:** MEDIUM
|
||||||
|
**Affected:** 4 scripts
|
||||||
|
**CWE:** CWE-77 (Command Injection)
|
||||||
|
|
||||||
|
#### Description
|
||||||
|
Some scripts use unquoted variables which can lead to:
|
||||||
|
- Word splitting on spaces
|
||||||
|
- Glob expansion
|
||||||
|
- Potential command injection
|
||||||
|
|
||||||
|
#### Affected Files
|
||||||
|
Found in various wrapper scripts where environment variables are passed through.
|
||||||
|
|
||||||
|
#### Pattern to Avoid
|
||||||
|
```bash
|
||||||
|
# Dangerous - unquoted
|
||||||
|
docker run $CONTAINER_NAME
|
||||||
|
|
||||||
|
# Safe - quoted
|
||||||
|
docker run "$CONTAINER_NAME"
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Recommendation
|
||||||
|
Always quote variable expansions:
|
||||||
|
```bash
|
||||||
|
docker run "${CONTAINER_NAME}"
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 4. No Input Validation (MEDIUM)
|
||||||
|
|
||||||
|
**Severity:** MEDIUM
|
||||||
|
**Affected:** All wrapper scripts
|
||||||
|
**CWE:** CWE-20 (Improper Input Validation)
|
||||||
|
|
||||||
|
#### Description
|
||||||
|
Wrapper scripts pass environment variables directly to Docker commands without validation.
|
||||||
|
|
||||||
|
#### Example
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
docker run --rm -i \
|
||||||
|
-e PROXMOX_HOST="${PROXMOX_HOST}" \
|
||||||
|
-e PROXMOX_USER="${PROXMOX_USER}" \
|
||||||
|
kneldevstack-aimiddleware-proxmox-mcp
|
||||||
|
```
|
||||||
|
|
||||||
|
No validation that:
|
||||||
|
- Variables are set
|
||||||
|
- Values are in expected format
|
||||||
|
- Values don't contain injection characters
|
||||||
|
|
||||||
|
#### Recommendation
|
||||||
|
Add validation for critical variables:
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
: "${REQUIRED_VAR:?REQUIRED_VAR must be set}"
|
||||||
|
|
||||||
|
# Optional validation
|
||||||
|
if [[ ! "$URL" =~ ^https?:// ]]; then
|
||||||
|
echo "Invalid URL format" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Script Categories
|
||||||
|
|
||||||
|
### MCP Wrapper Scripts (34 files)
|
||||||
|
- Pattern: `mcp-*-wrapper.sh`
|
||||||
|
- Purpose: Launch MCP server containers with environment configuration
|
||||||
|
- Risk: Medium - primarily pass-through scripts
|
||||||
|
|
||||||
|
### LSP Wrapper Scripts (5+ files)
|
||||||
|
- Pattern: `lsp-*-wrapper.sh`
|
||||||
|
- Purpose: Launch LSP server containers
|
||||||
|
- Risk: Low - typically no sensitive data
|
||||||
|
|
||||||
|
### Build/Utility Scripts (scripts/)
|
||||||
|
- `BuildAll.sh` - Build automation
|
||||||
|
- `validate-all.sh` - Validation testing
|
||||||
|
- Risk: Low - development utilities
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Positive Findings
|
||||||
|
|
||||||
|
1. **No command substitution injection** - Variables passed as arguments, not evaluated
|
||||||
|
2. **Consistent naming convention** - Easy to identify script purpose
|
||||||
|
3. **Simple pass-through design** - Limited attack surface
|
||||||
|
4. **No hardcoded secrets** - All credentials from environment
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Remediation Priority
|
||||||
|
|
||||||
|
| Priority | Finding | Effort | Impact |
|
||||||
|
|----------|---------|--------|--------|
|
||||||
|
| 1 | Add `set -euo pipefail` to all scripts | Low | High |
|
||||||
|
| 2 | Quote all variable expansions | Low | Medium |
|
||||||
|
| 3 | Add input validation for critical vars | Medium | Medium |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Example Secure Script Template
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
# MCP Server Wrapper for: service-name
|
||||||
|
# Generated secure template
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# Required variables with validation
|
||||||
|
: "${API_URL:?API_URL must be set}"
|
||||||
|
: "${API_KEY:?API_KEY must be set}"
|
||||||
|
|
||||||
|
# Optional variables with defaults
|
||||||
|
TIMEOUT="${TIMEOUT:-30}"
|
||||||
|
DEBUG="${DEBUG:-false}"
|
||||||
|
|
||||||
|
# Input validation
|
||||||
|
if [[ ! "$API_URL" =~ ^https?:// ]]; then
|
||||||
|
echo "ERROR: API_URL must be a valid HTTP/HTTPS URL" >&2
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Execute
|
||||||
|
exec docker run --rm -i \
|
||||||
|
-e API_URL="${API_URL}" \
|
||||||
|
-e API_KEY="${API_KEY}" \
|
||||||
|
-e TIMEOUT="${TIMEOUT}" \
|
||||||
|
-e DEBUG="${DEBUG}" \
|
||||||
|
kneldevstack-aimiddleware-service-name
|
||||||
|
```
|
||||||
246
docs/audit/2026-02-20/03-docker-compose-security.md
Normal file
246
docs/audit/2026-02-20/03-docker-compose-security.md
Normal file
@@ -0,0 +1,246 @@
|
|||||||
|
# Docker Compose Security Audit
|
||||||
|
|
||||||
|
**Date:** 2026-02-20
|
||||||
|
**Auditor:** External Security Review
|
||||||
|
**Scope:** `docker-compose.yml` and container orchestration
|
||||||
|
|
||||||
|
## Executive Summary
|
||||||
|
|
||||||
|
| Metric | Value |
|
||||||
|
|--------|-------|
|
||||||
|
| Total Services | 40+ |
|
||||||
|
| High Severity Issues | 3 |
|
||||||
|
| Medium Severity Issues | 1 |
|
||||||
|
| Low Severity Issues | 1 |
|
||||||
|
|
||||||
|
## Detailed Findings
|
||||||
|
|
||||||
|
### 1. Docker Socket Mount (HIGH)
|
||||||
|
|
||||||
|
**Severity:** HIGH
|
||||||
|
**Affected Services:** `docker-mcp`, `mcp-ansible`
|
||||||
|
**CWE:** CWE-250 (Execution with Unnecessary Privileges)
|
||||||
|
|
||||||
|
#### Description
|
||||||
|
Two services mount the Docker socket, granting full Docker daemon access:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# docker-mcp
|
||||||
|
volumes:
|
||||||
|
- /var/run/docker.sock:/var/run/docker.sock
|
||||||
|
|
||||||
|
# mcp-ansible
|
||||||
|
volumes:
|
||||||
|
- /var/run/docker.sock:/var/run/docker.sock
|
||||||
|
```
|
||||||
|
|
||||||
|
This provides equivalent access to root on the host system.
|
||||||
|
|
||||||
|
#### Impact
|
||||||
|
- Full control over all containers on host
|
||||||
|
- Ability to mount host filesystem
|
||||||
|
- Potential for container escape
|
||||||
|
- Access to secrets in other containers
|
||||||
|
|
||||||
|
#### Risk Assessment
|
||||||
|
- **Necessary for Function:** Yes - these services manage Docker/containers
|
||||||
|
- **Mitigation Required:** Yes
|
||||||
|
|
||||||
|
#### Recommendation
|
||||||
|
1. Run these services with explicit user constraints where possible
|
||||||
|
2. Document the privilege requirement clearly
|
||||||
|
3. Consider socket proxy (docker-socket-proxy) for least privilege
|
||||||
|
4. Isolate on dedicated management nodes in production
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Alternative with socket proxy
|
||||||
|
services:
|
||||||
|
docker-mcp:
|
||||||
|
environment:
|
||||||
|
- DOCKER_HOST=tcp://docker-proxy:2375
|
||||||
|
depends_on:
|
||||||
|
- docker-proxy
|
||||||
|
|
||||||
|
docker-proxy:
|
||||||
|
image: tecnativa/docker-socket-proxy
|
||||||
|
volumes:
|
||||||
|
- /var/run/docker.sock:/var/run/docker.sock
|
||||||
|
environment:
|
||||||
|
- CONTAINERS=1
|
||||||
|
- IMAGES=1
|
||||||
|
# Only allow specific operations
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 2. Kubernetes Config Mount (HIGH)
|
||||||
|
|
||||||
|
**Severity:** HIGH
|
||||||
|
**Affected Service:** `kubernetes-mcp`
|
||||||
|
**CWE:** CWE-250 (Execution with Unnecessary Privileges)
|
||||||
|
|
||||||
|
#### Description
|
||||||
|
The kubernetes-mcp service mounts kubeconfig:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
volumes:
|
||||||
|
- ~/.kube/config:/home/appuser/.kube/config:ro
|
||||||
|
```
|
||||||
|
|
||||||
|
This grants Kubernetes cluster admin access to the container.
|
||||||
|
|
||||||
|
#### Impact
|
||||||
|
- Full control over Kubernetes cluster
|
||||||
|
- Access to all secrets in cluster
|
||||||
|
- Ability to deploy privileged workloads
|
||||||
|
- Cluster admin equivalent access
|
||||||
|
|
||||||
|
#### Risk Assessment
|
||||||
|
- **Necessary for Function:** Yes - required for Kubernetes management
|
||||||
|
- **Mitigation Required:** Yes
|
||||||
|
|
||||||
|
#### Recommendation
|
||||||
|
1. Use read-only mount (`:ro` flag) - already implemented
|
||||||
|
2. Consider ServiceAccount tokens instead of kubeconfig
|
||||||
|
3. Implement RBAC with minimal required permissions
|
||||||
|
4. Document required permissions clearly
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3. Privileged Access Pattern (MEDIUM)
|
||||||
|
|
||||||
|
**Severity:** MEDIUM
|
||||||
|
**Affected:** Multiple services requiring system access
|
||||||
|
**CWE:** CWE-269 (Improper Privilege Management)
|
||||||
|
|
||||||
|
#### Description
|
||||||
|
Several services require elevated privileges for their function:
|
||||||
|
|
||||||
|
| Service | Privilege Type | Justification |
|
||||||
|
|---------|---------------|---------------|
|
||||||
|
| docker-mcp | Docker socket | Container management |
|
||||||
|
| mcp-ansible | Docker socket | Container orchestration |
|
||||||
|
| kubernetes-mcp | kubeconfig | Cluster management |
|
||||||
|
| ssh-mcp | SSH keys | Remote server access |
|
||||||
|
|
||||||
|
#### Recommendation
|
||||||
|
Document each privileged service with:
|
||||||
|
- Required access level
|
||||||
|
- Business justification
|
||||||
|
- Mitigating controls
|
||||||
|
- Audit logging requirements
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 4. Default Credential Pattern (LOW)
|
||||||
|
|
||||||
|
**Severity:** LOW
|
||||||
|
**Affected Service:** `ghost-mcp`
|
||||||
|
**CWE:** CWE-1188 (Initialization with Hard-Coded Network Resource Configuration)
|
||||||
|
|
||||||
|
#### Description
|
||||||
|
Ghost MCP service shows a placeholder credential pattern:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Line 224
|
||||||
|
environment:
|
||||||
|
- GHOST_API_KEY=${GHOST_API_KEY:-your-api-key-here}
|
||||||
|
```
|
||||||
|
|
||||||
|
While this is a placeholder (not a real credential), it establishes a pattern that could lead to:
|
||||||
|
- Developers committing real credentials
|
||||||
|
- Default credentials being used in development
|
||||||
|
|
||||||
|
#### Recommendation
|
||||||
|
- Remove default values entirely
|
||||||
|
- Fail fast if required variables not set
|
||||||
|
- Use `${VAR:?VAR must be set}` pattern
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
environment:
|
||||||
|
- GHOST_API_KEY=${GHOST_API_KEY:?GHOST_API_KEY must be set}
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Network Security Analysis
|
||||||
|
|
||||||
|
### Network Configuration
|
||||||
|
All services use default Docker networking (bridge). No custom networks defined.
|
||||||
|
|
||||||
|
#### Recommendations
|
||||||
|
1. Create isolated networks for service groups:
|
||||||
|
```yaml
|
||||||
|
networks:
|
||||||
|
mcp-servers:
|
||||||
|
driver: bridge
|
||||||
|
lsp-servers:
|
||||||
|
driver: bridge
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Limit inter-service communication where not required
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Resource Limits
|
||||||
|
|
||||||
|
### Current State
|
||||||
|
No resource limits defined for any service.
|
||||||
|
|
||||||
|
#### Risk
|
||||||
|
- Resource exhaustion (memory/CPU)
|
||||||
|
- Noisy neighbor problems
|
||||||
|
- Potential denial of service
|
||||||
|
|
||||||
|
#### Recommendation
|
||||||
|
Add resource constraints:
|
||||||
|
```yaml
|
||||||
|
deploy:
|
||||||
|
resources:
|
||||||
|
limits:
|
||||||
|
cpus: '0.5'
|
||||||
|
memory: 512M
|
||||||
|
reservations:
|
||||||
|
memory: 256M
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Health Checks
|
||||||
|
|
||||||
|
### Current State
|
||||||
|
No health checks defined.
|
||||||
|
|
||||||
|
#### Recommendation
|
||||||
|
Add health checks for monitoring:
|
||||||
|
```yaml
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
|
||||||
|
interval: 30s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 3
|
||||||
|
start_period: 40s
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Positive Findings
|
||||||
|
|
||||||
|
1. **No host network mode** - Services use bridge networking
|
||||||
|
2. **No privileged mode** - No containers run with `privileged: true`
|
||||||
|
3. **Environment variables externalized** - Using `.env` file pattern
|
||||||
|
4. **Read-only mounts where appropriate** - kubeconfig mounted read-only
|
||||||
|
5. **Consistent container naming** - `kneldevstack-aimiddleware-` prefix
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Remediation Priority
|
||||||
|
|
||||||
|
| Priority | Finding | Effort | Impact |
|
||||||
|
|----------|---------|--------|--------|
|
||||||
|
| 1 | Document privileged services | Low | High |
|
||||||
|
| 2 | Add resource limits | Low | Medium |
|
||||||
|
| 3 | Implement socket proxy for Docker access | Medium | High |
|
||||||
|
| 4 | Remove default credential patterns | Low | Low |
|
||||||
|
| 5 | Add health checks | Medium | Medium |
|
||||||
|
| 6 | Create network segmentation | Medium | Medium |
|
||||||
239
docs/audit/2026-02-20/04-secrets-audit.md
Normal file
239
docs/audit/2026-02-20/04-secrets-audit.md
Normal file
@@ -0,0 +1,239 @@
|
|||||||
|
# Secrets & Credentials Audit
|
||||||
|
|
||||||
|
**Date:** 2026-02-20
|
||||||
|
**Auditor:** External Security Review
|
||||||
|
**Scope:** All project files for credential exposure
|
||||||
|
|
||||||
|
## Executive Summary
|
||||||
|
|
||||||
|
| Metric | Value |
|
||||||
|
|--------|-------|
|
||||||
|
| Hardcoded Secrets Found | 0 |
|
||||||
|
| Credential Files Exposed | 0 |
|
||||||
|
| Secret Patterns in Code | 0 |
|
||||||
|
| Gitignored Secret Files | Yes (.env, vendor/) |
|
||||||
|
|
||||||
|
**Overall Assessment: PASS** - Project follows good secret management practices.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Detailed Analysis
|
||||||
|
|
||||||
|
### 1. Gitignore Configuration
|
||||||
|
|
||||||
|
**Status:** COMPLIANT
|
||||||
|
|
||||||
|
The `.gitignore` file properly excludes sensitive files:
|
||||||
|
|
||||||
|
```
|
||||||
|
# Environment variables
|
||||||
|
.env
|
||||||
|
|
||||||
|
# Vendor/cloned repositories
|
||||||
|
vendor/
|
||||||
|
|
||||||
|
# IDE files
|
||||||
|
.idea/
|
||||||
|
*.swp
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Verification
|
||||||
|
- `.env` is gitignored - actual credentials not committed
|
||||||
|
- `vendor/` is gitignored - cloned repos with potential secrets not tracked
|
||||||
|
- No sensitive files found in git history (based on file analysis)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 2. Environment Variable Template
|
||||||
|
|
||||||
|
**File:** `.env.example`
|
||||||
|
**Status:** COMPLIANT
|
||||||
|
|
||||||
|
The `.env.example` file uses placeholder values only:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Example placeholders (not real credentials)
|
||||||
|
PROXMOX_HOST=https://your-proxmox-host:8006
|
||||||
|
PROXMOX_USER=root@pam
|
||||||
|
PROXMOX_TOKEN_NAME=your-token-name
|
||||||
|
PROXMOX_TOKEN_SECRET=your-token-secret
|
||||||
|
```
|
||||||
|
|
||||||
|
No actual credentials present.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3. Credential Flow Analysis
|
||||||
|
|
||||||
|
#### Pattern Identified
|
||||||
|
```
|
||||||
|
.env file (gitignored)
|
||||||
|
↓
|
||||||
|
Environment Variables
|
||||||
|
↓
|
||||||
|
Wrapper Scripts (mcp-*-wrapper.sh)
|
||||||
|
↓
|
||||||
|
Docker Containers
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Wrapper Script Pattern
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
docker run --rm -i \
|
||||||
|
-e PROXMOX_HOST="${PROXMOX_HOST}" \
|
||||||
|
-e PROXMOX_USER="${PROXMOX_USER}" \
|
||||||
|
-e PROXMOX_TOKEN_SECRET="${PROXMOX_TOKEN_SECRET}" \
|
||||||
|
kneldevstack-aimiddleware-proxmox-mcp
|
||||||
|
```
|
||||||
|
|
||||||
|
**Assessment:** Secure - credentials passed at runtime, not hardcoded.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 4. Dockerfile Secret Analysis
|
||||||
|
|
||||||
|
#### ENV Directives Review
|
||||||
|
All ENV directives in Dockerfiles were analyzed:
|
||||||
|
|
||||||
|
| Dockerfile | ENV Variables | Assessment |
|
||||||
|
|------------|---------------|------------|
|
||||||
|
| proxmox-mcp | PYTHONUNBUFFERED=1 | Safe - not a secret |
|
||||||
|
| bitwarden-mcp | NODE_ENV=production | Safe - not a secret |
|
||||||
|
| paperless-mcp | PAPERLESS_URL="" | Safe - URL only |
|
||||||
|
| penpot-mcp | PENPOT_URL=${PENPOT_URL:-default} | Safe - URL only |
|
||||||
|
| postizz-mcp | PORT=${PORT} | Safe - port number |
|
||||||
|
|
||||||
|
**No secrets found in ENV directives.**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 5. Potential Secret Patterns Searched
|
||||||
|
|
||||||
|
| Pattern | Files Found | Assessment |
|
||||||
|
|---------|-------------|------------|
|
||||||
|
| API_KEY=... | 0 | None in codebase |
|
||||||
|
| PASSWORD=... | 0 | None in codebase |
|
||||||
|
| SECRET=... | 0 | None in codebase |
|
||||||
|
| TOKEN=... | 0 | None in codebase |
|
||||||
|
| AWS_ACCESS_KEY | 0 | None in codebase |
|
||||||
|
| PRIVATE_KEY | 0 | None in codebase |
|
||||||
|
| -----BEGIN.*KEY----- | 0 | None in codebase |
|
||||||
|
| Bearer [A-Za-z0-9]{20,} | 0 | None in codebase |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 6. Test Script Credentials
|
||||||
|
|
||||||
|
**File:** `scripts/validate-all.sh`
|
||||||
|
|
||||||
|
Contains test credentials for validation:
|
||||||
|
```bash
|
||||||
|
# Test credentials for validation purposes only
|
||||||
|
TEST_USER="testuser"
|
||||||
|
TEST_PASS="testpass123"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Assessment:** ACCEPTABLE - clearly test credentials for validation, not production.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 7. Build-Time Secret Exposure
|
||||||
|
|
||||||
|
**File:** `dockerfiles/postizz-mcp/Dockerfile`
|
||||||
|
|
||||||
|
#### Issue Identified
|
||||||
|
Build arguments potentially expose configuration:
|
||||||
|
|
||||||
|
```dockerfile
|
||||||
|
ARG POSTIZ_WEB_URL=${POSTIZ_WEB_URL}
|
||||||
|
ENV PORT=${PORT}
|
||||||
|
```
|
||||||
|
|
||||||
|
#### Risk Assessment
|
||||||
|
- **URL exposure:** Low risk (not a secret)
|
||||||
|
- **PORT exposure:** Minimal risk (non-sensitive)
|
||||||
|
- **No API keys in build args:** Confirmed
|
||||||
|
|
||||||
|
**Note:** While not currently a security issue, this pattern could lead to secrets being embedded if future changes add API keys as build arguments.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Credential Categories
|
||||||
|
|
||||||
|
### Services Requiring Credentials
|
||||||
|
|
||||||
|
| Service | Credential Type | Storage |
|
||||||
|
|---------|-----------------|---------|
|
||||||
|
| proxmox-mcp | API Token | .env file |
|
||||||
|
| docker-mcp | Docker Socket | Mount |
|
||||||
|
| kubernetes-mcp | kubeconfig | File mount |
|
||||||
|
| ssh-mcp | SSH Private Key | File mount |
|
||||||
|
| bitwarden-mcp | Access Token | .env file |
|
||||||
|
| ghost-mcp | API Key | .env file |
|
||||||
|
| elasticsearch-mcp | Basic Auth | .env file |
|
||||||
|
| nextcloud-mcp | App Password | .env file |
|
||||||
|
|
||||||
|
### Services Without Credentials
|
||||||
|
Most MCP servers operate without requiring credentials or accept configuration at runtime.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Recommendations
|
||||||
|
|
||||||
|
### 1. Add Secret Scanning to CI/CD (MEDIUM PRIORITY)
|
||||||
|
|
||||||
|
Implement automated secret detection:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# GitHub Actions example
|
||||||
|
- name: Secret Scan
|
||||||
|
uses: trufflesecurity/trufflehog@main
|
||||||
|
with:
|
||||||
|
path: ./
|
||||||
|
base: ${{ github.event.repository.default_branch }}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 2. Document Required Secrets (LOW PRIORITY)
|
||||||
|
|
||||||
|
Create documentation listing required credentials per service:
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
## proxmox-mcp
|
||||||
|
- PROXMOX_HOST (required)
|
||||||
|
- PROXMOX_USER (required)
|
||||||
|
- PROXMOX_TOKEN_NAME (required)
|
||||||
|
- PROXMOX_TOKEN_SECRET (required, secret)
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. Consider Secrets Management (FUTURE)
|
||||||
|
|
||||||
|
For production deployment, consider:
|
||||||
|
- HashiCorp Vault
|
||||||
|
- AWS Secrets Manager
|
||||||
|
- Docker Secrets
|
||||||
|
- Kubernetes Secrets
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Positive Findings Summary
|
||||||
|
|
||||||
|
1. **No hardcoded secrets** in any tracked file
|
||||||
|
2. **Proper .gitignore** excludes .env and vendor/
|
||||||
|
3. **Placeholder-only .env.example** - no real credentials
|
||||||
|
4. **Runtime credential injection** - not in images
|
||||||
|
5. **No secrets in git history** based on file analysis
|
||||||
|
6. **Consistent secure patterns** across wrapper scripts
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Compliance Check
|
||||||
|
|
||||||
|
| Requirement | Status | Notes |
|
||||||
|
|-------------|--------|-------|
|
||||||
|
| No hardcoded secrets | PASS | Full codebase scanned |
|
||||||
|
| Secrets not in git | PASS | .env gitignored |
|
||||||
|
| No secrets in Docker images | PASS | Runtime injection only |
|
||||||
|
| Placeholder examples only | PASS | .env.example clean |
|
||||||
|
| No secrets in logs | N/A | No logging review performed |
|
||||||
|
|
||||||
|
**Overall Secrets Audit: PASS**
|
||||||
233
docs/audit/2026-02-20/05-vulnerability-scan.md
Normal file
233
docs/audit/2026-02-20/05-vulnerability-scan.md
Normal file
@@ -0,0 +1,233 @@
|
|||||||
|
# Base Image Vulnerability Scan
|
||||||
|
|
||||||
|
**Date:** 2026-02-20
|
||||||
|
**Auditor:** External Security Review
|
||||||
|
**Tool:** Aqua Trivy (latest)
|
||||||
|
**Scope:** Base images used in project Dockerfiles
|
||||||
|
|
||||||
|
## Executive Summary
|
||||||
|
|
||||||
|
| Base Image | HIGH | CRITICAL | Total | Status |
|
||||||
|
|------------|------|----------|-------|--------|
|
||||||
|
| alpine:3.20 | 0 | 0 | 0 | CLEAN |
|
||||||
|
| python:3.12-slim | 2 | 0 | 2 | ACTION REQUIRED |
|
||||||
|
| node:22-slim | 2 | 1 | 3+ | ACTION REQUIRED |
|
||||||
|
| debian:bookworm-slim | 2 | 1 | 3 | ACTION REQUIRED |
|
||||||
|
| golang:1.23-alpine | 4 | 2 | 6 | ACTION REQUIRED |
|
||||||
|
|
||||||
|
**Overall Risk Level:** MEDIUM
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Detailed Findings
|
||||||
|
|
||||||
|
### 1. alpine:3.20
|
||||||
|
|
||||||
|
**Status:** CLEAN
|
||||||
|
**Vulnerabilities:** 0 HIGH/CRITICAL
|
||||||
|
|
||||||
|
```
|
||||||
|
Report Summary
|
||||||
|
┌─────────────────────────────┬────────┬─────────────────┬─────────┐
|
||||||
|
│ Target │ Type │ Vulnerabilities │ Secrets │
|
||||||
|
├─────────────────────────────┼────────┼─────────────────┼─────────┤
|
||||||
|
│ alpine:3.20 (alpine 3.20.9) │ alpine │ 0 │ - │
|
||||||
|
└─────────────────────────────┴────────┴─────────────────┴─────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
**Recommendation:** Preferred base image for new containers.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 2. python:3.12-slim (debian 13.3)
|
||||||
|
|
||||||
|
**Status:** ACTION REQUIRED
|
||||||
|
**Vulnerabilities:** 2 HIGH, 0 CRITICAL
|
||||||
|
|
||||||
|
| Library | CVE | Severity | Status | Title |
|
||||||
|
|---------|-----|----------|--------|-------|
|
||||||
|
| libc-bin | CVE-2026-0861 | HIGH | affected | glibc: Integer overflow in memalign leads to heap corruption |
|
||||||
|
| libc6 | CVE-2026-0861 | HIGH | affected | glibc: Integer overflow in memalign leads to heap corruption |
|
||||||
|
|
||||||
|
**Analysis:**
|
||||||
|
- glibc vulnerability CVE-2026-0861 affects memory allocation
|
||||||
|
- No fix currently available from Debian
|
||||||
|
- Risk: Low for containerized workloads (no untrusted memory allocation)
|
||||||
|
|
||||||
|
**Recommendation:**
|
||||||
|
- Monitor for security updates
|
||||||
|
- Consider Alpine-based Python images if risk is unacceptable
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3. node:22-slim (debian 12.13)
|
||||||
|
|
||||||
|
**Status:** ACTION REQUIRED
|
||||||
|
**Vulnerabilities:** 2 HIGH, 1 CRITICAL (OS) + 14 HIGH (Node packages)
|
||||||
|
|
||||||
|
#### OS-Level Vulnerabilities
|
||||||
|
|
||||||
|
| Library | CVE | Severity | Status | Title |
|
||||||
|
|---------|-----|----------|--------|-------|
|
||||||
|
| libc-bin | CVE-2026-0861 | HIGH | affected | glibc integer overflow |
|
||||||
|
| libc6 | CVE-2026-0861 | HIGH | affected | glibc integer overflow |
|
||||||
|
| zlib1g | CVE-2023-45853 | CRITICAL | will_not_fix | zlib heap-based buffer overflow |
|
||||||
|
|
||||||
|
#### Node Package Vulnerabilities
|
||||||
|
|
||||||
|
| Package | CVE | Severity | Installed | Fixed | Issue |
|
||||||
|
|---------|-----|----------|-----------|-------|-------|
|
||||||
|
| glob | CVE-2025-64756 | HIGH | 10.4.5 | 11.1.0 | Command Injection via Malicious Filenames |
|
||||||
|
| minimatch | CVE-2026-26996 | HIGH | 9.0.5 | 10.2.1 | ReDoS via repeated wildcards |
|
||||||
|
| tar | CVE-2026-23745 | HIGH | 6.2.1, 7.4.3 | 7.5.3 | Arbitrary file overwrite and symlink poisoning |
|
||||||
|
| tar | CVE-2026-23950 | HIGH | 6.2.1, 7.4.3 | 7.5.4 | Arbitrary file overwrite via Unicode path collision |
|
||||||
|
| tar | CVE-2026-24842 | HIGH | 6.2.1, 7.4.3 | 7.5.7 | Arbitrary file creation via path traversal bypass |
|
||||||
|
| tar | CVE-2026-26960 | HIGH | 6.2.1, 7.4.3 | 7.5.8 | Multiple issues with default options |
|
||||||
|
|
||||||
|
**Analysis:**
|
||||||
|
- zlib CVE-2023-45853 marked "will_not_fix" - architectural limitation in Debian
|
||||||
|
- Node tar package has multiple critical file system vulnerabilities
|
||||||
|
- These are build-time dependencies, reducing runtime risk
|
||||||
|
|
||||||
|
**Recommendation:**
|
||||||
|
- **HIGH PRIORITY:** Update tar package to 7.5.8+
|
||||||
|
- **HIGH PRIORITY:** Update glob to 11.1.0+ or 10.5.0+
|
||||||
|
- Monitor for Debian zlib security advisory
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 4. debian:bookworm-slim (debian 12.13)
|
||||||
|
|
||||||
|
**Status:** ACTION REQUIRED
|
||||||
|
**Vulnerabilities:** 2 HIGH, 1 CRITICAL
|
||||||
|
|
||||||
|
| Library | CVE | Severity | Status | Title |
|
||||||
|
|---------|-----|----------|--------|-------|
|
||||||
|
| libc-bin | CVE-2026-0861 | HIGH | affected | glibc integer overflow |
|
||||||
|
| libc6 | CVE-2026-0861 | HIGH | affected | glibc integer overflow |
|
||||||
|
| zlib1g | CVE-2023-45853 | CRITICAL | will_not_fix | zlib heap-based buffer overflow |
|
||||||
|
|
||||||
|
**Analysis:**
|
||||||
|
- Same vulnerabilities as node:22-slim (same Debian base)
|
||||||
|
- zlib vulnerability won't be fixed in Debian 12
|
||||||
|
|
||||||
|
**Recommendation:**
|
||||||
|
- Consider migrating to Alpine or Debian 13
|
||||||
|
- Monitor security advisories
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 5. golang:1.23-alpine (alpine 3.22.1)
|
||||||
|
|
||||||
|
**Status:** ACTION REQUIRED
|
||||||
|
**Vulnerabilities:** 4 HIGH, 2 CRITICAL
|
||||||
|
|
||||||
|
| Library | CVE | Severity | Status | Fixed Version | Title |
|
||||||
|
|---------|-----|----------|--------|---------------|-------|
|
||||||
|
| libcrypto3 | CVE-2025-15467 | CRITICAL | fixed | 3.5.5-r0 | OpenSSL: Remote code execution or DoS |
|
||||||
|
| libssl3 | CVE-2025-15467 | CRITICAL | fixed | 3.5.5-r0 | OpenSSL: Remote code execution or DoS |
|
||||||
|
|
||||||
|
**Additional vulnerabilities:** 4 HIGH related to Go toolchain (affects build only)
|
||||||
|
|
||||||
|
**Analysis:**
|
||||||
|
- OpenSSL CVE-2025-15467 is CRITICAL with RCE potential
|
||||||
|
- Fix available (3.5.5-r0) but current image uses 3.5.1-r0
|
||||||
|
- This is a significant security issue
|
||||||
|
|
||||||
|
**Recommendation:**
|
||||||
|
- **CRITICAL PRIORITY:** Update base image or rebuild with updated packages
|
||||||
|
- Alpine 3.22.1 should be updated to include OpenSSL fix
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Risk Assessment Matrix
|
||||||
|
|
||||||
|
| CVE | CVSS | Exploitability | Container Impact | Overall Risk |
|
||||||
|
|-----|------|----------------|------------------|--------------|
|
||||||
|
| CVE-2025-15467 (OpenSSL) | CRITICAL | High | High | CRITICAL |
|
||||||
|
| CVE-2023-45853 (zlib) | CRITICAL | Low | Medium | HIGH |
|
||||||
|
| CVE-2026-0861 (glibc) | HIGH | Low | Low | MEDIUM |
|
||||||
|
| CVE-2025-64756 (glob) | HIGH | Medium | Medium | HIGH |
|
||||||
|
| CVE-2026-23745 (tar) | HIGH | Medium | High | HIGH |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Remediation Priority
|
||||||
|
|
||||||
|
### Immediate (Before Release)
|
||||||
|
|
||||||
|
1. **Update golang:1.23-alpine** - OpenSSL RCE vulnerability
|
||||||
|
2. **Update Node tar package** in affected images - Multiple file system vulnerabilities
|
||||||
|
|
||||||
|
### Short Term (Post-Release)
|
||||||
|
|
||||||
|
3. **Update Node glob and minimatch** packages
|
||||||
|
4. **Monitor glibc CVE-2026-0861** for patches
|
||||||
|
5. **Evaluate Alpine-based alternatives** for Python images
|
||||||
|
|
||||||
|
### Long Term
|
||||||
|
|
||||||
|
6. **Implement automated base image scanning** in CI/CD
|
||||||
|
7. **Create base image update policy** (monthly refresh)
|
||||||
|
8. **Consider distroless images** for production
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Base Image Recommendations
|
||||||
|
|
||||||
|
### For New Services
|
||||||
|
|
||||||
|
1. **Prefer Alpine** (alpine:3.20) - currently clean
|
||||||
|
2. **Pin to digest** for reproducibility:
|
||||||
|
```dockerfile
|
||||||
|
FROM alpine:3.20@sha256:exact-digest-here
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **Avoid images with unfixed vulnerabilities**
|
||||||
|
|
||||||
|
### Image Selection Priority
|
||||||
|
|
||||||
|
1. `alpine:3.20` - CLEAN
|
||||||
|
2. `python:3.12-slim` - 2 HIGH (glibc, no fix)
|
||||||
|
3. `node:22-slim` - Multiple HIGH/CRITICAL
|
||||||
|
4. `debian:bookworm-slim` - Multiple HIGH/CRITICAL
|
||||||
|
5. `golang:1.23-alpine` - CRITICAL OpenSSL (fix available)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## CI/CD Integration Recommendation
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
# Example GitLab CI
|
||||||
|
container_scan:
|
||||||
|
image: aquasec/trivy:latest
|
||||||
|
script:
|
||||||
|
- trivy image --severity HIGH,CRITICAL --exit-code 1 $IMAGE
|
||||||
|
only:
|
||||||
|
- main
|
||||||
|
- merge requests
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Scanning Methodology
|
||||||
|
|
||||||
|
```bash
|
||||||
|
# Commands used
|
||||||
|
docker pull aquasec/trivy:latest
|
||||||
|
|
||||||
|
docker run --rm aquasec/trivy:latest image --severity HIGH,CRITICAL --quiet alpine:3.20
|
||||||
|
docker run --rm aquasec/trivy:latest image --severity HIGH,CRITICAL --quiet python:3.12-slim
|
||||||
|
docker run --rm aquasec/trivy:latest image --severity HIGH,CRITICAL --quiet node:22-slim
|
||||||
|
docker run --rm aquasec/trivy:latest image --severity HIGH,CRITICAL --quiet debian:bookworm-slim
|
||||||
|
docker run --rm aquasec/trivy:latest image --severity HIGH,CRITICAL --quiet golang:1.23-alpine
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Positive Findings
|
||||||
|
|
||||||
|
1. **Alpine images are clean** - Good baseline option available
|
||||||
|
2. **Fixes available** for most vulnerabilities
|
||||||
|
3. **No secrets in images** - Confirmed by Trivy scan
|
||||||
|
4. **Reasonable image selection** - Using official images
|
||||||
234
docs/audit/2026-02-20/FINAL-REPORT.md
Normal file
234
docs/audit/2026-02-20/FINAL-REPORT.md
Normal file
@@ -0,0 +1,234 @@
|
|||||||
|
# Security Audit Final Report
|
||||||
|
|
||||||
|
**Project:** KNEL-AIMiddleware
|
||||||
|
**Date:** 2026-02-20
|
||||||
|
**Auditor:** External Security Review
|
||||||
|
**Report Version:** 1.0
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Executive Summary
|
||||||
|
|
||||||
|
### Overall Assessment: CONDITIONAL PASS
|
||||||
|
|
||||||
|
The KNEL-AIMiddleware project demonstrates **good foundational security practices** with some areas requiring remediation before production release. The project handles credentials properly, uses official base images, and has no hardcoded secrets. However, container privilege management and base image vulnerabilities require attention.
|
||||||
|
|
||||||
|
### Risk Summary
|
||||||
|
|
||||||
|
| Category | Risk Level | Issues | Critical Action Required |
|
||||||
|
|----------|------------|--------|--------------------------|
|
||||||
|
| Secrets Management | LOW | 0 | No |
|
||||||
|
| Dockerfile Security | HIGH | 38 | Yes |
|
||||||
|
| Shell Script Security | HIGH | 83 | Yes |
|
||||||
|
| Docker Compose | MEDIUM | 5 | Partial |
|
||||||
|
| Base Image Vulnerabilities | MEDIUM | 14+ | Yes |
|
||||||
|
|
||||||
|
### Release Readiness: READY WITH CONDITIONS
|
||||||
|
|
||||||
|
**Conditions for Release:**
|
||||||
|
1. Fix CRITICAL OpenSSL vulnerability in golang:1.23-alpine
|
||||||
|
2. Document privileged services and their justification
|
||||||
|
3. Implement remediation plan for HIGH severity findings
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Detailed Findings Summary
|
||||||
|
|
||||||
|
### 1. Secrets & Credentials (PASS)
|
||||||
|
|
||||||
|
**Grade: A**
|
||||||
|
|
||||||
|
| Check | Result |
|
||||||
|
|-------|--------|
|
||||||
|
| No hardcoded secrets | PASS |
|
||||||
|
| .env properly gitignored | PASS |
|
||||||
|
| Placeholder-only examples | PASS |
|
||||||
|
| Runtime credential injection | PASS |
|
||||||
|
| No secrets in git history | PASS |
|
||||||
|
|
||||||
|
**Finding:** Project follows excellent secret management practices. Credentials are injected at runtime via environment variables, with no secrets in the codebase or Docker images.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 2. Dockerfile Security (NEEDS IMPROVEMENT)
|
||||||
|
|
||||||
|
**Grade: C**
|
||||||
|
|
||||||
|
| Issue | Severity | Count | Remediation |
|
||||||
|
|-------|----------|-------|-------------|
|
||||||
|
| Running as root | HIGH | 38/40 | Add USER directive |
|
||||||
|
| Missing multi-stage builds | MEDIUM | 32/40 | Convert to multi-stage |
|
||||||
|
| Build-time secrets | MEDIUM | 1 | Remove ARG for secrets |
|
||||||
|
| Missing --no-install-recommends | LOW | 2 | Add flag |
|
||||||
|
|
||||||
|
**Top Recommendation:** Add non-root users to all Dockerfiles. 95% of containers currently run as root.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 3. Shell Script Security (NEEDS IMPROVEMENT)
|
||||||
|
|
||||||
|
**Grade: C-**
|
||||||
|
|
||||||
|
| Issue | Severity | Count | Remediation |
|
||||||
|
|-------|----------|-------|-------------|
|
||||||
|
| Missing set -e | HIGH | 38 | Add error handling |
|
||||||
|
| Missing set -u | HIGH | 45 | Add undefined var protection |
|
||||||
|
| Unquoted variables | MEDIUM | 4 | Quote all variables |
|
||||||
|
|
||||||
|
**Top Recommendation:** Add `set -euo pipefail` to all shell scripts.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 4. Docker Compose Security (ACCEPTABLE)
|
||||||
|
|
||||||
|
**Grade: B**
|
||||||
|
|
||||||
|
| Issue | Severity | Services | Status |
|
||||||
|
|-------|----------|----------|--------|
|
||||||
|
| Docker socket mount | HIGH | 2 | Required for function |
|
||||||
|
| kubeconfig mount | HIGH | 1 | Required for function |
|
||||||
|
| Default credential pattern | LOW | 1 | Remove defaults |
|
||||||
|
| No resource limits | MEDIUM | All | Add limits |
|
||||||
|
| No health checks | MEDIUM | All | Add health checks |
|
||||||
|
|
||||||
|
**Finding:** Privileged access (Docker socket, kubeconfig) is necessary for service function but should be documented.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
### 5. Base Image Vulnerabilities (NEEDS ATTENTION)
|
||||||
|
|
||||||
|
**Grade: B-**
|
||||||
|
|
||||||
|
| Image | HIGH | CRITICAL | Status |
|
||||||
|
|-------|------|----------|--------|
|
||||||
|
| alpine:3.20 | 0 | 0 | Clean |
|
||||||
|
| python:3.12-slim | 2 | 0 | Monitor |
|
||||||
|
| node:22-slim | 2 | 1 | Update packages |
|
||||||
|
| debian:bookworm-slim | 2 | 1 | Monitor |
|
||||||
|
| golang:1.23-alpine | 4 | 2 | **UPDATE NOW** |
|
||||||
|
|
||||||
|
**Critical Finding:** CVE-2025-15467 (OpenSSL RCE) in golang:1.23-alpine requires immediate patching.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Remediation Roadmap
|
||||||
|
|
||||||
|
### Phase 1: Pre-Release (Required)
|
||||||
|
|
||||||
|
| Priority | Task | Effort | Impact |
|
||||||
|
|----------|------|--------|--------|
|
||||||
|
| 1 | Update golang:1.23-alpine base image | Low | Critical |
|
||||||
|
| 2 | Document privileged services | Low | High |
|
||||||
|
| 3 | Remove default credential patterns | Low | Medium |
|
||||||
|
|
||||||
|
### Phase 2: Short Term (30 Days)
|
||||||
|
|
||||||
|
| Priority | Task | Effort | Impact |
|
||||||
|
|----------|------|--------|--------|
|
||||||
|
| 4 | Add `set -euo pipefail` to all scripts | Low | High |
|
||||||
|
| 5 | Add USER directive to Dockerfiles | Medium | High |
|
||||||
|
| 6 | Update Node tar package | Low | High |
|
||||||
|
| 7 | Add resource limits to docker-compose | Low | Medium |
|
||||||
|
|
||||||
|
### Phase 3: Medium Term (90 Days)
|
||||||
|
|
||||||
|
| Priority | Task | Effort | Impact |
|
||||||
|
|----------|------|--------|--------|
|
||||||
|
| 8 | Convert to multi-stage builds | High | Medium |
|
||||||
|
| 9 | Implement CI/CD vulnerability scanning | Medium | High |
|
||||||
|
| 10 | Add health checks to all services | Medium | Medium |
|
||||||
|
| 11 | Implement socket proxy for Docker access | Medium | High |
|
||||||
|
|
||||||
|
### Phase 4: Long Term (Ongoing)
|
||||||
|
|
||||||
|
| Priority | Task | Effort | Impact |
|
||||||
|
|----------|------|--------|--------|
|
||||||
|
| 12 | Base image update policy | Low | Medium |
|
||||||
|
| 13 | Consider distroless images | High | Medium |
|
||||||
|
| 14 | Network segmentation | Medium | Medium |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Risk Register
|
||||||
|
|
||||||
|
### Critical Risks (Address Before Release)
|
||||||
|
|
||||||
|
| ID | Risk | Likelihood | Impact | Mitigation |
|
||||||
|
|----|------|------------|--------|------------|
|
||||||
|
| R1 | OpenSSL RCE in golang images | Medium | Critical | Update base image |
|
||||||
|
|
||||||
|
### High Risks (Address Within 30 Days)
|
||||||
|
|
||||||
|
| ID | Risk | Likelihood | Impact | Mitigation |
|
||||||
|
|----|------|------------|--------|------------|
|
||||||
|
| R2 | Container privilege escalation | Medium | High | Add USER directives |
|
||||||
|
| R3 | Silent script failures | Medium | High | Add set -e |
|
||||||
|
| R4 | Node tar vulnerabilities | Medium | High | Update package |
|
||||||
|
|
||||||
|
### Medium Risks (Address Within 90 Days)
|
||||||
|
|
||||||
|
| ID | Risk | Likelihood | Impact | Mitigation |
|
||||||
|
|----|------|------------|--------|------------|
|
||||||
|
| R5 | Docker socket abuse | Low | High | Document, socket proxy |
|
||||||
|
| R6 | Resource exhaustion | Low | Medium | Add limits |
|
||||||
|
| R7 | glibc vulnerability | Low | Medium | Monitor for patches |
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Positive Security Practices
|
||||||
|
|
||||||
|
The project demonstrates several security-conscious decisions:
|
||||||
|
|
||||||
|
1. **Credential Management**
|
||||||
|
- No hardcoded secrets anywhere
|
||||||
|
- Environment variables properly externalized
|
||||||
|
- .env file correctly gitignored
|
||||||
|
|
||||||
|
2. **Container Design**
|
||||||
|
- No privileged mode containers
|
||||||
|
- Read-only mounts where appropriate
|
||||||
|
- Official base images used
|
||||||
|
|
||||||
|
3. **Project Hygiene**
|
||||||
|
- Consistent naming conventions
|
||||||
|
- Clear documentation structure
|
||||||
|
- Wrapper scripts for configuration isolation
|
||||||
|
|
||||||
|
4. **Secret Injection Pattern**
|
||||||
|
- Runtime injection via environment
|
||||||
|
- No secrets baked into images
|
||||||
|
- Pass-through wrapper design
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Audit Artifacts
|
||||||
|
|
||||||
|
The following detailed reports are available:
|
||||||
|
|
||||||
|
1. [01-dockerfile-security.md](./01-dockerfile-security.md) - Dockerfile analysis
|
||||||
|
2. [02-shell-script-security.md](./02-shell-script-security.md) - Shell script analysis
|
||||||
|
3. [03-docker-compose-security.md](./03-docker-compose-security.md) - Docker Compose analysis
|
||||||
|
4. [04-secrets-audit.md](./04-secrets-audit.md) - Credentials and secrets review
|
||||||
|
5. [05-vulnerability-scan.md](./05-vulnerability-scan.md) - Base image vulnerabilities
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Conclusion
|
||||||
|
|
||||||
|
KNEL-AIMiddleware is **ready for release with conditions**. The project has solid security fundamentals, particularly in credential management. The primary concerns are:
|
||||||
|
|
||||||
|
1. **Immediate:** OpenSSL vulnerability in golang images
|
||||||
|
2. **Short-term:** Container privilege model (running as root)
|
||||||
|
3. **Short-term:** Shell script error handling
|
||||||
|
|
||||||
|
Addressing the critical OpenSSL vulnerability and documenting privileged services will allow for a safe initial release. The remaining findings should be addressed in subsequent releases.
|
||||||
|
|
||||||
|
### Auditor Confidence: HIGH
|
||||||
|
|
||||||
|
All major security domains were reviewed. Read-only access was maintained throughout. No destructive testing was performed.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
*Report generated: 2026-02-20*
|
||||||
|
*Auditor: External Security Review*
|
||||||
|
*Classification: Confidential*
|
||||||
15
mcp-firefly-iii-wrapper.sh
Executable file
15
mcp-firefly-iii-wrapper.sh
Executable file
@@ -0,0 +1,15 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Firefly III MCP wrapper script for Crush
|
||||||
|
CONTAINER_NAME="kneldevstack-aimiddleware-firefly-iii-mcp-crush"
|
||||||
|
|
||||||
|
# Force remove existing container (suppress output)
|
||||||
|
docker rm -f "${CONTAINER_NAME}" >/dev/null 2>&1 || true
|
||||||
|
sleep 0.5
|
||||||
|
|
||||||
|
# Run container with explicit name and environment variables
|
||||||
|
docker run -i --rm \
|
||||||
|
--name "${CONTAINER_NAME}" \
|
||||||
|
-e FIREFLY_III_BASE_URL="${FIREFLY_III_BASE_URL:-}" \
|
||||||
|
-e FIREFLY_III_PAT="${FIREFLY_III_PAT:-}" \
|
||||||
|
-e FIREFLY_III_PRESET="${FIREFLY_III_PRESET:-default}" \
|
||||||
|
kneldevstack-aimiddleware-firefly-iii-mcp
|
||||||
15
mcp-paperless-wrapper.sh
Executable file
15
mcp-paperless-wrapper.sh
Executable file
@@ -0,0 +1,15 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
# Paperless-NGX MCP wrapper script for Crush
|
||||||
|
CONTAINER_NAME="kneldevstack-aimiddleware-paperless-mcp-crush"
|
||||||
|
|
||||||
|
# Force remove existing container (suppress output)
|
||||||
|
docker rm -f "${CONTAINER_NAME}" >/dev/null 2>&1 || true
|
||||||
|
sleep 0.5
|
||||||
|
|
||||||
|
# Run container with explicit name and environment variables
|
||||||
|
docker run -i --rm \
|
||||||
|
--name "${CONTAINER_NAME}" \
|
||||||
|
-e PAPERLESS_URL="${PAPERLESS_URL:-}" \
|
||||||
|
-e PAPERLESS_TOKEN="${PAPERLESS_TOKEN:-}" \
|
||||||
|
kneldevstack-aimiddleware-paperless-mcp \
|
||||||
|
"${PAPERLESS_URL:-http://localhost:8000}" "${PAPERLESS_TOKEN:-}"
|
||||||
@@ -89,6 +89,7 @@ clone_repo "ha-mcp" "https://github.com/homeassistant-ai/ha-mcp.git"
|
|||||||
clone_repo "gitea-mcp" "https://gitea.com/gitea/gitea-mcp.git"
|
clone_repo "gitea-mcp" "https://gitea.com/gitea/gitea-mcp.git"
|
||||||
clone_repo "limesurvey-mcp" "https://github.com/TonisOrmisson/limesurvey-mcp.git"
|
clone_repo "limesurvey-mcp" "https://github.com/TonisOrmisson/limesurvey-mcp.git"
|
||||||
clone_repo "linkwarden-mcp-server" "https://github.com/irfansofyana/linkwarden-mcp-server.git"
|
clone_repo "linkwarden-mcp-server" "https://github.com/irfansofyana/linkwarden-mcp-server.git"
|
||||||
|
clone_repo "firefly-iii-mcp" "https://github.com/etnperlong/firefly-iii-mcp.git"
|
||||||
|
|
||||||
echo -e "${GREEN}=== All repositories cloned successfully! ===${NC}"
|
echo -e "${GREEN}=== All repositories cloned successfully! ===${NC}"
|
||||||
echo ""
|
echo ""
|
||||||
|
|||||||
Reference in New Issue
Block a user