preset-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| PRESET_API_TOKEN | Yes | Preset API token (required) | |
| PRESET_WORKSPACE | No | Auto-connect to this workspace | |
| PRESET_API_SECRET | Yes | Preset API secret (required) | |
| PRESET_MCP_LOG_LEVEL | No | Logging verbosity | INFO |
| PRESET_MCP_SQL_ROW_LIMIT | No | Max rows from SQL queries | 1000 |
| PRESET_MCP_SQL_SAMPLE_ROWS | No | Rows shown in standard mode | 5 |
| PRESET_MCP_TRUNCATION_TAIL | No | Tail rows kept when truncating | 5 |
| PRESET_MCP_TRUNCATION_THRESHOLD | No | Full-mode truncation cutoff | 50 |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tasks | {
"list": {},
"cancel": {},
"requests": {
"tools": {
"call": {}
},
"prompts": {
"get": {}
},
"resources": {
"read": {}
}
}
} |
| tools | {
"listChanged": true
} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_workspacesA | List all Preset workspaces you have access to. Call this FIRST to discover workspace titles, then pass one to use_workspace. |
| 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") |
| 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. |
| 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. |
| 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. |
| 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'. |
| 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. |
| 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. |
| 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. |
| 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. |
| 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. |
| 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. |
| 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. |
| 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. |
| 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:
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) |
| validate_dashboardB | Validate all charts on a dashboard and return aggregate statuses. |
| validate_chart_renderC | Validate chart rendering with a headless browser (frontend-level probe). |
| validate_dashboard_renderC | Validate frontend render status for all charts on a dashboard. |
| verify_chart_workflowC | Run end-to-end checks for chart query/render and optional dashboard context. |
| verify_dashboard_structureC | Validate dashboard layout graph integrity and chart reference health. |
| verify_dashboard_workflowC | Run structure + query + optional render verification for a dashboard. |
| capture_dashboard_templateC | Capture a reusable dashboard+chart template from an existing dashboard. |
| capture_golden_templatesC | Capture templates from one or more dashboards into a local folder. |
| 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) |
| 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) |
| 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) |
| 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) |
| 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) |
| 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) |
| repair_dashboard_chart_refsA | Repair stale chart IDs in a dashboard's layout metadata. This tool syncs 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. |
| repair_dashboard_layout_duplicatesC | Remove duplicate chart placements from a dashboard layout. |
| 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. |
| list_mutationsA | List recent local mutation-journal entries for incident debugging. |
| list_dashboard_snapshotsC | List locally saved dashboard snapshots captured before mutations. |
| restore_dashboard_snapshotC | Restore dashboard layout/settings from a local snapshot JSON file. |
| export_dashboardB | Export a dashboard ZIP bundle for backup or migration. |
| import_dashboardC | Import a dashboard ZIP bundle and report the affected dashboard IDs. |
| delete_dashboardC | Delete a dashboard after exporting a full backup. |
| 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. |
| get_saved_queryA | Get detail for a single saved query. Args: query_id: The saved query ID. response_mode: 'compact', 'standard', or 'full'. |
| 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. |
| 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. |
| 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. |
| 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. |
| get_css_templateA | Get detail for a single CSS template. Args: template_id: The CSS template ID. response_mode: 'compact', 'standard', or 'full'. |
| 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. |
| 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. |
| 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. |
| 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. |
| 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'. |
| 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. |
| 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. |
| 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. |
| 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. |
| 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. |
| 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. |
| 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. |
| 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. |
| 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. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
Latest Blog Posts
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