/ Directory / Playground / Tableau MCP
● Official tableau 🔑 Needs your key

Tableau MCP

by tableau · tableau/tableau-mcp

Tableau's official MCP — give agents scoped access to your datasources, workbooks, and view images via PAT, not screenshots.

tableau-mcp is Tableau's first-party MCP server. Configure it with your Tableau Cloud/Server URL, site name, and a Personal Access Token, and agents can query published datasources, list and explore workbook content, retrieve view images, and answer natural-language data questions without you pasting CSVs into chat. Supports npx, Heroku, and Docker deploys.

Why use it

Key features

Live Demo

What it looks like in practice

tableau-mcp.replay ▶ ready
0/0

Install

Pick your client

~/Library/Application Support/Claude/claude_desktop_config.json  · Windows: %APPDATA%\Claude\claude_desktop_config.json
{
  "mcpServers": {
    "tableau-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@tableau/mcp-server@latest"
      ],
      "env": {
        "SERVER": "https://your-server.tableau.com",
        "SITE_NAME": "your-site",
        "PAT_NAME": "claude-agent",
        "PAT_VALUE": "<personal-access-token>"
      }
    }
  }
}

Open Claude Desktop → Settings → Developer → Edit Config. Restart after saving.

~/.cursor/mcp.json · .cursor/mcp.json
{
  "mcpServers": {
    "tableau-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@tableau/mcp-server@latest"
      ],
      "env": {
        "SERVER": "https://your-server.tableau.com",
        "SITE_NAME": "your-site",
        "PAT_NAME": "claude-agent",
        "PAT_VALUE": "<personal-access-token>"
      }
    }
  }
}

Cursor uses the same mcpServers schema as Claude Desktop. Project config wins over global.

VS Code → Cline → MCP Servers → Edit
{
  "mcpServers": {
    "tableau-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@tableau/mcp-server@latest"
      ],
      "env": {
        "SERVER": "https://your-server.tableau.com",
        "SITE_NAME": "your-site",
        "PAT_NAME": "claude-agent",
        "PAT_VALUE": "<personal-access-token>"
      }
    }
  }
}

Click the MCP Servers icon in the Cline sidebar, then "Edit Configuration".

~/.codeium/windsurf/mcp_config.json
{
  "mcpServers": {
    "tableau-mcp": {
      "command": "npx",
      "args": [
        "-y",
        "@tableau/mcp-server@latest"
      ],
      "env": {
        "SERVER": "https://your-server.tableau.com",
        "SITE_NAME": "your-site",
        "PAT_NAME": "claude-agent",
        "PAT_VALUE": "<personal-access-token>"
      }
    }
  }
}

Same shape as Claude Desktop. Restart Windsurf to pick up changes.

~/.continue/config.json
{
  "mcpServers": [
    {
      "name": "tableau-mcp",
      "command": "npx",
      "args": [
        "-y",
        "@tableau/mcp-server@latest"
      ]
    }
  ]
}

Continue uses an array of server objects rather than a map.

~/.config/zed/settings.json
{
  "context_servers": {
    "tableau-mcp": {
      "command": {
        "path": "npx",
        "args": [
          "-y",
          "@tableau/mcp-server@latest"
        ]
      }
    }
  }
}

Add to context_servers. Zed hot-reloads on save.

claude mcp add tableau-mcp -- npx -y @tableau/mcp-server@latest

One-liner. Verify with claude mcp list. Remove with claude mcp remove.

Use Cases

Real-world ways to use Tableau MCP

Answer a business question against a published datasource

👤 Analysts and ops folks who live in chat ⏱ ~10 min beginner

When to use: You have a question a Tableau dashboard could answer, but you don't want to open Tableau Desktop.

Prerequisites
  • Tableau Cloud or Server account — Ask your admin for access if you don't have it
  • Personal Access Token — My Account Settings → Personal Access Tokens → Create token
Flow
  1. Find the datasource
    List published datasources on site 'ops'.✓ Copied
    → Array of datasources with names and IDs
  2. Ask the question
    From the 'orders_fact' datasource, what were top 10 products by revenue last quarter?✓ Copied
    → Numeric answer referencing fields that exist in the datasource

Outcome: A concrete answer grounded in your governed Tableau data.

Pitfalls
  • Asking about fields that aren't in the published datasource — Let the agent list metadata first, then ask
Combine with: bigquery-server · postgres

Embed a Tableau view image in a report document

👤 PMs and analysts writing weekly reports ⏱ ~5 min beginner

When to use: You want the latest view of a Tableau chart inside a Notion or Google Doc.

Prerequisites
  • The view URL or its site/workbook/view path — Copy from the Tableau UI
Flow
  1. Fetch the image
    Get a PNG of the 'Weekly Revenue' view from workbook 'Exec Scorecard'.✓ Copied
    → Image returned inline
  2. Paste it
    Attach it to the report in Notion with a short caption.✓ Copied
    → Image appears where you want it

Outcome: Always-fresh view images with no screenshot step.

Pitfalls
  • Filters in the URL getting lost — Pass filter params explicitly in the tool call
Combine with: notion

Audit workbooks for ownership and staleness

👤 Platform/data governance teams ⏱ ~25 min intermediate

When to use: You're cleaning up a noisy site before an access review.

Flow
  1. List all workbooks with owner + last-view date
    Enumerate workbooks on site 'ops' with owner, last_viewed, and project.✓ Copied
    → Table of workbooks sortable by recency
  2. Flag dead ones
    Mark workbooks not viewed in 180+ days as candidates for archive.✓ Copied
    → Filtered list you can hand to owners

Outcome: A concrete to-archive list, backed by real usage data.

Combine with: linear

Cross-check a Tableau number against the warehouse directly

👤 Data engineers debugging discrepancies ⏱ ~20 min intermediate

When to use: Your dashboard disagrees with the finance team's spreadsheet and you want to find where.

Flow
  1. Read the Tableau answer
    What does Tableau say revenue was for last month?✓ Copied
    → Single number + datasource + extract/live info
  2. Run the same aggregation on the warehouse
    Run the equivalent SQL on BigQuery and diff.✓ Copied
    → Both numbers side by side + delta explanation

Outcome: You find the drift (extract staleness? filter? join?) quickly.

Pitfalls
  • Comparing against live vs extract without noting it — Agent should print the datasource type before the number
Combine with: bigquery-server

Combinations

Pair with other MCPs for X10 leverage

tableau-mcp + bigquery-server

Reconcile a Tableau metric against warehouse SQL

Pull the Tableau value and the warehouse SQL answer and diff them.✓ Copied
tableau-mcp + postgres

Same workflow against an operational DB

Check why the orders_fact extract disagrees with the live orders table today.✓ Copied
tableau-mcp + notion

Embed live view images in weekly reports

Put the latest Weekly Revenue PNG at the top of the Notion report.✓ Copied

Tools

What this MCP exposes

ToolInputsWhen to callCost
list_datasources site?: str Discover what data is published before asking questions 1 API call
query_datasource datasource_id: str, question: str Answer a natural-language data question 1 API call + VizQL
list_workbooks site?: str, project?: str Browse or audit workbook inventory 1 API call
get_view_image view_id: str, filters?: map Include the chart image in a doc or reply 1 API call
list_views workbook_id: str Enumerate charts inside a workbook 1 API call

Cost & Limits

What this costs to run

API quota
Bound by your Tableau Cloud/Server REST API limits
Tokens per call
Small for metadata; view images are bytes, not tokens
Monetary
Free — your Tableau license already covers it
Tip
Cache list_workbooks / list_datasources results for audits; the inventory doesn't change every minute.

Security

Permissions, secrets, blast radius

Credential storage: PAT_VALUE belongs in env vars; never commit it. Rotate from the Tableau UI if leaked.
Data egress: All traffic goes to your configured Tableau SERVER URL. No third-party calls.

Troubleshooting

Common errors and fixes

401 / Signin failed

PAT expired or site mismatch. Regenerate the PAT and confirm SITE_NAME matches the site URL segment.

Verify: Log into Tableau and look at the URL: /site/<SITE_NAME>/...
Datasource not found

It may be unpublished or live in a different project. Call list_datasources to see what's visible to the token.

Verify: list_datasources with no filter
View image returns forbidden

The PAT owner lacks view permissions on that workbook. Have admin grant Read.

Verify: Open the view URL in a browser with the same user

Alternatives

Tableau MCP vs others

AlternativeWhen to use it insteadTradeoff
bigquery-serverYou want raw warehouse SQL, not governed semantic datasourcesMore power, no Tableau-owned metrics
postgresYour source of truth is operational Postgres, not a BI toolNo VizQL layer

More

Resources

📖 Read the official README on GitHub

🐙 Browse open issues

🔍 Browse all 400+ MCP servers and Skills