diff --git a/superset/mcp_service/chart/tool/list_charts.py b/superset/mcp_service/chart/tool/list_charts.py index 9d218a6591b..9831a8d4bab 100644 --- a/superset/mcp_service/chart/tool/list_charts.py +++ b/superset/mcp_service/chart/tool/list_charts.py @@ -137,17 +137,20 @@ async def list_charts(request: ListChartsRequest, ctx: Context) -> ChartList: % (count, total_pages) ) - # Apply field filtering via serialization context - # Use columns_requested from result (already resolved by ModelListCore) - columns_to_filter = result.columns_requested - await ctx.debug( - "Applying field filtering via serialization context: select_columns=%s" - % (columns_to_filter,) - ) - filtered = result.model_dump( - mode="json", context={"select_columns": columns_to_filter} - ) - return ChartList.model_validate(filtered) + # Apply field filtering via serialization context if select_columns specified + # This triggers ChartInfo._filter_fields_by_context for each chart + if request.select_columns: + await ctx.debug( + "Applying field filtering via serialization context: select_columns=%s" + % (request.select_columns,) + ) + # Return dict with context - FastMCP handles serialization + return result.model_dump( + mode="json", context={"select_columns": request.select_columns} + ) + + # No filtering - return full result as dict + return result.model_dump(mode="json") except Exception as e: await ctx.error("Failed to list charts: %s" % (str(e),)) raise diff --git a/superset/mcp_service/dashboard/tool/list_dashboards.py b/superset/mcp_service/dashboard/tool/list_dashboards.py index 4a1d0528852..ecb3433cefd 100644 --- a/superset/mcp_service/dashboard/tool/list_dashboards.py +++ b/superset/mcp_service/dashboard/tool/list_dashboards.py @@ -139,14 +139,17 @@ async def list_dashboards( % (count, total_pages) ) - # Apply field filtering via serialization context - # Use columns_requested from result (already resolved by ModelListCore) - columns_to_filter = result.columns_requested - await ctx.debug( - "Applying field filtering via serialization context: select_columns=%s" - % (columns_to_filter,) - ) - filtered = result.model_dump( - mode="json", context={"select_columns": columns_to_filter} - ) - return DashboardList.model_validate(filtered) + # Apply field filtering via serialization context if select_columns specified + # This triggers DashboardInfo._filter_fields_by_context for each dashboard + if request.select_columns: + await ctx.debug( + "Applying field filtering via serialization context: select_columns=%s" + % (request.select_columns,) + ) + # Return dict with context - FastMCP handles serialization + return result.model_dump( + mode="json", context={"select_columns": request.select_columns} + ) + + # No filtering - return full result as dict + return result.model_dump(mode="json") diff --git a/superset/mcp_service/dataset/tool/list_datasets.py b/superset/mcp_service/dataset/tool/list_datasets.py index f2536cc0e5c..897d7f613d6 100644 --- a/superset/mcp_service/dataset/tool/list_datasets.py +++ b/superset/mcp_service/dataset/tool/list_datasets.py @@ -148,17 +148,20 @@ async def list_datasets(request: ListDatasetsRequest, ctx: Context) -> DatasetLi ) ) - # Apply field filtering via serialization context - # Use columns_requested from result (already resolved by ModelListCore) - columns_to_filter = result.columns_requested - await ctx.debug( - "Applying field filtering via serialization context: select_columns=%s" - % (columns_to_filter,) - ) - filtered = result.model_dump( - mode="json", context={"select_columns": columns_to_filter} - ) - return DatasetList.model_validate(filtered) + # Apply field filtering via serialization context if select_columns specified + # This triggers DatasetInfo._filter_fields_by_context for each dataset + if request.select_columns: + await ctx.debug( + "Applying field filtering via serialization context: select_columns=%s" + % (request.select_columns,) + ) + # Return dict with context - FastMCP handles serialization + return result.model_dump( + mode="json", context={"select_columns": request.select_columns} + ) + + # No filtering - return full result as dict + return result.model_dump(mode="json") except Exception as e: await ctx.error(