Fix: fijar mcp a la serie 1.x y evitar que su fallo tumbe el REST

El primer rebuild del api en dos semanas trajo mcp 2.0.0, que elimino
Server.list_tools(). app/mcp/server.py lo usa como decorador en su linea 27,
asi que el import lanzaba AttributeError al arrancar.

El agravante: main.py envolvia el montaje del MCP en `except ImportError`.
Un AttributeError no es ImportError, asi que se escapaba y tumbaba toda la
aplicacion. En produccion el contenedor quedo en crash-loop y el REST dejo de
responder por completo, no solo el MCP.

Dos arreglos:
- requirements.txt fija `mcp>=1.28.1,<2.0.0`. La imagen anterior que llevaba dos
  semanas sana tenia 1.28.1; el rango abierto `>=1.0.0` permitio el salto mayor.
- main.py captura cualquier excepcion al montar el MCP y la registra. El servidor
  MCP es opcional; el REST no. Si el MCP no monta, la API sigue de pie.

Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
This commit is contained in:
urieljareth
2026-07-28 15:45:53 -06:00
co-authored by Claude Opus 5
parent 9023384de9
commit edb500f517
2 changed files with 17 additions and 4 deletions
+13 -3
View File
@@ -126,9 +126,19 @@ try:
"protocol": "mcp",
"description": "MCP server for Cotizador E3 quotation system",
}
except ImportError:
# MCP SDK not installed, skip MCP mount
pass
except Exception as exc: # noqa: BLE001
# Antes esto capturaba solo ImportError. Cuando el SDK de MCP salto a 2.0.0 y
# elimino Server.list_tools(), el import lanzo AttributeError, se escapo del
# except y tumbo TODA la aplicacion: el REST tambien dejo de responder.
# El servidor MCP es opcional; el REST no. Si el MCP no monta, se registra y
# la API sigue de pie.
import logging
logging.getLogger("uvicorn.error").error(
"No se pudo montar el servidor MCP (%s: %s). El REST sigue disponible.",
type(exc).__name__,
exc,
)
@app.get("/", include_in_schema=False)
+4 -1
View File
@@ -8,5 +8,8 @@ passlib[bcrypt]>=1.7.4
python-multipart>=0.0.18
reportlab>=4.0
openpyxl>=3.1.0
mcp>=1.0.0
# Fijado a la serie 1.x: mcp 2.0.0 elimino Server.list_tools() y rompe
# app/mcp/server.py al importarse. El rango abierto `>=1.0.0` dejo que una
# reconstruccion tomara 2.0.0 y tumbara el API entero en produccion.
mcp>=1.28.1,<2.0.0
httpx>=0.27.0