This is an automated email from the ASF dual-hosted git repository.

arivero pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/superset.git


The following commit(s) were added to refs/heads/master by this push:
     new 2a3567d2f11 fix(mcp): Remove unsupported thumbnail/preview URLs and 
internal fields from MCP schemas (#38109)
2a3567d2f11 is described below

commit 2a3567d2f1140960aa8a442a70df1365e500afb9
Author: Amin Ghadersohi <[email protected]>
AuthorDate: Mon Feb 23 06:44:12 2026 -0500

    fix(mcp): Remove unsupported thumbnail/preview URLs and internal fields 
from MCP schemas (#38109)
---
 superset/mcp_service/chart/schemas.py                            | 9 ++-------
 superset/mcp_service/chart/tool/get_chart_info.py                | 3 +--
 superset/mcp_service/chart/tool/get_chart_preview.py             | 7 +------
 superset/mcp_service/dashboard/schemas.py                        | 3 ---
 .../unit_tests/mcp_service/chart/tool/test_get_chart_preview.py  | 1 -
 tests/unit_tests/mcp_service/chart/tool/test_list_charts.py      | 4 ++--
 6 files changed, 6 insertions(+), 21 deletions(-)

diff --git a/superset/mcp_service/chart/schemas.py 
b/superset/mcp_service/chart/schemas.py
index a42798a6982..63007ef3d25 100644
--- a/superset/mcp_service/chart/schemas.py
+++ b/superset/mcp_service/chart/schemas.py
@@ -88,11 +88,9 @@ class ChartInfo(BaseModel):
     viz_type: str | None = Field(None, description="Visualization type")
     datasource_name: str | None = Field(None, description="Datasource name")
     datasource_type: str | None = Field(None, description="Datasource type")
-    url: str | None = Field(None, description="Chart URL")
+    url: str | None = Field(None, description="Chart explore page URL")
     description: str | None = Field(None, description="Chart description")
     cache_timeout: int | None = Field(None, description="Cache timeout")
-    form_data: Dict[str, Any] | None = Field(None, description="Chart form 
data")
-    query_context: Any | None = Field(None, description="Query context")
     changed_by: str | None = Field(None, description="Last modifier 
(username)")
     changed_by_name: str | None = Field(
         None, description="Last modifier (display name)"
@@ -231,8 +229,6 @@ def serialize_chart_object(chart: ChartLike | None) -> 
ChartInfo | None:
         url=chart_url,
         description=getattr(chart, "description", None),
         cache_timeout=getattr(chart, "cache_timeout", None),
-        form_data=getattr(chart, "form_data", None),
-        query_context=getattr(chart, "query_context", None),
         changed_by=getattr(chart, "changed_by_name", None)
         or (str(chart.changed_by) if getattr(chart, "changed_by", None) else 
None),
         changed_by_name=getattr(chart, "changed_by_name", None),
@@ -1039,9 +1035,8 @@ class ChartPreview(BaseModel):
 
     # Backward compatibility fields (populated based on content type)
     format: str | None = Field(
-        None, description="Format of the preview (url, ascii, table, base64)"
+        None, description="Format of the preview (ascii, table, vega_lite)"
     )
-    preview_url: str | None = Field(None, description="Image URL for 'url' 
format")
     ascii_chart: str | None = Field(
         None, description="ASCII art chart for 'ascii' format"
     )
diff --git a/superset/mcp_service/chart/tool/get_chart_info.py 
b/superset/mcp_service/chart/tool/get_chart_info.py
index d25354acd02..c9270d33fff 100644
--- a/superset/mcp_service/chart/tool/get_chart_info.py
+++ b/superset/mcp_service/chart/tool/get_chart_info.py
@@ -45,8 +45,7 @@ async def get_chart_info(
     """Get chart metadata by ID or UUID.
 
     IMPORTANT FOR LLM CLIENTS:
-    - ALWAYS display the chart URL when returned
-    - URL field contains chart's screenshot URL for preview
+    - URL field links to the chart's explore page in Superset
     - Use numeric ID or UUID string (NOT chart name)
     - To find a chart ID, use the list_charts tool first
 
diff --git a/superset/mcp_service/chart/tool/get_chart_preview.py 
b/superset/mcp_service/chart/tool/get_chart_preview.py
index fcce93d99bd..606ee88b023 100644
--- a/superset/mcp_service/chart/tool/get_chart_preview.py
+++ b/superset/mcp_service/chart/tool/get_chart_preview.py
@@ -1978,12 +1978,7 @@ async def _get_chart_preview_internal(  # noqa: C901
         )
 
         # Add format-specific fields for backward compatibility
-        if isinstance(content, URLPreview):
-            result.format = "url"
-            result.preview_url = content.preview_url
-            result.width = content.width
-            result.height = content.height
-        elif isinstance(content, ASCIIPreview):
+        if isinstance(content, ASCIIPreview):
             result.format = "ascii"
             result.ascii_chart = content.ascii_content
             result.width = content.width
diff --git a/superset/mcp_service/dashboard/schemas.py 
b/superset/mcp_service/dashboard/schemas.py
index 54c4e724471..3b4f520cfc1 100644
--- a/superset/mcp_service/dashboard/schemas.py
+++ b/superset/mcp_service/dashboard/schemas.py
@@ -307,7 +307,6 @@ class DashboardInfo(BaseModel):
     changed_by: str | None = Field(None, description="Last modifier 
(username)")
     uuid: str | None = Field(None, description="Dashboard UUID (converted to 
string)")
     url: str | None = Field(None, description="Dashboard URL")
-    thumbnail_url: str | None = Field(None, description="Thumbnail URL")
     created_on_humanized: str | None = Field(
         None, description="Humanized creation time"
     )
@@ -452,7 +451,6 @@ def dashboard_serializer(dashboard: "Dashboard") -> 
DashboardInfo:
         else None,
         uuid=str(dashboard.uuid) if dashboard.uuid else None,
         url=dashboard.url,
-        thumbnail_url=dashboard.thumbnail_url,
         created_on_humanized=dashboard.created_on_humanized,
         changed_on_humanized=dashboard.changed_on_humanized,
         chart_count=len(dashboard.slices) if dashboard.slices else 0,
@@ -504,7 +502,6 @@ def serialize_dashboard_object(dashboard: Any) -> 
DashboardInfo:
         uuid=str(getattr(dashboard, "uuid", ""))
         if getattr(dashboard, "uuid", None)
         else None,
-        thumbnail_url=getattr(dashboard, "thumbnail_url", None),
         chart_count=len(getattr(dashboard, "slices", [])),
         owners=getattr(dashboard, "owners", []),
         tags=getattr(dashboard, "tags", []),
diff --git a/tests/unit_tests/mcp_service/chart/tool/test_get_chart_preview.py 
b/tests/unit_tests/mcp_service/chart/tool/test_get_chart_preview.py
index fdd824886d7..7b0a5a61caa 100644
--- a/tests/unit_tests/mcp_service/chart/tool/test_get_chart_preview.py
+++ b/tests/unit_tests/mcp_service/chart/tool/test_get_chart_preview.py
@@ -258,7 +258,6 @@ class TestGetChartPreview:
         # Additional fields that may be present for backward compatibility
         _ = [
             "format",
-            "preview_url",
             "ascii_chart",
             "table_data",
             "width",
diff --git a/tests/unit_tests/mcp_service/chart/tool/test_list_charts.py 
b/tests/unit_tests/mcp_service/chart/tool/test_list_charts.py
index 0f30a27868f..a379e5309ee 100644
--- a/tests/unit_tests/mcp_service/chart/tool/test_list_charts.py
+++ b/tests/unit_tests/mcp_service/chart/tool/test_list_charts.py
@@ -201,12 +201,12 @@ class TestChartDefaultColumnFiltering:
     def test_explicit_select_columns(self):
         """Test that explicit select_columns can include non-default 
columns."""
         request = ListChartsRequest(
-            select_columns=["id", "slice_name", "description", "form_data"]
+            select_columns=["id", "slice_name", "description", "cache_timeout"]
         )
         # Verify exact columns are present - explicit request should match 
exactly
         assert set(request.select_columns) == {
             "id",
             "slice_name",
             "description",
-            "form_data",
+            "cache_timeout",
         }

Reply via email to