@salesforce/afv-skills 1.59.0 → 1.61.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. package/package.json +1 -1
  2. package/skills/agentforce-architecture-analyze/SKILL.md +66 -17
  3. package/skills/agentforce-architecture-analyze/assets/cli/show_access_token.yaml +4 -7
  4. package/skills/agentforce-architecture-analyze/references/contract.json +1 -1
  5. package/skills/agentforce-architecture-analyze/scripts/emit_env.py +2 -2
  6. package/skills/agentforce-architecture-analyze/scripts/main.py +40 -44
  7. package/skills/agentforce-architecture-analyze/scripts/rest_client.py +11 -3
  8. package/skills/agentforce-architecture-analyze/scripts/sf_cli.py +77 -10
  9. package/skills/agentforce-architecture-analyze/scripts/tests/test_end_to_end_fixture.py +1 -0
  10. package/skills/agentforce-architecture-analyze/scripts/tests/test_flow_children_inflation.py +1 -0
  11. package/skills/agentforce-architecture-analyze/scripts/tests/test_main_pipeline.py +53 -2
  12. package/skills/agentforce-architecture-analyze/scripts/tests/test_resolve_creds.py +184 -36
  13. package/skills/agentforce-architecture-analyze/scripts/tests/test_rest_client.py +17 -0
  14. package/skills/agentforce-architecture-analyze/scripts/tests/test_sf_cli.py +165 -11
  15. package/skills/agentforce-architecture-analyze/scripts/tests/test_skill_md_pipeline_block.py +319 -0
  16. package/skills/agentforce-d360-analyze/SKILL.md +28 -10
  17. package/skills/agentforce-d360-analyze/scripts/dc.py +200 -50
  18. package/skills/agentforce-d360-analyze/scripts/discover_sessions.py +10 -6
  19. package/skills/agentforce-d360-analyze/scripts/fetch_dc.py +22 -6
  20. package/skills/agentforce-d360-analyze/scripts/resolve_session.py +21 -13
  21. package/skills/agentforce-d360-analyze/scripts/tests/test_dc_and_resolve_session.py +298 -76
  22. package/skills/agentforce-d360-analyze/scripts/tests/test_default_target_org.py +432 -0
  23. package/skills/agentforce-d360-analyze/scripts/tests/test_discover_sessions.py +1 -1
  24. package/skills/agentforce-d360-analyze/scripts/tests/test_resolve_session_main.py +9 -3
  25. package/skills/agentforce-d360-analyze/scripts/tests/test_skill_md_prefix_block.py +176 -0
  26. package/skills/consumer-goods-accruals-datakit-deploy/SKILL.md +17 -27
  27. package/skills/consumer-goods-accruals-datakit-deploy/scripts/setup.js +7 -17
  28. package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/00-check-prerequisites.js +47 -63
  29. package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/01-download-static-resource.js +10 -13
  30. package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/02-replace-org-id.js +46 -46
  31. package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/03-deploy-metadata.js +4 -21
  32. package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/06-create-dataspace.js +58 -82
  33. package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/07-deploy-accruals-reports.js +16 -315
  34. package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/08-deploy-ui.js +9 -24
  35. package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/09-completion.js +44 -44
  36. package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/utils.js +11 -63
  37. package/skills/consumer-goods-rtr-datacloud-export-configure/SKILL.md +2 -1
  38. package/skills/consumer-goods-tpe-dashboard-configure/SKILL.md +2 -1
  39. package/skills/consumer-goods-tpe-dashboard-custom-kpi-configure/SKILL.md +2 -1
  40. package/skills/consumer-goods-tpe-datakit-deploy/SKILL.md +2 -1
  41. package/skills/data360-schema-get/SKILL.md +3 -3
  42. package/skills/design-systems-slds-validate/references/report-format.md +1 -1
  43. package/skills/dx-org-manage/SKILL.md +1 -0
  44. package/skills/dx-org-shape-manage/SKILL.md +1 -0
  45. package/skills/dx-org-snapshot-manage/SKILL.md +172 -0
  46. package/skills/dx-org-snapshot-manage/examples/create_error_output.json +16 -0
  47. package/skills/dx-org-snapshot-manage/examples/create_success_output.json +19 -0
  48. package/skills/dx-org-snapshot-manage/examples/delete_output.json +9 -0
  49. package/skills/dx-org-snapshot-manage/examples/get_output.json +19 -0
  50. package/skills/dx-org-snapshot-manage/examples/list_output.json +36 -0
  51. package/skills/dx-org-snapshot-manage/references/cli_flags.md +179 -0
  52. package/skills/dx-org-snapshot-manage/references/snapshot_usage.md +55 -0
  53. package/skills/dx-org-trial-expiration-check/SKILL.md +1 -1
  54. package/skills/dx-org-trial-expiration-check/scripts/check_expiration.sh +2 -2
  55. package/skills/education-cloud-student-recruitment-agent-configure/SKILL.md +7 -5
  56. package/skills/education-cloud-student-recruitment-agent-configure/references/prerequisites.md +11 -11
  57. package/skills/experience-content-media-image-generate/SKILL.md +83 -0
  58. package/skills/experience-content-media-image-generate/scripts/download-image.sh +84 -0
  59. package/skills/external-diagram-mermaid-generate/SKILL.md +12 -12
  60. package/skills/field-service-data-capture-migrate/references/component-mapping.md +1 -1
  61. package/skills/field-service-data-capture-migrate/references/fsm-dc-capability-catalog.md +1 -2
  62. package/skills/field-service-data-capture-migrate/references/known-deploy-errors.md +1 -0
  63. package/skills/field-service-data-capture-migrate/references/transformer-rules.md +1 -1
  64. package/skills/field-service-data-capture-migrate/scripts/transform_flow.py +12 -1
  65. package/skills/field-service-data-capture-migrate/scripts/vendor/build_flow.py +4 -1
  66. package/skills/field-service-setup-orchestrator-get/SKILL.md +0 -1
  67. package/skills/insurance-brokerage-agency-billing-configure/SKILL.md +233 -0
  68. package/skills/insurance-brokerage-agency-billing-configure/references/accounting-setup.md +117 -0
  69. package/skills/insurance-brokerage-agency-billing-configure/references/billing-rules-config.md +237 -0
  70. package/skills/insurance-brokerage-agency-billing-configure/references/billing-settings.md +271 -0
  71. package/skills/insurance-brokerage-agency-billing-configure/references/demo-policy-config.md +138 -0
  72. package/skills/insurance-brokerage-agency-billing-configure/references/org-defaults.md +64 -0
  73. package/skills/insurance-brokerage-agency-billing-configure/references/permissions-config.md +226 -0
  74. package/skills/insurance-brokerage-agency-billing-configure/references/prerequisites.md +142 -0
  75. package/skills/life-sciences-fieldsalesrep-coordinate/SKILL.md +3 -2
  76. package/skills/life-sciences-fieldsalesrep-coordinate/references/stage-5-visit-creation-execution-state-and-recovery.md +3 -3
  77. package/skills/life-sciences-fieldsalesrep-coordinate/references/stage-5-visit-creation-overview.md +68 -45
  78. package/skills/life-sciences-fieldsalesrep-coordinate/references/stage-5-visit-creation-visit-creation-data.md +17 -18
  79. package/skills/life-sciences-kam-coordinate/references/stage-5-data-and-plan-templates-overview.md +16 -3
  80. package/skills/life-sciences-kam-coordinate/references/stage-5-data-creation-data.md +16 -13
  81. package/skills/marketing-message-test/SKILL.md +194 -0
  82. package/skills/marketing-message-test/references/api-contract.md +333 -0
  83. package/skills/omnistudio-callable-apex-generate/SKILL.md +3 -3
  84. package/skills/omnistudio-datamapper-generate/SKILL.md +6 -6
  85. package/skills/omnistudio-datapacks-deploy/SKILL.md +11 -11
  86. package/skills/omnistudio-dependencies-analyze/SKILL.md +5 -5
  87. package/skills/omnistudio-epc-catalog-generate/SKILL.md +6 -6
  88. package/skills/omnistudio-flexcard-generate/SKILL.md +6 -6
  89. package/skills/omnistudio-integration-procedure-generate/SKILL.md +6 -6
  90. package/skills/omnistudio-omniscript-generate/SKILL.md +6 -5
  91. package/skills/platform-apex-logs-debug/SKILL.md +1 -0
  92. package/skills/platform-metadata-deploy/SKILL.md +1 -0
  93. package/skills/platform-models-api-configure/SKILL.md +5 -5
  94. package/skills/platform-soql-query/SKILL.md +1 -0
  95. package/skills/service-itsm-agentic-setup-cmdb-coordinate/SKILL.md +17 -6
  96. package/skills/service-itsm-agentic-setup-incident-sla-configure/SKILL.md +107 -192
  97. package/skills/service-itsm-agentic-setup-incident-sla-configure/assets/attach-milestone-action.json +6 -6
  98. package/skills/service-itsm-agentic-setup-incident-sla-configure/examples/milestone-patterns.md +49 -20
  99. package/skills/service-itsm-agentic-setup-incident-sla-configure/examples/output-templates.md +4 -4
  100. package/skills/service-itsm-agentic-setup-incident-sla-configure/references/mcp-invocation.md +224 -290
  101. package/skills/service-itsm-agentic-setup-incident-sla-configure/references/workflow.md +295 -0
  102. package/skills/service-itsm-incident-priority-configure/SKILL.md +1 -1
  103. package/skills/service-itsm-slack-itservice-configure/SKILL.md +2 -1
  104. package/skills/service-itsm-slack-itservice-configure/references/manage-slack-connection.md +2 -2
  105. package/skills/service-omni-channel-setup-coordinate/SKILL.md +20 -13
  106. package/skills/service-omni-channel-setup-coordinate/scripts/integration-driver.sh +5 -55
  107. package/skills/service-omni-channel-setup-coordinate/scripts/tests/test_omni_contracts.py +0 -38
  108. package/skills/service-omni-command-center-analyze/SKILL.md +2 -3
  109. package/skills/service-omni-command-center-analyze/scripts/analyze.sh +3 -3
  110. package/skills/tableau-next-asset-create/README.md +65 -0
  111. package/skills/tableau-next-asset-create/SKILL.md +409 -0
  112. package/skills/tableau-next-asset-create/references/admin-users.md +149 -0
  113. package/skills/tableau-next-asset-create/references/ai-readiness.md +355 -0
  114. package/skills/tableau-next-asset-create/references/alerts.md +111 -0
  115. package/skills/tableau-next-asset-create/references/build-workflow.md +819 -0
  116. package/skills/tableau-next-asset-create/references/dashboard-authoring.md +302 -0
  117. package/skills/tableau-next-asset-create/references/dashboard-design-principles.md +352 -0
  118. package/skills/tableau-next-asset-create/references/data-transform-gotchas.md +210 -0
  119. package/skills/tableau-next-asset-create/references/data-understanding.md +387 -0
  120. package/skills/tableau-next-asset-create/references/deep-reference-index.md +74 -0
  121. package/skills/tableau-next-asset-create/references/destructive-operations.md +62 -0
  122. package/skills/tableau-next-asset-create/references/edit-dashboard.md +273 -0
  123. package/skills/tableau-next-asset-create/references/edit-visualization.md +529 -0
  124. package/skills/tableau-next-asset-create/references/empty-source-handling.md +104 -0
  125. package/skills/tableau-next-asset-create/references/ingest-and-metric-gotchas.md +638 -0
  126. package/skills/tableau-next-asset-create/references/insight-bundle.md +69 -0
  127. package/skills/tableau-next-asset-create/references/large-flat-file-handling.md +331 -0
  128. package/skills/tableau-next-asset-create/references/schemas/edit-dashboard/_envelope.json +54 -0
  129. package/skills/tableau-next-asset-create/references/schemas/edit-dashboard/_shared-widget-fields.json +122 -0
  130. package/skills/tableau-next-asset-create/references/schemas/edit-dashboard/add_page.json +29 -0
  131. package/skills/tableau-next-asset-create/references/schemas/edit-dashboard/delete_page.json +27 -0
  132. package/skills/tableau-next-asset-create/references/schemas/edit-dashboard/discard_dashboard.json +11 -0
  133. package/skills/tableau-next-asset-create/references/schemas/edit-dashboard/move_widget.json +30 -0
  134. package/skills/tableau-next-asset-create/references/schemas/edit-dashboard/move_widget_to_page.json +30 -0
  135. package/skills/tableau-next-asset-create/references/schemas/edit-dashboard/place_widget_on_page.json +30 -0
  136. package/skills/tableau-next-asset-create/references/schemas/edit-dashboard/remove_widget_from_dashboard.json +16 -0
  137. package/skills/tableau-next-asset-create/references/schemas/edit-dashboard/remove_widget_from_page.json +26 -0
  138. package/skills/tableau-next-asset-create/references/schemas/edit-dashboard/rename_page.json +28 -0
  139. package/skills/tableau-next-asset-create/references/schemas/edit-dashboard/save_dashboard.json +18 -0
  140. package/skills/tableau-next-asset-create/references/schemas/edit-dashboard/undo.json +11 -0
  141. package/skills/tableau-next-asset-create/references/schemas/edit-dashboard/upsert_button_widget.json +69 -0
  142. package/skills/tableau-next-asset-create/references/schemas/edit-dashboard/upsert_container_widget.json +88 -0
  143. package/skills/tableau-next-asset-create/references/schemas/edit-dashboard/upsert_filter_widget.json +146 -0
  144. package/skills/tableau-next-asset-create/references/schemas/edit-dashboard/upsert_metric_widget.json +78 -0
  145. package/skills/tableau-next-asset-create/references/schemas/edit-dashboard/upsert_navigation_widget.json +80 -0
  146. package/skills/tableau-next-asset-create/references/schemas/edit-dashboard/upsert_parameter_widget.json +160 -0
  147. package/skills/tableau-next-asset-create/references/schemas/edit-dashboard/upsert_text_widget.json +103 -0
  148. package/skills/tableau-next-asset-create/references/schemas/edit-dashboard/upsert_visualization_widget.json +68 -0
  149. package/skills/tableau-next-asset-create/references/sdm-tool-reference.md +721 -0
  150. package/skills/tableau-next-asset-create/references/semantic-query-and-enrichment.md +355 -0
  151. package/skills/tableau-next-asset-create/references/shared-gates.md +322 -0
  152. package/skills/tableau-next-asset-create/references/sharing-and-promotion.md +306 -0
  153. package/skills/tableau-next-asset-create/references/tasks/ai-readiness-audit.md +51 -0
  154. package/skills/tableau-next-asset-create/references/tasks/analyze-data.md +48 -0
  155. package/skills/tableau-next-asset-create/references/tasks/build-dashboard.md +66 -0
  156. package/skills/tableau-next-asset-create/references/tasks/build-end-to-end.md +73 -0
  157. package/skills/tableau-next-asset-create/references/tasks/create-data-transform.md +51 -0
  158. package/skills/tableau-next-asset-create/references/tasks/create-viz.md +58 -0
  159. package/skills/tableau-next-asset-create/references/tasks/edit-dashboard.md +80 -0
  160. package/skills/tableau-next-asset-create/references/tasks/edit-sdm.md +106 -0
  161. package/skills/tableau-next-asset-create/references/tasks/edit-viz.md +40 -0
  162. package/skills/tableau-next-asset-create/references/tasks/enrich-model.md +68 -0
  163. package/skills/tableau-next-asset-create/references/tasks/ingest-flat-file.md +68 -0
  164. package/skills/tableau-next-asset-create/references/tasks/manage-alert.md +35 -0
  165. package/skills/tableau-next-asset-create/references/tasks/profile-dataset.md +47 -0
  166. package/skills/tableau-next-asset-create/references/tasks/promote-or-reuse.md +46 -0
  167. package/skills/tableau-next-asset-create/references/tasks/provision-user.md +39 -0
  168. package/skills/tableau-next-asset-create/references/tasks/query-model.md +92 -0
  169. package/skills/tableau-next-asset-create/references/tasks/review-verified-questions.md +42 -0
  170. package/skills/tableau-next-asset-create/references/tasks/share-asset.md +37 -0
  171. package/skills/tableau-next-asset-create/references/verified-questions.md +125 -0
  172. package/skills/tableau-next-asset-create/references/viz-authoring.md +992 -0
  173. package/skills/service-de-channel-consent-configure/SKILL.md +0 -230
  174. package/skills/service-itsm-agentic-setup-incident-sla-configure/assets/predefined-incident-policy.json +0 -102
@@ -142,8 +142,8 @@ else
142
142
  REC_SKILL="null"
143
143
  else
144
144
  STATE="v2_available_not_enabled"
145
- REC_ACTION="Org supports V2 but the CommandCenterForServiceV2 preference is off (no seeded page). Use service-omni-command-center-configure when the W-24039822 Metadata API contract is available; otherwise enable it manually in Setup → Omni-Channel → Supervisor Settings."
146
- REC_SKILL='"service-omni-command-center-configure"'
145
+ REC_ACTION="Org supports V2 but the CommandCenterForServiceV2 preference is off (no seeded page). Enable it manually in Setup → Omni-Channel → Supervisor Settings; there is no supported Metadata/Tooling write API for this preference."
146
+ REC_SKILL="null"
147
147
  fi
148
148
  fi
149
149
 
@@ -153,7 +153,7 @@ case "$STATE" in
153
153
  v2_permission_missing)
154
154
  MANUAL_ACTIONS=$(jq -n '[{id:"ASSIGN_V2_PERM",title:"Assign the CommandCenterForServiceUser permission to the supervisor (headless-capable via PermissionSet; packaging pending)",target_skill:null}]') ;;
155
155
  v2_available_not_enabled|v2_seed_incomplete)
156
- MANUAL_ACTIONS=$(jq -n '[{id:"ENABLE_V2_PREF",title:"Enable Command Center for Service V2 with service-omni-command-center-configure when the W-24039822 API field is available; otherwise use Setup → Omni-Channel → Supervisor Settings",target_skill:"service-omni-command-center-configure"}]') ;;
156
+ MANUAL_ACTIONS=$(jq -n '[{id:"ENABLE_V2_PREF",title:"Enable Command Center for Service V2 in Setup → Omni-Channel → Supervisor Settings (no supported public write API; manual)",target_skill:null}]') ;;
157
157
  esac
158
158
 
159
159
  # Emit
@@ -0,0 +1,65 @@
1
+ # tableau-next-asset-create
2
+
3
+ A skill for building **Tableau Next semantic models that actually return data**
4
+ via a `tableau-next-*` MCP server, then enriching, querying, and visualizing
5
+ them.
6
+
7
+ ## What it does
8
+
9
+ Routes an agent through the full authoring workflow: ingest CSVs to DLO/DMO,
10
+ discover and row-gate sources, join the semantic data model (SDM), add
11
+ calculated fields and metrics, run semantic queries, and build visualizations
12
+ and dashboards. It encodes the failure modes that produce **empty or
13
+ confidently-wrong dashboards** in Tableau Next — building on zero-row source
14
+ objects, leaving objects unjoined, inventing field apiNames instead of reading
15
+ them back, and shipping a populated-but-wrong model (an ID summed as a measure,
16
+ a snapshot inflated by its date count).
17
+
18
+ Trigger it for "analyze this CSV", "analyze account engagement", "build a
19
+ dashboard from these extracts" — whenever the user wants insight from data that
20
+ **isn't modeled yet** — and also for unnamed counts/totals ("how many orders…
21
+ from existing Tableau Next data") and for designing the dashboard
22
+ narrative/layout *before* charting. Plain counts, totals, and scalars against
23
+ existing Tableau Next data go to `run_semantic_query` (the model need not be
24
+ named). Interpreted breakdowns, rankings, trends, and comparisons go to
25
+ `analyze_data`. Not for debugging a broken MCP server, writing application
26
+ code, or reviewing someone else's existing dashboard without changing it.
27
+
28
+ ## Structure
29
+
30
+ ```text
31
+ SKILL.md # thin router: G1 precondition + intent→guide table + no-dispatch rule
32
+ references/
33
+ shared-gates.md # single source of truth for the overlapping guardrails (G1–G8)
34
+ tasks/ # thin task guides — one per capability; each opens with its gate header
35
+ build-end-to-end.md # greenfield: build model + dashboard from scratch (Step 0→11)
36
+ ingest-flat-file.md # ingest CSV → DLO → DMO
37
+ profile-dataset.md # read-only: profile / discover / verify / triage empty
38
+ edit-sdm.md # add a RAW object / dimension / measure / join / logical view
39
+ enrich-model.md # add a CALCULATED dimension / measure / metric
40
+ ai-readiness-audit.md # backfill readiness metadata / validate a model
41
+ query-model.md # run_semantic_query for figures (model need not be named)
42
+ analyze-data.md # interpreted breakdown / ranking / trend / comparison
43
+ create-viz.md # create a single visualization
44
+ edit-viz.md # edit an EXISTING visualization / persist via update_visualization
45
+ build-dashboard.md # design / create / update a dashboard, add widgets/filters
46
+ # deep references (verified payloads + tool shapes) — cited BY the task guides:
47
+ build-workflow.md # full numbered-step procedural spine with verified payloads
48
+ large-flat-file-handling.md
49
+ data-understanding.md
50
+ sdm-tool-reference.md
51
+ empty-source-handling.md
52
+ semantic-query-and-enrichment.md
53
+ ingest-and-metric-gotchas.md
54
+ viz-authoring.md
55
+ edit-visualization.md
56
+ dashboard-authoring.md
57
+ dashboard-design-principles.md
58
+ ai-readiness.md
59
+ ```
60
+
61
+ The router asserts **G1** (a Tableau Next MCP server must be connected) once,
62
+ then dispatches an intent to a task guide. Each guide's header names the gates
63
+ it must assert (from `shared-gates.md`) before any tool call, then points *down*
64
+ to a deep reference for the verified payload. The overlapping guardrails live
65
+ in exactly one place (`shared-gates.md`).
@@ -0,0 +1,409 @@
1
+ ---
2
+ name: tableau-next-asset-create
3
+ description: "Build and edit Tableau Next semantic models (SDMs), vizzes, and dashboards via MCP. TRIGGER when: building a semantic model or dashboard from CSV/Excel files; ingesting a flat file/database into DLO/DMO; profiling a dataset (grain, measures, dimensions; large/wide files via `infer_object_schema`); adding a dimension, measure, AI-ready metric, join, or logical view; running a semantic query, interpreting a breakdown, analyzing account/customer engagement, or pulling counts/totals from existing Tableau Next data (even unnamed/read-only); creating/editing a viz (filter, forecast, sort, shelf, mark encoding, reference line), widget, or dashboard layout. Also: Data Cloud SQL transforms; show a dashboard; share/revoke access; reuse prod or promote Personal Org assets; provision users/licenses; data alerts ('alert me when'); list/classify verified questions or score agent SQL. DO NOT TRIGGER for: rewriting prose descriptions, layout-only dashboard review, debugging MCP, or writing app code."
4
+ metadata:
5
+ version: "1.1"
6
+ domains: ["Tableau Next"]
7
+ mcpTools:
8
+ tableau-next:
9
+ tools:
10
+ - add_asset_share
11
+ - add_global_filter_to_dashboard
12
+ - add_semantic_model_calculated_dimension
13
+ - add_semantic_model_calculated_measure
14
+ - add_semantic_model_data_object
15
+ - add_semantic_model_dimension
16
+ - add_semantic_model_logical_view
17
+ - add_semantic_model_measure
18
+ - add_semantic_model_metric
19
+ - add_semantic_model_parameter
20
+ - add_semantic_model_relationship
21
+ - add_workspace_asset
22
+ - analyze_data
23
+ - browse_data_assets
24
+ - browse_data_assets_v2
25
+ - classify_analytics_interactions
26
+ - create_alert
27
+ - create_analytics_utterances
28
+ - create_dashboard
29
+ - create_data_model_object
30
+ - create_data_stream
31
+ - create_data_transform
32
+ - create_dlo_to_dmo_mapping
33
+ - create_promotion_pull_request
34
+ - create_reuse_promotion_request
35
+ - create_semantic_model
36
+ - create_visualization
37
+ - delete_alert
38
+ - delete_analytics_utterances
39
+ - delete_dashboard
40
+ - delete_semantic_model
41
+ - delete_semantic_model_calculated_dimension
42
+ - delete_semantic_model_calculated_measure
43
+ - delete_semantic_model_data_object
44
+ - delete_semantic_model_logical_view
45
+ - delete_semantic_model_metric
46
+ - delete_semantic_model_parameter
47
+ - delete_semantic_model_relationship
48
+ - delete_visualization
49
+ - delete_workspace
50
+ - edit_dashboard
51
+ - edit_visualization
52
+ - generate_business_preference
53
+ - generate_presigned_credential
54
+ - get_alerts
55
+ - get_analytics_full_interaction
56
+ - get_analytics_utterance
57
+ - get_connection
58
+ - get_dashboard
59
+ - get_data_stream
60
+ - get_data_transform
61
+ - get_data_transform_run_history
62
+ - get_dlo_to_dmo_mapping_status
63
+ - get_license_availability
64
+ - get_promotion_reuse_request
65
+ - get_semantic_model
66
+ - get_semantic_model_business_preferences
67
+ - get_semantic_model_calculated_dimension
68
+ - get_semantic_model_calculated_measure
69
+ - get_semantic_model_data_object
70
+ - get_semantic_model_logical_view
71
+ - get_semantic_model_metric
72
+ - get_semantic_model_relationship
73
+ - get_upload_connection
74
+ - get_users
75
+ - get_visualization
76
+ - infer_object_schema
77
+ - list_analytics_interactions
78
+ - list_asset_dependencies
79
+ - list_asset_shares
80
+ - list_connections
81
+ - list_dashboards
82
+ - list_data_connection_objects
83
+ - list_promotion_reuse_requests
84
+ - list_semantic_model_calculated_dimensions
85
+ - list_semantic_model_calculated_measures
86
+ - list_semantic_model_data_objects
87
+ - list_semantic_model_dependencies
88
+ - list_semantic_model_dimensions
89
+ - list_semantic_model_measures
90
+ - list_semantic_model_metrics
91
+ - list_semantic_model_parameters
92
+ - list_semantic_model_relationships
93
+ - list_semantic_models
94
+ - list_visualizations
95
+ - list_workspace_assets
96
+ - list_workspaces
97
+ - refresh_data_transform_status
98
+ - remove_asset_share
99
+ - remove_workspace_asset
100
+ - render_dashboard
101
+ - render_visualization
102
+ - run_data_stream
103
+ - run_data_transform
104
+ - run_query
105
+ - run_regression_evaluator
106
+ - run_semantic_query
107
+ - search_users_and_groups
108
+ - set_data_transform_schedule
109
+ - test_existing_connection
110
+ - update_alert
111
+ - update_analytics_utterance
112
+ - update_and_classify_analytics_interaction
113
+ - update_asset_share
114
+ - update_data_transform
115
+ - update_semantic_model
116
+ - update_semantic_model_business_preferences
117
+ - update_semantic_model_calculated_dimension
118
+ - update_semantic_model_calculated_measure
119
+ - update_semantic_model_data_object
120
+ - update_semantic_model_dimension
121
+ - update_semantic_model_logical_view
122
+ - update_semantic_model_measure
123
+ - update_semantic_model_metric
124
+ - update_semantic_model_parameter
125
+ - update_semantic_model_relationship
126
+ - update_visualization
127
+ - upsert_user
128
+ - validate_data_transform
129
+ semver: ">=1.0.0"
130
+ cliTools:
131
+ - tool: ["gh"]
132
+ semver: ">=2.0.0"
133
+ ---
134
+
135
+ # Tableau Next SDM Authoring — Router
136
+
137
+ Build semantic data models that actually return data, then enrich, query, and
138
+ visualize them. This skill encodes the failures that produce empty or
139
+ confidently-wrong dashboards in Tableau Next — building on **empty** source
140
+ objects, leaving objects **unjoined**, inventing field **apiNames**, summing an
141
+ ID, inflating a snapshot by its date count — and carries through to enriching,
142
+ querying, and visualizing the model.
143
+
144
+ This file is a **router**. It does two things: assert the one universal
145
+ precondition (G1), then dispatch your intent to the right task guide. The
146
+ guardrails that overlap between steps live in exactly one place —
147
+ **`references/shared-gates.md`** (gates G1–G8) — and each task guide opens with
148
+ the gates it must assert. Read the gate file once; every guide points back to it.
149
+
150
+ **The MCP tools are exposed under a `tableau-next-*` server** (Claude Code, for
151
+ example, advertises them as `mcp__tableau-next-pilot-production__add_semantic_model_relationship`).
152
+ Every tool name in this skill — router and reference/task files alike — is written
153
+ **bare** (e.g. `add_semantic_model_relationship`) for readability; invoke each one
154
+ under whatever name your client exposes for that server's tool. Match the advertised
155
+ name — do not hand-construct it. (Single statement: `references/shared-gates.md`.)
156
+
157
+ ## G1 — Precondition (assert once, here, before dispatching)
158
+
159
+ Every step of this skill drives a Tableau Next MCP server; without one connected
160
+ there is nothing to call. Before dispatching to any guide, confirm the available
161
+ tools include one prefixed `mcp__tableau-next-*__` (e.g.
162
+ `mcp__tableau-next-pilot-production__browse_data_assets`,
163
+ `mcp__tableau-next-self-service__create_semantic_model`). Server names vary — match
164
+ the `tableau-next` stem, not an exact name.
165
+
166
+ **If NO such tool is present, STOP.** Do not attempt the workflow, do not describe
167
+ payloads as if you had run them, and never fabricate tool calls, results, or IDs.
168
+ Tell the user the skill requires a connected Tableau Next MCP server (e.g.
169
+ `tableau-next-pilot-*`, `tableau-next-self-service`) and ask them to connect one
170
+ and re-invoke. Every entry point inherits this — a standalone "add a metric" with
171
+ no server must still STOP. Full statement: `references/shared-gates.md` G1.
172
+
173
+ ## Dispatch — route your intent to a task guide
174
+
175
+ Classify on **what the user wants to do**, then read that guide. Each guide's
176
+ header names the gates it asserts (from `references/shared-gates.md`).
177
+
178
+ Question phrasing does not exempt an intent from classification. "How do I
179
+ profile X" → `profile-dataset.md`. "What payload do I use for
180
+ `create_visualization`" / "which chart type for a stacked bar" →
181
+ `create-viz.md` (**not** `viz-authoring.md` — that file is cited by the
182
+ guide, it is not a first hop). "Before I build, how should I design the
183
+ layout" → `dashboard-design-principles.md` (load this skill; do not answer
184
+ from general dashboard knowledge). Only an explicit disclaimer of
185
+ *authoring* ("don't build/create anything") sends advice / review / ideation
186
+ to the No-dispatch rule. A disclaimer that still asks for a number, table,
187
+ or interpretation ("don't build or change any model — just get the count
188
+ from existing Tableau Next data") is a query/analyze intent: route to
189
+ `query-model.md` / `analyze-data.md`. The question mark is never the test.
190
+
191
+ | User intent | Route to |
192
+ |-------------|----------|
193
+ | "analyze this CSV" / "build a dashboard from these files" / nothing modeled yet | `references/tasks/build-end-to-end.md` |
194
+ | "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` |
195
+ | "create / update a data transform" / derived DLO or DMO via Data Cloud SQL | `references/tasks/create-data-transform.md` |
196
+ | "profile / discover / check this data" (read-only) | `references/tasks/profile-dataset.md` |
197
+ | add a **raw** object / dimension / measure / join / **logical view** / **parameter** to my model | `references/tasks/edit-sdm.md` |
198
+ | add a **calculated** dimension / measure / **metric** to my model | `references/tasks/enrich-model.md` |
199
+ | "is my model AI-ready" / "backfill readiness metadata" / validate a model | `references/tasks/ai-readiness-audit.md` |
200
+ | 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` |
201
+ | interpreted breakdown / ranking / trend / comparison without asking to author | `references/tasks/analyze-data.md` |
202
+ | delete a calc / metric / data object / logical view / relationship (component, not the whole SDM) | `references/sdm-tool-reference.md` |
203
+ | "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) |
204
+ | "edit / add a filter / forecast / sort / field to **this** chart" (an existing viz) | `references/tasks/edit-viz.md` |
205
+ | "show / view / display my existing chart/visualization" (no edit) | Call `get_visualization` directly (`minorVersion: -1`) — renders inline; do NOT chain `render_visualization` |
206
+ | "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) |
207
+ | "create a dashboard" / design a dashboard layout / add a global filter (no existing dashboard to edit) | `references/tasks/build-dashboard.md` |
208
+ | "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` |
209
+ | "how should I design the narrative/layout before charting" (no existing dashboard to review) | `references/dashboard-design-principles.md` |
210
+ | share / revoke / list who has access (user or group on a dashboard, viz, workspace, or SDM) | `references/tasks/share-asset.md` |
211
+ | reuse a prod asset in a Personal Org **or** promote a Personal Org asset / open a promotion PR | `references/tasks/promote-or-reuse.md` |
212
+ | provision / list Tableau Next users / check licenses (org **role**, not asset ACL) | `references/tasks/provision-user.md` |
213
+ | "alert me when" / change that alert / list or delete my alerts (ongoing monitor) | `references/tasks/manage-alert.md` |
214
+ | list / classify verified questions **or** score agent SQL against expected SQL | `references/tasks/review-verified-questions.md` |
215
+
216
+ **Destructive / lifecycle operations** — component and whole-asset deletes,
217
+ workspace asset association, share/reuse/promotion mutations, `upsert_user`,
218
+ `delete_alert`, `delete_analytics_utterances`, `edit_dashboard` drafts, and
219
+ double-wrapped `defaultExc` responses: read
220
+ **`references/destructive-operations.md`** before calling any of them. Always
221
+ get explicit user confirmation before `delete_visualization` /
222
+ `delete_dashboard` / `delete_semantic_model` / `delete_workspace`, and never
223
+ call `save_dashboard` or `upsert_user` without the user's explicit go-ahead.
224
+
225
+ **Disambiguation:**
226
+ - **calculated vs. raw** — a calc dimension/measure/metric routes to
227
+ `enrich-model.md`; a plain object/dimension/measure/join/**logical view**
228
+ routes to `edit-sdm.md`.
229
+ - **analyze vs query vs greenfield** — figures (counts, totals, scalars;
230
+ "how many orders", "what is total revenue") → `query-model.md`
231
+ (`run_semantic_query`; discover the SDM with `list_semantic_models` if
232
+ unnamed), **including** when the user says not to build or change a model.
233
+ Interpreted breakdowns, rankings, trends, comparisons →
234
+ `analyze-data.md` (`analyze_data`; do not pin `targetEntityNameOrId` /
235
+ `targetEntityType` unless the user named an SDM). Named already-built model +
236
+ structured table / explicit `run_semantic_query` → `query-model.md`. Raw SQL
237
+ against a DLO/DMO (`run_query`) when no SDM covers the data, or the user
238
+ asked for SQL, also → `query-model.md` (that guide prefers
239
+ `run_semantic_query` when an SDM exists). Nothing modeled yet / CSV /
240
+ "build a dashboard" → `build-end-to-end.md`. Ingest from an existing
241
+ database connection (not a local file) still → `ingest-flat-file.md`.
242
+ Derived table / Data Cloud SQL transform → `create-data-transform.md`, not
243
+ ingest and not `enrich-model.md`. Metadata discovery (list SDMs, fields,
244
+ relationships) is `list_*` / `get_*`, not `analyze_data`.
245
+ - **create vs. edit a viz** — a request that names or clearly references an
246
+ **existing** chart ("add a forecast to my monthly sales chart", "filter this
247
+ chart to West") routes to `edit-viz.md`; a request with no existing chart in
248
+ play ("create a bar chart of sales by category", "which chart type and what
249
+ `create_visualization` payload for a stacked bar") routes to `create-viz.md`.
250
+ Do not skip to `viz-authoring.md`.
251
+ - **create vs. edit a dashboard** — a request that names or clearly references an
252
+ **existing** dashboard ("add a KPI widget to my sales dashboard", "move this
253
+ chart to the top", "add a details page to the pipeline dashboard") routes to
254
+ `edit-dashboard.md`; a request with no existing dashboard in play ("create a
255
+ dashboard for regional sales", "design a dashboard layout for these metrics")
256
+ routes to `build-dashboard.md`. Do not skip to `dashboard-authoring.md`.
257
+ - **show vs get vs edit a dashboard** — "show / open / view my Sales
258
+ dashboard" (including naming or id'ing one to see it), no edit → `render_dashboard`
259
+ (`dashboard-authoring.md` §8). Widget JSON / PATCH or `edit_dashboard` prep on
260
+ an **existing** dashboard → `get_dashboard` then `edit-dashboard.md`. "Review
261
+ this dashboard, don't modify it" stays No-dispatch.
262
+ - **Fast-path** — if a suitable **already-built, populated, joined** model is
263
+ available (named, or discovered via `list_semantic_models`) and the user wants
264
+ figures or a structured table, this skill's build steps are not the entry
265
+ point: route to `query-model.md` (`run_semantic_query`). An interpretive
266
+ question (breakdown, ranking, trend, comparison) → `analyze-data.md`.
267
+ - **Greenfield** — "analyze account engagement / build a dashboard" where no
268
+ model exists yet is a *build* intent (the trigger is "the user wants insight
269
+ from data that isn't modeled yet," not the literal phrase "semantic model") →
270
+ `build-end-to-end.md`.
271
+ - **share vs workspace membership** — granting a user/group `accessType` on an
272
+ asset routes to `share-asset.md`. Putting an asset in a workspace
273
+ (`add_workspace_asset`) is not a share.
274
+ - **revoke share vs delete the asset** — "unshare Alice" / "remove her access"
275
+ → `share-asset.md`. Deleting the dashboard/model/workspace itself stays on
276
+ the destructive tools above.
277
+ - **reuse / promote vs create** — copying or packaging an **existing** asset
278
+ routes to `promote-or-reuse.md`. Building a new SDM from data still goes to
279
+ `build-end-to-end.md` / `edit-sdm.md`.
280
+ - **share vs provision a user** — "share this dashboard with Alice" /
281
+ viewer-vs-editor on an asset → `share-asset.md` (`search_users_and_groups`).
282
+ "Add Alice as Analyst" / list Tableau Next users / check seats →
283
+ `provision-user.md` (`get_users` / `upsert_user`). Granting a **role** is
284
+ not granting `accessType` on an asset.
285
+ - **analyze vs alert** — one-off "why did EMEA sales drop" /
286
+ breakdown/trend/comparison → `analyze-data.md`. "Alert me when bookings
287
+ drop 10% week over week" / change or list my alerts → `manage-alert.md`.
288
+ Do not pin an SDM on either path.
289
+ - **query vs score SQL** — "what is total revenue" → `query-model.md`.
290
+ "Does this agent SQL match the expected SQL" →
291
+ `review-verified-questions.md` (`run_regression_evaluator`; persists
292
+ nothing).
293
+ - **AI-ready vs verified questions** — backfill descriptions / `agentEnabled`
294
+ / prefs → `ai-readiness-audit.md`. List/classify AVQ or score golden Q&A →
295
+ `review-verified-questions.md`.
296
+ - **insights (analyze vs metric-card payload)** — "generate insights on EMEA
297
+ sales" / interpretive "what should I focus on" → `analyze-data.md`. The
298
+ dashboard metric-card live value/trend/status payload is
299
+ `generate_insight_bundle` / `render_metric` for the MCP app renderer
300
+ (`insight-bundle.md`) via `app.callServerTool()`. The model does **not**
301
+ call those tools on a user chat turn and does **not** first-hop to
302
+ `insight-bundle.md`.
303
+
304
+ ## No-dispatch rule (decline — do NOT route into an authoring guide)
305
+
306
+ The surface verbs above ("create a viz", "edit sdm", "create metric",
307
+ "create/update dashboard", "share", "promote", "reuse", "provision",
308
+ "alert", "classify") collide word-for-word
309
+ with work this skill is **not**
310
+ for. Classify on **build-vs-advise/review/ideate/edit-prose**, not the surface
311
+ verb. Decline (or hand off) these — do not dispatch:
312
+
313
+ - **Advice, no build** — "which chart type, stacked vs grouped? don't create
314
+ anything" → advise; do not route to `create-viz.md`.
315
+ - **Prose edit on an existing model** — decline any request whose *only* change
316
+ is the wording of an existing description/label, no matter the verb used
317
+ ("rewrite", "update", "fix", "correct", "improve", "reword" all count — the verb
318
+ is not the test). The test is: **does this add/change a field, join, metric, or
319
+ grain? If not — pure copy-editing — decline.** E.g. "rewrite the description on
320
+ my existing model" or "fix the typo in this field's description" → decline. This
321
+ is the sharpest near-miss: `edit-sdm.md` / `ai-readiness-audit.md` literally wrap
322
+ `update_semantic_model_dimension/_measure` as sparse description updates, so it
323
+ is tempting — but a prose-only edit is not authoring the model. (Backfilling
324
+ *missing* readiness metadata as part of making a model AI-ready IS in scope
325
+ and must echo `isVisible` + `dataObjectFieldName` — see G5; rewording existing
326
+ prose for style, accuracy, or typos is not.)
327
+ - **Ideation, no data** — "brainstorm KPIs I could track later, no changes now" →
328
+ ideate; do not route to `enrich-model.md`.
329
+ - **Review** — "review my dashboard layout, don't modify it" / "someone on my
330
+ team built this, what's confusing" → review; do not route to
331
+ `build-dashboard.md`. Designing the narrative *before* you drop charts is
332
+ the opposite intent — that **does** dispatch (to
333
+ `dashboard-design-principles.md`).
334
+ - **Share advice, no grant** — "who should I share this with / viewer vs
335
+ editor? don't actually share" → advise; do not route to `share-asset.md`.
336
+ - **Provision advice, no mutate** — "who should I add as Analyst? don't
337
+ provision anyone" → advise; do not route to `provision-user.md`.
338
+ - **Alert advice, no monitor** — "should I alert on this KPI? don't create
339
+ one" → advise; do not route to `manage-alert.md`.
340
+
341
+ A "don't build / don't change anything" disclaimer does **not** by itself
342
+ mean No-dispatch. Count / total / scalar ("how many orders") and named-model
343
+ structured query still route to `query-model.md`; interpreted breakdown /
344
+ ranking / trend / comparison still route to `analyze-data.md`. Those are
345
+ in-scope redirects, not declines.
346
+
347
+ Also out of scope: debugging a broken MCP server (→ Columbo / standard
348
+ debugging); writing application code / managing AI Suite infra.
349
+
350
+ ## Deep references (cited by task guides)
351
+
352
+ The task guides point *down* to these for verified payloads and tool shapes.
353
+ A narrow lookup — "how do I / what is / what's the exact ___" — is a
354
+ **direct-dispatch** only when the list below names that file. Viz,
355
+ dashboard-widget, ingest, and greenfield-build lookups are **not**
356
+ direct-dispatch: first-hop to the matching `references/tasks/*.md` guide
357
+ (the guide then cites the deep ref). In particular, chart-type /
358
+ `create_visualization` payload questions first-hop to `tasks/create-viz.md`;
359
+ **`viz-authoring.md` is not a first hop.**
360
+
361
+ Direct-dispatch lookups:
362
+
363
+ - "how do I handle a huge/wide CSV with cryptic columns" → `large-flat-file-handling.md`
364
+ - "how do I figure out grain / measures vs. dimensions [before modeling]" → `data-understanding.md`
365
+ - "what's the input shape / suffix rule for `add_semantic_model_*`" → `sdm-tool-reference.md`
366
+ - "how do I bind SDM fields in one `create_semantic_model` call" → `sdm-tool-reference.md`
367
+ - "how do I add or update a semantic-model parameter" → `tasks/edit-sdm.md`
368
+ (shapes in `sdm-tool-reference.md` Parameters)
369
+ - "how do I add a HardJoin / Union / CustomSQL logical view" → `tasks/edit-sdm.md`
370
+ (shapes in `sdm-tool-reference.md`)
371
+ - "how do I safely delete a calc / metric / data object / logical view / relationship" →
372
+ `sdm-tool-reference.md`
373
+ - "what depends on this viz / dashboard" / before deleting a viz or dashboard →
374
+ `dashboard-authoring.md`
375
+ - "how do I show / open / view a dashboard" (inline render, not metadata) →
376
+ `dashboard-authoring.md` (§8 `render_dashboard`)
377
+ - "why did my query return zero rows" / "empty vs. does-not-exist" → `empty-source-handling.md`
378
+ - "how do I write a `run_semantic_query` body" → `semantic-query-and-enrichment.md`
379
+ - "how do I make my model AI-ready" (checklist; not "backfill it now") → `ai-readiness.md`
380
+ - "how should I design the narrative/layout before charting" → `dashboard-design-principles.md`
381
+
382
+ Not a first hop (cited only from the matching task guide):
383
+
384
+ - "which chart type / what `create_visualization` payload" → `tasks/create-viz.md`
385
+ (NOT `viz-authoring.md`)
386
+ - "how do I add/move/remove a widget on an **existing** dashboard" →
387
+ `tasks/edit-dashboard.md` (NOT `edit-dashboard.md` the deep ref, and NOT
388
+ `dashboard-authoring.md`)
389
+ - "how do I create a dashboard / lay out a **new** dashboard" →
390
+ `tasks/build-dashboard.md` (NOT `dashboard-authoring.md`)
391
+ - "how do I ingest a CSV / Excel / existing connection into a DLO/DMO" → `tasks/ingest-flat-file.md`
392
+ (NOT `ingest-and-metric-gotchas.md`)
393
+ - "how do I create or update a data transform" → `tasks/create-data-transform.md`
394
+ (NOT `data-transform-gotchas.md`)
395
+ - "walk me through building a model end to end" → `tasks/build-end-to-end.md`
396
+ (NOT `build-workflow.md`)
397
+ - "how do I share / unshare / list who has access" → `tasks/share-asset.md`
398
+ (NOT `sharing-and-promotion.md`)
399
+ - "how do I reuse a prod asset or promote a Personal Org asset" →
400
+ `tasks/promote-or-reuse.md` (NOT `sharing-and-promotion.md`)
401
+ - "how do I provision / list Tableau Next users / check licenses" →
402
+ `tasks/provision-user.md` (NOT `admin-users.md`)
403
+ - "how do I create / update / list / delete a data alert" → `tasks/manage-alert.md`
404
+ (NOT `alerts.md`)
405
+ - "how do I list verified questions / score agent SQL" →
406
+ `tasks/review-verified-questions.md` (NOT `verified-questions.md`)
407
+
408
+ What each deep reference covers (and which guide cites it) is in
409
+ **`references/deep-reference-index.md`**.
@@ -0,0 +1,149 @@
1
+ # Admin users and licenses — payloads and gotchas
2
+
3
+ Load this from `tasks/provision-user.md`. Not a first hop.
4
+
5
+ Tableau Next **role** provisioning is org-admin, not asset ACL. Sharing an
6
+ asset (`search_users_and_groups` / `add_asset_share`) stays on
7
+ `tasks/share-asset.md`.
8
+
9
+ The MCP tools are namespaced per server — names here are bare; use whichever
10
+ server prefix is connected.
11
+
12
+ ## Contents
13
+
14
+ - `get_users` — list / search (ADMIN-ONLY)
15
+ - `get_license_availability` — seats before ADD or role upgrade
16
+ - `upsert_user` — ADD / UPDATE / REVOKE / DEACTIVATE (never on the request turn)
17
+
18
+ All three tools are **ADMIN-ONLY**. If any returns a permission / unauthorized
19
+ error, report it and **STOP**. Do not retry and do not fall back to analyst
20
+ tools (`search_users_and_groups`, share tools, ingest). Unauthorized here means
21
+ the current user is not a Tableau Next admin.
22
+
23
+ ---
24
+
25
+ ## `get_users`
26
+
27
+ Retrieve Tableau Next users for admin management. Only **Standard** users are
28
+ returned. Filters apply **server-side**, so `limit` / `offset` is the filtered
29
+ set, not the unfiltered org.
30
+
31
+ **Inputs (all optional):**
32
+
33
+ - `searchQuery` — case-insensitive substring on name, username, or email
34
+ - `role` — exact: `ADMIN`, `ANALYST`, `SELF_SERVICE_ANALYST`,
35
+ `SELF_SERVICE_CONSUMER`, `CONSUMER`. Unrecognized values are rejected
36
+ - `license` — permission-set-license key; users whose role grants it
37
+ - `isActive` — `true` / `false`; omit for both
38
+ - `limit` — default 50, capped at 2000
39
+ - `offset` — **omit on the first page** (starts at 0)
40
+
41
+ **Returns:** `items[]` (`id`, `name`, `email`, `isActive`, plus derived `role`
42
+ and `license` when the user holds a Tableau Next role), `size`, `nextOffset`.
43
+
44
+ **Pagination.** Omit `offset` on the first call. Pass the returned
45
+ `nextOffset` back as `offset`. Continue until a page has fewer than `limit`
46
+ items (or is empty).
47
+
48
+ **Use when:** browse or find users before granting or revoking a role.
49
+
50
+ ---
51
+
52
+ ## `get_license_availability`
53
+
54
+ Call **before** `upsert_user` ADD or a role upgrade. When `available` is `0`
55
+ or `exhausted` is `true` for the target license class, **warn** and do not
56
+ attempt the change.
57
+
58
+ **Inputs (optional):** `licenseType` — same role enum as `get_users`. Omit to
59
+ return every Tableau Next license class.
60
+
61
+ **Returns:** `items[]` with `licenseKey`, `label`, `total`, `used`,
62
+ `available`, `exhausted`, plus `size`.
63
+
64
+ ---
65
+
66
+ ## `upsert_user`
67
+
68
+ Provision a Tableau Next user by role. **Never call on the turn the admin
69
+ makes the request.** Present a per-action preview (below) and wait for
70
+ explicit approval in a **separate** turn. This applies to every action,
71
+ including ones that look clear or urgent.
72
+
73
+ The caller must choose the action. This tool never infers ADD vs UPDATE vs
74
+ REVOKE vs DEACTIVATE.
75
+
76
+ ### Required inputs
77
+
78
+ - `action` — `ADD` | `UPDATE` | `REVOKE` | `DEACTIVATE`
79
+ - `email` — also the login / username
80
+ - `firstName`, `lastName`
81
+ - `role` — `ADMIN` | `ANALYST` | `SELF_SERVICE_ANALYST` |
82
+ `SELF_SERVICE_CONSUMER` | `CONSUMER`
83
+
84
+ Optional: `localeSidKey` (e.g. `en_US`), `timeZoneSidKey` (e.g.
85
+ `America/Los_Angeles`), `alias`.
86
+
87
+ `forceDeactivate` (boolean, DEACTIVATE only, default `false`) — set `true`
88
+ **only** after the admin consents to deactivate a Personal Org owner.
89
+
90
+ **Returns:** `created`, `userId`, and a human-readable `message`.
91
+
92
+ ### What each action does
93
+
94
+ - **ADD** — creates a brand-new user and grants the role.
95
+ - **UPDATE** — sets an **existing** user to the role. Roles are mutually
96
+ exclusive: switching Admin → Analyst leaves Analyst only. Permission set
97
+ and permission-set license for the new role are granted; any other Tableau
98
+ Next role permission set is removed.
99
+ - **REVOKE** — removes the role's permission set(s); the user remains active.
100
+ - **DEACTIVATE** — sets the user inactive (cannot log in). Role permission
101
+ sets stay in place.
102
+
103
+ `firstName` / `lastName` apply **only on ADD**. They are ignored for UPDATE,
104
+ REVOKE, and DEACTIVATE. This tool **cannot rename** an existing user — tell
105
+ the admin that if they ask.
106
+
107
+ ### ADD CONFLICT ≠ silent UPDATE
108
+
109
+ ADD fails with **CONFLICT** when a user already exists for the email. That is
110
+ intentional. **Do not** silently retry as UPDATE. Report the conflict and get
111
+ explicit confirmation before granting the role via UPDATE (UPDATE changes that
112
+ user's permissions).
113
+
114
+ ### "Remove access" ≠ DEACTIVATE
115
+
116
+ Never infer DEACTIVATE from an ambiguous instruction. "Remove access" may mean
117
+ REVOKE (drop the Tableau Next role) or an **asset share** revoke
118
+ (`share-asset.md`). Ask. DEACTIVATE is the most destructive: the user loses
119
+ login and access to their Tableau Next content and assignments.
120
+
121
+ ### Personal Org owner CONFLICT
122
+
123
+ The tool enforces the Personal Org owner check **server-side**. First
124
+ DEACTIVATE call: omit `forceDeactivate` (or pass `false`). If the user owns
125
+ one or more Personal Orgs, the tool does **not** deactivate them; it returns
126
+ CONFLICT stating they own a Personal Org and will be removed as owner.
127
+
128
+ Relay that to the admin. Only if they **explicitly consent** re-invoke
129
+ DEACTIVATE with `forceDeactivate=true`. Never set `forceDeactivate` true on
130
+ the first call.
131
+
132
+ ### Preview formats (mandatory, all actions)
133
+
134
+ **(ADD)** Structured summary of the new user — name, email, role, permission
135
+ set(s), license type — then: "This user has not been created yet. Please
136
+ confirm to proceed."
137
+
138
+ **(UPDATE)** Side-by-side Current vs Proposed for every field that will
139
+ change (role, permission set(s), permission-set license(s)) — then: "These
140
+ changes have not been saved yet. Would you like to proceed?"
141
+
142
+ **(REVOKE)** Summarize the role and permission set(s) that will be removed.
143
+ Confirm before calling.
144
+
145
+ **(DEACTIVATE)** After describing access/content impact, show:
146
+ "⚠️ This will deactivate [name] ([email]) and revoke their access." then
147
+ "Please confirm to proceed." If the first call returns the Personal Org
148
+ owner CONFLICT, add "They will be removed as personal org owner." and
149
+ re-confirm before `forceDeactivate=true`.