twilize
twilize
用于可重现仪表板和工作簿工程的 Tableau 工作簿 (.twb/.twbx) 生成工具包 通过稳定的分析原语、仪表板组合和内置的结构验证,以编程方式创建 Tableau 工作簿。
概述
twilize 是一个模型上下文协议 (MCP) 服务器和 Python 工具包,用于通过代码或 AI 驱动的工具调用生成 Tableau Desktop 工作簿文件 (.twb / .twbx)。
它被设计为工作簿工程层,而不是对话式数据探索代理。其目标是使工作簿生成过程可重现、可检查,并能安全地在本地工作流、脚本和 CI 中实现自动化。
默认工作流为:
从已知模板 (
.twb或.twbx) 或内置的零配置模板开始添加计算字段和参数
使用稳定的图表原语构建工作表
组装仪表板和交互
保存并验证可在 Tableau Desktop 中打开的
.twb或.twbx文件
Interfaces
┌───────────────────────────────────────────────────────────────┐
│ ┌──────────────────────────┐ ┌───────────────────────────┐ │
│ │ MCP Server │ │ Python Library │ │
│ │ tools_workbook │ │ from twilize.twb_editor │ │
│ │ tools_layout │ │ import TWBEditor │ │
│ │ tools_migration │ │ │ │
│ │ tools_support │ │ editor.add_...() │ │
│ │ │ │ editor.configure_...() │ │
│ │ (Claude / Cursor / │ │ editor.save(...) │ │
│ │ VSCode / Claude Code) │ │ │ │
│ └─────────────┬────────────┘ └──────────────┬────────────┘ │
│ └──────────────┬────────────────┘ │
└───────────────────────────── ┼ ─────────────────────────────┘
▼
┌───────────────────────────────────────────────────────────────┐
│ TWBEditor │
│ ParametersMixin · ConnectionsMixin │
│ ChartsMixin · DashboardsMixin │
└──────────┬──────────────────┬──────────────────┬─────────────┘
▼ ▼ ▼
┌──────────────────┐ ┌──────────────┐ ┌──────────────────────┐
│ Chart Builders │ │ Dashboard │ │ Analysis & │
│ │ │ System │ │ Migration │
│ Basic DualAxis │ │ │ │ │
│ Pie Text │ │ layouts │ │ migration.py │
│ Map Recipes │ │ actions │ │ twb_analyzer.py │
│ │ │ dependencies│ │ capability_registry │
└────────┬─────────┘ └──────┬───────┘ └──────────┬───────────┘
└───────────────────┼──────────────────────┘
▼
┌───────────────────────────────────────────────────────────────┐
│ XML Engine (lxml) │
│ template.twb/.twbx → patch → validate → save │
└───────────────────────────────┬───────────────────────────────┘
▼
output.twb / output.twbx安装
pip install twilize要运行捆绑的基于 Hyper 的示例(该示例检查 .hyper 文件并自动解析物理 Orders_* 表),请同时安装可选的示例依赖项:
pip install "twilize[examples]"要求
快速入门
作为 MCP 服务器
要允许 MCP 客户端自动构建 Tableau 工作簿,请将 twilize 添加到该客户端的 MCP 配置中。
启动命令在不同客户端中是相同的:
uvx twilize每个客户端以不同的配置格式存储此命令。请使用下方的匹配示例。
Claude Desktop
在 macOS 上打开 ~/Library/Application Support/Claude/claude_desktop_config.json,或在 Windows 上打开 %APPDATA%\Claude\claude_desktop_config.json 并添加:
{
"mcpServers": {
"twilize": {
"command": "uvx",
"args": ["twilize"]
}
}
}Cursor IDE
打开 Cursor Settings -> Features -> MCP
点击 Add New MCP Server
将 Type 设置为
command将 Name 设置为
twilize将 Command 设置为
uvx twilize
Claude Code
claude mcp add twilize -- uvx twilizeVSCode
打开工作区 .vscode/mcp.json 文件或您的用户配置文件 mcp.json 并添加:
{
"servers": {
"twilize": {
"command": "uvx",
"args": ["twilize"]
}
}
}在 VSCode 中,您可以通过命令面板使用 MCP: Open Workspace Folder Configuration 或 MCP: Open User Configuration 打开这些文件。您还可以使用 MCP: Add Server 并通过引导流程输入相同的 uvx twilize 命令。
作为 Python 库
使用 TWBEditor(...) 从模板开始并重建工作簿内容。当您想要保留现有工作表和仪表板并就地重新配置工作表时,请使用 TWBEditor.open_existing(...)。
from twilize.twb_editor import TWBEditor
editor = TWBEditor("") # "" uses the built-in Superstore template
editor.clear_worksheets()
editor.add_calculated_field("Profit Ratio", "SUM([Profit])/SUM([Sales])")
editor.add_worksheet("Sales by Category")
editor.configure_chart(
worksheet_name="Sales by Category",
mark_type="Bar",
rows=["Category"],
columns=["SUM(Sales)"],
)
editor.add_worksheet("Segment Pie")
editor.configure_chart(
worksheet_name="Segment Pie",
mark_type="Pie",
color="Segment",
wedge_size="SUM(Sales)",
)
editor.add_dashboard(
dashboard_name="Overview",
worksheet_names=["Sales by Category", "Segment Pie"],
layout="horizontal",
)
editor.save("output/my_workbook.twb")使用打包工作簿 (.twbx)
.twbx 文件是将工作簿 XML 与数据提取 (.hyper) 和图像资源捆绑在一起的 ZIP 归档文件。twilize 可以透明地读取和写入它们:
from twilize.twb_editor import TWBEditor
# Open a packaged workbook — extracts and images are preserved automatically
editor = TWBEditor.open_existing("templates/dashboard/MyDashboard.twbx")
# Make changes as usual
editor.add_calculated_field("Profit Ratio", "SUM([Profit])/SUM([Sales])")
# Save as .twbx — re-bundles the updated .twb with the original extracts/images
editor.save("output/MyDashboard_v2.twbx")
# Or extract just the XML when the packaged format isn't needed
editor.save("output/MyDashboard_v2.twb")普通的 .twb 也可以被打包:
editor = TWBEditor("templates/twb/superstore.twb")
# ...
editor.save("output/superstore.twbx") # produces a single-entry ZIP with the .twb insideMCP 工具
工具 | 描述 |
| 加载 |
| 打开现有的 |
| 列出所有可用的维度和度量 |
| 列出活动工作簿中的工作表名称 |
| 列出仪表板及其引用的工作表区域 |
| 添加用于假设分析的交互式参数 |
| 添加带有 Tableau 公式的计算字段 |
| 移除先前添加的计算字段 |
| 添加新的空白工作表 |
| 配置图表类型和字段映射 |
| 应用工作表级样式:背景颜色、轴/网格/边框可见性 |
| 配置双轴图表组合 |
| 配置展示型配方图表,如 |
| 创建组合工作表的仪表板 |
| 向仪表板添加筛选器或高亮操作 |
| 构建交互式结构化仪表板 flexbox 布局 |
| 显示 twilize 声明的支持边界 |
| 解释图表或功能是核心、高级、配方还是不受支持 |
| 根据能力目录分析 |
| 总结模板的非核心差距 |
| 根据官方 Tableau TWB XSD 架构 (2026.1) 验证工作簿 |
| 运行内置的 TWB 迁移工作流,并在需要时暂停以确认警告 |
| 配置数据源以使用本地 MySQL 连接 |
| 配置到在线 Tableau Server 的连接 |
| 配置数据源以使用本地 Hyper 提取连接 |
| 将工作簿保存为 |
能力模型
核心原语
这些是项目应持续承诺的稳定构建块:
条形图
折线图
面积图
饼图
地图
文本 / KPI 卡片
参数和计算字段
基本仪表板组合
高级模式
这些受支持,但它们是更高级的组合或交互功能,而不是默认的表面区域:
散点图
热力图
树状图
气泡图
双轴 —
mark_color_1/2,color_map_1,reverse_axis_1,hide_zeroline,synchronized表计算 — 通过
add_calculated_field(table_calc="Rows")使用RANK_DENSE,RUNNING_SUM,WINDOW_SUMKPI 差异徽章 —
MIN(1)虚拟轴 +axis_fixed_range+color_map+customized_label环形图(通过 extra_axes) — 多窗格饼图 + 使用
configure_dual_axis(extra_axes=[...])的白色圆圈;支持:Measure Names调色板的color_map富文本标签 — 用于多样式 KPI 卡片和带有内联字段值的动态标题的
configure_chart(label_runs=[...])高级工作表样式 —
configure_worksheet_style支持窗格级单元格/数据标签/标记样式、每个字段的标签/单元格/标题格式、轴刻度控制、禁用工具提示以及所有 Tableau 视觉噪声抑制行维度标题抑制 —
configure_worksheet_style(hide_row_label="FieldName")筛选器区域、参数控件、颜色图例
仪表板筛选器和高亮操作
声明式 JSON 布局工作流
通过布局字典中的
show_title: false进行仪表板区域标题控制
配方和展示模式
这些今天可以生成,但应被视为配方或示例,而不是一等承诺:
环形图
棒棒糖图
子弹图
凹凸图
蝴蝶图
日历图
配方图表有意通过单个 configure_chart_recipe 工具公开,因此公共 MCP 表面不会为每个展示模式逐个增加工具。
这种区别很重要,因为 twilize 并不试图成为图表动物园或与 Tableau 自己的对话式分析工具竞争。当它提供一个可靠、可自动化的工作簿生成层时,该项目最强大。
能力优先工作流
当您不确定某项功能是否属于稳定的 SDK 表面时:
使用
list_capabilities检查声明的边界使用
describe_capability检查特定的图表、编码或功能在追逐展示模板之前使用
analyze_twb或diff_template_gap
这使新功能工作与项目的实际产品边界保持一致,而不是与示例工作簿中碰巧出现的任何内容保持一致。
内置验证
结构验证
save() 在写入前会自动验证 TWB XML 结构:
致命错误(如缺少
<workbook>或<datasources>)会引发TWBValidationError警告(如缺少
<view>或<panes>)会被记录但不会阻止保存可以使用
editor.save("output.twb", validate=False)或editor.save("output.twbx", validate=False)禁用验证
XSD 架构验证
TWBEditor.validate_schema() 根据官方 Tableau TWB XSD 架构 (2026.1) 检查工作簿,该架构位于 vendor/tableau-document-schemas/:
result = editor.validate_schema()
print(result.to_text())
# PASS Workbook is valid against Tableau TWB XSD schema (2026.1)
# — or —
# FAIL Schema validation failed (2 error(s)):
# * Element 'workbook': Missing child element(s)...
result.valid # bool
result.errors # list[str] — lxml error messages
result.schema_available # False if the vendor submodule is not checked out相同的检查可用作 MCP 工具:
validate_workbook() # validate current open workbook in memory
validate_workbook(file_path="out.twb") # validate a file on disk (.twb or .twbx)XSD 错误是信息性的——Tableau 本身生成的工作簿偶尔会偏离架构——但反复出现的错误预示着值得修复的结构性问题。
仪表板布局
布局 | 描述 |
| 从上到下堆叠工作表 |
| 并排放置工作表 |
| 最多四个工作表的 2x2 网格布局 |
| 用于更复杂仪表板的声明式自定义布局 |
自定义布局可以使用嵌套的 layout 字典以编程方式构建,或通过 generate_layout_json 用于 MCP 工作流。
基于 Hyper 的示例
examples/hyper_and_new_charts.py 示例使用直接捆绑在包中的 Sample - EU Superstore.hyper 提取 (src/twilize/references/),并在切换工作簿连接之前通过 Tableau Hyper API 解析物理 Orders_* 表。无需克隆存储库 — 使用 pip install "twilize[examples]" 安装并直接运行。
工作簿迁移
twilize 包含一个迁移子系统,用于将现有的 .twb 切换到新的数据源——例如,将基于一个 Excel 文件构建的工作簿重新指向具有不同架构的另一个 Excel,或在同一数据集的语言变体之间进行迁移。
工作原理
迁移是一个多步骤工作流。每个步骤都可用作 MCP 工具和 Python 函数:
1. inspect_target_schema → Scan the target Excel and list its columns
2. profile_twb_for_migration → Inventory which fields the workbook uses
3. propose_field_mapping → Match source fields to target columns (fuzzy)
4. preview_twb_migration → Dry-run: show what would change, blockers/warnings
5. apply_twb_migration → Write the migrated .twb + JSON reportsmigrate_twb_guided 是一个便捷包装器,它按顺序运行步骤 2–5,并在仅剩下低置信度字段匹配时自动暂停,返回一个 warning_review_bundle 供人工审查,然后再继续。
Python 示例
from twilize.migration import migrate_twb_guided_json
import json
# One-call guided migration
result = migrate_twb_guided_json(
file_path="templates/SalesDashboard.twb",
target_source="data/new_data_source.xlsx",
output_path="output/SalesDashboard_migrated.twb",
)
bundle = json.loads(result)
if bundle["status"] == "warning_review_required":
# Inspect low-confidence matches and confirm or override them
print(bundle["warning_review_bundle"])
# Re-run with confirmed mappings
result = migrate_twb_guided_json(
file_path="templates/SalesDashboard.twb",
target_source="data/new_data_source.xlsx",
output_path="output/SalesDashboard_migrated.twb",
mapping_overrides={"Old Field Name": "New Column Name"},
)MCP 工具示例
当将 twilize 用作 MCP 服务器时,AI 代理可以运行完整的工作流:
inspect_target_schema(target_source="data/new_data_source.xlsx")
→ returns column list and data types
migrate_twb_guided(
file_path="templates/SalesDashboard.twb",
target_source="data/new_data_source.xlsx",
output_path="output/SalesDashboard_migrated.twb"
)
→ returns status: "applied" or "warning_review_required"输出文件
完成的迁移会写入三个文件:
文件 | 内容 |
| 带有重写字段引用的已迁移工作簿 |
| 每个字段的状态:已映射 / 警告 / 已阻止 |
| 用于审计的最终源→目标字段映射 |
范围参数
scope="workbook" 迁移所有工作表。传递工作表名称以将迁移限制为单个工作表。
自包含示例
examples/migrate_workflow/ 包含一个模板 .twb、原始 Superstore Excel、目标中文区域设置的 Superstore Excel 和一个可运行的脚本:
python examples/migrate_workflow/test_migration_workflow.py项目结构
twilize/
|-- src/twilize/
| |-- __init__.py
| |-- capability_registry.py
| |-- config.py
| |-- charts/
| |-- connections.py
| |-- dashboard_actions.py
| |-- dashboard_dependencies.py
| |-- dashboard_layouts.py
| |-- dashboards.py
| |-- field_registry.py
| |-- layout.py
| |-- layout_model.py
| |-- layout_rendering.py
| |-- mcp/
| |-- parameters.py
| |-- twb_analyzer.py
| |-- twb_editor.py
| |-- validator.py
| `-- server.py
|-- tests/
|-- examples/
|-- docs/
|-- pyproject.toml
`-- README.md开发
# Install in editable mode
pip install -e .
# Run test suite
pytest --basetemp=output/pytest_tmp
# Run the mixed showcase example
python examples/scripts/demo_all_supported_charts.py
# Run the advanced Hyper-backed example
python examples/scripts/demo_hyper_and_new_charts.py
# Run the guided migration example
python examples/migrate_workflow/test_migration_workflow.py
# Start MCP server
twilizeMCP 服务器清单
twilize 附带一个完整的 MCP 服务器清单 (mcp-server.json)——这是 Tableau Extension .trex 文件的 MCP 等效文件。它声明了:
.trex 等效项 | MCP 字段 | 描述 |
扩展 ID |
|
|
版本 |
| 当前包版本 |
名称 / 描述 |
| 服务器标识 |
作者 |
| 名称、电子邮件、组织、URL |
权限 |
|
|
源 URL |
|
|
最低 API 版本 |
|
|
此外,该清单声明了所有 40 个带有类别的工具、6 个资源,以及针对 Claude Desktop、Cursor、VS Code 和 Claude Code 的预构建客户端配置。
有关带有参数架构的完整工具参考,请参阅 docs/MCP_SERVER.md。
发布
PyPI
pip install build twine
python -m build
twine upload dist/*Smithery MCP 注册表
smithery.yaml 文件已准备好提交至 Smithery。
MCP 服务器注册表
mcp-server.json 文件遵循用于注册表提交的 MCP 服务器架构。
许可证
AGPL-3.0-or-later
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/subhatta123/twilize'
If you have feedback or need assistance with the MCP directory API, please join our Discord server