Skip to main content
Glama

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 API

Setup for Claude Code

1. Get your Preset API credentials

  1. Log in to app.preset.io

  2. Go to Settings > API Keys

  3. Create a new token/secret pair

  4. Copy both the token and secret

2. Install from PyPI

uv tool install preset-mcp --with preset-cli --with fastmcp --with sqlglot --with pydantic

3. Register with Claude Code

claude mcp add --scope user -e PRESET_API_TOKEN=<your-token> \
  -e PRESET_API_SECRET=<your-secret> \
  preset-mcp -- preset-mcp

To 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-mcp

4. Verify

claude mcp list
# Should show: preset-mcp  ... 63 tools

Then in a Claude Code session, try:

> list my preset workspaces

Alternative: 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-mcp

Related MCP server: Superset MCP Server

Tools (63)

Workspace Navigation

Tool

Purpose

list_workspaces

List all workspaces you have access to

use_workspace

Switch to a workspace by title

Read

Tool

Purpose

list_dashboards

List dashboards (with progressive disclosure)

get_dashboard

Get detail for a single dashboard (supports response_mode)

list_charts

List charts

get_chart

Get detail for a single chart (supports response_mode)

list_datasets

List datasets

get_dataset

Get detail for a single dataset (columns, metrics, SQL)

list_databases

List database connections

get_database

Get detail for a single database connection

workspace_catalog

Relationship-aware topology map

Create

Tool

Purpose

create_dashboard

Create a new empty dashboard

create_dataset

Register a SQL query as a virtual dataset

create_chart

Build a chart from a dataset

Update

Tool

Purpose

update_dataset

Change a dataset's SQL, name, or description

update_chart

Change a chart's title, viz type, or parameters

update_dashboard

Rename or publish/unpublish a dashboard

Dashboard Lifecycle

Tool

Purpose

export_dashboard

Export a dashboard ZIP bundle for backup or migration

import_dashboard

Import a dashboard ZIP bundle and report affected dashboard IDs

delete_dashboard

Delete a dashboard after exporting a backup ZIP

SQL & Query

Tool

Purpose

run_sql

Execute a read-only SQL query through Preset's connection

query_dataset

Query a dataset using Superset's metric/dimension abstraction

Validation & Audit

Tool

Purpose

validate_chart

Validate a single chart via chart-data execution

validate_dashboard

Validate all charts on a dashboard

validate_chart_render

Validate chart rendering via headless browser probe

validate_dashboard_render

Validate render status across dashboard charts

verify_chart_workflow

One-shot chart→dashboard query/render verification

verify_dashboard_structure

Validate dashboard layout graph and chart references

verify_dashboard_workflow

One-shot dashboard structure/query/render verification

repair_dashboard_chart_refs

Repair stale dashboard chart ID references

list_mutations

Inspect local mutation audit journal entries

list_dashboard_snapshots

List local pre-mutation dashboard snapshots

restore_dashboard_snapshot

Restore dashboard layout/settings from local snapshot

capture_dashboard_template

Capture reusable dashboard+chart template JSON

capture_golden_templates

Batch-export templates from dashboard IDs

snapshot_workspace

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) — iterate

Features

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 blobs

Detail 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

PRESET_API_TOKEN

(required)

Preset API token

PRESET_API_SECRET

(required)

Preset API secret

PRESET_WORKSPACE

(optional)

Auto-connect to this workspace

PRESET_MCP_SQL_ROW_LIMIT

1000

Max rows from SQL queries

PRESET_MCP_SQL_SAMPLE_ROWS

5

Rows shown in standard mode

PRESET_MCP_TRUNCATION_THRESHOLD

50

Full-mode truncation cutoff

PRESET_MCP_TRUNCATION_TAIL

5

Tail rows kept when truncating

PRESET_MCP_LOG_LEVEL

INFO

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.metrics accepts saved metric names or ad-hoc metric objects.

  • create_chart.template="auto" applies viz-specific defaults for missing fields.

  • params_json is validated preflight against dataset columns/metrics.

  • params_json cannot include datasource-rebinding keys like viz_type or datasource_id.

  • create_chart.repair_dashboard_refs defaults to false so chart creation does not mutate dashboard layouts unless explicitly requested.

Strict Params Semantics

  • update_chart(params_json=...) uses strict validation semantics and treats params_json as a full viz-compatible params payload.

  • For viz types with required fields (for example pie and 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:

  1. Find dashboard IDs:

list_dashboards(response_mode="compact")
  1. Verify layout/query/render health before templating:

verify_dashboard_workflow(dashboard_id=<id>, include_render=true, response_mode="standard")
  1. 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"
)
  1. 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 \
  --overwrite

Optional 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.py

License

MIT

Available Tools

59 tools
capture_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_id speeds 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

    B3.3/5.0

    Scored across 59 tools

    Disambiguation4/5

    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.

    Naming Consistency5/5

    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.

    Tool Count2/5

    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.

    Completeness3/5

    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

    ActivityInactive
    ResponsivenessOutdated data

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      B
      quality
      D
      maintenance
      MCP 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.
      60
      195
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      An 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 npm
      MIT
    • A
      license
      A
      quality
      B
      maintenance
      Full-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.
      100
      1,234 PyPI
      65
      MIT
    • F
      license
      B
      quality
      D
      maintenance
      An 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
      -