AgentExchange

Help & Support

Elevate Your Agents with AgentExchange Solutions
Easily enhance Agentforce with pre-built AI solutions from AgentExchange. Browse, install, and deploy agents, actions, and apps directly into your environment. Tell Me More

Have Questions?

Tableau Next Asset Create

Beta
undefinedFiles
  • README.md
  • SKILL.md

Tableau Next SDM Authoring — Router

Build semantic data models that actually return data, then enrich, query, and visualize them. This skill encodes the failures that produce empty or confidently-wrong dashboards in Tableau Next — building on empty source objects, leaving objects unjoined, inventing field apiNames, summing an ID, inflating a snapshot by its date count — and carries through to enriching, querying, and visualizing the model.

This file is a router. It does two things: assert the one universal precondition (G1), then dispatch your intent to the right task guide. The guardrails that overlap between steps live in exactly one place — references/shared-gates.md (gates G1–G8) — and each task guide opens with the gates it must assert. Read the gate file once; every guide points back to it.

The MCP tools are exposed under a tableau-next-* server (Claude Code, for example, advertises them as mcp__tableau-next-pilot-production__add_semantic_model_relationship). Every tool name in this skill — router and reference/task files alike — is written bare (e.g. add_semantic_model_relationship) for readability; invoke each one under whatever name your client exposes for that server's tool. Match the advertised name — do not hand-construct it. (Single statement: references/shared-gates.md.)

G1 — Precondition (assert once, here, before dispatching)

Every step of this skill drives a Tableau Next MCP server; without one connected there is nothing to call. Before dispatching to any guide, confirm the available tools include one prefixed mcp__tableau-next-*__ (e.g. mcp__tableau-next-pilot-production__browse_data_assets, mcp__tableau-next-self-service__create_semantic_model). Server names vary — match the tableau-next stem, not an exact name.

If NO such tool is present, STOP. Do not attempt the workflow, do not describe payloads as if you had run them, and never fabricate tool calls, results, or IDs. Tell the user the skill requires a connected Tableau Next MCP server (e.g. tableau-next-pilot-*, tableau-next-self-service) and ask them to connect one and re-invoke. Every entry point inherits this — a standalone "add a metric" with no server must still STOP. Full statement: references/shared-gates.md G1.

Dispatch — route your intent to a task guide

Classify on what the user wants to do, then read that guide. Each guide's header names the gates it asserts (from references/shared-gates.md).

Question phrasing does not exempt an intent from classification. "How do I profile X" → profile-dataset.md. "What payload do I use for create_visualization" / "which chart type for a stacked bar" → create-viz.md (not viz-authoring.md — that file is cited by the guide, it is not a first hop). "Before I build, how should I design the layout" → dashboard-design-principles.md (load this skill; do not answer from general dashboard knowledge). Only an explicit disclaimer of authoring ("don't build/create anything") sends advice / review / ideation to the No-dispatch rule. A disclaimer that still asks for a number, table, or interpretation ("don't build or change any model — just get the count from existing Tableau Next data") is a query/analyze intent: route to query-model.md / analyze-data.md. The question mark is never the test.

User intent Route to
"analyze this CSV" / "build a dashboard from these files" / nothing modeled yet references/tasks/build-end-to-end.md
"ingest this CSV / Excel into a DLO/DMO" or ingest from an existing Snowflake / Databricks / BigQuery / Redshift connection (ingest only, no downstream ask) references/tasks/ingest-flat-file.md
"create / update a data transform" / derived DLO or DMO via Data Cloud SQL references/tasks/create-data-transform.md
"profile / discover / check this data" (read-only) references/tasks/profile-dataset.md
add a raw object / dimension / measure / join / logical view / parameter to my model references/tasks/edit-sdm.md
add a calculated dimension / measure / metric to my model references/tasks/enrich-model.md
"is my model AI-ready" / "backfill readiness metadata" / validate a model references/tasks/ai-readiness-audit.md
count / total / scalar ("how many orders", "what is total revenue") or named-model structured run_semantic_query or raw DLO/DMO run_query references/tasks/query-model.md
interpreted breakdown / ranking / trend / comparison without asking to author references/tasks/analyze-data.md
delete a calc / metric / data object / logical view / relationship (component, not the whole SDM) references/sdm-tool-reference.md
"create a viz / chart" OR which-chart-type / create_visualization payload (no existing chart; not "just advise") references/tasks/create-viz.md (then that guide cites viz-authoring.md — do not skip to it)
"edit / add a filter / forecast / sort / field to this chart" (an existing viz) references/tasks/edit-viz.md
"show / view / display my existing chart/visualization" (no edit) Call get_visualization directly (minorVersion: -1) — renders inline; do NOT chain render_visualization
"show / view / display / open my existing dashboard" (no edit) Call render_dashboard (addVisualization=true, addSdm=true, showDraft=true, minorVersion=-1) — details in references/dashboard-authoring.md §8. Do not use get_dashboard (metadata-only, does not render)
"create a dashboard" / design a dashboard layout / add a global filter (no existing dashboard to edit) references/tasks/build-dashboard.md
"edit an existing dashboard" / add-move-remove a widget / add-rename-delete a page on a dashboard that already exists references/tasks/edit-dashboard.md
"how should I design the narrative/layout before charting" (no existing dashboard to review) references/dashboard-design-principles.md
share / revoke / list who has access (user or group on a dashboard, viz, workspace, or SDM) references/tasks/share-asset.md
reuse a prod asset in a Personal Org or promote a Personal Org asset / open a promotion PR references/tasks/promote-or-reuse.md
provision / list Tableau Next users / check licenses (org role, not asset ACL) references/tasks/provision-user.md
"alert me when" / change that alert / list or delete my alerts (ongoing monitor) references/tasks/manage-alert.md
list / classify verified questions or score agent SQL against expected SQL references/tasks/review-verified-questions.md

Destructive / lifecycle operations — component and whole-asset deletes, workspace asset association, share/reuse/promotion mutations, upsert_user, delete_alert, delete_analytics_utterances, edit_dashboard drafts, and double-wrapped defaultExc responses: read references/destructive-operations.md before calling any of them. Always get explicit user confirmation before delete_visualization / delete_dashboard / delete_semantic_model / delete_workspace, and never call save_dashboard or upsert_user without the user's explicit go-ahead.

Disambiguation:

  • calculated vs. raw — a calc dimension/measure/metric routes to enrich-model.md; a plain object/dimension/measure/join/logical view routes to edit-sdm.md.
  • analyze vs query vs greenfield — figures (counts, totals, scalars; "how many orders", "what is total revenue") → query-model.md (run_semantic_query; discover the SDM with list_semantic_models if unnamed), including when the user says not to build or change a model. Interpreted breakdowns, rankings, trends, comparisons → analyze-data.md (analyze_data; do not pin targetEntityNameOrId / targetEntityType unless the user named an SDM). Named already-built model + structured table / explicit run_semantic_query → query-model.md. Raw SQL against a DLO/DMO (run_query) when no SDM covers the data, or the user asked for SQL, also → query-model.md (that guide prefers run_semantic_query when an SDM exists). Nothing modeled yet / CSV / "build a dashboard" → build-end-to-end.md. Ingest from an existing database connection (not a local file) still → ingest-flat-file.md. Derived table / Data Cloud SQL transform → create-data-transform.md, not ingest and not enrich-model.md. Metadata discovery (list SDMs, fields, relationships) is list_* / get_*, not analyze_data.
  • create vs. edit a viz — a request that names or clearly references an existing chart ("add a forecast to my monthly sales chart", "filter this chart to West") routes to edit-viz.md; a request with no existing chart in play ("create a bar chart of sales by category", "which chart type and what create_visualization payload for a stacked bar") routes to create-viz.md. Do not skip to viz-authoring.md.
  • create vs. edit a dashboard — a request that names or clearly references an existing dashboard ("add a KPI widget to my sales dashboard", "move this chart to the top", "add a details page to the pipeline dashboard") routes to edit-dashboard.md; a request with no existing dashboard in play ("create a dashboard for regional sales", "design a dashboard layout for these metrics") routes to build-dashboard.md. Do not skip to dashboard-authoring.md.
  • show vs get vs edit a dashboard — "show / open / view my Sales dashboard" (including naming or id'ing one to see it), no edit → render_dashboard (dashboard-authoring.md §8). Widget JSON / PATCH or edit_dashboard prep on an existing dashboard → get_dashboard then edit-dashboard.md. "Review this dashboard, don't modify it" stays No-dispatch.
  • Fast-path — if a suitable already-built, populated, joined model is available (named, or discovered via list_semantic_models) and the user wants figures or a structured table, this skill's build steps are not the entry point: route to query-model.md (run_semantic_query). An interpretive question (breakdown, ranking, trend, comparison) → analyze-data.md.
  • Greenfield — "analyze account engagement / build a dashboard" where no model exists yet is a build intent (the trigger is "the user wants insight from data that isn't modeled yet," not the literal phrase "semantic model") → build-end-to-end.md.
  • share vs workspace membership — granting a user/group accessType on an asset routes to share-asset.md. Putting an asset in a workspace (add_workspace_asset) is not a share.
  • revoke share vs delete the asset — "unshare Alice" / "remove her access" → share-asset.md. Deleting the dashboard/model/workspace itself stays on the destructive tools above.
  • reuse / promote vs create — copying or packaging an existing asset routes to promote-or-reuse.md. Building a new SDM from data still goes to build-end-to-end.md / edit-sdm.md.
  • share vs provision a user — "share this dashboard with Alice" / viewer-vs-editor on an asset → share-asset.md (search_users_and_groups). "Add Alice as Analyst" / list Tableau Next users / check seats → provision-user.md (get_users / upsert_user). Granting a role is not granting accessType on an asset.
  • analyze vs alert — one-off "why did EMEA sales drop" / breakdown/trend/comparison → analyze-data.md. "Alert me when bookings drop 10% week over week" / change or list my alerts → manage-alert.md. Do not pin an SDM on either path.
  • query vs score SQL — "what is total revenue" → query-model.md. "Does this agent SQL match the expected SQL" → review-verified-questions.md (run_regression_evaluator; persists nothing).
  • AI-ready vs verified questions — backfill descriptions / agentEnabled / prefs → ai-readiness-audit.md. List/classify AVQ or score golden Q&A → review-verified-questions.md.
  • insights (analyze vs metric-card payload) — "generate insights on EMEA sales" / interpretive "what should I focus on" → analyze-data.md. The dashboard metric-card live value/trend/status payload is generate_insight_bundle / render_metric for the MCP app renderer (insight-bundle.md) via app.callServerTool(). The model does not call those tools on a user chat turn and does not first-hop to insight-bundle.md.

No-dispatch rule (decline — do NOT route into an authoring guide)

The surface verbs above ("create a viz", "edit sdm", "create metric", "create/update dashboard", "share", "promote", "reuse", "provision", "alert", "classify") collide word-for-word with work this skill is not for. Classify on build-vs-advise/review/ideate/edit-prose, not the surface verb. Decline (or hand off) these — do not dispatch:

  • Advice, no build — "which chart type, stacked vs grouped? don't create anything" → advise; do not route to create-viz.md.
  • Prose edit on an existing model — decline any request whose only change is the wording of an existing description/label, no matter the verb used ("rewrite", "update", "fix", "correct", "improve", "reword" all count — the verb is not the test). The test is: does this add/change a field, join, metric, or grain? If not — pure copy-editing — decline. E.g. "rewrite the description on my existing model" or "fix the typo in this field's description" → decline. This is the sharpest near-miss: edit-sdm.md / ai-readiness-audit.md literally wrap update_semantic_model_dimension/_measure as sparse description updates, so it is tempting — but a prose-only edit is not authoring the model. (Backfilling missing readiness metadata as part of making a model AI-ready IS in scope and must echo isVisible + dataObjectFieldName — see G5; rewording existing prose for style, accuracy, or typos is not.)
  • Ideation, no data — "brainstorm KPIs I could track later, no changes now" → ideate; do not route to enrich-model.md.
  • Review — "review my dashboard layout, don't modify it" / "someone on my team built this, what's confusing" → review; do not route to build-dashboard.md. Designing the narrative before you drop charts is the opposite intent — that does dispatch (to dashboard-design-principles.md).
  • Share advice, no grant — "who should I share this with / viewer vs editor? don't actually share" → advise; do not route to share-asset.md.
  • Provision advice, no mutate — "who should I add as Analyst? don't provision anyone" → advise; do not route to provision-user.md.
  • Alert advice, no monitor — "should I alert on this KPI? don't create one" → advise; do not route to manage-alert.md.

A "don't build / don't change anything" disclaimer does not by itself mean No-dispatch. Count / total / scalar ("how many orders") and named-model structured query still route to query-model.md; interpreted breakdown / ranking / trend / comparison still route to analyze-data.md. Those are in-scope redirects, not declines.

Also out of scope: debugging a broken MCP server (→ Columbo / standard debugging); writing application code / managing AI Suite infra.

Deep references (cited by task guides)

The task guides point down to these for verified payloads and tool shapes. A narrow lookup — "how do I / what is / what's the exact ___" — is a direct-dispatch only when the list below names that file. Viz, dashboard-widget, ingest, and greenfield-build lookups are not direct-dispatch: first-hop to the matching references/tasks/*.md guide (the guide then cites the deep ref). In particular, chart-type / create_visualization payload questions first-hop to tasks/create-viz.md; viz-authoring.md is not a first hop.

Direct-dispatch lookups:

  • "how do I handle a huge/wide CSV with cryptic columns" → large-flat-file-handling.md
  • "how do I figure out grain / measures vs. dimensions [before modeling]" → data-understanding.md
  • "what's the input shape / suffix rule for add_semantic_model_*" → sdm-tool-reference.md
  • "how do I bind SDM fields in one create_semantic_model call" → sdm-tool-reference.md
  • "how do I add or update a semantic-model parameter" → tasks/edit-sdm.md (shapes in sdm-tool-reference.md Parameters)
  • "how do I add a HardJoin / Union / CustomSQL logical view" → tasks/edit-sdm.md (shapes in sdm-tool-reference.md)
  • "how do I safely delete a calc / metric / data object / logical view / relationship" → sdm-tool-reference.md
  • "what depends on this viz / dashboard" / before deleting a viz or dashboard → dashboard-authoring.md
  • "how do I show / open / view a dashboard" (inline render, not metadata) → dashboard-authoring.md (§8 render_dashboard)
  • "why did my query return zero rows" / "empty vs. does-not-exist" → empty-source-handling.md
  • "how do I write a run_semantic_query body" → semantic-query-and-enrichment.md
  • "how do I make my model AI-ready" (checklist; not "backfill it now") → ai-readiness.md
  • "how should I design the narrative/layout before charting" → dashboard-design-principles.md

Not a first hop (cited only from the matching task guide):

  • "which chart type / what create_visualization payload" → tasks/create-viz.md (NOT viz-authoring.md)
  • "how do I add/move/remove a widget on an existing dashboard" → tasks/edit-dashboard.md (NOT edit-dashboard.md the deep ref, and NOT dashboard-authoring.md)
  • "how do I create a dashboard / lay out a new dashboard" → tasks/build-dashboard.md (NOT dashboard-authoring.md)
  • "how do I ingest a CSV / Excel / existing connection into a DLO/DMO" → tasks/ingest-flat-file.md (NOT ingest-and-metric-gotchas.md)
  • "how do I create or update a data transform" → tasks/create-data-transform.md (NOT data-transform-gotchas.md)
  • "walk me through building a model end to end" → tasks/build-end-to-end.md (NOT build-workflow.md)
  • "how do I share / unshare / list who has access" → tasks/share-asset.md (NOT sharing-and-promotion.md)
  • "how do I reuse a prod asset or promote a Personal Org asset" → tasks/promote-or-reuse.md (NOT sharing-and-promotion.md)
  • "how do I provision / list Tableau Next users / check licenses" → tasks/provision-user.md (NOT admin-users.md)
  • "how do I create / update / list / delete a data alert" → tasks/manage-alert.md (NOT alerts.md)
  • "how do I list verified questions / score agent SQL" → tasks/review-verified-questions.md (NOT verified-questions.md)

What each deep reference covers (and which guide cites it) is in references/deep-reference-index.md.