You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@superset.apache.org by mi...@apache.org on 2026/05/07 16:56:18 UTC
(superset) branch fix/mcp-ssl-connection-teardown created (now c8b431e9e19)
This is an automated email from the ASF dual-hosted git repository.
aminghadersohi pushed a change to branch fix/mcp-ssl-connection-teardown
in repository https://gitbox.apache.org/repos/asf/superset.git
at c8b431e9e19 refactor(mcp): lift deferred imports to module level in auth.py
This branch includes the following new commits:
new c8b431e9e19 refactor(mcp): lift deferred imports to module level in auth.py
The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
(superset) 01/01: refactor(mcp): lift deferred imports to module level in auth.py
Posted by mi...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
aminghadersohi pushed a commit to branch fix/mcp-ssl-connection-teardown
in repository https://gitbox.apache.org/repos/asf/superset.git
commit c8b431e9e190e019b16dd9c38d94f29420cbf4ae
Author: Amin Ghadersohi <am...@gmail.com>
AuthorDate: Thu May 7 16:55:59 2026 +0000
refactor(mcp): lift deferred imports to module level in auth.py
Move non-circular stdlib, SQLAlchemy, Flask, and fastmcp imports from
function bodies to the module-level import block for readability.
Imports that must remain deferred (superset.extensions.db,
security_manager, mcp_config, flask_singleton, chart_utils) and
optional-dep guards (fastmcp.server.dependencies) are unchanged.
---
superset/mcp_service/auth.py | 29 ++++++++---------------------
1 file changed, 8 insertions(+), 21 deletions(-)
diff --git a/superset/mcp_service/auth.py b/superset/mcp_service/auth.py
index 583b721b9ea..610dbb5393d 100644
--- a/superset/mcp_service/auth.py
+++ b/superset/mcp_service/auth.py
@@ -44,12 +44,19 @@ Configuration:
- MCP_DEV_USERNAME: Fallback username for development
"""
+import contextlib
+import functools
+import inspect
import logging
+import types
from contextlib import AbstractContextManager
from typing import Any, Callable, TYPE_CHECKING, TypeVar
-from flask import g, has_request_context
+from fastmcp import Context as FMContext
+from flask import current_app, g, has_app_context, has_request_context
from flask_appbuilder.security.sqla.models import Group, User
+from sqlalchemy.exc import DBAPIError, OperationalError
+from sqlalchemy.orm import joinedload
if TYPE_CHECKING:
from superset.connectors.sqla.models import SqlaTable
@@ -104,8 +111,6 @@ def check_tool_permission(func: Callable[..., Any]) -> bool:
True if user has permission or no permission is required.
"""
try:
- from flask import current_app
-
if not current_app.config.get("MCP_RBAC_ENABLED", True):
return True
@@ -172,8 +177,6 @@ def load_user_with_relationships(
if not username and not email:
raise ValueError("Either username or email must be provided")
- from sqlalchemy.orm import joinedload
-
from superset.extensions import db
query = db.session.query(User).options(
@@ -330,8 +333,6 @@ def get_user_from_request() -> User:
Raises:
ValueError: If user cannot be authenticated or found
"""
- from flask import current_app
-
# Priority 1: JWT context (per-request safe via ContextVar)
if (jwt_user := _resolve_user_from_jwt_context(current_app)) is not None:
return jwt_user
@@ -445,13 +446,9 @@ def _setup_user_context() -> User | None:
# tool calls when no per-request middleware refreshes it.
# Only clear in app-context-only mode; preserve g.user when
# a request context is active (external middleware set it).
- from flask import has_request_context
-
if not has_request_context():
g.pop("user", None)
- from sqlalchemy.exc import OperationalError
-
user = None # Ensure defined before loop in case of unexpected exit
for attempt in range(2):
@@ -535,8 +532,6 @@ def _remove_session_safe() -> None:
The tool call still proceeds because a fresh connection will be obtained
on the next DB access.
"""
- from sqlalchemy.exc import DBAPIError
-
from superset.extensions import db
try:
@@ -571,12 +566,6 @@ def mcp_auth_hook(tool_func: F) -> F: # noqa: C901
Supports both sync and async tool functions.
"""
- import contextlib
- import functools
- import inspect
- import types
-
- from flask import current_app, has_app_context, has_request_context
def _get_app_context_manager() -> AbstractContextManager[None]:
"""Push a fresh app context unless a request context is active.
@@ -611,8 +600,6 @@ def mcp_auth_hook(tool_func: F) -> F: # noqa: C901
# Detect if the original function expects a ctx: Context parameter.
# If so, we inject it via get_context() at call time.
- from fastmcp import Context as FMContext
-
_tool_sig = inspect.signature(tool_func)
_needs_ctx = any(
p.annotation is FMContext