MCP proxy for Metrotel n8n Prov server. Adds cache, logs, bearer auth and composite tool.
212
Proxy MCP local en Python que envuelve un servidor MCP existente en n8n (la instancia de aprovisionamiento de Metrotel). Agrega caché, logging, tool compuesta de diagnóstico y auth Bearer propio sin tocar el backend.
Imagen en Docker Hub: metrotel/mcp-prov
tool, args, cached, duration_ms, error)diagnostico_completo/data para logs persistentes (y cache futura)El server MCP embebido en el flujo de n8n de Metrotel cierra el long-poll SSE
tras un tiempo de inactividad, y clientes como mcp-remote empiezan a hacer
reintentos ruidosos. Además el token upstream vivía en JSONs de config en
claro.
Este proxy:
X-Prov-MCP-Key): vive solo en el env file del proxy, no en Claude Desktop / Claude Code configs.contexto_servicio varias veces en pocos minutos).uv (recomendado, o pip)X-Prov-MCP-Key válidodocker run -d --name prov-mcp -p 8767:8767 \
-e PROV_MCP_KEY='pmcc_...' \
-e PROV_MCP_AUTH_TOKEN='pmcp_...' \
-v prov-data:/data \
--restart unless-stopped \
metrotel/mcp-prov:0.2.2
O con docker-compose.yml del repo:
git clone https://github.com/datacenter-metrotel/mcp-prov.git
cd mcp-prov
cp .env.example .env && chmod 600 .env # editá .env
docker compose up -d
Log persistido en el volumen prov-data (montado a /data/logs):
docker exec prov-mcp tail -f /data/logs/calls.log
git clone https://github.com/datacenter-metrotel/mcp-prov.git
cd mcp-prov
cp .env.example .env
chmod 600 .env
# editá .env con los valores reales
# Arrancar en foreground
uvx --from . prov-mcp-proxy
# server escuchando en http://0.0.0.0:8767/mcp
Verificar:
KEY=$(grep '^PROV_MCP_AUTH_TOKEN=' .env | cut -d= -f2)
curl -sS -L -X POST http://127.0.0.1:8767/mcp \
-H "Authorization: Bearer $KEY" \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
--data '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"1"}}}'
export PROV_MCP_KEY='pmcc_...'
export PROV_MCP_TRANSPORT=stdio
uvx --from . prov-mcp-proxy
Y en .mcp.json (Claude Code):
{
"mcpServers": {
"prov": {
"command": "uvx",
"args": ["--from", "/ruta/al/repo", "prov-mcp-proxy"],
"env": { "PROV_MCP_KEY": "${PROV_MCP_KEY}" }
}
}
}
envFrom.secretRef + PersistentVolumeClaim:
ver k8s/README.md.swarm/README.md.Template en systemd/prov-mcp-proxy.service.example:
mkdir -p ~/.config/systemd/user ~/.config/prov-mcp-proxy
cp systemd/prov-mcp-proxy.service.example ~/.config/systemd/user/prov-mcp-proxy.service
cp .env.example ~/.config/prov-mcp-proxy/env
chmod 600 ~/.config/prov-mcp-proxy/env
# editá ~/.config/prov-mcp-proxy/env con los valores reales
systemctl --user daemon-reload
systemctl --user enable --now prov-mcp-proxy.service
systemctl --user status prov-mcp-proxy.service
Para que sobreviva a reboots sin login:
sudo loginctl enable-linger $USER.
Editar claude_desktop_config.json:
{
"mcpServers": {
"prov": {
"command": "npx",
"args": [
"-y", "mcp-remote",
"http://<HOST_IP>:8767/mcp",
"--allow-http",
"--transport", "http-only",
"--header", "Authorization:Bearer <PROV_MCP_AUTH_TOKEN>"
]
}
}
}
Rutas del config:
~/Library/Application Support/Claude/claude_desktop_config.json%APPDATA%\Claude\claude_desktop_config.json~/.config/Claude/claude_desktop_config.jsonVer ejemplo completo en examples/claude_desktop_config.example.json.
| Variable | Requerida | Default | Descripción |
|---|---|---|---|
PROV_MCP_KEY | ✅ | — | Header X-Prov-MCP-Key que se envía al upstream |
PROV_MCP_AUTH_TOKEN | ✅ (si TRANSPORT=http) | — | Bearer que los clientes MCP deben mandar en Authorization |
PROV_MCP_URL | ❌ | https://n8n-asegured.metrotel.com.ar/mcp/prov_mcp_cc | Endpoint upstream |
PROV_MCP_TRANSPORT | ❌ | stdio | stdio o http |
PROV_MCP_HTTP_HOST | ❌ | 127.0.0.1 | Bind del listener HTTP |
PROV_MCP_HTTP_PORT | ❌ | 8767 | Puerto |
PROV_MCP_HTTP_PATH | ❌ | /mcp | Path del endpoint |
PROV_MCP_CACHE_TTL | ❌ | 60 | TTL de caché en segundos (0 = off) |
PROV_MCP_LOG_DIR | ❌ | ~/.cache/prov_mcp_proxy | Directorio del log JSON-lines |
Todas las tools del upstream se re-exponen tal cual (32 al momento de escribir), más una compuesta:
diagnostico_completo(service_number) — llama contexto_servicio →
Topologia → (si el subproducto es ISI) ISI_Check_IP, y devuelve un
resumen agrupado. Útil como "punto de entrada" para diagnóstico rápido de
un servicio dado su número.Ver el detalle de las tools upstream en la colección Postman en
postman/.
Tools que nunca se cachean (efectos activos o datos volátiles):
Ping_toolATA_Test_1, ATA_Test_2, ATA_Test_3Gestion_ACSObtener_backup_equipoEl resto entra a caché con TTL configurable (default 60s). El key incluye nombre de tool + hash SHA1 de los argumentos normalizados.
Cada tool call se registra en ~/.cache/prov_mcp_proxy/calls.log como una
línea JSON con ts, tool, args, cached, duration_ms, error.
Rotación automática 5 MB × 3.
Ver SECURITY.md. En resumen:
chmod 600, fuera de git..env en .gitignore.MIT — ver LICENSE.
Content type
Image
Digest
sha256:ba95c1be3…
Size
51.9 MB
Last updated
about 1 month ago
docker pull metrotel/mcp-prov