Skip to main content
Glama

twilize

用于可重现仪表板和工作簿工程的 Tableau 工作簿 (.twb/.twbx) 生成工具包 通过稳定的分析原语、仪表板组合和内置的结构验证,以编程方式创建 Tableau 工作簿。

概述

twilize 是一个模型上下文协议 (MCP) 服务器和 Python 工具包,用于通过代码或 AI 驱动的工具调用生成 Tableau Desktop 工作簿文件 (.twb / .twbx)。

它被设计为工作簿工程层,而不是对话式数据探索代理。其目标是使工作簿生成过程可重现、可检查,并能安全地在本地工作流、脚本和 CI 中实现自动化。

默认工作流为:

  1. 从已知模板 (.twb.twbx) 或内置的零配置模板开始

  2. 添加计算字段和参数

  3. 使用稳定的图表原语构建工作表

  4. 组装仪表板和交互

  5. 保存并验证可在 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

  1. 打开 Cursor Settings -> Features -> MCP

  2. 点击 Add New MCP Server

  3. Type 设置为 command

  4. Name 设置为 twilize

  5. Command 设置为 uvx twilize

Claude Code

claude mcp add twilize -- uvx twilize

VSCode

打开工作区 .vscode/mcp.json 文件或您的用户配置文件 mcp.json 并添加:

{
  "servers": {
    "twilize": {
      "command": "uvx",
      "args": ["twilize"]
    }
  }
}

在 VSCode 中,您可以通过命令面板使用 MCP: Open Workspace Folder ConfigurationMCP: 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 inside

MCP 工具

工具

描述

create_workbook

加载 .twb.twbx 模板并初始化从模板重建的工作区

open_workbook

打开现有的 .twb.twbx 并保留其工作表和仪表板以进行编辑

list_fields

列出所有可用的维度和度量

list_worksheets

列出活动工作簿中的工作表名称

list_dashboards

列出仪表板及其引用的工作表区域

add_parameter

添加用于假设分析的交互式参数

add_calculated_field

添加带有 Tableau 公式的计算字段

remove_calculated_field

移除先前添加的计算字段

add_worksheet

添加新的空白工作表

configure_chart

配置图表类型和字段映射

configure_worksheet_style

应用工作表级样式:背景颜色、轴/网格/边框可见性

configure_dual_axis

配置双轴图表组合

configure_chart_recipe

配置展示型配方图表,如 lollipop(棒棒糖图)、donut(环形图)、butterfly(蝴蝶图)或 calendar(日历图)

add_dashboard

创建组合工作表的仪表板

add_dashboard_action

向仪表板添加筛选器或高亮操作

generate_layout_json

构建交互式结构化仪表板 flexbox 布局

list_capabilities

显示 twilize 声明的支持边界

describe_capability

解释图表或功能是核心、高级、配方还是不受支持

analyze_twb

根据能力目录分析 .twb 文件;输出包括完整的分解和能力差距分类摘要

diff_template_gap

总结模板的非核心差距

validate_workbook

根据官方 Tableau TWB XSD 架构 (2026.1) 验证工作簿

migrate_twb_guided

运行内置的 TWB 迁移工作流,并在需要时暂停以确认警告

set_mysql_connection

配置数据源以使用本地 MySQL 连接

set_tableauserver_connection

配置到在线 Tableau Server 的连接

set_hyper_connection

配置数据源以使用本地 Hyper 提取连接

save_workbook

将工作簿保存为 .twb(纯 XML)或 .twbx(带有捆绑提取和图像的 ZIP)

能力模型

核心原语

这些是项目应持续承诺的稳定构建块:

  • 条形图

  • 折线图

  • 面积图

  • 饼图

  • 地图

  • 文本 / 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_SUM

  • KPI 差异徽章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 表面时:

  1. 使用 list_capabilities 检查声明的边界

  2. 使用 describe_capability 检查特定的图表、编码或功能

  3. 在追逐展示模板之前使用 analyze_twbdiff_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 本身生成的工作簿偶尔会偏离架构——但反复出现的错误预示着值得修复的结构性问题。

仪表板布局

布局

描述

vertical

从上到下堆叠工作表

horizontal

并排放置工作表

grid-2x2

最多四个工作表的 2x2 网格布局

dict.json 路径

用于更复杂仪表板的声明式自定义布局

自定义布局可以使用嵌套的 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 reports

migrate_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"

输出文件

完成的迁移会写入三个文件:

文件

内容

<output>.twb

带有重写字段引用的已迁移工作簿

migration_report.json

每个字段的状态:已映射 / 警告 / 已阻止

field_mapping.json

用于审计的最终源→目标字段映射

范围参数

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
twilize

MCP 服务器清单

twilize 附带一个完整的 MCP 服务器清单 (mcp-server.json)——这是 Tableau Extension .trex 文件的 MCP 等效文件。它声明了:

.trex 等效项

MCP 字段

描述

扩展 ID

id

com.twilize.mcp-server

版本

version

当前包版本

名称 / 描述

name, description

服务器标识

作者

author

名称、电子邮件、组织、URL

权限

permissions

file-read, file-write

源 URL

command

uvx twilize

最低 API 版本

minPythonVersion

3.10

此外,该清单声明了所有 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