superset_tag_objects
Retrieve tagged objects from Apache Superset by making API requests to fetch all items with assigned tags, grouped by tag for organized access.
Instructions
Get objects associated with tags
Makes a request to the /api/v1/tag/get_objects/ endpoint to retrieve all objects that have tags assigned to them.
Returns: A dictionary with tagged objects grouped by tag
Input Schema
TableJSON Schema
| Name | Required | Description | Default |
|---|---|---|---|
No arguments | |||
Implementation Reference
- main.py:1562-1572 (handler)The handler function implementing the superset_tag_objects tool. It retrieves objects associated with tags by making a GET request to the Superset API endpoint /api/v1/tag/get_objects/ using the make_api_request helper.async def superset_tag_objects(ctx: Context) -> Dict[str, Any]: """ Get objects associated with tags Makes a request to the /api/v1/tag/get_objects/ endpoint to retrieve all objects that have tags assigned to them. Returns: A dictionary with tagged objects grouped by tag """ return await make_api_request(ctx, "get", "/api/v1/tag/get_objects/")
- main.py:1559-1559 (registration)The @mcp.tool() decorator registers the superset_tag_objects function as an MCP tool.@mcp.tool()
- main.py:271-330 (helper)The make_api_request helper function used by the tool to perform authenticated API calls to Superset, handling token refresh, CSRF, and error management.async def make_api_request( ctx: Context, method: str, endpoint: str, data: Dict[str, Any] = None, params: Dict[str, Any] = None, auto_refresh: bool = True, ) -> Dict[str, Any]: """ Helper function to make API requests to Superset Args: ctx: MCP context method: HTTP method (get, post, put, delete) endpoint: API endpoint (without base URL) data: Optional JSON payload for POST/PUT requests params: Optional query parameters auto_refresh: Whether to auto-refresh token on 401 """ superset_ctx: SupersetContext = ctx.request_context.lifespan_context client = superset_ctx.client # For non-GET requests, make sure we have a CSRF token if method.lower() != "get" and not superset_ctx.csrf_token: await get_csrf_token(ctx) async def make_request() -> httpx.Response: headers = {} # Add CSRF token for non-GET requests if method.lower() != "get" and superset_ctx.csrf_token: headers["X-CSRFToken"] = superset_ctx.csrf_token if method.lower() == "get": return await client.get(endpoint, params=params) elif method.lower() == "post": return await client.post( endpoint, json=data, params=params, headers=headers ) elif method.lower() == "put": return await client.put(endpoint, json=data, headers=headers) elif method.lower() == "delete": return await client.delete(endpoint, headers=headers) else: raise ValueError(f"Unsupported HTTP method: {method}") # Use auto_refresh if requested response = ( await with_auto_refresh(ctx, make_request) if auto_refresh else await make_request() ) if response.status_code not in [200, 201]: return { "error": f"API request failed: {response.status_code} - {response.text}" } return response.json()
- main.py:154-169 (helper)The requires_auth decorator applied to the tool, ensuring authentication before execution.def requires_auth( func: Callable[..., Awaitable[Dict[str, Any]]], ) -> Callable[..., Awaitable[Dict[str, Any]]]: """Decorator to check authentication before executing a function""" @wraps(func) async def wrapper(ctx: Context, *args, **kwargs) -> Dict[str, Any]: superset_ctx: SupersetContext = ctx.request_context.lifespan_context if not superset_ctx.access_token: return {"error": "Not authenticated. Please authenticate first."} return await func(ctx, *args, **kwargs) return wrapper
- main.py:171-186 (helper)The handle_api_errors decorator applied to the tool for consistent error handling.def handle_api_errors( func: Callable[..., Awaitable[Dict[str, Any]]], ) -> Callable[..., Awaitable[Dict[str, Any]]]: """Decorator to handle API errors in a consistent way""" @wraps(func) async def wrapper(ctx: Context, *args, **kwargs) -> Dict[str, Any]: try: return await func(ctx, *args, **kwargs) except Exception as e: # Extract function name for better error context function_name = func.__name__ return {"error": f"Error in {function_name}: {str(e)}"} return wrapper