eudaimos opened a new issue, #40917:
URL: https://github.com/apache/superset/issues/40917

   ### Bug or Feature Request?
   
   Feature request / API completeness gap. The MCP server's chart-authoring 
tools cannot express Custom-SQL aggregate metrics, which are required for any 
composed/ratio measure that can't be reduced to one of the built-in aggregate 
keywords. This makes the MCP a noticeably less-than-equal alternative to the 
Explore UI for a common analytics shape.
   
   ### Affected MCP Tools
   
   - `generate_chart`
   - `update_chart`
   - `create_virtual_dataset` (related — see below)
   
   ### What the schema currently exposes
   
   In the `xy` (and every other) chart-type config, the metric is a `ColumnRef`:
   
   ```jsonc
   {
     "name": "youtube_share_pct",
     "aggregate": "SUM" | "COUNT" | "AVG" | "MIN" | "MAX" | "COUNT_DISTINCT" |
                  "STDDEV" | "VAR" | "MEDIAN" | "PERCENTILE",
     "saved_metric": false
   }
   ```
   
   There is no field for `sqlExpression` / `expressionType="SQL"`. Internally 
Superset's form_data fully supports adhoc Custom SQL metrics (the Explore UI 
uses them constantly):
   
   ```jsonc
   {
     "expressionType": "SQL",
     "sqlExpression": "100.0 * SUM(youtube_deliverables) / 
nullIf(SUM(total_deliverables), 0)",
     "label": "YouTube Share %",
     "hasCustomLabel": true
   }
   ```
   
   The MCP schema simply has no surface that maps to this.
   
   ### Concrete failing use-case
   
   Building a dashboard with a virtual dataset that pre-aggregates monthly 
counters across multiple dimension partitions:
   
   ```
   | month | client_status | program_status | total_deliverables | 
youtube_deliverables | ... |
   ```
   
   Dashboard filters can target any subset of the dimensions. We want a Share % 
chart whose metric is **stable under any filter combination** — that requires 
`100 * SUM(youtube_deliverables) / SUM(total_deliverables)`. Cannot be 
expressed because:
   
   - `SUM`, `AVG`, `MAX` on a *pre-computed* `youtube_share_pct` column compose 
wrong (weighting a percentage equally across differently-sized partitions).
   - The fixed `aggregate` enum has no ratio operator.
   - `saved_metric: true` requires the metric to be pre-registered on the 
dataset, but...
   
   ### Related gap: `create_virtual_dataset` can't author saved metrics or 
computed columns either
   
   The current request schema only accepts `dataset_name`, `sql`, 
`database_id`, `schema`, `catalog`, `description`. There is no way to attach 
`metrics: [...]` (saved Custom-SQL metrics) or computed `columns: [...]` at 
dataset-creation time. The Explore-side UI supports both. Result: an 
MCP-authored virtual dataset is permanently lacking these capabilities until a 
human edits it in the Superset UI.
   
   The MCP equivalent of the Explore "Custom SQL" metric tab + the dataset's 
"Metrics" / "Calculated Columns" editor are both unreachable.
   
   ### Suggested API shape
   
   For chart configs (`generate_chart` / `update_chart`), extend `ColumnRef` 
(or accept an alternative `AdhocMetricRef` discriminated by `expressionType`):
   
   ```jsonc
   {
     "expressionType": "SQL",
     "sqlExpression": "100.0 * SUM(num) / nullIf(SUM(den), 0)",
     "label": "Share %",
     "hasCustomLabel": true
   }
   ```
   
   For `create_virtual_dataset`, accept optional arrays:
   
   ```jsonc
   {
     "database_id": 1,
     "sql": "...",
     "dataset_name": "...",
     "metrics": [
       {"metric_name": "share_pct", "expression": "100.0 * SUM(num) / 
nullIf(SUM(den), 0)", "verbose_name": "Share %"}
     ],
     "calculated_columns": [
       {"column_name": "month_label", "expression": "formatDateTime(month, '%b 
%Y')"}
     ]
   }
   ```
   
   ### Workaround today
   
   After MCP creates the chart with a placeholder aggregate metric, open the 
chart's Explore view manually, click the metric, switch to **Custom SQL**, 
paste the expression, and save. This works but defeats the purpose of 
MCP-driven chart authoring for any composed-measure chart.
   
   ### Repro
   
   1. `create_virtual_dataset` with a query that emits `numerator` and 
`denominator` columns at some grain.
   2. Try to `generate_chart` with `chart_type: "xy"` and a `y` metric that 
computes `100 * SUM(numerator) / SUM(denominator)`.
   3. There is no schema-valid way to express this. Best available is 
`aggregate: "AVG"` on a pre-computed ratio column, which composes wrong under 
multi-row aggregation.
   
   ### Why this matters
   
   Ratios, weighted averages, and conditional aggregates are core analytics 
primitives. Sales-funnel conversion rates, time-windowed share %, weighted 
CSAT, etc. all require Custom-SQL adhoc metrics. The MCP surface today routes 
every such chart through "make it in the UI" — which is fine for one-offs but 
not workable for AI-assistant flows that try to author dashboards end-to-end.
   
   ### Environment
   
   - Superset version on which this is reproducible: latest (`v6.1.x`) — MCP 
tool schemas as shipped, observed via the MCP `get_chart_type_schema` resource.
   - Affected since the MCP service was introduced.


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to