Your table → Sandbox sandbox-user01 All prompts below use your sandbox. Pick your table once — it's remembered.
Vibe Coding Tableau · Admin Lab Manual

Run your Tableau Cloud site from a chat box

Promote a workbook from Dev to UAT. Audit a user's permissions. Archive everything an offboarded employee owns. Three real admin scenarios. All done by asking an AI agent in plain English — backed by a Model Context Protocol server that exposes 19 narrow, well-named tools to the agent.

19
MCP tools
4
demo users
6
workbooks
3
scenarios
30 min
end to end
Cohérent avec la session précédente

Antoine just showed you the three pillars — Context, Structure, Verification — applied to writing a Tableau viz extension. Same playbook here, pointed at the admin side: Context = a site with users/groups/projects already wired; Structure = 19 narrow tools the agent picks from instead of free-handing REST calls; Verification = each tool returns a structured envelope so you see exactly what changed.

Chapter 1Your setup — 5 min

Three things to wire up: a Salesforce org for Vibes, the MCP server URL, and one verification prompt. Everything runs in the browser.

WhatWhere
Agentforce VibesBrowser-based AI coding tool — no local install
Tableau Cloud siteShared site datamanagetab, pre-populated with demo content
MCP serverHosted on Heroku — already deployed, just paste the URL into Vibes

Strongly recommended: claim a fresh Salesforce org for this lab (Step 0 below). It guarantees a clean slate and ensures every Vibes setting we tweak doesn't conflict with whatever you did in Antoine's session. If you really want to reuse the org from the previous workshop you can — your Vibes is already open and you can skip to Step 2 — but be aware leftover state from Antoine's lab can occasionally trip the agent.

⚠ Before anything — disconnect your VPN

Salesforce blocks several corporate VPNs. If you try to claim or open an org with a VPN on, the org gets locked and becomes unusable for the rest of the session. Turn your VPN off now, then come back.

0 Claim a Salesforce org for Vibes

Vibes runs inside a Salesforce developer org. The org farm hands them out instantly.

  1. Go to orgfarm.salesforce.com/signup
  2. Claim an org with the code 5GPWZRJ3
  3. Open the org once it's ready (about 30 seconds)

1 Open Agentforce Vibes

Vibes is a browser-based AI editor — same idea as Claude Code or Cursor, with nothing to install locally.

  1. Inside the org, click the Gear icon (top-right) and choose Open Agentforce Vibes. A new tab opens — wait a minute while the environment loads.
  2. You don't need to clone any repo for this lab — all the action happens in the chat panel using MCP tools, not local files. Just close the welcome screen.
If Vibes asks you to re-login mid-session

Known bug: the Vibes token sometimes expires and you get kicked back to a login screen. Don't claim a new org — just sign back in:
1. Inside the Salesforce org, grab your Username (top-right menu → Settings → My Personal Information, or visible in the org URL).
2. Go to login.salesforce.com and sign in with that username + password Orgfarm1234.
3. Reopen Vibes from the gear icon. Your MCP config is still there.

2 Add the Tableau Admin MCP server

This is the bridge between Vibes and your Tableau Cloud site. The server is already running on Heroku — you just declare it.

  1. In Vibes, open the command palette (Cmd/Ctrl + Shift + P)
  2. Type “MCP: Add Server” and pick it
  3. Pick HTTP transport, then paste this URL when prompted:
loading…
  1. Name the server tableau-cloud-admin
  2. Vibes should refresh and show 19 tools available from this server (open the MCP panel to confirm)
Heads-up — isolation by sandbox

All 30 attendees share one Tableau Cloud site (datamanagetab) and one MCP server, but each of you has a dedicated sandbox project (40 are pre-created: sandbox-user01 through sandbox-user40). Use the picker in the blue banner above to set your table number — every prompt below will be re-written to target your sandbox, and your choice is remembered.

3 Configure Vibes for fast iteration

Two settings cut about 60% of the friction during the lab.

  1. In the chat panel header, switch to Act Mode (Cmd/Ctrl + Shift + A). Plan Mode is great for thinking; Act Mode is what you want for executing.
  2. For each MCP tool that pops up the “wants to use a tool” confirmation, click Auto-approve. Toggle it on for at least list_workbooks, list_users, list_user_content, get_workbook_permissions (the read tools) — write tools are your call.

4 Verify — say hi to the site

One prompt, one tool call, one confirmation that everything is wired.

The prompt to give Vibes

Show me my Tableau Cloud site info — what site I'm signed into and as who.

tool called:whoami
What you should see

Site datamanagetab, signed in as jordan-nguyen-01@outlook.fr (the shared service account). If the agent returns ok: true with these fields, you're live.

Exercise 1Promote a workbook from Dev to UAT

The most common admin task: a developer finishes a draft, you move it to UAT, rename it, and give the QA group viewer rights. Three REST endpoints in the UI — one prompt here.

Your sandbox sandbox-user01 already has Dev/Sales Q4 - Draft owned by Alice. You'll promote it to UAT inside your sandbox (so 30 attendees can run this in parallel without colliding).

The prompt to give Vibes

Promote the Sales Q4 - Draft workbook from {{SANDBOX}}/Dev to {{SANDBOX}}/UAT — rename it to drop the - Draft suffix and grant the Sales-Viewers group viewer permissions on the promoted version. Pass source_project_parent='{{SANDBOX}}' and dest_project_parent='{{SANDBOX}}' on move_workbook so you target my sandbox unambiguously.

tools chained: list_projectsmove_workbookgrant_workbook_permission
What the agent will do

1. (Optionally) Call list_projects to confirm your sandbox's Dev/UAT project IDs.
2. Call move_workbook with workbook_name="Sales Q4 - Draft", source_project="Dev", source_project_parent="sandbox-user01", dest_project="UAT", dest_project_parent="sandbox-user01", new_name="Sales Q4". The agent must pass both source_project_parent and dest_project_parent — without them, the MCP returns an ambiguity error because Dev and UAT both exist under every sandbox-userNN.
3. Call grant_workbook_permission with grantee_group="Sales-Viewers", preset="viewer".
4. Return a chained summary of what changed.

Hands-on tweak

Try chaining further: ask “and then show me the permissions you just set”. The agent will call get_workbook_permissions as a verification step. This is the Verification pillar in action — you don't trust, you check.

Exercise 2Audit a user's permissions

A security exercise: an internal audit asks “what does Alice have access to?”. You answer in 30 seconds instead of 30 minutes of clicking.

The prompt to give Vibes

Show me everything alice owns inside my sandbox (use list_user_content with user_email='alice' and project_parent='{{SANDBOX}}'). Then for each workbook returned, list the permissions granted to other users and groups.

tools chained: list_user_content(project_parent)get_workbook_permissions
Why this is interesting

You typed alice. The MCP fuzzy-resolves to jordan-nguyen-01+alice@outlook.fr automatically (it searches email + fullname, must be unique — if ambiguous, it returns the candidates so the agent can disambiguate). No more copy-pasting long emails. Same for dave below.

For round two, swap the role: grant the auditor temporary access (scoped to your sandbox).

Follow-up prompt

Grant carol the viewer preset on every workbook alice owns in my sandbox (re-use list_user_content with project_parent='{{SANDBOX}}' to scope the listing). Show me the result.

tools chained (one call per workbook): list_user_contentgrant_workbook_permission
Heads-up

Carol has the Viewer site role on purpose — she can be granted workbook permissions, but she can't own a workbook. If you try change_workbook_owner to carol the tool will return a clear hint explaining the site_role constraint.

Exercise 3Offboard a user (the most common one nobody automates)

Dave just left the company. You need to: inventory what he owned, move it to an archive project, reassign ownership to someone still around, then deactivate his account. The UI is 6 different screens. The agent makes it three prompts — and one of them is just a dry-run preview.

Prompt 1 · Inventory

Dave just left the company. Show me everything he owns on the site so I can plan the cleanup.

tool called:list_user_content

Important — scope it to your sandbox. Dave owns content in every sandbox (one set per attendee). If you ask "show me everything Dave owns" without qualifying, you'll get 80+ items — every other attendee's copy. Always include your sandbox name as a filter.

Prompt 1 · Inventory

Dave just left the company. Show me everything he owns inside my sandbox {{SANDBOX}}. Use list_user_content with user_email='dave' and project_parent='{{SANDBOX}}' to scope the listing to my sandbox only.

tool called:list_user_content(project_parent)
Prompt 2 · Dry-run preview

Preview what would happen if I archived all of dave's content from my sandbox to the {{SANDBOX}}/Archive project. Use archive_project='Archive', archive_project_parent='{{SANDBOX}}', source_project_parent='{{SANDBOX}}', dry_run=true.

tool called:archive_user_content(dry_run=true, source_project_parent)
What you'll see

A table of every workbook and datasource Dave owns in your sandbox (2 workbooks: Marketing KPIs - WIP and Customer 360 - Draft) with the proposed new names (suffixed with -archived-<HHMMSSXX> to avoid collisions in your Archive project) and the destination. No writes happen yet.

Prompt 3 · Execute + reassign

Looks good. Actually archive it now (same scope: source_project_parent='{{SANDBOX}}', archive_project='Archive', archive_project_parent='{{SANDBOX}}') and transfer ownership of every moved item to alice with new_owner_email='alice'.

tool called:archive_user_content(dry_run=false, new_owner_email)
Verify

Re-run prompt 1 ("Show me everything dave owns in my sandbox"). Dave should now own zero items in your sandbox. The agent will show you the empty list — that's your verification.

BonusIf you finish early

All of these are one-prompt exercises against the same site state. Pick anything that looks fun.

Copy permissions between workbooks

First do Exercise 1 so you have a UAT/Sales Q4 in your sandbox. Then:

Prompt

Copy all the permissions from {{SANDBOX}}/UAT/Sales Q4 onto {{SANDBOX}}/Dev/Customer 360 - Draft, clearing the existing rules first. Pass template_project_parent='{{SANDBOX}}' and target_project_parent='{{SANDBOX}}' to scope to my sandbox.

tool:set_workbook_permissions_from_template

Compare Dev vs UAT

Prompt

Compare the workbooks between {{SANDBOX}}/Dev and {{SANDBOX}}/UAT. Pass project_a_parent='{{SANDBOX}}' and project_b_parent='{{SANDBOX}}'. Show me what's in one but not the other.

tool:compare_workbooks_in_projects

Clone a draft for a hotfix

Prompt

Clone {{SANDBOX}}/Dev/Marketing KPIs - WIP into {{SANDBOX}}/UAT as a snapshot named Marketing KPIs - Hotfix Review. Pass source_project_parent='{{SANDBOX}}' and dest_project_parent='{{SANDBOX}}'. Keep me as the owner.

tool:clone_workbook

Group inventory

Prompt

List every group on the site and who's in it.

tool:list_groups_with_members

Datasource inventory & connections

Prompt

List every published datasource on the site, then for the largest one, show me its connections (server, port, user).

tools chained:list_datasourceslist_connections
Real-world variant — credential rotation

This is the prompt you'd use in production after rotating a DB password: "The Sales PG database password just rotated. Update the credentials on the Sales-Q4-Live datasource's connection — new user is sales_reader_v2, new password is <paste>, and keep it embedded." The agent will list_connections first to confirm the target, then update_connection_credentials in one step. The demo site doesn't have a live DB datasource, so the rotation will error out cleanly — the structure is what matters.

Appendix AAll 19 tools

The agent picks from this set. You don't need to call them by name — natural language works because the docstrings tell the agent what each one does.

Read · explore the site

ToolDoes what
whoamiShow signed-in user + site
list_workbooksList workbooks, filtered by project or owner (fuzzy)
list_datasourcesList published datasources, filtered by project or owner
list_connectionsConnections on a workbook OR datasource (server, port, user, embedded)
list_projectsProject tree (hides system Default)
list_usersUsers on the site, filtered by role or email substring
list_groups_with_membersGroups + members (hides All Users)
list_user_contentInventory everything a user owns (workbooks + datasources)
get_workbook_permissionsACLs on a workbook (per user, per group)
compare_workbooks_in_projectsDiff two project's workbook lists

Write · change the site

ToolDoes what
move_workbookChange a workbook's project (with auto-rename)
rename_workbookRename in place
clone_workbookDownload + republish as a new workbook
grant_workbook_permissionGrant a preset (viewer/explorer/editor) or explicit capabilities
revoke_workbook_permissionRemove specific capabilities or all
set_workbook_permissions_from_templateCopy all ACLs from one workbook to another
change_workbook_ownerTransfer ownership (minimal REST PUT — dodges TSC's name-update validation bug)
archive_user_contentSoft-delete: move everything a user owns to an archive project, optionally reassign
update_connection_credentialsRotate DB user/password on a workbook OR datasource connection

All tools accept fuzzy identifiers — "alice", "dave", "sales" are resolved to a unique user/group/email. Ambiguous inputs return a list of candidates so the agent can disambiguate.

Appendix BReference

ResourceLink
This MCP serverloading…
Tableau Cloud siteloading…
Tableau REST API docshelp.tableau.com/.../REST
Connected App + JWT authhelp.tableau.com/.../connected_apps
Model Context Protocolmodelcontextprotocol.io
FastMCP (Python)github.com/modelcontextprotocol/python-sdk
Tableau Server Client (TSC)tableau.github.io/server-client-python
Vibe Coding Tableau · Admin track · Zurich Tableau from Salesforce