Power BI Authoring MCP Server
OFFICIAL SERVERMicrosoft's local server for building and editing Power BI semantic models from an AI agent
Query Tableau data sources, explore workbooks and views, and read Pulse metrics from an assistant
Official · Tableau TypeScript Remote (hosted) · Streamable HTTPLocal · stdio Data and analytics
79 popularity score ★ 368 ↓ 18k/wk
Opens the app, which asks before it adds the server.
claude mcp add --transport http Tableau https://mcp.tableau.comhttps://mcp.tableau.comhttps://mcp.tableau.comOpens the app, which asks before it adds the server. Then replace each <NAME> in its settings with your value.
It needs SERVER, SITE_NAME, PAT_NAME, PAT_VALUE. Replace each <NAME> with your value.
claude mcp add tableau -e SERVER=<SERVER> -e SITE_NAME=<SITE_NAME> -e PAT_NAME=<PAT_NAME> -e PAT_VALUE=<PAT_VALUE> -- npx -y @tableau/mcp-server@latest{
"mcpServers": {
"tableau": {
"command": "npx",
"args": [
"-y",
"@tableau/mcp-server@latest"
],
"env": {
"SERVER": "<SERVER>",
"SITE_NAME": "<SITE_NAME>",
"PAT_NAME": "<PAT_NAME>",
"PAT_VALUE": "<PAT_VALUE>"
}
}
}
}{
"mcpServers": {
"tableau": {
"command": "npx",
"args": [
"-y",
"@tableau/mcp-server@latest"
],
"env": {
"SERVER": "<SERVER>",
"SITE_NAME": "<SITE_NAME>",
"PAT_NAME": "<PAT_NAME>",
"PAT_VALUE": "<PAT_VALUE>"
}
}
}
}{
"servers": {
"tableau": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@tableau/mcp-server@latest"
],
"env": {
"SERVER": "<SERVER>",
"SITE_NAME": "<SITE_NAME>",
"PAT_NAME": "<PAT_NAME>",
"PAT_VALUE": "<PAT_VALUE>"
}
}
}
}[mcp_servers.tableau]
command = "npx"
args = ["-y", "@tableau/mcp-server@latest"]
[mcp_servers.tableau.env]
SERVER = "<SERVER>"
SITE_NAME = "<SITE_NAME>"
PAT_NAME = "<PAT_NAME>"
PAT_VALUE = "<PAT_VALUE>"gemini mcp add --scope user -e SERVER=<SERVER> -e SITE_NAME=<SITE_NAME> -e PAT_NAME=<PAT_NAME> -e PAT_VALUE=<PAT_VALUE> tableau npx -- -y @tableau/mcp-server@latestOpens the app, which asks before it adds the server. Then replace each <NAME> in its settings with your value.
It needs SERVER, SITE_NAME, PAT_NAME, PAT_VALUE. Replace each <NAME> with your value.
git clone https://github.com/tableau/tableau-mcp.git
cd tableau-mcp
npm install
npm run build:dockerclaude mcp add tableau -e SERVER=<SERVER> -e SITE_NAME=<SITE_NAME> -e PAT_NAME=<PAT_NAME> -e PAT_VALUE=<PAT_VALUE> -- docker run -i --rm -e SERVER -e SITE_NAME -e PAT_NAME -e PAT_VALUE tableau-mcp{
"mcpServers": {
"tableau": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"SERVER",
"-e",
"SITE_NAME",
"-e",
"PAT_NAME",
"-e",
"PAT_VALUE",
"tableau-mcp"
],
"env": {
"SERVER": "<SERVER>",
"SITE_NAME": "<SITE_NAME>",
"PAT_NAME": "<PAT_NAME>",
"PAT_VALUE": "<PAT_VALUE>"
}
}
}
}{
"mcpServers": {
"tableau": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"SERVER",
"-e",
"SITE_NAME",
"-e",
"PAT_NAME",
"-e",
"PAT_VALUE",
"tableau-mcp"
],
"env": {
"SERVER": "<SERVER>",
"SITE_NAME": "<SITE_NAME>",
"PAT_NAME": "<PAT_NAME>",
"PAT_VALUE": "<PAT_VALUE>"
}
}
}
}{
"servers": {
"tableau": {
"type": "stdio",
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-e",
"SERVER",
"-e",
"SITE_NAME",
"-e",
"PAT_NAME",
"-e",
"PAT_VALUE",
"tableau-mcp"
],
"env": {
"SERVER": "<SERVER>",
"SITE_NAME": "<SITE_NAME>",
"PAT_NAME": "<PAT_NAME>",
"PAT_VALUE": "<PAT_VALUE>"
}
}
}
}[mcp_servers.tableau]
command = "docker"
args = ["run", "-i", "--rm", "-e", "SERVER", "-e", "SITE_NAME", "-e", "PAT_NAME", "-e", "PAT_VALUE", "tableau-mcp"]
[mcp_servers.tableau.env]
SERVER = "<SERVER>"
SITE_NAME = "<SITE_NAME>"
PAT_NAME = "<PAT_NAME>"
PAT_VALUE = "<PAT_VALUE>"gemini mcp add --scope user -e SERVER=<SERVER> -e SITE_NAME=<SITE_NAME> -e PAT_NAME=<PAT_NAME> -e PAT_VALUE=<PAT_VALUE> tableau docker -- run -i --rm -e SERVER -e SITE_NAME -e PAT_NAME -e PAT_VALUE tableau-mcpOpens the app, which asks before it adds the server. Then replace each <NAME> in its settings with your value.
It needs SERVER, SITE_NAME, PAT_NAME, PAT_VALUE. Replace each <NAME> with your value.
git clone https://github.com/tableau/tableau-mcp.git
cd tableau-mcp
npm install
npm run buildclaude mcp add tableau -e SERVER=<SERVER> -e SITE_NAME=<SITE_NAME> -e PAT_NAME=<PAT_NAME> -e PAT_VALUE=<PAT_VALUE> -- node '<ABSOLUTE_PATH_TO_CLONE>/build/index.js'{
"mcpServers": {
"tableau": {
"command": "node",
"args": [
"<ABSOLUTE_PATH_TO_CLONE>/build/index.js"
],
"env": {
"SERVER": "<SERVER>",
"SITE_NAME": "<SITE_NAME>",
"PAT_NAME": "<PAT_NAME>",
"PAT_VALUE": "<PAT_VALUE>"
}
}
}
}{
"mcpServers": {
"tableau": {
"command": "node",
"args": [
"<ABSOLUTE_PATH_TO_CLONE>/build/index.js"
],
"env": {
"SERVER": "<SERVER>",
"SITE_NAME": "<SITE_NAME>",
"PAT_NAME": "<PAT_NAME>",
"PAT_VALUE": "<PAT_VALUE>"
}
}
}
}{
"servers": {
"tableau": {
"type": "stdio",
"command": "node",
"args": [
"<ABSOLUTE_PATH_TO_CLONE>/build/index.js"
],
"env": {
"SERVER": "<SERVER>",
"SITE_NAME": "<SITE_NAME>",
"PAT_NAME": "<PAT_NAME>",
"PAT_VALUE": "<PAT_VALUE>"
}
}
}
}[mcp_servers.tableau]
command = "node"
args = ["<ABSOLUTE_PATH_TO_CLONE>/build/index.js"]
[mcp_servers.tableau.env]
SERVER = "<SERVER>"
SITE_NAME = "<SITE_NAME>"
PAT_NAME = "<PAT_NAME>"
PAT_VALUE = "<PAT_VALUE>"gemini mcp add --scope user -e SERVER=<SERVER> -e SITE_NAME=<SITE_NAME> -e PAT_NAME=<PAT_NAME> -e PAT_VALUE=<PAT_VALUE> tableau node -- '<ABSOLUTE_PATH_TO_CLONE>/build/index.js'SERVER |
Required: URL of the Tableau Server, or the Cloud pod (e.g. https://prod-useast-c.online.tableau.com). |
|---|---|
SITE_NAME |
Required: Content URL of the site. It may be blank on Tableau Server for the default site. |
AUTH |
Optional: pat, uat, direct-trust, oauth or passthrough. Each mode other than pat needs its own settings. |
INCLUDE_TOOLS |
Optional: Comma-separated tools or groups to offer. All are offered by default. EXCLUDE_TOOLS hides tools instead, and the two cannot be set together. |
ADMIN_TOOLS_ENABLED |
Optional: true turns on the admin-only tools. |
FLOW_WRITE_TOOLS_ENABLED |
Optional: false hides run-flow, run-flow-task and cancel-flow-run. When unset the flow-write-tools flag (on) decides. FLOW_READ_TOOLS_ENABLED does the same for the read-only flow tools. |
KNOWLEDGE_TOOLS_ENABLED |
Optional: true registers the knowledge read tools on sites that have Tableau Knowledge. When unset the knowledge-tools flag (off) decides. |
KNOWLEDGE_WRITE_TOOLS_ENABLED |
Optional: true registers manage-knowledge-context, but only when KNOWLEDGE_TOOLS_ENABLED is true too. When unset the knowledge-write-tools flag (off) decides. |
INSIGHTS_TOOLS_ENABLED |
Optional: true registers generate-insight-cards. |
PRODUCT_TELEMETRY_ENABLED |
Optional: Sends a usage event to Tableau on each tool call. Only the value false stops it. |
| Set together: pat | |
PAT_NAME |
Required: Name of the personal access token (not your username). |
PAT_VALUE secret |
Required: Secret value of the personal access token. |
In a container, a setting goes in with -e NAME=value after docker run.
Tableau MCP is Tableau's own server for working with a Tableau Cloud or Tableau Server site from an assistant. It can list published data sources, read their fields and run queries against them through the VizQL Data Service. Workbooks and views can be found, downloaded and exported as data or images. It also searches site content and reads Pulse metrics. Some tools change things. Publishing a workbook or running a Prep flow are examples, and with admin tools switched on it can also change user roles or delete content after a preview.
You can use it two ways. Tableau hosts a copy at https://mcp.tableau.com for Tableau Cloud, where each person signs in with OAuth under their own permissions. The other way is to run the npm package yourself, with npx or from a clone or as a Docker image you build. That works against Cloud or Server and signs in with a personal access token unless AUTH says otherwise. The repo can also build a standalone executable that needs no Node install. The npm package carries the Web server only, so the Tableau Desktop authoring tools come from a separate build of the same repo.
The tool list in src/tools/web/toolName.ts has 55 tools, though not all of them show up by default. features.json turns the Prep flow tools on, run-flow included, and leaves the knowledge and MCP app tools off along with data apps. The knowledge tools now have their own switches: KNOWLEDGE_TOOLS_ENABLED for the two read tools, and KNOWLEDGE_WRITE_TOOLS_ENABLED for manage-knowledge-context, which also needs the read switch on. Admin tools stay hidden until ADMIN_TOOLS_ENABLED=true. Insight cards wait for INSIGHTS_TOOLS_ENABLED=true. The same file now turns role and registration checks on by default, so a user whose site role is too low, or a site that lacks a feature, may see fewer tools than the list holds.
| To run it yourself | Node.js 22.7.5+ |
|---|---|
| Runs on | macOS, Windows, Linux |
| Tableau Cloud or Tableau Server | Paid planA user with API access and a personal access token. Admin tools need a site or server administrator role. |
Create a personal access token under your Tableau account settings. Pass its name and secret as PAT_NAME and PAT_VALUE, next to SERVER and SITE_NAME. Pulse needs Tableau Cloud. Insight Brief and the knowledge tools need Tableau+, and flow runs need Data Management with Prep Conductor. For the hosted way you need a Tableau Cloud account, and in Claude Code you run /mcp and choose Authenticate.
It suits Tableau customers who want an assistant to answer questions from published data sources or to find and export workbooks and views. On Tableau Cloud the hosted endpoint spares you a token and a Node install, and each user only sees what their own permissions allow. Tableau Server sites, or teams that want the admin tools under their own control, should run the package themselves. Flow runs are on by default there, so set FLOW_WRITE_TOOLS_ENABLED=false or use INCLUDE_TOOLS if the assistant should only read. It needs a Tableau site to do anything.
37 only read, 15 change things, 3 can delete or overwrite.
list-datasourcesget-datasource-metadataquery-datasourcelist-workbooksget-workbookdownload-workbookmove-workbook changesrequest-workbook-upload changespublish-workbook changesrequest-datasource-upload changespublish-datasource changeslist-projectslist-viewslist-custom-viewsget-viewget-view-dataget-view-imageget-custom-view-dataget-custom-view-imagesearch-contentlist-flowsget-flowdescribe-flowlist-flow-runslist-flow-tasksget-flow-taskrun-flow changesrun-flow-task changescancel-flow-run changeslist-all-pulse-metric-definitionslist-pulse-metric-definitions-from-definition-idslist-pulse-metrics-from-metric-definition-idlist-pulse-metrics-from-metric-idslist-pulse-metric-subscriptionsgenerate-pulse-metric-value-insight-bundlegenerate-pulse-insight-briefgenerate-insight-cardslist-extract-refresh-tasksupdate-cloud-extract-refresh-task changesconfirm-update-cloud-extract-refresh-task changeslist-jobslist-usersupdate-user changesquery-admin-insightsdelete-content deletesconfirm-delete-content deletesquery-knowledge-contextinspect-knowledge-contextmanage-knowledge-context deletesget-embed-tokenrender-interactive-vizrecord-event changesrevoke-access-token changesreset-consent changesscaffold-data-app changes