diff --git a/superset/mcp_service/server.py b/superset/mcp_service/server.py index f2ee1d69a0d..5435a66e68b 100644 --- a/superset/mcp_service/server.py +++ b/superset/mcp_service/server.py @@ -30,7 +30,11 @@ import uvicorn from superset.mcp_service.app import create_mcp_app, init_fastmcp_server from superset.mcp_service.mcp_config import get_mcp_factory_config, MCP_STORE_CONFIG -from superset.mcp_service.middleware import create_response_size_guard_middleware +from superset.mcp_service.middleware import ( + create_response_size_guard_middleware, + GlobalErrorHandlerMiddleware, + LoggingMiddleware, +) from superset.mcp_service.storage import _create_redis_store logger = logging.getLogger(__name__) @@ -224,16 +228,24 @@ def run_server( auth_provider = _create_auth_provider(flask_app) # Build middleware list + # FastMCP wraps handlers so that the LAST-added middleware is + # outermost. Order here is innermost → outermost. middleware_list = [] + # Add caching middleware (innermost – runs closest to the tool) + caching_middleware = create_response_caching_middleware() + if caching_middleware: + middleware_list.append(caching_middleware) + # Add response size guard (protects LLM clients from huge responses) if size_guard_middleware := create_response_size_guard_middleware(): middleware_list.append(size_guard_middleware) - # Add caching middleware - caching_middleware = create_response_caching_middleware() - if caching_middleware: - middleware_list.append(caching_middleware) + # Add logging middleware (logs all tool calls with duration tracking) + middleware_list.append(LoggingMiddleware()) + + # Add global error handler (outermost – catches all exceptions) + middleware_list.append(GlobalErrorHandlerMiddleware()) mcp_instance = init_fastmcp_server( auth=auth_provider,