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",
}