mcp-diag
Read-only diagnostic MCP server that exposes system stats, Docker status, OOM events, container logs, Sidekiq queues, and local Chatwoot health checks for Claude to review a Hetzner server.
README
MCP de diagnóstico read-only — Hetzner (Chatwoot)
Servicio chico que corre en el propio server y expone herramientas de diagnóstico de solo lectura vía MCP, para que Claude (claude.ai) pueda revisar el estado del Hetzner igual que hoy revisa Railway y Neon.
Qué puede hacer Claude con esto: ver RAM/disco/uptime, detectar eventos OOM, estado y consumo de containers Docker, leer logs de containers de una allowlist, medir colas de Sidekiq en Redis y chequear que Chatwoot responda en local.
Qué NO puede hacer: ejecutar comandos arbitrarios, escribir, reiniciar nada, leer archivos. Cada herramienta es un comando fijo con timeout.
Instalación (10-15 min)
Todo como root salvo indicación contraria.
1. Bajar el código y crear el usuario
apt update && apt install -y git python3-venv curl
git clone https://github.com/Leonelito08/mcp-diag.git /opt/mcp-diag
useradd -r -s /usr/sbin/nologin -d /opt/mcp-diag mcpdiag
cd /opt/mcp-diag
(Actualizaciones futuras: cd /opt/mcp-diag && git pull && systemctl restart mcp-diag.)
2. Entorno Python
python3 -m venv venv
./venv/bin/pip install -r requirements.txt
3. Configuración
cp env.example .env
openssl rand -hex 32 # pegar el resultado en MCP_SECRET dentro de .env
docker ps --format '{{.Names}}' # con esto completás ALLOWED_CONTAINERS y REDIS_CONTAINER
nano .env
chown -R mcpdiag:mcpdiag /opt/mcp-diag
chmod 600 .env
CHATWOOT_LOCAL_URL: el puerto donde rails escucha en el host
(verificalo con docker ps — columna de puertos, típicamente 3000).
4. Servicio systemd
cp mcp-diag.service /etc/systemd/system/
systemctl daemon-reload
systemctl enable --now mcp-diag
systemctl status mcp-diag # debe decir "active (running)"
Prueba local (debe responder algo, aunque sea un error de protocolo MCP — lo importante es que NO sea "connection refused"):
curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8321/$(grep MCP_SECRET .env | cut -d= -f2)/mcp
5. Exponerlo con HTTPS
El servicio escucha solo en 127.0.0.1. Elegí UNA de las dos opciones.
Opción A — Cloudflare Tunnel (recomendada: cero puertos abiertos)
Requiere un dominio tuyo administrado en Cloudflare (sirve un subdominio de cualquiera que ya tengas ahí).
# Instalar cloudflared
curl -L -o /usr/local/bin/cloudflared https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64
chmod +x /usr/local/bin/cloudflared
cloudflared tunnel login # abre URL, elegís el dominio
cloudflared tunnel create mcp-diag
cloudflared tunnel route dns mcp-diag mcp.TUDOMINIO.com
Crear /etc/cloudflared/config.yml (el ID del túnel te lo dio create):
tunnel: <TUNNEL_ID>
credentials-file: /root/.cloudflared/<TUNNEL_ID>.json
ingress:
- hostname: mcp.TUDOMINIO.com
service: http://127.0.0.1:8321
- service: http_status:404
cloudflared service install
systemctl enable --now cloudflared
Opción B — Caddy (si preferís no depender de Cloudflare)
Necesita un registro DNS A → IP del Hetzner y el puerto 443 abierto.
apt install -y caddy
/etc/caddy/Caddyfile:
mcp.TUDOMINIO.com {
reverse_proxy 127.0.0.1:8321
}
systemctl reload caddy
Caddy gestiona el certificado Let's Encrypt solo.
6. Agregar el conector en claude.ai
- En claude.ai: Configuración → Conectores → "+" → Agregar conector personalizado.
- Nombre:
Hetzner Chatwoot. - URL:
https://mcp.TUDOMINIO.com/<MCP_SECRET>/mcp(el secreto va en la URL — esa URL ES la credencial, no la compartas). - Guardar. No hace falta OAuth.
7. Probar
En una conversación nueva: "Revisá el estado del Hetzner". Claude debería
poder llamar system_stats, docker_status, oom_check, etc.
Cómo agregar herramientas (para futuras necesidades de monitoreo)
Receta: función con argv fijo + decorador + reiniciar. Ejemplo — chequear que Postgres acepte conexiones:
@mcp.tool()
def postgres_ping() -> str:
"""pg_isready dentro del container de Postgres."""
return run(["docker", "exec", "chatwoot-postgres-1", "pg_isready"], timeout=10)
systemctl restart mcp-diag
Reglas al extender:
- Solo lectura. Nada de restart/exec arbitrario/escritura, aunque tiente.
- Nunca interpolar strings del modelo en comandos: parámetros solo como
números acotados o nombres validados contra allowlist (mirá
container_logscomo plantilla). - Siempre
timeout=.
El mismo patrón sirve para cualquier server futuro: copiás la carpeta, cambiás las tools, otro subdominio, otro secreto.
Operación
- Rotar credencial: nuevo
openssl rand -hex 32en.env→systemctl restart mcp-diag→ actualizar la URL del conector en claude.ai. - Logs del servicio:
journalctl -u mcp-diag -f - Actualizar fastmcp:
./venv/bin/pip install -U "fastmcp>=2.10,<3"y restart. - Si algún día preferís credencial en header en vez de URL: claude.ai tiene soporte (en beta) de request headers para conectores; el cambio en el server es chico — pedírselo a Claude cuando toque.
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。
mcp-server-qdrant
这个仓库展示了如何为向量搜索引擎 Qdrant 创建一个 MCP (Managed Control Plane) 服务器的示例。