Atlas / MCP servers / tableau / Tableau MCP

Tableau MCPCAUTION

mcp/tableau/tableau-mcp

Tableau's official MCP Server. Helping agents see and understand data.

Verdict
CAUTION
Grade
C
Trust score
70 /100
Exposed tools
9 6r · 3w · 0d
Transport
stdio · streamable-http
License
Apache-2.0
Stars
351
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

[](https://www.tableau.com/support-levels-it-and-developer-tools)

[](https://github.com/tableau/tableau-mcp/actions/workflows/ci.yml)

[](https://www.npmjs.com/package/@tableau/mcp-server)

Overview

Tableau MCP is a suite of developer primitives, including tools, resources and prompts, that will make it easier for developers to build AI applications that integrate with Tableau.

Official Documentation

https://tableau.github.io/tableau-mcp/

Getting Started

Hosted Tableau MCP (Recommended for Tableau Cloud)

Tableau MCP is available as a managed service at `https://mcp.tableau.com`. It uses OAuth 2.1 so every user signs in with their own Tableau Cloud identity, and all existing per-user permissions are enforced automatically.

Point any MCP-compatible client at https://mcp.tableau.com and complete the OAuth sign-in flow when prompted.

See Popular Client Integrations for step-by-step setup instructions for Slack, Claude, ChatGPT, and other common AI clients.

Tableau Server customers and Cloud customers who require self-hosted infrastructure should see the Enterprise Deployment and Self-Hosted Getting Started guides.

Self-Hosted / Local (npx)

The quickest way to run Tableau MCP locally. Requires Node.js 22.7.5 or later — no cloning or building needed. Configure your AI tool (MCP client) with:

{
"mcpServers": {
"tableau": {
"command": "npx",
"args": ["-y", "@tableau/mcp-server@latest"],
"env": {
"SERVER":
Read from source at commit 4f9cfb82edf3OBSERVED · 2026-10-12
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code
claude mcp add mcp-server --env AUTH=${AUTH} --env OAUTH_DISABLE_SCOPES=${OAUTH_DISABLE_SCOPES} --env OAUTH_EMBEDDED_AUTHZ_SERVER=${OAUTH_EMBEDDED_AUTHZ_SERVER} --env OAUTH_ISSUER=${OAUTH_ISSUER} -- npx -y @tableau/[email protected]
claude-desktop
{
  "mcpServers": {
    "mcp-server": {
      "command": "npx",
      "args": [
        "-y",
        "@tableau/[email protected]"
      ],
      "env": {
        "AUTH": "${AUTH}",
        "OAUTH_DISABLE_SCOPES": "${OAUTH_DISABLE_SCOPES}",
        "OAUTH_EMBEDDED_AUTHZ_SERVER": "${OAUTH_EMBEDDED_AUTHZ_SERVER}",
        "OAUTH_ISSUER": "${OAUTH_ISSUER}"
      }
    }
  }
}
03

Exposed tools (9)

6 read · 3 write · 0 destructive.

ToolRiskDescription
DefaultreadThe default project that was automatically created by Tableau.
Primaryread
SamplesreadSample content shipped with Tableau.
extract-optimization-applywriteTableau Cloud admin workflow (destructive Apply phase): take the recommendations from the
job-optimization-informreadTableau Cloud admin workflow: analyze Admin Insights job performance and surface optimization
stale-content-cleanup-applywriteTableau Cloud admin workflow (destructive Apply phase): find stale workbooks and published
stale-content-cleanup-informreadTableau Cloud admin workflow: identify stale workbooks and published datasources by
user-license-reclamation-applywriteTableau Cloud admin workflow (destructive Apply phase): identify inactive licensed users
user-license-reclamation-informreadTableau Cloud admin workflow: identify inactive licensed users who are candidates for
04

Trust audit

CAUTIONgrade C · trust 70/100 Install with care. The audit found things worth knowing before you trust its output.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeWARN
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfacePASS
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (1 observation(s))
Network
declared (2 observation(s))
Shell
none-observed
Dependencies
not all pinned
Secrets in source
found

Findings (23)

MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
src/tools/web/tool.test.ts:603
token: 'fake-mcp-access-token',
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
src/web/apps/src/embed/getEmbedTokenToolClient.test.ts:17
token: 'test-bearer-token-12345',
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
tests/oauth/embedded-authz/oauth.test.ts:827
.send({ token: 'unknown-token-that-does-not-exist' });
MEDIUMHard-coded secrets · secret.private_key · CWE-798, CWE-321
docs/docs/configuration/mcp-config/authentication/uat.md:68
-----BEGIN RSA PRIVATE KEY-----\nMIIE...HZ3Q==\n-----END RSA PRIVATE KEY-----
MEDIUMHard-coded secrets · secret.private_key · CWE-798, CWE-321
docs/docs/configuration/mcp-config/oauth.md:229
-----BEGIN RSA PRIVATE KEY-----\nMIIE...HZ3Q==\n-----END RSA PRIVATE KEY-----
MEDIUMHard-coded secrets · secret.private_key · CWE-798, CWE-321
docs/docs/enterprise/tableau-server.md:249
#OAUTH_JWE_PRIVATE_KEY=-----BEGIN RSA PRIVATE KEY-----\nMIIE...HZ3Q==\n-----END RSA PRIVATE KEY-----
LOWInventory / provenance · inv.binary · CWE-1104
tests/e2e/fixtures/workbooks/badtwbx.twbx
badtwbx.twbx
Why it matters. a compiled or binary member cannot be reviewed from source
Fix. ship source, or explain the binary in the README
LOWInventory / provenance · inv.hidden_file · CWE-1104
.mcpbignore
.mcpbignore
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
docs/static/.nojekyll
.nojekyll
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/desktop/commands/workbook/getWorkbookXml.test.ts:3
import { LocalExecutor } from '../../toolExecutor/localToolExecutor.js';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/desktop/commands/workbook/getWorkbookXml.test.ts:6
vi.mock('../../toolExecutor/localToolExecutor.js');
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/desktop/commands/workbook/getWorkbookXml.ts:7
} from '../../toolExecutor/toolExecutor.js';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/desktop/commands/workbook/listDashboards.test.ts:3
import { LocalExecutor } from '../../toolExecutor/localToolExecutor.js';
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/desktop/commands/workbook/listDashboards.test.ts:6
vi.mock('../../toolExecutor/localToolExecutor.js');
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
.github/actions/run-oauth-embedded-authz-tests/action.yml:10
OAUTH_ISSUER: http://127.0.0.1:3927
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
docs/docs/configuration/mcp-config/oauth.md:63
- Example: `http://127.0.0.1:3927` (for local testing) or `https://tableau-mcp.example.com` (for
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
docs/docs/configuration/mcp-config/oauth.md:153
- Default: `http://127.0.0.1:3927`
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
docs/docs/configuration/mcp-config/oauth.md:154
- Example: `http://127.0.0.1:3927` (for local testing) or `https://tableau-mcp.example.com` (for
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
docs/docs/enterprise/tableau-cloud.md:455
request (e.g. from the web browser) to http://127.0.0.1:3927/tableau-mcp, you'll see a message like:
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
docs/package.json
@docusaurus/core, @docusaurus/faster, @docusaurus/plugin-content-docs, @docusaurus/preset-classic, @docusaurus/theme-mermaid, @mdx-js/react, clsx, prism-react-renderer
Why it matters. 14 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
package.json
@aws-sdk/client-s3, @aws-sdk/s3-request-presigner, @mjackson/multipart-parser, @modelcontextprotocol/ext-apps, @modelcontextprotocol/sdk, @xmldom/xmldom, @zodios/core, cookie-parser
Why it matters. 54 dependency range(s) float
Fix. pin exact versions or ship a lockfile
INFOInventory / provenance · inv.oversize · CWE-1104
tests/e2e/fixtures/workbooks/forecast.twbx
tests/e2e/fixtures/workbooks/forecast.twbx
Why it matters. 21286080 bytes not read
INFOPrompt injection · prompt.credential_read · CWE-94, CWE-1427
AGENTS.md:55
Never read or modify: `.env*`, `env.list`, `env.example.list` real values, PAT/UAT/Connected-App credentials, OAuth secrets, tokens, private keys. Logging masks PATs/tokens — do not disable masking (`
Why it matters. asks the agent to read credentials

Gates applied: no_behavioural_pass.

Audited 2026-10-12 · audit v0.4.1 · source sha 4f9cfb82edf3full audit observations/trust-audit/mcp-server/tableau__tableau-mcp.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-124f9cfb82edf3CAUTIONC70first audit
06

Questions

What is the @tableau/mcp-server MCP server?

Tableau's official MCP Server. Helping agents see and understand data.

What tools does @tableau/mcp-server expose?

9 in total: 6 read-only, 3 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.

Is @tableau/mcp-server safe to connect to an agent?

With care. The audit graded it C (70/100) and found 23 things worth knowing before you trust this server, listed below with the exact line each was found on.

What credentials does @tableau/mcp-server need?

It reads AUTH, OAUTH_DISABLE_SCOPES, OAUTH_EMBEDDED_AUTHZ_SERVER, OAUTH_ISSUER and OAUTH_REFRESH_TOKEN_TIMEOUT_MS from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does @tableau/mcp-server run?

It speaks stdio and streamable-http, so it runs as a local process your client starts. It is published on npm as @tableau/mcp-server at 4.22.3.

How current is this page?

The grade is for one exact copy of the source (4f9cfb82edf3), read on 2026-10-12. The repository is watched and re-audited when it changes.

Advertisement