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 "Install 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-mcplist 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 Integration
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
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Evan-Kim2028/preset-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server