预设mcp
MCP服务器 预设 (管理Apache Superset)。管理来自Claude Code和其他LLM代理的仪表板、图表和数据集。
Claude Code ──STDIO──> preset-mcp ──> Preset APIClaude代码的设置
1.获取您的预设API证书
- 登录到 app.preset.io
- 首选 设置>API密钥
- 创建新的令牌/秘密对
- 复制这两个 令牌 和 秘密
2.从PyPI安装
uv tool install preset-mcp --with preset-cli --with fastmcp --with sqlglot --with pydantic3.用克劳德代码注册
claude mcp add --scope user -e PRESET_API_TOKEN= \
-e PRESET_API_SECRET= \
preset-mcp -- preset-mcp要在启动时自动连接到特定工作区,请执行以下操作:
claude mcp add --scope user -e PRESET_API_TOKEN= \
-e PRESET_API_SECRET= \
-e PRESET_WORKSPACE="Your Workspace Title" \
preset-mcp -- preset-mcp4.验证
claude mcp list
# Should show: preset-mcp ... 63 tools然后在Claude Code会话中,尝试:
> list my preset workspaces替代方案:从源代码安装
git clone https://github.com/Evan-Kim2028/preset-mcp.git
cd preset-mcp
uv sync
claude mcp add --scope user -e PRESET_API_TOKEN= \
-e PRESET_API_SECRET= \
preset-mcp -- uv run --directory /path/to/preset-mcp preset-mcp工具(63)
工作区导航
| 工具 | 目的 |
|---|---|
list_workspaces | 列出您有权访问的所有工作区 |
use_workspace | 按标题切换到工作区 |
阅读
| 工具 | 目的 |
|---|---|
list_dashboards | 列出仪表板(逐步披露) |
get_dashboard | 获取单个仪表板的详细信息(支持 response_mode) |
list_charts | 列出图表 |
get_chart | 获取单个图表的详细信息(支持 response_mode) |
list_datasets | 列出数据集 |
get_dataset | 获取单个数据集(列、指标、SQL)的详细信息 |
list_databases | 列出数据库连接 |
get_database | 获取单个数据库连接的详细信息 |
workspace_catalog | 关系感知拓扑图 |
创建
| 工具 | 目的 |
|---|---|
create_dashboard | 创建新的空仪表板 |
create_dataset | 将SQL查询注册为虚拟数据集 |
create_chart | 从数据集构建图表 |
更新
| 工具 | 目的 |
|---|---|
update_dataset | 更改数据集的SQL、名称或描述 |
update_chart | 更改图表的标题,即类型或参数 |
update_dashboard | 重命名或发布/取消发布仪表板 |
仪表板生命周期
| 工具 | 目的 |
|---|---|
export_dashboard | 导出仪表板ZIP包以进行备份或迁移 |
import_dashboard | 导入仪表板ZIP包并报告受影响的仪表板ID |
delete_dashboard | 导出备份ZIP后删除仪表板 |
SQL查询
| 工具 | 目的 |
|---|---|
run_sql | 通过Preset的连接执行只读SQL查询 |
query_dataset | 使用Superset的度量/维度抽象查询数据集 |
验证与审核
| 工具 | 目的 |
|---|---|
validate_chart | 通过图表数据执行验证单个图表 |
validate_dashboard | 验证仪表板上的所有图表 |
validate_chart_render | 通过无头浏览器探测器验证图表渲染 |
validate_dashboard_render | 跨仪表板图表验证渲染状态 |
verify_chart_workflow | 单镜头图表→仪表板查询/呈现验证 |
verify_dashboard_structure | 验证仪表板布局图和图表参考 |
verify_dashboard_workflow | 一键式仪表板结构/查询/渲染验证 |
repair_dashboard_chart_refs | 修复过时的仪表板图表ID引用 |
list_mutations | 检查本地突变审计日记账分录 |
list_dashboard_snapshots | 列出本地突变前仪表板快照 |
restore_dashboard_snapshot | 从本地快照还原仪表板布局/设置 |
capture_dashboard_template | 捕获可重用的仪表板+图表模板JSON |
capture_golden_templates | 从仪表板ID批量导出模板 |
snapshot_workspace | 完整库存转储以供审计 |
典型工作流程
预期的工作流程将预设的mcp与数据仓库mcp(如 冰屋mcp 雪花):
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特性
渐进式披露
所有列表和详细信息工具都接受 response_mode 用于控制令牌使用的参数:
compact--仅限ID和名称(令牌减少约80%)standard--关键元数据字段(列表工具的默认值)full-原始API响应(详细信息工具的默认响应)
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详细工具(get_dashboard, get_chart, get_dataset, get_database)默认为 full 为了向后兼容性。使用 standard 或 compact 为了避免大的有效负载,具有20多个图表的仪表板在完整模式下可以返回50-100K个字符。
SQL安全
run_sql 用途 sqlglot 对于基于AST的验证:
- 块写入操作(INSERT、UPDATE、DELETE、DROP、ALTER、MERGE、TRUNCATE、GRANT、REVOKE)
- 检测多语句注入(
SELECT 1; DROP TABLE x) - 处理评论包装绕过(
-- comment\nDELETE FROM x) - 捕获CTE封装的写入(
WITH x AS (...) DELETE FROM y)
结构化错误
错误包括 error_type 和 hints[] 因此LLM可以自我恢复:
{
"error": "No workspace selected.",
"error_type": "no_workspace",
"hints": [
"Call list_workspaces to see available workspaces.",
"Then call use_workspace('Title') to select one."
]
}结构化日志记录
stderr上的JSON日志(stdout保留用于STDIO传输):
{"ts":"2025-02-11 12:00:00","level":"INFO","msg":"tool=list_dashboards status=ok duration_ms=234"}配置
所有设置都可以通过环境变量覆盖:
| 变量 | 默认值 | 用途 |
|---|---|---|
PRESET_API_TOKEN | (必需) | 预设API令牌 |
PRESET_API_SECRET | (必需) | 预设API机密 |
PRESET_WORKSPACE | (可选) | 自动连接到此工作区 |
PRESET_MCP_SQL_ROW_LIMIT | 1000 | SQL查询的最大行数 |
PRESET_MCP_SQL_SAMPLE_ROWS | 5 | 以标准模式显示的行 |
PRESET_MCP_TRUNCATION_THRESHOLD | 50 | 全模式截断截止 |
PRESET_MCP_TRUNCATION_TAIL | 5 | 截断时保留尾排 |
PRESET_MCP_LOG_LEVEL | INFO | 记录冗长 |
Python库
preset mcp也可以作为一个独立的Python库使用(不需要mcp):
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")高级配方:带有特殊指标的饼图
使用 params_json 用于高级图表参数,如ad-hoc过滤器。
{
"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\"}]}"
}笔记:
create_chart.metrics接受已保存的度量名称或特殊度量对象。create_chart.template="auto"对缺失的字段应用viz特定的默认值。params_json在飞行前根据数据集列/指标进行验证。params_json不能包含数据源重新绑定键,如viz_type或datasource_id.create_chart.repair_dashboard_refs默认为false因此,除非明确要求,否则图表创建不会改变仪表板布局。
严格参数语义
update_chart(params_json=...)使用严格的验证语义并处理params_json作为与viz完全兼容的params有效载荷。- 对于具有必填字段的viz类型(例如
pie和时间序列图),仅部分有效载荷{"color_scheme":"..."}被拒绝。 - 使用
get_chart(chart_id=, response_mode="full")当您需要精确更新时,可以复制/编辑现有的参数JSON。
黄金模板工作流
使用经过验证的仪表板(例如BTC Fight、海象、DeepBook)作为模板源:
- 查找仪表板ID:
list_dashboards(response_mode="compact")- 在模板化之前验证布局/查询/呈现运行状况:
verify_dashboard_workflow(dashboard_id=, include_render=true, response_mode="standard")- 导出单个可重用模板:
capture_dashboard_template(
dashboard_id=,
portable=true,
include_query_context=false,
include_dataset_schema=true,
output_path="~/.preset-mcp/golden-templates/.json"
)- 一次运行导出多个仪表板:
capture_golden_templates(
dashboard_ids="[80,97,162]",
output_dir="~/.preset-mcp/golden-templates",
portable=true,
include_dataset_schema=true
)CLI替代方案:
uv run scripts/export_golden_templates.py \
--workspace "Mysten Labs--General" \
--dashboard-ids 80,103,102 \
--output-dir ~/.preset-mcp/golden-templates \
--overwrite可选的活烟测试(默认跳过):
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许可证
麻省理工学院
