preset-mcp
Provides tools for managing dashboards, charts, datasets, and SQL queries in Preset, a managed Apache Superset platform. Supports workspace navigation, CRUD operations on dashboards, charts, and datasets, as well as validation and audit tools.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@preset-mcp list my preset workspaces"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
preset-mcp
MCP server for Preset (managed Apache Superset). Manage dashboards, charts, and datasets from Claude Code and other LLM agents.
Claude Code ──STDIO──> preset-mcp ──> Preset APISetup for Claude Code
1. Get your Preset API credentials
Log in to app.preset.io
Go to Settings > API Keys
Create a new token/secret pair
Copy both the token and secret
2. Install from PyPI
uv tool install preset-mcp --with preset-cli --with fastmcp --with sqlglot --with pydantic3. Register with Claude Code
claude mcp add --scope user -e PRESET_API_TOKEN=<your-token> \
-e PRESET_API_SECRET=<your-secret> \
preset-mcp -- preset-mcpTo auto-connect to a specific workspace on startup:
claude mcp add --scope user -e PRESET_API_TOKEN=<your-token> \
-e PRESET_API_SECRET=<your-secret> \
-e PRESET_WORKSPACE="Your Workspace Title" \
preset-mcp -- preset-mcp4. Verify
claude mcp list
# Should show: preset-mcp ... 63 toolsThen in a Claude Code session, try:
> list my preset workspacesAlternative: Install from source
git clone https://github.com/Evan-Kim2028/preset-mcp.git
cd preset-mcp
uv sync
claude mcp add --scope user -e PRESET_API_TOKEN=<your-token> \
-e PRESET_API_SECRET=<your-secret> \
preset-mcp -- uv run --directory /path/to/preset-mcp preset-mcpRelated MCP server: Superset MCP Server
Tools (63)
Workspace Navigation
Tool | Purpose |
| List all workspaces you have access to |
| Switch to a workspace by title |
Read
Tool | Purpose |
| List dashboards (with progressive disclosure) |
| Get detail for a single dashboard (supports |
| List charts |
| Get detail for a single chart (supports |
| List datasets |
| Get detail for a single dataset (columns, metrics, SQL) |
| List database connections |
| Get detail for a single database connection |
| Relationship-aware topology map |
Create
Tool | Purpose |
| Create a new empty dashboard |
| Register a SQL query as a virtual dataset |
| Build a chart from a dataset |
Update
Tool | Purpose |
| Change a dataset's SQL, name, or description |
| Change a chart's title, viz type, or parameters |
| Rename or publish/unpublish a dashboard |
Dashboard Lifecycle
Tool | Purpose |
| Export a dashboard ZIP bundle for backup or migration |
| Import a dashboard ZIP bundle and report affected dashboard IDs |
| Delete a dashboard after exporting a backup ZIP |
SQL & Query
Tool | Purpose |
| Execute a read-only SQL query through Preset's connection |
| Query a dataset using Superset's metric/dimension abstraction |
Validation & Audit
Tool | Purpose |
| Validate a single chart via chart-data execution |
| Validate all charts on a dashboard |
| Validate chart rendering via headless browser probe |
| Validate render status across dashboard charts |
| One-shot chart→dashboard query/render verification |
| Validate dashboard layout graph and chart references |
| One-shot dashboard structure/query/render verification |
| Repair stale dashboard chart ID references |
| Inspect local mutation audit journal entries |
| List local pre-mutation dashboard snapshots |
| Restore dashboard layout/settings from local snapshot |
| Capture reusable dashboard+chart template JSON |
| Batch-export templates from dashboard IDs |
| Full inventory dump for auditing |
Typical Workflow
The intended workflow pairs preset-mcp with a data warehouse MCP (like igloo-mcp for Snowflake):
1. Explore data in Snowflake (igloo-mcp)
2. Write and validate your SQL (igloo-mcp)
3. workspace_catalog (preset-mcp) — understand what exists
4. list_databases (preset-mcp) — find the database_id
5. create_dataset (preset-mcp) — register the SQL
6. create_chart + create_dashboard (preset-mcp) — build the viz
7. update_dataset / update_chart (preset-mcp) — iterateFeatures
Progressive Disclosure
All list and detail tools accept a response_mode parameter to control token usage:
compact— IDs and names only (~80% fewer tokens)standard— Key metadata fields (default for list tools)full— Raw API response (default for detail tools)
list_dashboards(response_mode="compact")
→ {"count": 42, "data": [{"id": 1, "dashboard_title": "Revenue"}, ...]}
get_dashboard(dashboard_id=80, response_mode="standard")
→ key fields only, no position_json or json_metadata blobsDetail tools (get_dashboard, get_chart, get_dataset, get_database) default to full for backward compatibility. Use standard or compact to avoid large payloads — dashboards with 20+ charts can return 50-100K chars in full mode.
SQL Safety
run_sql uses sqlglot for AST-based validation:
Blocks write operations (INSERT, UPDATE, DELETE, DROP, ALTER, MERGE, TRUNCATE, GRANT, REVOKE)
Detects multi-statement injection (
SELECT 1; DROP TABLE x)Handles comment-wrapped bypasses (
-- comment\nDELETE FROM x)Catches CTE-wrapped writes (
WITH x AS (...) DELETE FROM y)
Structured Errors
Errors include error_type and hints[] so the LLM can self-recover:
{
"error": "No workspace selected.",
"error_type": "no_workspace",
"hints": [
"Call list_workspaces to see available workspaces.",
"Then call use_workspace('Title') to select one."
]
}Structured Logging
JSON logs on stderr (stdout is reserved for the STDIO transport):
{"ts":"2025-02-11 12:00:00","level":"INFO","msg":"tool=list_dashboards status=ok duration_ms=234"}Configuration
All settings are overridable via environment variables:
Variable | Default | Purpose |
| (required) | Preset API token |
| (required) | Preset API secret |
| (optional) | Auto-connect to this workspace |
|
| Max rows from SQL queries |
|
| Rows shown in standard mode |
|
| Full-mode truncation cutoff |
|
| Tail rows kept when truncating |
|
| Logging verbosity |
Python Library
preset-mcp also works as a standalone Python library (no MCP required):
from preset_py import connect
ws = connect("My Workspace")
dashboards = ws.dashboards()
df = ws.run_sql("SELECT * FROM revenue LIMIT 10", database_id=1)
ws.create_dataset("daily_revenue", "SELECT ...", database_id=1)
ws.create_chart(dataset_id=5, title="Revenue", viz_type="echarts_timeseries_bar")Advanced Recipe: Pie Chart with Ad-hoc Metric
Use params_json for advanced chart params such as ad-hoc filters.
{
"dataset_id": 868,
"title": "USDSUI Distribution",
"viz_type": "pie",
"metrics": "[{\"expressionType\":\"SQL\",\"sqlExpression\":\"AVG(AMOUNT_USD)\",\"label\":\"AVG(AMOUNT_USD)\"}]",
"groupby": "[\"CATEGORY\",\"SOURCE_NAME\"]",
"params_json": "{\"adhoc_filters\":[{\"col\":\"TOKEN_SYMBOL\",\"op\":\"==\",\"val\":\"USDSUI\"}]}"
}Notes:
create_chart.metricsaccepts saved metric names or ad-hoc metric objects.create_chart.template="auto"applies viz-specific defaults for missing fields.params_jsonis validated preflight against dataset columns/metrics.params_jsoncannot include datasource-rebinding keys likeviz_typeordatasource_id.create_chart.repair_dashboard_refsdefaults tofalseso chart creation does not mutate dashboard layouts unless explicitly requested.
Strict Params Semantics
update_chart(params_json=...)uses strict validation semantics and treatsparams_jsonas a full viz-compatible params payload.For viz types with required fields (for example
pieand timeseries charts), partial payloads like only{"color_scheme":"..."}are rejected.Use
get_chart(chart_id=<id>, response_mode="full")to copy/edit the existing params JSON when you need precise updates.
Golden Template Workflow
Use proven dashboards (for example BTC Fight, Walrus, DeepBook) as template sources:
Find dashboard IDs:
list_dashboards(response_mode="compact")Verify layout/query/render health before templating:
verify_dashboard_workflow(dashboard_id=<id>, include_render=true, response_mode="standard")Export a single reusable template:
capture_dashboard_template(
dashboard_id=<id>,
portable=true,
include_query_context=false,
include_dataset_schema=true,
output_path="~/.preset-mcp/golden-templates/<name>.json"
)Export multiple dashboards in one run:
capture_golden_templates(
dashboard_ids="[80,97,162]",
output_dir="~/.preset-mcp/golden-templates",
portable=true,
include_dataset_schema=true
)CLI alternative:
uv run scripts/export_golden_templates.py \
--workspace "Mysten Labs--General" \
--dashboard-ids 80,103,102 \
--output-dir ~/.preset-mcp/golden-templates \
--overwriteOptional live smoke test (skipped by default):
PRESET_MCP_ENABLE_LIVE_TESTS=1 \
PRESET_MCP_LIVE_DASHBOARD_IDS=80,103,102 \
uv run --with pytest pytest -q tests/test_live_dashboard_smoke.pyLicense
MIT
Available Tools
59 toolscapture_dashboard_templateC
Capture a reusable dashboard+chart template from an existing dashboard.
Inputs: dashboard_id (required), portable, include_query_context, include_dataset_schema, +2 more. Returns: result
capture_golden_templatesC
Capture templates from one or more dashboards into a local folder.
Inputs: dashboard_ids (required), output_dir, portable, include_query_context, +3 more. Returns: result
create_annotationA
Add an annotation to an existing annotation layer.
Annotations are time-based markers that overlay on time-series charts. Use list_annotation_layers or get_annotation_layer to find layer IDs.
Args: layer_id: The annotation layer ID to add this annotation to. short_descr: Short description (label) shown on the chart overlay. start_dttm: Start datetime in ISO 8601 format (e.g. '2024-01-15T00:00:00'). end_dttm: End datetime in ISO 8601 format (e.g. '2024-01-16T00:00:00'). long_descr: Optional longer description with details. dry_run: If True, preview the action without executing.
Inputs: layer_id (required), short_descr (required), start_dttm (required), end_dttm (required), +2 more. Returns: result
create_annotation_layerA
Create a new annotation layer.
Annotation layers group time-based annotations that can be overlaid on time-series charts. After creating a layer, use create_annotation to add individual annotations.
Args: name: Name for the annotation layer. descr: Optional description. dry_run: If True, preview the action without executing.
Inputs: name (required), descr, dry_run. Returns: result
create_chartA
Create a chart from an existing dataset.
Recommended workflow: create_dataset → create_chart (with dashboards param to attach it). Use list_datasets to find dataset_id and list_dashboards to find dashboard IDs.
Args: dataset_id: ID of the dataset to visualize title: Chart title viz_type: Visualization type (e.g. "echarts_timeseries_bar", "pie", "big_number_total", "table") metrics: Metric names or ad-hoc metric objects groupby: Columns to group by time_column: Time column for time-series charts template: Defaulting strategy for missing chart fields ('auto' or 'minimal') params_json: Optional JSON object to merge into chart params dashboards: Dashboard IDs to attach this chart to validate_after_create: Run chart-data validation after create repair_dashboard_refs: Attempt to repair stale dashboard chart references when dashboards are provided. Defaults to False so create_chart does not mutate dashboard layouts unless explicitly requested. dry_run: If True, validate inputs and return a preview without making any changes (default: False)
Inputs: dataset_id (required), title (required), viz_type (required), metrics, +8 more. Returns: result
create_css_templateA
Create a new CSS template for dashboard styling.
Args: template_name: Name for the CSS template. css: The CSS stylesheet text. dry_run: If True, preview the action without executing.
Inputs: template_name (required), css (required), dry_run. Returns: result
create_dashboardA
Create a new, empty dashboard.
After creating, use create_chart with the dashboards parameter to add charts, or use update_dashboard to change properties.
Args: dashboard_title: Display title for the dashboard published: Whether the dashboard is published (default: False) dry_run: If True, validate inputs and return a preview without making any changes (default: False)
Inputs: dashboard_title (required), published, dry_run. Returns: result
create_datasetA
Create a virtual (SQL-based) dataset for charting.
This is the main entry point from analytics into visualization. Take a validated SQL query (e.g. from igloo-mcp) and register it as a Preset dataset. Use list_databases to find database_id.
Write SQL (INSERT, DROP, etc.) is blocked — only SELECT-style queries are permitted as dataset definitions.
Args: name: Display name for the dataset sql: SQL query defining the dataset database_id: Database connection ID schema: Optional schema name dry_run: If True, validate inputs and return a preview without making any changes (default: False)
Inputs: name (required), sql (required), database_id (required), schema, +1 more. Returns: result
create_saved_queryA
Create a new saved SQL query in SQL Lab.
Saved queries persist reusable SQL snippets associated with a database.
Args: label: Name / label for the saved query. sql: The SQL text to save. database_id: ID of the database this query targets. schema: Optional schema context (e.g. 'public'). description: Optional description of the query. dry_run: If True, preview the action without executing.
Inputs: label (required), sql (required), database_id (required), schema, +2 more. Returns: result
delete_annotationA
Delete a specific annotation from an annotation layer.
Args: layer_id: The annotation layer ID. annotation_id: The annotation ID to delete. dry_run: If True, preview the action without executing.
Inputs: layer_id (required), annotation_id (required), dry_run. Returns: result
delete_annotation_layerA
Delete an annotation layer and all its annotations.
Args: layer_id: The annotation layer ID to delete. dry_run: If True, preview the action without executing.
Inputs: layer_id (required), dry_run. Returns: result
delete_css_templateA
Delete a CSS template.
Args: template_id: The CSS template ID to delete. dry_run: If True, preview the action without executing.
Inputs: template_id (required), dry_run. Returns: result
delete_dashboardC
Delete a dashboard after exporting a full backup.
Inputs: dashboard_id (required), dry_run. Returns: result
delete_saved_queryA
Delete a saved query.
Args: query_id: The saved query ID to delete. dry_run: If True, preview the action without executing.
Inputs: query_id (required), dry_run. Returns: result
describe_dashboardA
Return a normalized dashboard summary in one call.
Provides dashboard metadata, markdown blocks, chart inventory, unique dataset inventory, and optional source-table lineage — without requiring multiple follow-up tool calls.
Args: dashboard_id: Numeric dashboard ID (or use get_dashboard to find it) include_lineage: Parse dataset SQL to extract upstream source tables include_sql: Include raw SQL for each virtual dataset response_mode: 'compact' (counts only), 'standard' (inventory), or 'full' (all detail + lineage + warnings). Default: standard.
Inputs: dashboard_id (required), include_lineage, include_sql, response_mode. Returns: result
disable_embedded_dashboardA
Disable embedding for a dashboard.
This revokes the embed UUID and prevents the dashboard from being embedded in external applications.
Args: dashboard_id: The dashboard ID to disable embedding for. dry_run: If True, preview the action without executing.
Inputs: dashboard_id (required), dry_run. Returns: result
enable_embedded_dashboardA
Enable embedding for a dashboard and return its embed UUID.
The returned UUID is used to embed the dashboard in external applications via the Superset embedded SDK.
Args: dashboard_id: The dashboard ID to enable embedding for. allowed_domains: List of domains allowed to embed (e.g. '["app.example.com"]'). Pass an empty list to allow all origins. dry_run: If True, preview the action without executing.
Inputs: dashboard_id (required), allowed_domains, dry_run. Returns: result
export_dashboardB
Export a dashboard ZIP bundle for backup or migration.
Inputs: dashboard_id (required), output_path. Returns: result
get_annotation_layerB
Get detail for a single annotation layer including its annotations.
Args: layer_id: The annotation layer ID. response_mode: 'compact', 'standard', or 'full'.
Inputs: layer_id (required), response_mode. Returns: result
get_async_query_resultA
Fetch results of an async SQL query by its query ID (key).
When SQL Lab runs a query asynchronously, it returns a query ID (also called a 'key'). Use this tool to poll for and retrieve the results once the query completes.
Args: query_id: The query ID / key returned by an async SQL Lab query.
Inputs: query_id (required). Returns: result
get_chartA
Get detail for a single chart including params and query context.
Returns the chart's visualization type, parameters, query_context, datasource info, and other metadata. Use list_charts first to find valid IDs.
Args: chart_id: Numeric chart ID response_mode: 'compact' (id+name+viz_type), 'standard' (key fields), or 'full' (raw API response). Default: full.
Inputs: chart_id (required), response_mode. Returns: result
get_css_templateA
Get detail for a single CSS template.
Args: template_id: The CSS template ID. response_mode: 'compact', 'standard', or 'full'.
Inputs: template_id (required), response_mode. Returns: result
get_dashboardA
Get detail for a single dashboard.
Use list_dashboards first to find valid IDs. Use response_mode to control verbosity — dashboards can contain large position_json and json_metadata blobs.
Args: dashboard_id: Numeric dashboard ID response_mode: 'compact' (id+title), 'standard' (key fields, no position_json), or 'full' (raw API response). Default: full.
Inputs: dashboard_id (required), response_mode. Returns: result
get_databaseA
Get detail for a single database connection.
Use list_databases first to find valid IDs.
Args: database_id: Numeric database ID response_mode: 'compact' (id+name+backend), 'standard' (key fields), or 'full' (raw API response). Default: full.
Inputs: database_id (required), response_mode. Returns: result
get_datasetA
Get detail for a single dataset including columns, metrics, and SQL.
Use list_datasets first to find valid IDs. Set refresh_columns=True to query the source database for current column metadata (useful when the underlying table schema has changed).
Args: dataset_id: Numeric dataset ID response_mode: 'compact' (id+name+schema), 'standard' (columns, metrics, sql), or 'full' (raw API response). Default: full. refresh_columns: If True, also fetch live column metadata from the source database and include as 'external_columns'.
Inputs: dataset_id (required), response_mode, refresh_columns. Returns: result
get_embedded_dashboardB
Get the embedded configuration for a dashboard.
Returns the embedding UUID and allowed domains if embedding is enabled, or indicates that embedding is not configured.
Args: dashboard_id: The dashboard ID.
Inputs: dashboard_id (required). Returns: result
get_saved_queryA
Get detail for a single saved query.
Args: query_id: The saved query ID. response_mode: 'compact', 'standard', or 'full'.
Inputs: query_id (required), response_mode. Returns: result
import_dashboardC
Import a dashboard ZIP bundle and report the affected dashboard IDs.
Inputs: import_path (required), overwrite, repair_duplicate_layout, verify_after_import. Returns: result
list_annotation_layersB
List annotation layers in the current workspace.
Annotation layers let you overlay time-based markers on charts (e.g. deploys, incidents). Use this to discover layer IDs.
Args: response_mode: 'compact' (id+name), 'standard' (key fields), or 'full' (raw API response). Default: standard. name_contains: Case-insensitive substring filter on layer name.
Inputs: response_mode, name_contains. Returns: result
list_chartsA
List charts in the current workspace.
Use this to find chart IDs and see which viz types are in use.
Args: response_mode: 'compact', 'standard', or 'full'. Default: standard. name_contains: Case-insensitive substring filter on slice_name. viz_type: Exact-match filter on viz_type (e.g. "echarts_timeseries_bar"). dataset_id: Filter to charts using this datasource_id.
Inputs: response_mode, name_contains, viz_type, dataset_id. Returns: result
list_css_templatesA
List CSS templates in the current workspace.
CSS templates define reusable dashboard styling. Use this to discover template IDs, then pass one to get_css_template for full detail.
Args: response_mode: 'compact' (id+name), 'standard' (key fields), or 'full' (raw API response). Default: standard. name_contains: Case-insensitive substring filter on template_name.
Inputs: response_mode, name_contains. Returns: result
list_dashboardsA
List dashboards in the current workspace.
Start here to discover dashboard IDs, then use get_dashboard for detail on a specific one.
Args: response_mode: 'compact' (id+title), 'standard' (key fields), or 'full' (raw API response). Default: standard. name_contains: Case-insensitive substring filter on dashboard_title.
Inputs: response_mode, name_contains. Returns: result
list_dashboard_snapshotsC
List locally saved dashboard snapshots captured before mutations.
Inputs: dashboard_id, limit. Returns: result
list_databasesA
List database connections in the current workspace.
Call this BEFORE run_sql or create_dataset to find a valid database_id.
Args: response_mode: 'compact', 'standard', or 'full'. Default: standard. name_contains: Case-insensitive substring filter on database_name.
Inputs: response_mode, name_contains. Returns: result
list_datasetsA
List datasets (virtual tables) in the current workspace.
Datasets are the data sources for charts. Use list_databases to find connection IDs needed for creating new datasets.
Args: response_mode: 'compact', 'standard', or 'full'. Default: standard. name_contains: Case-insensitive substring filter on table_name. schema: Server-side exact-match filter on schema name. database_id: Server-side filter to datasets in this database.
Inputs: response_mode, name_contains, schema, database_id. Returns: result
list_mutationsA
List recent local mutation-journal entries for incident debugging.
Inputs: resource_type, resource_id, tool_name, limit. Returns: result
list_saved_queriesA
List saved SQL queries in the current workspace.
Saved queries are reusable SQL snippets stored in SQL Lab. Use this to discover query IDs, then pass one to get_saved_query for full detail.
Args: response_mode: 'compact' (id+label), 'standard' (key fields), or 'full' (raw API response). Default: standard. name_contains: Case-insensitive substring filter on the query label.
Inputs: response_mode, name_contains. Returns: result
list_workspacesA
List all Preset workspaces you have access to.
Call this FIRST to discover workspace titles, then pass one to use_workspace.
Inputs: no named parameters. Returns: result
query_datasetA
Query a dataset using Superset's metric/dimension abstraction.
This executes the same query path that charts use — aggregating metrics over dimension columns — without needing raw SQL. Use get_dataset to discover available metrics and columns first.
For time-series queries, set time_column plus start/end (ISO-8601) and optionally granularity (e.g. "P1D", "P1W").
Args: dataset_id: ID of the dataset to query metrics: Metric names to aggregate (e.g. ["count", "revenue"]) columns: Dimension columns to group by time_column: Time column for time-filtered or time-series queries start: Start date/time in ISO-8601 format (e.g. "2025-01-01") end: End date/time in ISO-8601 format (e.g. "2025-06-01") granularity: Time grain (e.g. "P1D", "P1W", "P1M") where: SQL WHERE clause fragment for filtering having: SQL HAVING clause fragment for post-aggregation filtering order_by: Columns or metrics to order by order_desc: If True, sort descending (default: True) row_limit: Max rows to return (default: 10000) force: If True, bypass query cache response_mode: 'compact' (columns only), 'standard' (sample rows), or 'full' (all rows). Default: standard.
Inputs: dataset_id (required), metrics (required), columns, time_column, +10 more. Returns: result
repair_dashboard_chart_refsA
Repair stale chart IDs in a dashboard's layout metadata.
This tool syncs position_json and json_metadata.chartsInScope by
replacing or removing orphaned chart references.
Args: dashboard_id: Dashboard ID to repair strategy: 'replace_by_name' (default) maps stale chart IDs to currently attached charts with matching names; or 'remove_orphans' to drop stale references only. dry_run: If True, preview detected changes without updating.
Inputs: dashboard_id (required), strategy, dry_run. Returns: result
repair_dashboard_layout_duplicatesC
Remove duplicate chart placements from a dashboard layout.
Inputs: dashboard_id (required), dry_run. Returns: result
restore_dashboard_snapshotC
Restore dashboard layout/settings from a local snapshot JSON file.
Inputs: dashboard_id (required), snapshot_path (required), restore_json_metadata, allow_id_mismatch, +1 more. Returns: result
run_sqlA
Execute a read-only SQL query through a Preset database connection.
This is a debugging/verification tool — use it to confirm a query works through Preset's connection before creating a dataset. For primary SQL exploration, prefer your Snowflake MCP (igloo-mcp).
Only SELECT, SHOW, DESCRIBE, and EXPLAIN are permitted. Write operations and multi-statement queries are blocked.
Args: sql: SQL query to execute (read-only, single statement) database_id: Database connection ID — use list_databases to find it schema: Optional schema name limit: Max rows to return (default 1000) response_mode: 'compact' (columns only), 'standard' (5 sample rows), or 'full' (all rows with smart truncation). Default: standard.
Inputs: sql (required), database_id (required), schema, limit, +1 more. Returns: result
snapshot_workspaceA
Capture a full inventory of the current workspace.
Returns counts and complete lists of dashboards, charts, datasets, and databases. Heavier than workspace_catalog — use catalog for navigation, snapshot for full audit.
Inputs: no named parameters. Returns: result
update_annotation_layerB
Update an existing annotation layer.
Args: layer_id: The annotation layer ID to update. name: New name for the layer. descr: New description. dry_run: If True, preview the action without executing.
Inputs: layer_id (required), name, descr, dry_run. Returns: result
update_chartA
Update an existing chart's title, viz type, or parameters.
Use list_charts to find the chart_id. Pass params_json as a JSON string to override visualization parameters (metrics, groupby, filters, etc.).
params_json uses strict semantics: when provided, it is treated as a full chart params payload for validation. For viz types with required fields (for example pie/timeseries), include those fields in the payload instead of sending partial patches.
Args: chart_id: ID of the chart to update title: New chart title viz_type: New visualization type params_json: JSON string of chart parameters (advanced — use get_chart to inspect existing chart params first). Strict semantics: provide a complete params payload compatible with the chart viz type. dashboards: Reassign chart to these dashboard IDs validate_after_update: Run chart-data validation after update dry_run: If True, validate inputs, capture current state, and return a preview without making any changes (default: False)
Inputs: chart_id (required), title, viz_type, params_json, +3 more. Returns: result
update_css_templateA
Update an existing CSS template.
Args: template_id: The CSS template ID to update. template_name: New name for the template. css: New CSS stylesheet text. dry_run: If True, preview the action without executing.
Inputs: template_id (required), template_name, css, dry_run. Returns: result
update_dashboardA
Update an existing dashboard's properties.
Use list_dashboards to find the dashboard_id. Use get_dashboard to inspect the current position_json and json_metadata.
Args: dashboard_id: ID of the dashboard to update dashboard_title: New dashboard title published: Set to True to publish, False to unpublish position_json: JSON object (or JSON string) defining the dashboard layout (chart containers, rows, grid). Use this to add, remove, or rearrange chart containers — e.g. after deleting charts whose containers remain as orphaned placeholders. json_metadata: JSON object (or JSON string) with dashboard metadata (cross-filter config, color schemes, label colors, refresh settings). Update this alongside position_json to keep chart references in sync. allow_empty_layout: If True, allow updates that remove all chart containers from the layout tree (default: False). dry_run: If True, validate inputs, capture current state, and return a preview without making any changes (default: False)
Inputs: dashboard_id (required), dashboard_title, published, position_json, +3 more. Returns: result
update_datasetA
Update an existing dataset's SQL, name, or description.
Use list_datasets to find the dataset_id. After updating the SQL, any charts built on this dataset will reflect the new data on their next refresh.
Args: dataset_id: ID of the dataset to update sql: New SQL query (replaces existing) name: New display name description: New description override_columns: If True, refresh column metadata from the new SQL (recommended when changing SQL) dry_run: If True, validate inputs, capture current state, and check dependencies without making any changes (default: False)
Inputs: dataset_id (required), sql, name, description, +2 more. Returns: result
update_saved_queryB
Update an existing saved query.
Args: query_id: The saved query ID to update. label: New label (name) for the query. sql: New SQL text. description: New description. schema: New schema context. dry_run: If True, preview the action without executing.
Inputs: query_id (required), label, sql, description, +2 more. Returns: result
use_workspaceA
Switch to a different Preset workspace by its exact title.
You must call this before any read/write tools if PRESET_WORKSPACE was not set at startup. Use list_workspaces to discover titles.
Args: workspace_title: Exact workspace title (e.g. "Mysten Labs--General")
Inputs: workspace_title (required). Returns: result
validate_chartA
Run chart query validation and return render status.
This validates the saved chart params against chart-data execution, returning actionable errors for missing metrics/columns/etc.
Notes:
This does not take a screenshot; it executes the same query context used for chart rendering.
dashboard_idspeeds lookup of chart form_data. If omitted, all dashboards are scanned.
Args: chart_id: Chart ID to validate dashboard_id: Optional dashboard context for form_data lookup row_limit: Query row limit used for validation force: Whether to force recomputation (if supported by backend) response_mode: 'compact' (small summary), 'standard' (default), or 'full' (raw payload + metadata)
Inputs: chart_id (required), dashboard_id, row_limit, force, +1 more. Returns: result
validate_chart_renderC
Validate chart rendering with a headless browser (frontend-level probe).
Inputs: chart_id (required), timeout_ms, settle_ms, response_mode. Returns: result
validate_dashboardB
Validate all charts on a dashboard and return aggregate statuses.
Inputs: dashboard_id (required), row_limit, force, response_mode. Returns: result
validate_dashboard_renderC
Validate frontend render status for all charts on a dashboard.
Inputs: dashboard_id (required), timeout_ms, settle_ms, response_mode. Returns: result
verify_chart_workflowC
Run end-to-end checks for chart query/render and optional dashboard context.
Inputs: chart_id (required), dashboard_id, include_render, row_limit, +4 more. Returns: result
verify_dashboard_structureC
Validate dashboard layout graph integrity and chart reference health.
Inputs: dashboard_id (required), response_mode. Returns: result
verify_dashboard_workflowC
Run structure + query + optional render verification for a dashboard.
Inputs: dashboard_id (required), include_render, row_limit, force, +3 more. Returns: result
workspace_catalogA
Build a relationship-aware catalog of the current workspace.
Returns databases, datasets, charts, and dashboards with their dependency links (dataset→database, chart→dataset). Use this to understand workspace topology BEFORE creating or updating resources.
Much cheaper on tokens than snapshot_workspace — returns only the fields needed for navigation.
Inputs: no named parameters. Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 59 tools
Most tools target distinct resources (dashboards, charts, datasets, annotations, etc.), but there is overlap among validation and verification tools (validate_chart vs validate_chart_render vs verify_chart_workflow) that could confuse an agent. The core CRUD tools are well-separated.
All tool names follow a consistent verb_noun pattern in snake_case (e.g., list_dashboards, create_chart, delete_annotation). Even compound tools like validate_chart_render maintain this pattern without mixing styles.
With 59 tools, the server is over-scoped. While Preset is complex, many tools could be consolidated (e.g., multiple validate/verify tools, separate repair tools). Typically a well-scoped MCP server has 3-15 tools; this far exceeds that range.
The tool set covers most lifecycle operations for dashboards, charts, datasets, annotations, etc., but lacks delete operations for charts and datasets, which are important gaps. Import/export and repair tools are present, so overall it's decent but incomplete.
Maintenance
Related MCP Connectors
MCP server that lets AI assistants use all OneSchema features exposed via the public API.
MCP server for interacting with the Supabase platform
Marketo MCP server for AI. 130 tools to operate Marketo from Claude, Cursor, or ChatGPT.
An MCP server that provides an API to LLMs to manage their JumpCloud resources.
Related MCP Servers
- AlicenseBqualityDmaintenanceMCP server enabling AI agents to programmatically connect to and control Apache Superset instances, allowing users to manage dashboards, charts, databases, datasets, and run SQL queries through natural language interactions.60195MIT
- AlicenseNot gradedqualityDmaintenanceAn MCP server for Apache Superset that enables AI models to manage dashboards, create charts with auto-detection, and execute SQL queries programmatically. It utilizes stateless HTTP transport to ensure compatibility with integration tools like Open WebUI.136 npmMIT
- AlicenseAqualityBmaintenanceFull-featured MCP server for Apache Superset — 135+ tools for dashboards, charts, datasets, SQL Lab, security (users, roles, RLS, groups), audit, and more. Built-in safety validations.1001,234 PyPI65MIT
- FlicenseBqualityDmaintenanceAn MCP server that provides AI assistants with full access to Apache Superset instances, enabling interaction with dashboards, charts, datasets, databases, and SQL execution capabilities.34-