@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.
- package/package.json +1 -1
- package/skills/agentforce-architecture-analyze/SKILL.md +66 -17
- package/skills/agentforce-architecture-analyze/assets/cli/show_access_token.yaml +4 -7
- package/skills/agentforce-architecture-analyze/references/contract.json +1 -1
- package/skills/agentforce-architecture-analyze/scripts/emit_env.py +2 -2
- package/skills/agentforce-architecture-analyze/scripts/main.py +40 -44
- package/skills/agentforce-architecture-analyze/scripts/rest_client.py +11 -3
- package/skills/agentforce-architecture-analyze/scripts/sf_cli.py +77 -10
- package/skills/agentforce-architecture-analyze/scripts/tests/test_end_to_end_fixture.py +1 -0
- package/skills/agentforce-architecture-analyze/scripts/tests/test_flow_children_inflation.py +1 -0
- package/skills/agentforce-architecture-analyze/scripts/tests/test_main_pipeline.py +53 -2
- package/skills/agentforce-architecture-analyze/scripts/tests/test_resolve_creds.py +184 -36
- package/skills/agentforce-architecture-analyze/scripts/tests/test_rest_client.py +17 -0
- package/skills/agentforce-architecture-analyze/scripts/tests/test_sf_cli.py +165 -11
- package/skills/agentforce-architecture-analyze/scripts/tests/test_skill_md_pipeline_block.py +319 -0
- package/skills/agentforce-d360-analyze/SKILL.md +28 -10
- package/skills/agentforce-d360-analyze/scripts/dc.py +200 -50
- package/skills/agentforce-d360-analyze/scripts/discover_sessions.py +10 -6
- package/skills/agentforce-d360-analyze/scripts/fetch_dc.py +22 -6
- package/skills/agentforce-d360-analyze/scripts/resolve_session.py +21 -13
- package/skills/agentforce-d360-analyze/scripts/tests/test_dc_and_resolve_session.py +298 -76
- package/skills/agentforce-d360-analyze/scripts/tests/test_default_target_org.py +432 -0
- package/skills/agentforce-d360-analyze/scripts/tests/test_discover_sessions.py +1 -1
- package/skills/agentforce-d360-analyze/scripts/tests/test_resolve_session_main.py +9 -3
- package/skills/agentforce-d360-analyze/scripts/tests/test_skill_md_prefix_block.py +176 -0
- package/skills/consumer-goods-accruals-datakit-deploy/SKILL.md +17 -27
- package/skills/consumer-goods-accruals-datakit-deploy/scripts/setup.js +7 -17
- package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/00-check-prerequisites.js +47 -63
- package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/01-download-static-resource.js +10 -13
- package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/02-replace-org-id.js +46 -46
- package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/03-deploy-metadata.js +4 -21
- package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/06-create-dataspace.js +58 -82
- package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/07-deploy-accruals-reports.js +16 -315
- package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/08-deploy-ui.js +9 -24
- package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/09-completion.js +44 -44
- package/skills/consumer-goods-accruals-datakit-deploy/scripts/steps/utils.js +11 -63
- package/skills/consumer-goods-rtr-datacloud-export-configure/SKILL.md +2 -1
- package/skills/consumer-goods-tpe-dashboard-configure/SKILL.md +2 -1
- package/skills/consumer-goods-tpe-dashboard-custom-kpi-configure/SKILL.md +2 -1
- package/skills/consumer-goods-tpe-datakit-deploy/SKILL.md +2 -1
- package/skills/data360-schema-get/SKILL.md +3 -3
- package/skills/design-systems-slds-validate/references/report-format.md +1 -1
- package/skills/dx-org-manage/SKILL.md +1 -0
- package/skills/dx-org-shape-manage/SKILL.md +1 -0
- package/skills/dx-org-snapshot-manage/SKILL.md +172 -0
- package/skills/dx-org-snapshot-manage/examples/create_error_output.json +16 -0
- package/skills/dx-org-snapshot-manage/examples/create_success_output.json +19 -0
- package/skills/dx-org-snapshot-manage/examples/delete_output.json +9 -0
- package/skills/dx-org-snapshot-manage/examples/get_output.json +19 -0
- package/skills/dx-org-snapshot-manage/examples/list_output.json +36 -0
- package/skills/dx-org-snapshot-manage/references/cli_flags.md +179 -0
- package/skills/dx-org-snapshot-manage/references/snapshot_usage.md +55 -0
- package/skills/dx-org-trial-expiration-check/SKILL.md +1 -1
- package/skills/dx-org-trial-expiration-check/scripts/check_expiration.sh +2 -2
- package/skills/education-cloud-student-recruitment-agent-configure/SKILL.md +7 -5
- package/skills/education-cloud-student-recruitment-agent-configure/references/prerequisites.md +11 -11
- package/skills/experience-content-media-image-generate/SKILL.md +83 -0
- package/skills/experience-content-media-image-generate/scripts/download-image.sh +84 -0
- package/skills/external-diagram-mermaid-generate/SKILL.md +12 -12
- package/skills/field-service-data-capture-migrate/references/component-mapping.md +1 -1
- package/skills/field-service-data-capture-migrate/references/fsm-dc-capability-catalog.md +1 -2
- package/skills/field-service-data-capture-migrate/references/known-deploy-errors.md +1 -0
- package/skills/field-service-data-capture-migrate/references/transformer-rules.md +1 -1
- package/skills/field-service-data-capture-migrate/scripts/transform_flow.py +12 -1
- package/skills/field-service-data-capture-migrate/scripts/vendor/build_flow.py +4 -1
- package/skills/field-service-setup-orchestrator-get/SKILL.md +0 -1
- package/skills/insurance-brokerage-agency-billing-configure/SKILL.md +233 -0
- package/skills/insurance-brokerage-agency-billing-configure/references/accounting-setup.md +117 -0
- package/skills/insurance-brokerage-agency-billing-configure/references/billing-rules-config.md +237 -0
- package/skills/insurance-brokerage-agency-billing-configure/references/billing-settings.md +271 -0
- package/skills/insurance-brokerage-agency-billing-configure/references/demo-policy-config.md +138 -0
- package/skills/insurance-brokerage-agency-billing-configure/references/org-defaults.md +64 -0
- package/skills/insurance-brokerage-agency-billing-configure/references/permissions-config.md +226 -0
- package/skills/insurance-brokerage-agency-billing-configure/references/prerequisites.md +142 -0
- package/skills/life-sciences-fieldsalesrep-coordinate/SKILL.md +3 -2
- package/skills/life-sciences-fieldsalesrep-coordinate/references/stage-5-visit-creation-execution-state-and-recovery.md +3 -3
- package/skills/life-sciences-fieldsalesrep-coordinate/references/stage-5-visit-creation-overview.md +68 -45
- package/skills/life-sciences-fieldsalesrep-coordinate/references/stage-5-visit-creation-visit-creation-data.md +17 -18
- package/skills/life-sciences-kam-coordinate/references/stage-5-data-and-plan-templates-overview.md +16 -3
- package/skills/life-sciences-kam-coordinate/references/stage-5-data-creation-data.md +16 -13
- package/skills/marketing-message-test/SKILL.md +194 -0
- package/skills/marketing-message-test/references/api-contract.md +333 -0
- package/skills/omnistudio-callable-apex-generate/SKILL.md +3 -3
- package/skills/omnistudio-datamapper-generate/SKILL.md +6 -6
- package/skills/omnistudio-datapacks-deploy/SKILL.md +11 -11
- package/skills/omnistudio-dependencies-analyze/SKILL.md +5 -5
- package/skills/omnistudio-epc-catalog-generate/SKILL.md +6 -6
- package/skills/omnistudio-flexcard-generate/SKILL.md +6 -6
- package/skills/omnistudio-integration-procedure-generate/SKILL.md +6 -6
- package/skills/omnistudio-omniscript-generate/SKILL.md +6 -5
- package/skills/platform-apex-logs-debug/SKILL.md +1 -0
- package/skills/platform-metadata-deploy/SKILL.md +1 -0
- package/skills/platform-models-api-configure/SKILL.md +5 -5
- package/skills/platform-soql-query/SKILL.md +1 -0
- package/skills/service-itsm-agentic-setup-cmdb-coordinate/SKILL.md +17 -6
- package/skills/service-itsm-agentic-setup-incident-sla-configure/SKILL.md +107 -192
- package/skills/service-itsm-agentic-setup-incident-sla-configure/assets/attach-milestone-action.json +6 -6
- package/skills/service-itsm-agentic-setup-incident-sla-configure/examples/milestone-patterns.md +49 -20
- package/skills/service-itsm-agentic-setup-incident-sla-configure/examples/output-templates.md +4 -4
- package/skills/service-itsm-agentic-setup-incident-sla-configure/references/mcp-invocation.md +224 -290
- package/skills/service-itsm-agentic-setup-incident-sla-configure/references/workflow.md +295 -0
- package/skills/service-itsm-incident-priority-configure/SKILL.md +1 -1
- package/skills/service-itsm-slack-itservice-configure/SKILL.md +2 -1
- package/skills/service-itsm-slack-itservice-configure/references/manage-slack-connection.md +2 -2
- package/skills/service-omni-channel-setup-coordinate/SKILL.md +20 -13
- package/skills/service-omni-channel-setup-coordinate/scripts/integration-driver.sh +5 -55
- package/skills/service-omni-channel-setup-coordinate/scripts/tests/test_omni_contracts.py +0 -38
- package/skills/service-omni-command-center-analyze/SKILL.md +2 -3
- package/skills/service-omni-command-center-analyze/scripts/analyze.sh +3 -3
- package/skills/tableau-next-asset-create/README.md +65 -0
- package/skills/tableau-next-asset-create/SKILL.md +409 -0
- package/skills/tableau-next-asset-create/references/admin-users.md +149 -0
- package/skills/tableau-next-asset-create/references/ai-readiness.md +355 -0
- package/skills/tableau-next-asset-create/references/alerts.md +111 -0
- package/skills/tableau-next-asset-create/references/build-workflow.md +819 -0
- package/skills/tableau-next-asset-create/references/dashboard-authoring.md +302 -0
- package/skills/tableau-next-asset-create/references/dashboard-design-principles.md +352 -0
- package/skills/tableau-next-asset-create/references/data-transform-gotchas.md +210 -0
- package/skills/tableau-next-asset-create/references/data-understanding.md +387 -0
- package/skills/tableau-next-asset-create/references/deep-reference-index.md +74 -0
- package/skills/tableau-next-asset-create/references/destructive-operations.md +62 -0
- package/skills/tableau-next-asset-create/references/edit-dashboard.md +273 -0
- package/skills/tableau-next-asset-create/references/edit-visualization.md +529 -0
- package/skills/tableau-next-asset-create/references/empty-source-handling.md +104 -0
- package/skills/tableau-next-asset-create/references/ingest-and-metric-gotchas.md +638 -0
- package/skills/tableau-next-asset-create/references/insight-bundle.md +69 -0
- package/skills/tableau-next-asset-create/references/large-flat-file-handling.md +331 -0
- package/skills/tableau-next-asset-create/references/schemas/edit-dashboard/_envelope.json +54 -0
- package/skills/tableau-next-asset-create/references/schemas/edit-dashboard/_shared-widget-fields.json +122 -0
- package/skills/tableau-next-asset-create/references/schemas/edit-dashboard/add_page.json +29 -0
- package/skills/tableau-next-asset-create/references/schemas/edit-dashboard/delete_page.json +27 -0
- package/skills/tableau-next-asset-create/references/schemas/edit-dashboard/discard_dashboard.json +11 -0
- package/skills/tableau-next-asset-create/references/schemas/edit-dashboard/move_widget.json +30 -0
- package/skills/tableau-next-asset-create/references/schemas/edit-dashboard/move_widget_to_page.json +30 -0
- package/skills/tableau-next-asset-create/references/schemas/edit-dashboard/place_widget_on_page.json +30 -0
- package/skills/tableau-next-asset-create/references/schemas/edit-dashboard/remove_widget_from_dashboard.json +16 -0
- package/skills/tableau-next-asset-create/references/schemas/edit-dashboard/remove_widget_from_page.json +26 -0
- package/skills/tableau-next-asset-create/references/schemas/edit-dashboard/rename_page.json +28 -0
- package/skills/tableau-next-asset-create/references/schemas/edit-dashboard/save_dashboard.json +18 -0
- package/skills/tableau-next-asset-create/references/schemas/edit-dashboard/undo.json +11 -0
- package/skills/tableau-next-asset-create/references/schemas/edit-dashboard/upsert_button_widget.json +69 -0
- package/skills/tableau-next-asset-create/references/schemas/edit-dashboard/upsert_container_widget.json +88 -0
- package/skills/tableau-next-asset-create/references/schemas/edit-dashboard/upsert_filter_widget.json +146 -0
- package/skills/tableau-next-asset-create/references/schemas/edit-dashboard/upsert_metric_widget.json +78 -0
- package/skills/tableau-next-asset-create/references/schemas/edit-dashboard/upsert_navigation_widget.json +80 -0
- package/skills/tableau-next-asset-create/references/schemas/edit-dashboard/upsert_parameter_widget.json +160 -0
- package/skills/tableau-next-asset-create/references/schemas/edit-dashboard/upsert_text_widget.json +103 -0
- package/skills/tableau-next-asset-create/references/schemas/edit-dashboard/upsert_visualization_widget.json +68 -0
- package/skills/tableau-next-asset-create/references/sdm-tool-reference.md +721 -0
- package/skills/tableau-next-asset-create/references/semantic-query-and-enrichment.md +355 -0
- package/skills/tableau-next-asset-create/references/shared-gates.md +322 -0
- package/skills/tableau-next-asset-create/references/sharing-and-promotion.md +306 -0
- package/skills/tableau-next-asset-create/references/tasks/ai-readiness-audit.md +51 -0
- package/skills/tableau-next-asset-create/references/tasks/analyze-data.md +48 -0
- package/skills/tableau-next-asset-create/references/tasks/build-dashboard.md +66 -0
- package/skills/tableau-next-asset-create/references/tasks/build-end-to-end.md +73 -0
- package/skills/tableau-next-asset-create/references/tasks/create-data-transform.md +51 -0
- package/skills/tableau-next-asset-create/references/tasks/create-viz.md +58 -0
- package/skills/tableau-next-asset-create/references/tasks/edit-dashboard.md +80 -0
- package/skills/tableau-next-asset-create/references/tasks/edit-sdm.md +106 -0
- package/skills/tableau-next-asset-create/references/tasks/edit-viz.md +40 -0
- package/skills/tableau-next-asset-create/references/tasks/enrich-model.md +68 -0
- package/skills/tableau-next-asset-create/references/tasks/ingest-flat-file.md +68 -0
- package/skills/tableau-next-asset-create/references/tasks/manage-alert.md +35 -0
- package/skills/tableau-next-asset-create/references/tasks/profile-dataset.md +47 -0
- package/skills/tableau-next-asset-create/references/tasks/promote-or-reuse.md +46 -0
- package/skills/tableau-next-asset-create/references/tasks/provision-user.md +39 -0
- package/skills/tableau-next-asset-create/references/tasks/query-model.md +92 -0
- package/skills/tableau-next-asset-create/references/tasks/review-verified-questions.md +42 -0
- package/skills/tableau-next-asset-create/references/tasks/share-asset.md +37 -0
- package/skills/tableau-next-asset-create/references/verified-questions.md +125 -0
- package/skills/tableau-next-asset-create/references/viz-authoring.md +992 -0
- package/skills/service-de-channel-consent-configure/SKILL.md +0 -230
- 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).
|
|
146
|
-
REC_SKILL=
|
|
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
|
|
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`.
|