First-party app
Tableau

Tableau

Manage Tableau Server or Tableau Cloud sites, projects, workbooks, views and data sources.

stable Analytics & BIProductivity

About

Tableau ships in the w6w first-party pack. It declares 15 actions, 2 health checks, and the host runs its code in a sandbox that never sees the credential.

App id
io.w6w.tableau
Version
0.1.0
Author
w6w
Licence
MIT
Categories
Analytics & BI · Productivity

Overview

Tableau is Salesforce’s analytics and BI platform, reachable through one REST API that fronts two very different deployments: Tableau Cloud (a pod-hosted multi-tenant service, e.g. 10ax.online.tableau.com) and Tableau Server (a customer’s own install, at whatever host they gave it). This app treats the server address the way it treats a self-hosted app’s URL — a connection field, not a fixed hostname — because there is no single Tableau host to allowlist.

It covers the surface a workflow actually touches day to day: listing and creating projects, listing, reading and deleting workbooks, reading the views inside them (site-wide or per workbook) and rendering a view to an image, listing and reading published data sources and kicking off an extract refresh without waiting for its schedule, and listing or looking up the users on a site.

Authentication is a Personal Access Token exchanged for a short-lived session — the token is signed in once to get a X-Tableau-Auth credential and a site id, and the app refreshes that session by signing in again rather than treating the PAT itself as a bearer credential. Publishing new workbooks, data source extracts and every admin-only surface (users, groups, schedules, permissions) are deliberately out of scope for a first version.

Build with Tableau

Three routes to the same 15 actions. The Workflow tab is generated from Tableau's own manifest and carries its real ids, so it is copy-pasteable; the Code and CLI examples are the same call for any action on any app, so every app-specific value in them is a blank you fill in.

Get a data source

datasource-get

Read a published data source's metadata.

List data sources

datasource-list

List the published data sources on this site.

Refresh a data source now

datasource-refresh

Trigger an immediate extract refresh, without waiting for its schedule.

Create a project

project-create

Create a project, optionally nested under a parent project.

Delete a project

project-delete

Permanently delete a project and everything published inside it.

List projects

project-list

List the projects on this site.

Get this site

site-get

Read the connection's own site — name, storage and user count. Requires a server or site administrator PAT.

Get a user

user-get

Read one user's profile on this site.

List users

user-list

List the users on this site. Requires a server or site administrator PAT.

Get a view's image

view-image-get

Render a view to a PNG image, returned as base64.

List views (site)

view-list-for-site

List every view on this site, optionally with usage statistics.

List views (workbook)

view-list-for-workbook

List the views inside one workbook.

Delete a workbook

workbook-delete

Permanently delete a workbook and its views.

Get a workbook

workbook-get

Read a workbook's metadata, views and tags.

List workbooks

workbook-list

List the workbooks on this site.

A workflow step names the app and the action, and the editor fills in the connection when you pick one. This is the Step shape from the workflow spec, carrying Tableau's real ids.

{
  "manifestVersion": "2",
  "name": "tableau-example",
  "steps": [
    {
      "id": "datasource-get",
      "uses": {
        "app": "io.w6w.tableau",
        "action": "datasource-get",
        "connection": "conn_YOUR_CONNECTION_ID"
      },
      "with": {
        "datasourceId": "<datasourceId>"
      }
    }
  ]
}

Here are some of the things you can do

  • Get a data source

    read
    datasource-get
  • List data sources

    read
    datasource-list
  • Refresh a data source now

    perform
    datasource-refresh
  • Create a project

    perform
    project-create
  • List projects

    read
    project-list

+10 more actions available

Every app-specific value here is a blank you have to fill in. An app action is reached through the connection that authenticates it, so the address is a connection id, not the app id — and connections belong to your account, so a public page cannot know yours. Create one for Tableau, then fill in the three blanks: conn_YOUR_CONNECTION_ID, the action key, and the parameters that action declares. The call itself is real — the shape is transcribed from the studio's own snippet builder, which prints the same kind of blanks — but nothing in it is specific to Tableau. The Workflow tab is where this app's real ids are.

Install
npm install @w6w/sdk
yarn add @w6w/sdk
pnpm add @w6w/sdk
deno add npm:@w6w/sdk
Code
import { W6wClient, isActionRun } from "@w6w/sdk";

// Reads W6W_BASE_URL and W6W_TOKEN from the environment when omitted.
const client = new W6wClient();

const envelope = await client.run({
  urn: "conn_YOUR_CONNECTION_ID",
  action: "datasource-get",
  payload: {
    datasourceId: "<value>",
  },
});

if (isActionRun(envelope)) console.log(envelope.value);
Install the CLI
npm install -g @w6w/cli
CLI
w6w run conn_YOUR_CONNECTION_ID --action datasource-get --payload '{"datasourceId":"<value>"}'

Give an AI agent Tableau — without giving it Tableau's credentials. One MCP endpoint exposes every app, function and workflow the caller is entitled to, as tools it can discover and run. Access is granted per team while we onboard.

One tool call
{
  "name": "w6w_invoke",
  "arguments": {
    "ref": "app:io.w6w.tableau#datasource-get",
    "input": {
      "datasourceId": "<datasourceId>"
    }
  }
}

Every tool names its target with a single ref. The app: form above doesn't name a connection at all — the host resolves which of the caller's Tableau connections to sign with, and refuses rather than guesses when the answer is ambiguous.

What the agent gets

Credentials it can't read

The token is attached host-side, at the moment of the call. It is never a tool argument, never in the model's context, and never in a transcript — so a prompt injection has nothing to exfiltrate.

A tool surface scoped to the caller

Tools are derived per end user from what that person has actually connected and is entitled to — not one shared bot identity carrying the union of everyone's access.

A durable workflow in one call

Multi-step work runs on the workflow engine and returns a run handle the agent can poll — retries, branching and state survive the conversation that started them.

Health-aware discovery

Tableau's declared health checks are on the surface too, so an agent can tell "the vendor is down" from "your credential expired" before it burns a retry on either.

The MCP surface is part of the hosted platform. Tableau itself is MIT, and the runtime that executes it is source-available (FSL).

Request MCP access

Health checks

Tableau declares its own checks, so its health is a property of the app rather than something the host guesses at.

dependency

Tableau server reachable

This connection's own server, via its unauthenticated GET /serverinfo. Sends no credential — an idled-out session must not make the server look down.

service

Tableau platform status