Leading off

THE BAR CHART AN AGENT MADE

Can you trust the number on the chart?

You've made this chart a thousand times. Years across the horizontal axis. A count on the vertical. Done before the coffee cools.

You didn't make this one. An agent did. It wrote the workbook as XML, Tableau's MCP server checked it line by line, and it published to Tableau Cloud without anyone opening a browser.

The bars say 400. So ask what you'd ask of anybody's chart: how do I know that's right?

Tableau Cloud Tableau MCP Claude Code BigQuery

The game. Sunday, August 7, 1988. Twins at Yankees, 5–1. At the top of his card Poppa wrote four guesses at the crowd: 49,000. 48,000. 54,875. 51,500. Then the real number, 53,176, circled. Can you trust the number? He checked.

Tableau Cloud bar chart: home runs witnessed by year, 1984 to 2025, 34 red bars summing to 400
Tableau Cloud · Keeping Score - HR by Year · 34 bars, 400 home runs. Authored as XML, validated and published through the Tableau MCP, 2026-09-10. Restyled to the mark color 2026-09-17.

#What happened

The spec was five lines: the measure, what to slice it by, the sort, the title, the color. The agent turned that into a .twb, the same file Desktop saves. The server sent back errors by line number until it was right, then published it. The proof is a PNG and a CSV, and if the CSV doesn't sum to 400, nothing publishes.

One snag worth knowing: Tableau's newest strict schema won't validate, because of two errors in Tableau's own published schema. So the agent writes the older grammar, the one Tableau 2026.1 still writes when you download a workbook, and the server takes it.

The red bars took. The font didn't show up in the render. The number and the sort held.

#How you know it's right

The 400 is home runs witnessed, written down once in dbt: a play in a game I attended with event code 23. Every bar is that definition by year. Five other engines answer the same question through their own semantic layers and say 400 too. That's in the standings.

The chart is the photo. The definition is the contract. That's why the lineup leads off with a bar chart and not an agent: it's where you're standing, and it's a question you already know how to ask.

One workbook, one sheet, my data at demo scale. No dashboards.

#From the shoebox

Poppa's scorecard, August 7, 1988, Twins at Yankees. Top left: four crowd guesses, 49,000, 48,000, 54,875, 51,500, and ACTUAL 53,176 circled. Bottom: Winner Dotson
Poppa's card, top-left corner. Four guesses at the crowd, then the word ACTUAL and 53,176, circled. Top right, who was there: George, Georgie, Bob and me. Bottom: Winner Dotson. The whole piece is in that corner.

#Try this

You need a Tableau Cloud site you can publish to, a personal access token, Node, and Claude Code or any agent that speaks MCP.

  1. Install Tableau's MCP server. npm install @tableau/mcp-server. Point it at your site with four environment variables: SERVER, SITE_NAME, PAT_NAME, PAT_VALUE.
  2. Turn publishing on. The publish-workbook tool ships switched off. In the version I used, 4.8.1, it's a flag called authoring-tools in the package's build/features.json. Set it to true. While you're there, expose only what you need: INCLUDE_TOOLS=list-projects,publish-workbook.
  3. Publish the data source first. The workbook points at a published source, so there's no connection to embed and nothing to break.
  4. Write the spec, not the XML. Five lines: measure, by what, sort, title, color. Give it to the agent and let it write the .twb.
  5. Tell it which grammar. Workbook version 18.1, classic manifest. The newer strict grammar won't pass, for the reason above.
  6. Let the server grade it. Call publish-workbook. If the file is wrong you get errors by line number and nothing publishes. Hand them back to the agent and go again.
  7. Check the number. Pull the view's image and data back through the REST API and make sure the data adds up to what your definition says. Mine: 400.

As of September 2026, on version 4.8.1. The MCP server moves fast; check its README for the current switch.

#What it taught me

  1. The chart was never the hard part. An agent made it from five lines. It can't decide what a home run is. That call lives upstream of every tool, in the contract.
  2. Trust the server, not the file. A local schema said the strict grammar was fine. The server said no, with a line number.
  3. Next to Tableau, never instead of. Every door in the lineup redraws this chart. Tableau drew it first.

Next, batting 2nd: What is a home run? →