From edb500f5173c5d7ea3f9196cc4cdcaecff759d5d Mon Sep 17 00:00:00 2001 From: urieljareth Date: Tue, 28 Jul 2026 15:45:53 -0600 Subject: [PATCH] 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) --- api/main.py | 16 +++++++++++++--- api/requirements.txt | 5 ++++- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/api/main.py b/api/main.py index 22652bc..be7f1e6 100644 --- a/api/main.py +++ b/api/main.py @@ -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) diff --git a/api/requirements.txt b/api/requirements.txt index 84e7b13..5474b93 100644 --- a/api/requirements.txt +++ b/api/requirements.txt @@ -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