twilize
twilize
Набор инструментов для создания книг Tableau (.twb/.twbx) для воспроизводимых дашбордов и проектирования книг Программное создание книг Tableau со стабильными аналитическими примитивами, композицией дашбордов и встроенной структурной проверкой.
Обзор
twilize — это сервер протокола контекста модели (MCP) и набор инструментов Python для создания файлов книг Tableau Desktop (.twb / .twbx) с помощью кода или вызовов инструментов на базе ИИ.
Он разработан как уровень проектирования книг, а не как агент для разговорного исследования данных. Цель состоит в том, чтобы сделать создание книг воспроизводимым, проверяемым и безопасным для автоматизации в локальных рабочих процессах, скриптах и CI.
Стандартный рабочий процесс:
Начните с известного шаблона (
.twbили.twbx) или встроенного шаблона с нулевой конфигурацией.Добавьте вычисляемые поля и параметры.
Создайте рабочие листы из стабильных примитивов диаграмм.
Соберите дашборды и взаимодействия.
Сохраните и проверьте файл
.twbили.twbx, который открывается в Tableau Desktop.
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
Откройте ~/Library/Application Support/Claude/claude_desktop_config.json в macOS или %APPDATA%\Claude\claude_desktop_config.json в Windows и добавьте:
{
"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 — это ZIP-архивы, которые объединяют XML книги с извлеченными данными (.hyper) и графическими ресурсами. 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
Инструмент | Описание |
| Загрузить шаблон |
| Открыть существующий |
| Перечислить все доступные измерения и показатели |
| Перечислить имена рабочих листов в активной книге |
| Перечислить дашборды и зоны рабочих листов, на которые они ссылаются |
| Добавить интерактивный параметр для анализа «что, если» |
| Добавить вычисляемое поле с формулой 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Табличные вычисления —
RANK_DENSE,RUNNING_SUM,WINDOW_SUMчерезadd_calculated_field(table_calc="Rows")Бейджи разницы KPI — фиктивная ось
MIN(1)+axis_fixed_range+color_map+customized_labelКольцевая диаграмма (через extra_axes) — многопанельная круговая диаграмма + белый круг с использованием
configure_dual_axis(extra_axes=[...]); поддерживаетcolor_mapдля палитры:Measure NamesМетки с форматированным текстом —
configure_chart(label_runs=[...])для многостилевых KPI-карточек и динамических заголовков со встроенными значениями полейРасширенное стилизование рабочих листов —
configure_worksheet_styleподдерживает стили ячеек/меток данных/меток на уровне панели, форматы меток/ячеек/заголовков для каждого поля, управление делениями осей, отключение подсказок и подавление всех визуальных шумов TableauПодавление заголовка измерения строки —
configure_worksheet_style(hide_row_label="FieldName")Зоны фильтров, элементы управления параметрами, цветовые легенды
Действия фильтрации и выделения на дашборде
Декларативные рабочие процессы макета JSON
Управление заголовком зоны дашборда через
show_title: falseв словарях макета
Рецепты и демонстрационные шаблоны
Их можно создать сегодня, но их следует рассматривать как рецепты или примеры, а не как первоклассные обязательства:
Кольцевая диаграмма
Леденцовая диаграмма (Lollipop)
Пулевая диаграмма (Bullet)
Bump-диаграмма
Диаграмма «бабочка»
Календарь
Рецептурные диаграммы намеренно представлены через единый инструмент 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/), и разрешает физическую таблицу Orders_* через Tableau Hyper API перед переключением подключения книги. Клонирование репозитория не требуется — установите с помощью 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 агент ИИ может запустить полный рабочий процесс:
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)
scope="workbook" мигрирует все рабочие листы. Передайте имя рабочего листа, чтобы ограничить миграцию одним листом.
Автономный пример
examples/migrate_workflow/ содержит шаблон .twb, оригинальный Excel Superstore, целевой Excel Superstore с китайской локалью и запускаемый скрипт:
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) — эквивалентом файла .trex расширения Tableau. Он объявляет:
Эквивалент .trex | Поле MCP | Описание |
ID расширения |
|
|
Версия |
| Текущая версия пакета |
Имя / Описание |
| Идентификация сервера |
Автор |
| Имя, email, организация, URL |
Разрешения |
|
|
URL источника |
|
|
Мин. версия API |
| `3.1 |
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