Skip to main content
Glama

twilize

재현 가능한 대시보드 및 통합 문서 엔지니어링을 위한 Tableau 통합 문서(.twb/.twbx) 생성 툴킷 안정적인 분석 기본 요소, 대시보드 구성 및 내장된 구조적 유효성 검사를 사용하여 프로그래밍 방식으로 Tableau 통합 문서를 생성합니다.

개요

twilize는 코드나 AI 기반 도구 호출을 통해 Tableau Desktop 통합 문서 파일(.twb / .twbx)을 생성하기 위한 Model Context Protocol(MCP) 서버이자 Python 툴킷입니다.

이 도구는 대화형 데이터 탐색 에이전트가 아닌 통합 문서 엔지니어링 계층으로 설계되었습니다. 목표는 로컬 워크플로우, 스크립트 및 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 파일을 검사하고 물리적 Orders_* 테이블을 자동으로 확인하는 번들된 Hyper 기반 예제를 실행하려면, 선택적 예제 종속성도 설치하십시오:

pip install "twilize[examples]"

요구 사항

빠른 시작

MCP 서버로 사용

MCP 클라이언트가 Tableau 통합 문서를 자동으로 빌드하도록 하려면 해당 클라이언트의 MCP 구성에 twilize를 추가하십시오.

시작 명령은 클라이언트 전반에서 동일합니다:

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 설정 -> 기능 -> MCP를 엽니다.

  2. 새 MCP 서버 추가를 클릭합니다.

  3. 유형command로 설정합니다.

  4. 이름twilize로 설정합니다.

  5. 명령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 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 inside

MCP 도구

도구

설명

create_workbook

.twb 또는 .twbx 템플릿을 로드하고 템플릿 기반 재빌드 작업 영역을 초기화합니다

open_workbook

기존 .twb 또는 .twbx를 열고 편집을 위해 워크시트와 대시보드를 유지합니다

list_fields

사용 가능한 모든 차원과 측정값을 나열합니다

list_worksheets

활성 통합 문서의 워크시트 이름을 나열합니다

list_dashboards

대시보드와 참조하는 워크시트 영역을 나열합니다

add_parameter

What-if 분석을 위한 대화형 매개변수를 추가합니다

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 도구를 통해 의도적으로 노출됩니다.

twilize는 차트 동물원이 되거나 Tableau 자체의 대화형 분석 도구와 경쟁하려는 것이 아니기 때문에 이러한 구분이 중요합니다. 이 프로젝트는 신뢰할 수 있고 자동화 가능한 통합 문서 생성 계층을 제공할 때 가장 강력합니다.

기능 우선 워크플로우

어떤 기능이 안정적인 SDK 표면에 속하는지 확실하지 않은 경우:

  1. list_capabilities를 사용하여 선언된 경계를 검사하십시오.

  2. describe_capability를 사용하여 특정 차트, 인코딩 또는 기능을 확인하십시오.

  3. 쇼케이스 템플릿을 찾기 전에 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()vendor/tableau-document-schemas/에 공급된 공식 Tableau TWB XSD 스키마(2026.1)에 대해 통합 문서를 확인합니다:

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

최대 4개의 워크시트에 대한 2x2 격자 레이아웃

dict 또는 .json 경로

더 복잡한 대시보드를 위한 선언적 사용자 지정 레이아웃

사용자 지정 레이아웃은 중첩된 layout 딕셔너리를 사용하거나 MCP 워크플로우의 경우 generate_layout_json을 통해 프로그래밍 방식으로 빌드할 수 있습니다.

Hyper 기반 예제

examples/hyper_and_new_charts.py 예제는 패키지(src/twilize/references/)에 직접 번들된 Sample - EU Superstore.hyper 추출을 사용하며, 통합 문서 연결을 전환하기 전에 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는 Tableau Extension .trex 파일의 MCP 버전인 전체 MCP 서버 매니페스트(mcp-server.json)와 함께 제공됩니다. 여기에는 다음이 선언되어 있습니다:

.trex 대응 항목

MCP 필드

설명

확장 ID

id

com.twilize.mcp-server

버전

version

현재 패키지 버전

이름 / 설명

name, description

서버 ID

작성자

author

이름, 이메일, 조직, URL

권한

permissions

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