Help & Support
Elevate Your Agents with AgentExchange Solutions
Have Questions?
Tableau Next Asset Create
- references/
- 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 toedit-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 withlist_semantic_modelsif 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 pintargetEntityNameOrId/targetEntityTypeunless the user named an SDM). Named already-built model + structured table / explicitrun_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 prefersrun_semantic_querywhen 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 notenrich-model.md. Metadata discovery (list SDMs, fields, relationships) islist_*/get_*, notanalyze_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 whatcreate_visualizationpayload for a stacked bar") routes tocreate-viz.md. Do not skip toviz-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 tobuild-dashboard.md. Do not skip todashboard-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 oredit_dashboardprep on an existing dashboard →get_dashboardthenedit-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 toquery-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
accessTypeon an asset routes toshare-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 tobuild-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 grantingaccessTypeon 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 isgenerate_insight_bundle/render_metricfor the MCP app renderer (insight-bundle.md) viaapp.callServerTool(). The model does not call those tools on a user chat turn and does not first-hop toinsight-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.mdliterally wrapupdate_semantic_model_dimension/_measureas 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 echoisVisible+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 (todashboard-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_modelcall" →sdm-tool-reference.md - "how do I add or update a semantic-model parameter" →
tasks/edit-sdm.md(shapes insdm-tool-reference.mdParameters) - "how do I add a HardJoin / Union / CustomSQL logical view" →
tasks/edit-sdm.md(shapes insdm-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(§8render_dashboard) - "why did my query return zero rows" / "empty vs. does-not-exist" →
empty-source-handling.md - "how do I write a
run_semantic_querybody" →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_visualizationpayload" →tasks/create-viz.md(NOTviz-authoring.md) - "how do I add/move/remove a widget on an existing dashboard" →
tasks/edit-dashboard.md(NOTedit-dashboard.mdthe deep ref, and NOTdashboard-authoring.md) - "how do I create a dashboard / lay out a new dashboard" →
tasks/build-dashboard.md(NOTdashboard-authoring.md) - "how do I ingest a CSV / Excel / existing connection into a DLO/DMO" →
tasks/ingest-flat-file.md(NOTingest-and-metric-gotchas.md) - "how do I create or update a data transform" →
tasks/create-data-transform.md(NOTdata-transform-gotchas.md) - "walk me through building a model end to end" →
tasks/build-end-to-end.md(NOTbuild-workflow.md) - "how do I share / unshare / list who has access" →
tasks/share-asset.md(NOTsharing-and-promotion.md) - "how do I reuse a prod asset or promote a Personal Org asset" →
tasks/promote-or-reuse.md(NOTsharing-and-promotion.md) - "how do I provision / list Tableau Next users / check licenses" →
tasks/provision-user.md(NOTadmin-users.md) - "how do I create / update / list / delete a data alert" →
tasks/manage-alert.md(NOTalerts.md) - "how do I list verified questions / score agent SQL" →
tasks/review-verified-questions.md(NOTverified-questions.md)
What each deep reference covers (and which guide cites it) is in
references/deep-reference-index.md.