Skip to main content

Tableau Workbook (.twb) generation toolkit and MCP server

Project description

cwtwb

Datacooper logo

Tableau workbook engineering for reproducible .twb / .twbx generation, validation, and migration.

cwtwb hero image

cwtwb is a Python toolkit and Model Context Protocol (MCP) server for building Tableau Desktop workbooks from code or agent tool calls.

It is meant to be a workbook engineering layer, not a conversational analytics agent. The focus is reproducibility, inspectability, and safe automation in local workflows, scripts, and CI.

The cw in cwtwb comes from Cooper Wenhua.

Latest update (0.18.8): date-like fields now keep date bindings such as MONTH(Order Date) while raw numeric measures still default to SUM(...).

Author: Cooper Wenhua <imgwho@gmail.com>

Website · Source · Changelog

Website Source License Python

Star History Chart

Try the example workflow · Read the guide

Quick Start

Install

pip install cwtwb

If you want the bundled Hyper-backed example too:

pip install "cwtwb[examples]"

Run As An MCP Server

uvx cwtwb

Add the server to your MCP client with the same command. For example:

{
  "mcpServers": {
    "cwtwb": {
      "command": "uvx",
      "args": ["cwtwb"]
    }
  }
}

For Claude Code:

claude mcp add cwtwb -- uvx cwtwb

For VSCode, add cwtwb to your workspace or user mcp.json and use uvx cwtwb as the command.

For client-specific details and the full reference, see https://github.com/imgwho/cwtwb/blob/master/docs/guide.md.

Highlights

Area What you get
Workbook authoring Generate .twb / .twbx files from templates or from scratch
Chart building Build bar, line, pie, map, KPI, and dual-axis workbooks
Safety Validate structure and Tableau XSD before publishing
Migration Repoint existing workbooks to new data sources with explicit steps
MCP support Drive workbook workflows from Claude, Cursor, VSCode, or other MCP clients

See It In Action

This GIF shows the MCP tool flow that builds a dashboard step by step.

cwtwb demo GIF

Architecture

                            Interfaces
  ┌───────────────────────────────────────────────────────────────┐
  │  ┌──────────────────────────┐  ┌───────────────────────────┐  │
  │  │        MCP Server        │  │      Python Library       │  │
  │  │  tools_workbook          │  │  from cwtwb.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

FAQ

What is the difference between .twb and .twbx?

.twb is the workbook XML. .twbx is the packaged version that bundles the workbook together with extracts and images.

Does validate_workbook save files?

No. validate_workbook() checks the workbook in memory or on disk, but it does not write output. save_workbook() is the tool that writes files.

When should I use uvx cwtwb versus python -m cwtwb.mcp?

Use uvx cwtwb for the normal MCP workflow. Use python -m cwtwb.mcp for local testing without uvx.

Where is the full guide?

See the online guide.

Documentation

License

AGPL-3.0-or-later

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

cwtwb-0.18.8.tar.gz (19.2 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

cwtwb-0.18.8-py3-none-any.whl (1.2 MB view details)

Uploaded Python 3

File details

Details for the file cwtwb-0.18.8.tar.gz.

File metadata

  • Download URL: cwtwb-0.18.8.tar.gz
  • Upload date:
  • Size: 19.2 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.1

File hashes

Hashes for cwtwb-0.18.8.tar.gz
Algorithm Hash digest
SHA256 2d8bf93f347fd1778ad88394b9686e86f9b4f3fc2ee6e02fd94d628fc46d1011
MD5 49f6cbd4462c2ea7263efee2ad2b5cea
BLAKE2b-256 a4e9670ef5e5ead615a076b091e6394ac93ee653c2c8e60434063a19c75dc09a

See more details on using hashes here.

File details

Details for the file cwtwb-0.18.8-py3-none-any.whl.

File metadata

  • Download URL: cwtwb-0.18.8-py3-none-any.whl
  • Upload date:
  • Size: 1.2 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.1

File hashes

Hashes for cwtwb-0.18.8-py3-none-any.whl
Algorithm Hash digest
SHA256 0508eab02fd1cf058f31bc8221db67f787a883f85145d08f59e02b398719461e
MD5 5b690660a95dd6278b93000dfa0fab32
BLAKE2b-256 9070216ac6aca20ba8a907204cb7e637edf03eea46c640ad36a6b208877de45b

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page