Announcing CIMD support for MCP Client registration
Learn more

Tableau MCP vs Tableau API for AI Agents (2026)

Saif Ali Shaik
Founding Developer Advocate

TL;DR

  • Tableau MCP is Tableau's official, open-source server. It exposes a curated catalog of roughly thirty tools across data Q&A, workbooks, views, jobs, projects, Pulse, users, and admin insights. Content publishing, Hyper extract operations, the full Metadata GraphQL surface, and webhook event subscriptions are not MCP tools; they live in the direct API.
  • The auth story is not "MCP is OAuth-only." The hosted Tableau MCP is OAuth 2.1 and interactive, Tableau Cloud only. The self-hosted MCP supports Personal Access Tokens, Connected Apps (JWT), Unified Access Tokens, OAuth, and passthrough. The direct API adds Connected Apps JWT for clean headless server-to-server access. Your credential model changes with the path you pick.
  • For a multi-tenant B2B agent, neither path eliminates per-user credential isolation. Every analyst carries their own Tableau credential, which is N credentials to store, refresh, and revoke. That is an infrastructure problem regardless of which path you build against.
  • Hosted MCP is the fastest route for interactive, user-present agents on Tableau Cloud. The direct API gives you headless execution, publishing, bulk operations, and endpoint versioning for deterministic pipelines.
  • Scalekit's Tableau connector stores each user's Tableau credential, signs in, and refreshes the session token automatically, so the MCP vs API decision does not change your auth infrastructure.

Your BI agent needs to read Tableau. It has to query a published data source before a pipeline review, pull the numbers behind an executive dashboard, and check whether last night's extract refresh actually finished. Tableau ships both an official MCP server (hosted at mcp.tableau.com and self-hostable) and a mature API surface spanning REST, the VizQL Data Service, Metadata, and Pulse. They cover overlapping but not identical territory, and they do not put you on the same auth path. For Tableau specifically, the auth fork is the part most teams get wrong. Here's how to pick.

What Tableau MCP and Tableau API actually are

Tableau MCP

Tableau MCP is Tableau's official Model Context Protocol server, an open-source project maintained by Tableau under github.com/tableau/tableau-mcp. It ships in two forms. The hosted service runs as a managed endpoint on every Tableau Cloud pod at a single URL, https://mcp.tableau.com, with pod-aware routing and no infrastructure to deploy. The self-hosted build (Docker or Node) is for Tableau Server customers, or Cloud customers who need to run the server inside their own network.

Both forms proxy each tool call to the same underlying Tableau APIs (REST, VizQL Data Service, Metadata, Pulse) using the signed-in user's access token, so existing per-user permissions apply automatically. Official docs: tableau.github.io/tableau-mcp/docs/intro.

Tableau API

Tableau is not a single API. Agents reason about four surfaces. The REST API handles content: workbooks, views, data sources, projects, users, groups, jobs, tasks, publishing, and permissions, on a date-versioned contract (currently the 3.2x line). The VizQL Data Service (VDS) is the headless query layer, returning JSON from published data sources without rendering a viz. The Metadata API is a GraphQL surface for lineage and catalog. The Pulse API exposes metric definitions and insights.

Auth accepts a Personal Access Token, a username and password, or a JSON Web Token issued by a Connected App or Unified Access Token, exchanged at sign-in for an X-Tableau-Auth credentials token. Official docs: help.tableau.com/current/api/rest_api/en-us/REST/rest_api.htm.

Comparing them where it matters for agents

What your agent can actually do

The hosted MCP covers most of what a BI agent needs day to day: asking questions of a governed data source, browsing content, discovering Pulse metrics, and checking refresh jobs. The gaps show up when the agent has to publish content, move data at volume, trace lineage in depth, or react to events.

Capability
Tableau MCP
Tableau API
Query published data sources (VizQL Data Service)
Yes (Data Q&A tools)
Yes (VizQL Data Service)
Browse workbooks, views, and data sources
Yes
Yes (REST)
Discover and query Pulse metrics
Yes (Pulse tools)
Yes (Pulse API)
Manage users, groups, and projects
Yes
Yes (REST)
Monitor jobs and extract refresh tasks
Yes (Jobs, Tasks)
Yes (REST)
Export a view as image, PDF, or data
Partial (Views tools)
Yes (REST)
Content lineage and catalog
Partial (Content Exploration, Admin Insights)
Yes (full Metadata GraphQL API)
Publish or upload workbooks and data sources
Not exposed
Yes (REST publish)
Bulk and high-volume content operations
Not exposed
Yes (REST)
Hyper extract file operations
Not exposed
Yes (Hyper API)
Webhooks and event subscriptions
Not exposed
Yes (Webhooks REST API)
Tableau Server support
Self-hosted MCP only
Yes (Cloud and Server)

Where the MCP ceiling is

The MCP catalog is broad but fixed. It is a request-and-response surface: the agent asks, a tool answers. It does not publish content, run Hyper extract file operations, expose the complete Metadata GraphQL query surface, or manage webhook subscriptions. Those are direct-API capabilities.

Two constraints are worth stating plainly. The hosted MCP is Tableau Cloud only; Server customers must self-host. And some hosted tools are gated by SKU, so a tool the docs list can still return an entitlement error at call time if the signed-in user's site lacks it. If your agent's job is configuring the environment, publishing artifacts, or subscribing to change events, the MCP is not the right layer for that part of the work.

The auth path each one puts you on

This is the section that decides most Tableau builds, and it is more nuanced than the "MCP is OAuth-only" pattern seen with other tools.

The hosted MCP is OAuth 2.1 and interactive. Every user completes a browser sign-in against their own Tableau Cloud identity; there is no static-credential option. That is correct for a user-present assistant, and a hard blocker for an agent running with no human in the loop.

The self-hosted MCP is different. It accepts Personal Access Tokens, Connected Apps using direct trust (JWT), Unified Access Tokens, OAuth, and passthrough. Several of those are non-interactive, so a self-hosted MCP can run headlessly, at the cost of you owning the server.

The direct API is the most flexible. A JWT issued by a Connected App gives you scoped, per-user, server-to-server access with a single sign-in request and no browser, which is the right pattern for background execution.

Path
Auth methods
Headless-capable
Hosted Tableau MCP (mcp.tableau.com)
OAuth 2.1, interactive, per-user, Cloud only
No
Self-hosted Tableau MCP
PAT, Connected Apps (JWT), Unified Access Tokens, OAuth, passthrough
Yes (PAT or Connected Apps)
Direct Tableau API
PAT, username and password, Connected Apps (JWT), Unified Access Tokens
Yes (Connected Apps JWT)

The per-user implication

Tableau's model runs every call as the authenticated user, so field-level security, row-level security, and content permissions apply on every tool call. That is architecturally correct. It also means a multi-tenant B2B agent holds one credential per user, per site. The hosted MCP OAuth flow gives you a token per user; the direct-API PAT or JWT gives you a credential per user. In neither case does the path itself store, rotate, or revoke those credentials for you.

What you own in production

On the hosted MCP path, Tableau owns hosting, scaling, routing, and continuous tool updates. You still own per-user credential storage, refresh, revocation on disconnect, and tenant isolation. You also inherit an unversioned tool contract: because the hosted service ships changes continuously, tool schemas can move without a version you pin to.

On the direct-API path you own more and control more. You select endpoints across four surfaces, each with its own error and retry behavior, and you handle the full credential lifecycle. In exchange you pin an explicit REST API version and migrate on your own schedule, which matters when an unexpected schema change would be an incident rather than an inconvenience.

Rate limits are a shared production constraint

Agentic workflows issue many sequential calls per user action, so limits arrive faster than with a traditional integration. On Tableau Cloud, REST API usage is capped at 40,000 calls per user per site per hour, and requests to endpoints that start long-running jobs are limited to 20 concurrent at a time, with a 429 response when you exceed either. MCP tool calls proxy to the same APIs, so they consume the same budget. Monitor usage from day one; neither path exempts you from the limit.

When to use MCP, when to use the API

Use Tableau MCP when:

  • Your agent is interactive and user-present: an analyst querying a governed data source or checking a dashboard through Claude, ChatGPT, or Cursor on Tableau Cloud.
  • The core job is data Q&A, content browsing, Pulse discovery, and refresh monitoring, and you want Tableau's per-user permissions enforced automatically.
  • You are on Tableau Cloud and want a working agent with no server to deploy, using the hosted endpoint.
  • You want Tableau to own tool maintenance and are comfortable with a continuously updated, unversioned tool surface.

Use the Tableau API directly when:

  • Your agent runs headless on a schedule: nightly extract checks, background metric scoring, automated reporting, where Connected Apps JWT is the right auth and the hosted MCP cannot participate.
  • You need capabilities outside the MCP catalog: publishing or uploading content, Hyper extract operations, the full Metadata GraphQL surface, or webhook event subscriptions.
  • You are on Tableau Server, or you need one deterministic pipeline where you pin an API version.
  • You are moving data at volume and need explicit control over pagination, retries, and rate-limit handling across surfaces.

The credential problem that exists on both paths

The N-credential reality

Both paths hand you a credential per user. Neither hands you a vault, refresh orchestration, or a revocation flow. Picture a BI agent serving 40 analysts across 8 Tableau sites: that is 40 credentials to store encrypted, 40 session tokens to refresh before they expire, and 40 to revoke when someone leaves. The MCP OAuth token and the direct-API PAT differ in type; the infrastructure they demand is identical.

What Scalekit's Agent Auth handles

Scalekit's Tableau connector closes that gap for the direct-API path. You store each user's Personal Access Token once as a connected account, and Scalekit signs in on their behalf and refreshes the Tableau session token automatically, renewing it when it is within five minutes of expiry, so your code never calls the sign-in endpoint. Credentials live in a per-tenant, AES-256 token vault, resolved server-side at request time and never placed in the LLM context. What the user can't do in Tableau, the agent can't do, because the agent acts as that user.

Token Vault, in one line

The value of the vault for a Tableau agent is narrow and concrete: the agent calls a tool, gets a result, and never sees a token. Credentials never touch the agent runtime.

Building on the API path with Scalekit

The connector and its tools

Scalekit's Tableau connector wraps the REST API and the VizQL Data Service behind a set of prebuilt, LLM-ready tools, so you build the agent rather than the tooling. The tool names below are the exact strings you pass to execute_tool.

Tool
Purpose
tableau_workbooks_list
List workbooks on a site, with filter, sort, and pagination
tableau_workbook_search
Find a workbook by name
tableau_views_list
List views across the site or within a workbook
tableau_datasources_list
List published data sources
tableau_query_view
Run a structured VizQL Data Service query against a published data source
tableau_jobs_list
List extract refresh, publish, and flow jobs
tableau_users_list
List site users for permission and attribution checks

For binary exports (PNG, PDF, Excel, .twbx, .tdsx) and any REST endpoint without a dedicated tool, the connector exposes a proxy call that injects the X-Tableau-Auth session token for you. Full tool reference: docs.scalekit.com/agentkit/connectors/tableau.

Scoped tool calling in one framework

The sequence is discovery, then scope, then execution. listScopedTools returns only the tools the current user's connected account is authorized to call, not a flat catalog, and the filter narrows that surface further to the tools this agent actually needs. The connection name string, tableau, must match the connection you configured in the Scalekit dashboard; a mismatch here is the most common integration error. Then the agent runs its normal loop and calls executeTool.

import { ScalekitClient } from "@scalekit-sdk/node"; import Anthropic from "@anthropic-ai/sdk"; const sk = new ScalekitClient(envUrl, clientId, clientSecret); const anthropic = new Anthropic(); // Discovery + scope: only the tools this user's Tableau account authorizes, // narrowed to what this BI agent needs. const { tools } = await sk.tools.listScopedTools("user_123", { filter: { connectionNames: ["tableau"], toolNames: ["tableau_workbooks_list", "tableau_views_list", "tableau_query_view"], }, pageSize: 100, }); const llmTools = tools.map((t) => ({ name: t.tool.definition.name, description: t.tool.definition.description, input_schema: t.tool.definition.input_schema, })); // Execution: the agent loop. let messages = [{ role: "user", content: "Pull Q3 revenue behind the executive dashboard." }]; let response = await anthropic.messages.create({ model: "claude-sonnet-4-6", max_tokens: 1024, tools: llmTools, messages, }); while (response.stop_reason === "tool_use") { const toolUse = response.content.find((b) => b.type === "tool_use"); const { data } = await sk.tools.executeTool({ toolName: toolUse.name, identifier: "user_123", params: toolUse.input, }); messages.push({ role: "assistant", content: response.content }); messages.push({ role: "user", content: [{ type: "tool_result", tool_use_id: toolUse.id, content: JSON.stringify(data) }], }); response = await anthropic.messages.create({ model: "claude-sonnet-4-6", max_tokens: 1024, tools: llmTools, messages, }); }

The same connected-account model backs the Python and Node SDKs, LangChain, Google ADK, OpenAI, and Claude Managed Agents. Getting-started guide: docs.scalekit.com/agentkit/quickstart.

Virtual MCP: one endpoint, per-user identity

If you would rather hand your agent an MCP endpoint than wire tools directly, Scalekit's Virtual MCP Server gives you a scoped, user-specific MCP endpoint with no server to deploy, host, or maintain. You create it once per agent role and declare exactly which connections and tools it exposes; the agent sees only what you allow, not everything the connector exposes.

vmcp = scalekit_client.actions.mcp.create_config( name="bi-reporting-agent", connection_tool_mappings=[ McpConfigConnectionToolMapping( connection_name="tableau", tools=["tableau_workbooks_list", "tableau_views_list", "tableau_query_view"], ), ], ) mcp_server_url = vmcp.config.mcp_server_url

The response returns a static mcp_server_url of the form https://yourcompany.scalekit.com/mcp/v3/servers/<server-id>. One server definition serves every user. Per-user isolation is handled by session tokens: before each run you confirm the user's connection is active, mint a short-lived token scoped to that user's connected account, and pass it as a bearer credential. The endpoint is static; the identity is per-user. A full end-to-end walkthrough lives at docs.scalekit.com/agentkit/examples/claude-managed-agents, and setup steps at docs.scalekit.com/agentkit/mcp/configure-mcp-server.

Observability for multi-tool, multi-tenant agents

A BI agent rarely touches Tableau alone; it also reads a CRM, posts to Slack, and files tickets. Across those tools, shared credentials break attribution: every call in the audit log reads as a service account. Scalekit resolves the real per-user credential on each call, so audit logs attribute every Tableau action to the user who authorized it, with the tool that ran and what came back, retained for 90 days and exportable to your SIEM. That is the difference between "the agent queried a data source" and "user_abc queried the Q3 revenue data source at 18:29, scoped to their permissions." For multi-tenant products, that record is what a security reviewer asks to see.

If the tool you need is not there yet

The connector covers content browsing, VizQL queries, jobs, users, and proxied REST calls, but not everything (for example, content publishing or Hyper extract operations are not prebuilt tools today). If your agent needs a tool that is not yet available, request it: join the Scalekit community on Slack at join.slack.com/t/scalekit-community or talk to the team at scalekit.com/demo-agent-actions.

Which one to build against

If your agent is interactive and user-present on Tableau Cloud, and its job is data Q&A, content browsing, and Pulse discovery, the hosted MCP is the fastest working path, with per-user permissions enforced for you. If your agent runs headless, publishes content, moves data at volume, needs the full Metadata surface or webhooks, or runs on Tableau Server, build against the direct API with Connected Apps JWT. Most production Tableau agents end up running both: the assistant on MCP, the pipeline on the API. Either way, every user still carries their own Tableau credential, and that credential layer is the part that needs production-grade infrastructure.

Browse the Scalekit Tableau connector: scalekit.com/connectors/tableau. Connector docs: docs.scalekit.com/agentkit/connectors/tableau.

No items found.
Agent Auth Quickstart
On this page
Share this article
Agent Auth Quickstart

Acquire enterprise customers with zero upfront cost

Every feature unlocked. No hidden fees.
Start Free
$0
/ month
1 million Monthly Active Users
100 Monthly Active Organizations
1 SSO connection
1 SCIM connection
10K Connected Accounts
Unlimited Dev & Prod environments