Skip to main content

MCP server for Preset (Superset) — manage dashboards, charts, and datasets from Claude Code and other LLM agents

Project description

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  ... 33 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

Tools (33)

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

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

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

preset_mcp-0.6.0.tar.gz (192.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

preset_mcp-0.6.0-py3-none-any.whl (49.7 kB view details)

Uploaded Python 3

File details

Details for the file preset_mcp-0.6.0.tar.gz.

File metadata

  • Download URL: preset_mcp-0.6.0.tar.gz
  • Upload date:
  • Size: 192.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.1

File hashes

Hashes for preset_mcp-0.6.0.tar.gz
Algorithm Hash digest
SHA256 bc693dc38db35b01bbfa919f8b526afbe6a5d16808881ab2bab54e3c6684921d
MD5 6407670fbd6ec82f0b32527fbdf2a696
BLAKE2b-256 8371a69d8f0b6e6278d91cc7198cf86ed5f45ce3dad71aa1c37321c3faa64872

See more details on using hashes here.

File details

Details for the file preset_mcp-0.6.0-py3-none-any.whl.

File metadata

  • Download URL: preset_mcp-0.6.0-py3-none-any.whl
  • Upload date:
  • Size: 49.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.1

File hashes

Hashes for preset_mcp-0.6.0-py3-none-any.whl
Algorithm Hash digest
SHA256 70a936e23bb17e31b4cdca46644a1e5d1062e5165b01de2b2a853247862f7c9d
MD5 99fc0855f9559d12e3f8087070d2395c
BLAKE2b-256 6e899a36cd89f8cdc322ecf46a0dd6097b9200cf8b7ece901752feba990b4a26

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page