[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-microsoft-semantic-model-authoring":3,"mdc-vx1oaa-key":36,"related-org-microsoft-semantic-model-authoring":4584,"related-repo-microsoft-semantic-model-authoring":4778},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":25,"repoUrl":26,"updatedAt":27,"license":28,"forks":29,"topics":30,"repo":31,"sourceUrl":34,"mdContent":35},"semantic-model-authoring","author and manage Power BI semantic models","Author and inspect Power BI semantic models and their metadata: list tables, columns, measures, relationships; create, edit, deploy, refresh, and manage models; optimize DAX; build Import, DirectQuery, and Direct Lake models; configure data sources, permissions, connections; and prepare for AI\u002FCopilot. Load this skill before acting on any semantic model authoring, metadata, or read-only inspection request: it picks the correct tool and method for the environment and permissions. Authoring-scoped: does not answer natural-language or data questions about a model's data. Does NOT author report visuals, manage workspaces, or manage RLS\u002FOLS roles. Triggers: \"create or edit a semantic model\", \"create or edit a DAX measure\", \"discover semantic model metadata\", \"list tables, columns, or measures in a semantic model\", \"refresh semantic model\", \"deploy semantic model to Fabric\",  \"prepare semantic model for AI\u002FCopilot\", \"set semantic model permissions\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"microsoft","Microsoft","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fmicrosoft.png",[12,16,19,22],{"name":13,"slug":14,"type":15},"Data Analysis","data-analysis","tag",{"name":17,"slug":18,"type":15},"Data Modeling","data-modeling",{"name":20,"slug":21,"type":15},"Microsoft Fabric","microsoft-fabric",{"name":23,"slug":24,"type":15},"Power BI","power-bi",858,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fskills-for-fabric","2026-07-31T05:55:06.065558",null,237,[],{"repoUrl":26,"stars":25,"forks":29,"topics":32,"description":33},[],"A collection of skills and MCP systems to enable users of CLI, VSCode, Claude to operate over Microsoft Fabric","https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fskills-for-fabric\u002Ftree\u002FHEAD\u002Fplugins\u002Ffabric-authoring\u002Fskills\u002Fsemantic-model-authoring","---\nname: semantic-model-authoring\ndescription: >  \n  Author and inspect Power BI semantic models and their metadata: list tables, columns, measures, relationships; create, edit, deploy, refresh, and manage models; optimize DAX; build Import, DirectQuery, and Direct Lake models; configure data sources, permissions, connections; and prepare for AI\u002FCopilot.\n  Load this skill before acting on any semantic model authoring, metadata, or read-only inspection request: it picks the correct tool and method for the environment and permissions.\n  Authoring-scoped: does not answer natural-language or data questions about a model's data.\n  Does NOT author report visuals, manage workspaces, or manage RLS\u002FOLS roles.\n  Triggers: \"create or edit a semantic model\", \"create or edit a DAX measure\", \"discover semantic model metadata\", \"list tables, columns, or measures in a semantic model\", \"refresh semantic model\", \"deploy semantic model to Fabric\",  \"prepare semantic model for AI\u002FCopilot\", \"set semantic model permissions\".\n---\n\n> **Update Check — ONCE PER SESSION (mandatory)**\n> The first time this skill is used in a session, run the **check-updates** skill before proceeding.\n> - **GitHub Copilot CLI \u002F VS Code**: invoke the `check-updates` skill.\n> - **Claude Code \u002F Cowork \u002F Cursor \u002F Windsurf \u002F Codex**: compare local vs remote package.json version.\n> - Skip if the check was already performed earlier in this session.\n\n> **CRITICAL NOTES**\n> 1. To find the workspace details (including its ID) from workspace name: list all workspaces and, then, use JMESPath filtering\n> 2. To find the item details (including its ID) from workspace ID, item type, and item name: list all items of that type in that workspace and, then, use JMESPath filtering\n> 3. Always consider the [Tool selection priority](#tool-selection-priority) when choosing which tool to use for each operation. Do not default to TMDL edits or `az rest` if MCP is available and connected to the target model.\n\n# Power BI Semantic Model Authoring — CLI Skill\n\n## Workflow Selector\n\nUse this decision tree to route to the correct workflow based on user intent:\n\n| User wants to...                                                                | Workflow                                                                             |\n| ------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------ |\n| Create a semantic model from scratch                                            | [Create new semantic model](#workflow-create-new-semantic-model)                     |\n| Inspect or discover model metadata (tables, columns, measures, relationships)   | [Discover Semantic Model Metadata](#workflow-discover-semantic-model-metadata)      |\n| Add\u002Fedit semantic model objects (e.g. measures, tables, columns, relationships) | [Modify an Existing Model](#workflow-modify-an-existing-model)                       |\n| Write or refactor DAX code                                                      | [Modify an Existing Model](#workflow-modify-an-existing-model)                       |\n| Improve DAX query or measure performance                                        | [Optimize DAX Performance](#workflow-optimize-dax-performance)                       |\n| Analyze semantic model against best practices                                   | [Analyze Best Practices](#workflow-analyze-best-practices)                           |\n| Prepare a semantic model for AI consumption (Copilot \u002F Data Agents)             | [Semantic Model AI Readiness](#workflow-semantic-model-ai-readiness)                 |\n| Deploy a model to a Fabric workspace                                            | [Deploy to Fabric](#workflow-deploy-to-fabric)                                       |\n| Refresh a semantic model                                                        | [Refresh Semantic Model](#workflow-refresh-semantic-model)                           |\n| Configure data sources, parameters, or permissions                              | [Manage Semantic Model in Fabric](#workflow-manage-semantic-model-in-fabric)         |\n| Bind a semantic model to a Fabric connection (or unbind)                        | [Bind Semantic Model to a Connection](#workflow-bind-semantic-model-to-a-connection) |\n| Export \u002F Get semantic model definition as PBIP                                  | [Export to PBIP](#workflow-export-to-pbip)           |\n\n## Table of Contents\n\nLoad these references on demand when a workflow step requires them. Do not load all at once.\n\n| Topic                            | Reference                                                                          | When to load                                                                                |\n| -------------------------------- | ---------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------- |\n| Modeling Best Practices          | [modeling-guidelines.md](.\u002Freferences\u002Fmodeling-guidelines.md)                      | Before creating or editing any model                                                        |\n| Naming Conventions               | [naming-conventions.md](.\u002Freferences\u002Fnaming-conventions.md)                        | When naming or renaming tables, columns, measures                                           |\n| Direct Lake Modeling             | [direct-lake-guidelines.md](.\u002Freferences\u002Fdirect-lake-guidelines.md)                | When model connects to OneLake                                                              |\n| TMDL Editing                     | [tmdl-guidelines.md](.\u002Freferences\u002Ftmdl-guidelines.md)                              | Before generating or editing any TMDL file                                                  |\n| PBIP Projects                    | [pbip.md](.\u002Freferences\u002Fpbip.md)                                                    | When working with PBIP folders                                                              |\n| DAX Language                     | [dax-guidelines.md](.\u002Freferences\u002Fdax-guidelines.md)                                | When writing or reviewing any DAX code                                                      |\n| Metadata Discovery (DAX INFO functions) | [metadata-discovery.md](.\u002Freferences\u002Fmetadata-discovery.md)                 | When discovering model metadata via DAX INFO functions (see [Workflow: Discover Semantic Model Metadata](#workflow-discover-semantic-model-metadata)) |\n| DAX Performance Decision Guide   | [dax-perf-decision-guide.md](.\u002Freferences\u002Fdax-perf-decision-guide.md)              | Start here when optimizing DAX                                                             |\n| DAX Performance Pattern Catalog  | [dax-perf-patterns.md](.\u002Freferences\u002Fdax-perf-patterns.md)                          | Load on demand after the decision guide identifies candidate patterns                       |\n| Semantic Model AI Readiness                | [semantic-model-ai-readiness.md](.\u002Freferences\u002Fsemantic-model-ai-readiness.md)                          | When preparing a model for Copilot or Data Agents                                           |\n| Semantic Model REST API          | [semantic-model-rest-api.md](.\u002Freferences\u002Fsemantic-model-rest-api.md)              | When using `az rest` for TMDL CRUD, refresh, parameters, permissions, or property retrieval |\n| Connection Binding               | [connection-binding.md](.\u002Freferences\u002Fconnection-binding.md)                        | When binding\u002Funbinding a semantic model to a Fabric data connection (gateway, cloud, VNet, automatic, none) |\n| Finding Workspaces\u002FItems         | [COMMON-CLI.md](..\u002F..\u002Fcommon\u002FCOMMON-CLI.md#finding-workspaces-and-items-in-fabric) | When resolving workspace\u002Fitem IDs                                                           |\n| Fabric Control-Plane API         | [COMMON-CLI.md](..\u002F..\u002Fcommon\u002FCOMMON-CLI.md#fabric-control-plane-api-via-az-rest)   | When using `az rest` patterns, LRO, pagination                                              |\n| Authentication                   | [COMMON-CLI.md](..\u002F..\u002Fcommon\u002FCOMMON-CLI.md#authentication-recipes)                 | When authenticating with `az login`                                                         |\n| Authentication & Token Acquisition | [COMMON-CORE.md § Authentication & Token Acquisition](..\u002F..\u002Fcommon\u002FCOMMON-CORE.md#authentication--token-acquisition) | Wrong audience = 401; read before any auth issue |\n| Core Control-Plane REST APIs | [COMMON-CORE.md § Core Control-Plane REST APIs](..\u002F..\u002Fcommon\u002FCOMMON-CORE.md#core-control-plane-rest-apis) | Includes pagination, LRO polling, and rate-limiting patterns |\n| Definition Envelope              | [ITEM-DEFINITIONS-CORE.md](..\u002F..\u002Fcommon\u002FITEM-DEFINITIONS-CORE.md#semanticmodel)    | When building TMDL definition payloads                                                      |\n| Examples                         | [Examples](#examples)                                                              | Reference end-to-end walkthroughs. |\n\n---\n\n## Tool Selection Priority\n\nPriority order (highest first):\n\n1. **Tier 1 — `powerbi-modeling-mcp` MCP is registered** -> Use MCP for authoring (new or edit) operations against the model from any source: Power BI Desktop, Fabric workspace, or local PBIP folder. MCP is the most reliable and full-featured way to edit semantic models, with immediate effect on the live model and no risk of TMDL desync.\n\n   **Important:** In case of dynamic search tools is available (e.g. `tool_search_tool_regex`) search for an available MCP server matching the pattern `powerbi-modeling-mcp`.\n\n   **This includes BOTH writes AND reads\u002Finspection.**\n   - To inspect or verify changes -> use the corresponding MCP operations (List \u002F Get).\n   - **Anti-pattern:** opening, `view`-ing, `glob`-ing or otherwise reading TMDL files (`*.tmdl`) while MCP is connected. The MCP-loaded model is the source of truth - the on-disk TMDL is stale. The only exceptions is when the user explicitly asks to work with the TMDL files.\n\n2. **Tier 2 — MCP not registered + PBIP folder or Fabric workspace** -> Edit TMDL files directly. Load [tmdl-guidelines.md](.\u002Freferences\u002Ftmdl-guidelines.md) and [pbip.md](.\u002Freferences\u002Fpbip.md). When the source is a Fabric workspace, use `az rest` to round-trip the TMDL (load [semantic-model-rest-api.md](.\u002Freferences\u002Fsemantic-model-rest-api.md)): `getDefinition` -> edit TMDL locally -> `updateDefinition`.\n\n**Fallback — none of the above available (e.g., Power BI Desktop with no PBIP and no MCP)** -> STOP. The agent cannot author the model in this configuration. Instruct the user to either (a) install and register the `powerbi-modeling-mcp` MCP server, or (b) save the PBIX as a PBIP project, then restart the workflow.\n\n> **All workflows below are tool-agnostic.** Workflow steps describe the *intent* (connect, create, edit, save, deploy, refresh). The tool used to perform each step is determined here. Always select the highest-priority tool available for the current environment; do not mix tools when a higher-priority option works. Some workflows OVERRIDE this default priority, always check the workflow's own tool-selection rules before defaulting to Tier 1.\n\n### Connecting to a Semantic Model\n\nA semantic model can live in three locations. Resolve the connection per [Tool Selection Priority](#tool-selection-priority):\n\n- **Power BI Desktop**: Locate the running Power BI Desktop instance and connect to its local model.\n- **Fabric workspace**: First, find the workspace and semantic model using the [Finding Workspaces and Items](..\u002F..\u002Fcommon\u002FCOMMON-CLI.md#finding-workspaces-and-items-in-fabric) pattern: list workspaces to resolve the workspace ID by name, then list items of type `SemanticModel` in that workspace to resolve the model ID by name. Then connect to the model (live) or export its TMDL definition for local editing.\n- **PBIP project**: Connect to the `[Name].SemanticModel\u002Fdefinition` folder. Load [pbip.md](.\u002Freferences\u002Fpbip.md) to understand the PBIP folder structure - only load the `[Name].SemanticModel\u002Fdefinition` folder that includes the TMDL code.\n\n### Saving Changes to a Semantic Model\n\nHow changes are persisted depends on where the model lives and which tool tier (per [Tool Selection Priority](#tool-selection-priority)) is in use:\n\n**Live connection (Tier 1 - MCP against Desktop or Fabric workspace):**\n\n- Changes are applied immediately as each operation executes against the live model. No explicit save step is needed.\n- **PBIP project (live via MCP)**: Serialize the model back to the `[Name].SemanticModel\u002Fdefinition` folder at the end of the session. If the PBIP folder does not exist yet, follow [Export to PBIP](#workflow-export-to-pbip) to create the full structure first.\n\n**Local TMDL editing (Tier 2 - direct file edits or `az rest` round-trip):**\n\n- **PBIP project**: Changes are already written to the TMDL files during editing. No additional save step is needed.\n- **Fabric workspace**: Changes were made to local TMDL files exported from the service. Re-deploy the model (load [semantic-model-rest-api.md](.\u002Freferences\u002Fsemantic-model-rest-api.md) for the `updateDefinition` flow) to push changes back to the workspace.\n\n---\n\n## Workflow: Create new Semantic Model\n\n**When this applies:** User asks to create a new semantic model from scratch.\n\nSteps:\n\n1. **Gather requirements** - interview the user until both reach a shared understanding of: purpose of the model, data source connection details and schemas, and key business entities\u002Ffacts. **If data source information is not available, STOP and use `ask_user`. Do not guess or fabricate.**\n2. **Determine storage mode** - data source is Fabric OneLake -> **Direct Lake**; otherwise default to **Import**. Only use **DirectQuery** when the user explicitly asks for it.\n3. **Design star schema** - identify fact and dimension tables and relationship keys.\n   - If fact table includes date field(s), create a separate date dimension table and link it to the fact with a relationship. If not explicitly requested, use PowerQuery\u002FM partition instead of DAX calculated table.\n4. **Load applicable guidelines** - **MANDATORY: load [modeling-guidelines.md](.\u002Freferences\u002Fmodeling-guidelines.md) before building any object** (including the Tier 1 MCP path below); also load [direct-lake-guidelines.md](.\u002Freferences\u002Fdirect-lake-guidelines.md) if Direct Lake. Don't build from memory.\n5. **Build** - follow [Tool Selection Priority](#tool-selection-priority): **prefer the modeling MCP to build the whole model when one is available; otherwise use the TMDL code-edit path.** Create an empty database (compatibility level 1702+), then for each table follow the execution order from [Modify an Existing Model](#workflow-modify-an-existing-model) (partitions -> columns -> relationships -> measures). Storage-mode specifics:\n   - **Import \u002F DirectQuery** - create M parameters for the data source (`Server`, `Database`, ...) and reference them in partition M code; ensure proper `dataType` and `sourceColumn` mapping on columns.\n   - **Direct Lake** - create a shared named expression for the Direct Lake connection using the `AzureStorage.DataLake` connector; use `EntityPartitionSource` with `directLake` mode mapped to the lakehouse table columns.\n\n   > **Build the whole model in one pass, then deploy once.** Add every table, column, relationship and measure before deploying - don't deploy a partial model and edit-redeploy. On the MCP path, keep the model in the session end to end.\n6. **Deploy or save** - Fabric workspace available -> [Deploy to Fabric](#workflow-deploy-to-fabric); otherwise -> [Export to PBIP](#workflow-export-to-pbip). See [Saving Changes to a Semantic Model](#saving-changes-to-a-semantic-model). Deploy through the same path you built with.\n7. **Validate** - run [Validation Checklist](#validation-checklist).\n\n---\n\n## Workflow: Discover Semantic Model Metadata\n\n**When this applies:** User asks to inspect, list, or discover the model's structure - tables, columns, measures, relationships, hierarchies, partitions, roles, or storage internals. Also used internally by other workflows ([Modify](#workflow-modify-an-existing-model), [Analyze Best Practices](#workflow-analyze-best-practices), [AI Readiness](#workflow-semantic-model-ai-readiness)) to inventory the model before editing.\n\n> **Scope:** This workflow covers **metadata** discovery only. To answer natural-language\u002Fdata questions against the model, use the `FabricIQ` skill instead.\n\nPick a discovery method (highest priority first):\n\n1. **`powerbi-modeling-mcp` TOM inspection (List \u002F Get)** - the default when `powerbi-modeling-mcp` is registered and connected to the target model **with Write access**. It returns the structured object model directly and stays in sync with pending edits, so it is preferred while authoring.\n\n2. **DAX `INFO` functions** - query the model's `INFO.VIEW.*` \u002F `INFO.*` metadata rowsets. **MANDATORY: before writing or running ANY `INFO`-function DAX, you MUST load [metadata-discovery.md](.\u002Freferences\u002Fmetadata-discovery.md) first**. Do NOT compose `INFO` queries from memory; load the reference and use its patterns. **Prioritize this method when any of the following is true:**\n   - **You lack Write permission** on the model. `powerbi-modeling-mcp` operations require Write access; with Read or Build access, use `INFO` functions.\n   - **`powerbi-modeling-mcp` is not registered or not available** in the current environment.\n \n   Execute the `INFO`-function DAX through one of these tools (highest priority first):\n   - **FabricIQ `ExecuteQuery`** - requires only **Read** permission on the model. Load the `FabricIQ` skill for artifact discovery (`DiscoverArtifacts`) and execution mechanics.\n   - **`powerbi-modeling-mcp` `dax_query_operations`** - requires **Write** permission. Use this when the modeling MCP is already connected with Write access.\n\n> **Do NOT use FabricIQ `GetSemanticModelSchema` for authoring metadata discovery** - it is a data-consumption tool that can return stale metadata and miss recent edits. Even when FabricIQ is available, always use the `INFO` functions (via `ExecuteQuery`); they query the live model.\n\nStart narrow: run the scope-estimation and `INFO.VIEW.*` queries first, then project\u002Ffilter to only the objects relevant to the task (see [metadata-discovery.md](.\u002Freferences\u002Fmetadata-discovery.md)).\n\n---\n\n## Workflow: Modify an Existing Model\n\n**When this applies:** User asks to add\u002Fedit\u002Fremove measures, tables, columns, relationships, write DAX code, refactor with UDFs, or edit TMDL directly.\n\nSteps:\n\n1. **Connect & discover** - per [Connecting to a Semantic Model](#connecting-to-a-semantic-model) and [Discover Semantic Model Metadata](#workflow-discover-semantic-model-metadata). List tables, relationships, existing measures, and identify storage mode (it dictates which guidelines apply).\n2. **Load applicable guidelines** - [modeling-guidelines.md](.\u002Freferences\u002Fmodeling-guidelines.md) always; [direct-lake-guidelines.md](.\u002Freferences\u002Fdirect-lake-guidelines.md) if Direct Lake; [tmdl-guidelines.md](.\u002Freferences\u002Ftmdl-guidelines.md) when editing TMDL directly; [dax-guidelines.md](.\u002Freferences\u002Fdax-guidelines.md) for any DAX changes (includes UDF refactoring).\n3. **Plan changes** - identify exactly what to add, modify, or remove. Check for naming conflicts and duplicates.\n4. **Execute** in correct order:\n   - **Adding tables** - partitions -> columns -> relationships -> measures.\n   - **Adding relationships** - ensure key columns exist on both sides with matching data types;\n   - **Adding measures** - verify referenced columns\u002Ftables exist;\n5. **Save & validate** - per [Saving Changes to a Semantic Model](#saving-changes-to-a-semantic-model) and [Validation Checklist](#validation-checklist).\n\n---\n\n## Workflow: Optimize DAX Performance\n\n**When this applies:** User asks to improve DAX query performance, diagnose slow measures, or optimize calculations.\n\n> **Hard requirement:** Requires a trace-capable client (MCP preferred))\n\nLoad [dax-perf-decision-guide.md](.\u002Freferences\u002Fdax-perf-decision-guide.md) first and follow the framework defined there. Load [dax-perf-patterns.md](.\u002Freferences\u002Fdax-perf-patterns.md) only when applying candidate optimization patterns. The framework includes:\n\n1. Tier model for categorizing optimization effort\n2. Trace diagnostics to identify bottlenecks\n3. Pattern catalog with candidate optimization techniques to test and validate\n\n---\n\n## Workflow: Analyze Best Practices\n\n**When this applies:** User asks to review, audit, or analyze a semantic model against best practices.\n\nSteps:\n\n1. **Connect & inventory** - per [Connecting to a Semantic Model](#connecting-to-a-semantic-model) and [Discover Semantic Model Metadata](#workflow-discover-semantic-model-metadata). Capture all tables, columns, relationships, measures, and storage mode.\n2. **Load applicable guidelines** - [modeling-guidelines.md](.\u002Freferences\u002Fmodeling-guidelines.md) always; [direct-lake-guidelines.md](.\u002Freferences\u002Fdirect-lake-guidelines.md) if Direct Lake; [naming-conventions.md](.\u002Freferences\u002Fnaming-conventions.md) when assessing naming; [dax-guidelines.md](.\u002Freferences\u002Fdax-guidelines.md) when assessing DAX.\n3. **Evaluate** - compare the model against the loaded guidelines (star schema, naming, relationship cardinality and cross-filter, explicit measures with `formatString`, column data types and `sourceColumn`, hidden FK columns, calculated-column-vs-measure choices, Direct Lake constraints, etc.).\n4. **Present findings** grouped by severity (critical, recommended, optional). For each item state the rule violated and the proposed fix. Wait for user approval.\n5. **Apply approved fixes** via [Modify an Existing Model](#workflow-modify-an-existing-model).\n6. **Save & validate** - per [Saving Changes to a Semantic Model](#saving-changes-to-a-semantic-model) and [Validation Checklist](#validation-checklist).\n\n---\n\n## Workflow: Semantic Model AI Readiness\n\n**When this applies:** User asks to make a semantic model ready for Microsoft Fabric Copilot, a Power BI Data Agent, or any conversational BI experience. Triggers include \"Copilot readiness\", \"AI readiness\", \"Prep for AI\", \"prepare model for Copilot\".\n\nLoad [semantic-model-ai-readiness.md](.\u002Freferences\u002Fsemantic-model-ai-readiness.md) before starting.\n\nSteps:\n\n1. **Confirm scope & gather context** - via `ask_user`, confirm consumption mode (reports only \u002F conversational BI \u002F both) and model stability per the *When to Apply* section. Collect business context (process, key metrics, common natural-language questions, vocabulary). Do not invent.\n2. **Connect & inventory** - per [Connecting to a Semantic Model](#connecting-to-a-semantic-model). Capture model contents and the source location (PBIP \u002F Fabric workspace \u002F Desktop-only).\n3. **Evaluate & route** - walk the [Readiness Checklist](.\u002Freferences\u002Fsemantic-model-ai-readiness.md#readiness-checklist) in order; for each gap, classify the fix per [Editing Capability](.\u002Freferences\u002Fsemantic-model-ai-readiness.md#editing-capability) (agent-editable TOM metadata vs AI-specific artifacts the user configures in the Power BI \"Prep data for AI\" UI).\n4. **Present findings** grouped by severity, each tagged with routing (agent-applicable vs user-action-required). Wait for approval.\n5. **Apply approved changes** - apply TOM metadata fixes via [Modify an Existing Model](#workflow-modify-an-existing-model); for AI instructions, AI Data Schema, and Verified Answers, instruct the user to configure them in the Power BI \"Prep data for AI\" UI and, only if the user agrees, offer suggestions per the readiness reference; Desktop-only PBIX -> instruct user.\n6. **Save, validate, recommend live testing** - per [Saving Changes to a Semantic Model](#saving-changes-to-a-semantic-model) and [Validation Checklist](#validation-checklist); advise the user to test representative natural-language prompts in Copilot or the Data Agent and iterate.\n\n---\n\n## Workflow: Export to PBIP\n\n**When this applies:** User asks to export or save a semantic model to a PBIP project folder, or there is no Fabric workspace available to deploy to (e.g., after building a model in-memory).\n\n> **Key fact:** Exporting a model only produces the TMDL definition files. It does NOT create the surrounding PBIP folder structure (Report folder, `definition.pbism`, `definition.pbir`, `.pbip` entry point). The agent must scaffold these before exporting, otherwise the result cannot be opened in Power BI Desktop.\n\nLoad [pbip.md](.\u002Freferences\u002Fpbip.md) before starting and follow the PBIP folder structure defined there.\n\nSteps:\n\n1. **Determine target** - via `ask_user`, get the target folder path and the semantic model name. If only a folder is provided, use the model's database name as the semantic model folder name.\n2. **Scaffold the PBIP structure** - per [pbip.md](.\u002Freferences\u002Fpbip.md), ensure `\u003CName>.SemanticModel\u002F` (with `definition\u002F` and `definition.pbism`), `\u003CName>.Report\u002F` (with `definition\u002F` and `definition.pbir` using a `byPath` reference), and `\u003CName>.pbip` exist. Create any missing piece.\n3. **Export TMDL** into `\u003CName>.SemanticModel\u002Fdefinition\u002F`, per [Tool Selection Priority](#tool-selection-priority):\n   - **Tier 1 (MCP)** - use the MCP export\u002Fsave operation against the live model.\n   - **Tier 2 (Fabric workspace, no MCP)** - call `getDefinition` (load [semantic-model-rest-api.md](.\u002Freferences\u002Fsemantic-model-rest-api.md)) and write the returned parts.\n   - **Local TMDL files already on disk** - copy or move them into the `definition\u002F` folder.\n4. **Validate** - confirm the `definition\u002F` folder contains at minimum `model.tmdl` and table `.tmdl` files; confirm `definition.pbism`, `\u003CName>.Report\u002Fdefinition.pbir` (with correct `byPath` to `..\u002F\u003CName>.SemanticModel`), and `\u003CName>.pbip` exist and reference each other correctly.\n\n---\n\n## Workflow: Deploy to Fabric\n\n**When this applies:** User asks to deploy or publish a semantic model to a Fabric workspace.\n\n> **Hard rule — this workflow OVERRIDES the default [Tool Selection Priority](#tool-selection-priority).** Do not default to MCP just because it is available. The deployment path is determined by the **source of the model**, not by which tools are connected. If the source is PBIP\u002FTMDL files on disk, you **MUST** use the Fabric REST API even when an MCP session is active.\n\nDecision tree (pick exactly one — top-down, first match wins):\n\n1. **Are there PBIP \u002F TMDL files on disk that need to be deployed?**\n   -> **YES — use Fabric REST API.** Call `az rest` with `createItemWithDefinition` (new model) or `updateDefinition` (existing model). Load [semantic-model-rest-api.md](.\u002Freferences\u002Fsemantic-model-rest-api.md).\n   - Rationale: deploying TMDL files directly via the Fabric API is more reliable, faster, and avoids unnecessarily loading the model into MCP only to push it back out.\n   - **Do NOT** open the PBIP in MCP first and then deploy via MCP. That is an explicit anti-pattern for this workflow.\n2. **Is the model already loaded in a live MCP session** (e.g., just built in-memory, or currently being edited via MCP) **with no PBIP\u002FTMDL files involved?**\n   -> Use MCP tool to deploy with the target workspace and semantic model name.\n3. **Is the model live in Power BI Desktop with no PBIP saved?**\n   -> Use MCP Deploy if MCP is connected to Desktop. If MCP is not available, instruct the user to save as PBIP first, then restart this workflow at step 1.\n\nVerify deployment succeeded by listing workspace items of type `SemanticModel`.\n\n> **Deploy exactly once; the deploy is NOT idempotent.** A retried deploy creates a *second* model with the same name, after which the deploy fails with `There are multiple datasets named '\u003Cname>'`. If you hit that error, do NOT retry blindly: list the workspace's semantic models, **delete every duplicate with that name**, then deploy once from the clean state. If deploying a model that may already exist, delete the existing same-named model(s) *before* the single deploy.\n\n---\n\n## Workflow: Refresh Semantic Model\n\n**When this applies:** User asks to refresh data in a semantic model.\n\nRefresh is only possible when working against a live model in Desktop or Fabric Service. If working with local TMDL files, deploy the model first.\n\nTrigger a refresh per [Tool Selection Priority](#tool-selection-priority):\n\n- **Power BI Desktop**: Tier 1 (MCP) only — use the MCP Refresh operation.\n- **Fabric Service**: Tier 1 (MCP Refresh operation) or fallback to the Power BI Enhanced Refresh API (load [semantic-model-rest-api.md](.\u002Freferences\u002Fsemantic-model-rest-api.md)).\n\nIf the refresh fails with a credential error, **stop immediately** and instruct the user to configure the data source connections manually in Power BI Service. Do not attempt to retry or work around credential errors programmatically.\n\n---\n\n## Workflow: Manage Semantic Model in Fabric\n\n**When this applies:** User asks to configure data sources, update parameters, or manage permissions for a semantic model in Fabric Service.\n\n> **Hard rule — this workflow OVERRIDES the default [Tool Selection Priority](#tool-selection-priority).** Do not default to MCP (Tier 1) prefer using `az rest` and REST APIs.\n\n### Data Sources & Parameters\n\nGet\u002Fupdate data sources and parameters via Power BI REST API. Load [semantic-model-rest-api.md](.\u002Freferences\u002Fsemantic-model-rest-api.md#4-data-sources--parameters-power-bi-datasets-api).\n\n### Permissions\n\nList\u002Fgrant\u002Fupdate dataset user permissions via Power BI REST API. Load [semantic-model-rest-api.md](.\u002Freferences\u002Fsemantic-model-rest-api.md#5-permissions-power-bi-datasets-api).\n\n### Connection Binding\n\nLoad [connection-binding.md](.\u002Freferences\u002Fconnection-binding.md) and follow it. The reference covers prerequisites, the `bindConnection` endpoint, the discover -> match -> bind -> validate steps, all `connectivityType` values, the unbind pattern, and troubleshooting.\n\nKey rules (full details in the reference):\n\n- Use the Fabric **Bind Semantic Model Connection** REST API (supersedes the legacy Power BI `BindToGateway`).\n- **One bind request per data source reference** - the API does not support bulk binding.\n- Discover the model's data source references via `List Item Connections`, then match `connectionDetails` against `List Connections` to find the target `id`. Create a connection first if no match exists.\n- Validate by re-listing item connections and triggering a refresh.\n\n---\n\n## Validation Checklist\n\nRun after any model creation or modification:\n\n**Always (works with PBIP, Desktop, and Fabric Service):**\n\n1. **Check the PBIP structure** - if the model is sourced from a PBIP folder, ensure the folder structure and files are correct (see [pbip.md](.\u002Freferences\u002Fpbip.md)).\n2. **Verify against modeling guidelines** - re-check every change against [modeling-guidelines.md](.\u002Freferences\u002Fmodeling-guidelines.md) (and [direct-lake-guidelines.md](.\u002Freferences\u002Fdirect-lake-guidelines.md) for Direct Lake models).\n\n**Only when connected to an Analysis Services database (Power BI Desktop or Fabric Service):**\n\n3. **Test new measures** - for each new measure, run a simple DAX query to validate it returns expected results (e.g., `EVALUATE { [Measure Name] }`). Skip this step when working with local TMDL\u002FPBIP files only.\n4. **Test table refresh** - when new tables were created, trigger a refresh to verify that partitions, data source expressions, and column mappings are correct. A failed refresh typically indicates mismatched `sourceColumn` names, invalid M expressions, or incorrect Direct Lake entity references. Skip this step when working with local TMDL\u002FPBIP files only.\n\nIf any check fails, fix the issue and re-run validation.\n\n---\n\n## Must\u002FPrefer\u002FAvoid\n\n### MUST\n\n- **Understand the data source schema before starting** - analyze source tables, columns, and data types before designing or modifying the model.\n- **Follow modeling guidelines** - load [modeling-guidelines.md](.\u002Freferences\u002Fmodeling-guidelines.md) before creating or editing any model; apply star schema design, naming conventions, and column\u002Fmeasure rules\n- **Follow [Tool Selection Priority](#tool-selection-priority)** - always pick the highest-priority tool tier available for the current environment; do not mix tiers when a higher-priority option works\n\n### PREFER\n\n- **Star schema over snowflake or flat tables** - denormalized dimensions with single-column relationship keys\n- **Consistency with existing model patterns** - when editing an existing model, match its naming conventions and structure rather than imposing new ones\n- **TMDL format over TMSL** - text-based, diff-friendly, preferred for Fabric\n- **Validate after changes** - use [Workflow: Discover Semantic Model Metadata](#workflow-discover-semantic-model-metadata) to confirm objects landed.\n\n### AVOID\n\n- **Hardcoded workspace\u002Fitem IDs** - resolve dynamically via API\n- **Reading TMDL files when MCP is connected** - `view`\u002F`glob` on `*.tmdl` while a Tier 1 MCP session is live is an anti-pattern (see [Tool Selection Priority](#tool-selection-priority)).\n- **Hand-authoring TMDL files when MCP is registered** - using `create`\u002F`edit`\u002Ffile-write tools to scaffold `model.tmdl`, `database.tmdl`, `relationships.tmdl`, or `tables\u002F*.tmdl` is a Tier 1 anti-pattern, including for brand-new models. Build and export via MCP tools.\n\n### DENY\n\n- **Manage RLS\u002FOLS role membership** - do not propose REST calls, `az rest` URLs, MCP operations, or TMDL changes to add\u002Fremove users or groups from a security role. Refuse the request as out-of-scope here and redirect the user to the Power BI portal.\n\n---\n\n## Examples\n\n> **Scope note** — examples use `az rest` for discovery to resolve ID's and discover Fabric metadata (see [COMMON-CLI.md § Finding Workspaces and Items](..\u002F..\u002Fcommon\u002FCOMMON-CLI.md#finding-workspaces-and-items-in-fabric)). Authoring of the semantic model definition is routed through [Tool Selection Priority](#tool-selection-priority): Tier 1 MCP `powerbi-modeling-mcp` when available, Tier 2 TMDL editing via `getDefinition` \u002F `updateDefinition` otherwise.\n\n### Example 1: Modify an Existing Semantic Model\n\n**Prompt**: \"Create base measures for all aggregable columns in the semantic model **Sales** in workspace **Marketing**.\"\n\n**Agent response** - follows [Workflow: Modify an Existing Model](#workflow-modify-an-existing-model).\n\n1. **Discover IDs** via `az rest`.\n2. **Connect to the model** per [Connecting to a Semantic Model](#connecting-to-a-semantic-model) and [Tool Selection Priority](#tool-selection-priority). With `powerbi-modeling-mcp` registered, connect MCP directly to the Fabric workspace model (Tier 1). Otherwise fall back to Tier 2 (`getDefinition` -> edit TMDL locally).\n3. **Inspect & plan** - list tables and columns via the active tool tier; identify aggregable columns (numeric, not foreign keys, not hidden surrogate IDs) and decide on `SUM` \u002F `AVERAGE` \u002F `MIN` \u002F `MAX` per column following [modeling-guidelines.md](.\u002Freferences\u002Fmodeling-guidelines.md) and [naming-conventions.md](.\u002Freferences\u002Fnaming-conventions.md). Load [dax-guidelines.md](.\u002Freferences\u002Fdax-guidelines.md) before writing DAX.\n4. **Add measures** per [Workflow: Modify an Existing Model](#workflow-modify-an-existing-model).\n   - **Tier 1 (MCP)**: call tool create for each new measure with `expression`, `formatString`, and target table. Do not hand-author TMDL.\n   - **Tier 2 (no MCP)**: edit the table's `.tmdl` file directly and round-trip via `updateDefinition` REST API.\n5. **Save & validate** per [Saving Changes to a Semantic Model](#saving-changes-to-a-semantic-model).\n\n---\n\n### Example 2: Create a New Semantic Model from a Fabric Lakehouse\n\n**Prompt**: \"Create a new Power BI semantic model in workspace **Marketing**, using the **SalesLakehouse** in the same workspace as the data source.\"\n\n**Agent response** - follows [Workflow: Create new Semantic Model](#workflow-create-new-semantic-model).\n\n1. **Discover workspace + lakehouse IDs** via `az rest`.\n2. **Discover lakehouse schema** - list tables and columns via the Lakehouse OneLake APIs or the SQL Endpoint of the lakehouse. Capture table names, column names, and data types - these drive semantic model table, column definitions and partition metadata.\n3. **Select tool tier** per [Tool Selection Priority](#tool-selection-priority): prefer Tier 1 (`powerbi-modeling-mcp`) for the full build. Tier 2 (PBIP\u002FTMDL scaffolding then deploy) only if MCP is not registered.\n4. **Build the model** following [Workflow: Create new Semantic Model](#workflow-create-new-semantic-model) - data source is OneLake so the storage mode is **Direct Lake** (load [direct-lake-guidelines.md](.\u002Freferences\u002Fdirect-lake-guidelines.md) and [modeling-guidelines.md](.\u002Freferences\u002Fmodeling-guidelines.md)). Design a star schema from the lakehouse tables, then:\n   - Create the empty database.\n   - Create one shared named expression for the lakehouse connection.\n   - For each table: add `EntityPartitionSource` (mode `directLake`) -> columns mapped to lakehouse columns -> relationships -> measures.\n5. **Deploy** per [Workflow: Deploy to Fabric](#workflow-deploy-to-fabric):\n6. **Validate** per the [Validation Checklist](#validation-checklist) - confirm the model appears in the workspace and trigger an initial refresh to verify Direct Lake column mappings resolve.\n\n---\n\n### Example 3: Bind a Semantic Model to a Fabric Connection\n\n**Prompt**: \"Bind semantic model **Sales** in workspace **Marketing** to the **sql-prod** connection.\"\n\n**Agent response** - follows [Workflow: Manage Semantic Model in Fabric § Connection Binding](#connection-binding). **No MCP** - this workflow overrides [Tool Selection Priority](#tool-selection-priority) and is REST-only.\n\n1. **Discover workspace + model IDs** via `az rest`.\n2. **Discover the target connection** in Fabric by matching the server name:\n\n   ```bash\n   SERVER=\"sql-prod\"\n   CONN_ID=$(az rest --method get --resource \"https:\u002F\u002Fapi.fabric.microsoft.com\" \\\n     --url \"https:\u002F\u002Fapi.fabric.microsoft.com\u002Fv1\u002Fconnections\" \\\n     --query \"value[?connectionDetails.path | contains(@, '$SERVER')] | [0].id\" -o tsv)\n   ```\n\n   If no connection matches, **stop** and instruct the user to create one first per [connection-binding.md](.\u002Freferences\u002Fconnection-binding.md).\n3. **Execute the bind** per [Workflow: Manage Semantic Model in Fabric § Connection Binding](#connection-binding) - load [connection-binding.md](.\u002Freferences\u002Fconnection-binding.md) and follow the discover -> match -> bind -> validate flow:\n   - List the model's data source references (`List Item Connections`).\n   - For each reference whose `connectionDetails` matches `$CONN_ID`, call the Fabric `bindConnection` endpoint **one request per data source reference** (no bulk binding).\n4. **Validate** - re-list item connections to confirm the binding, prompt the user to trigger a refresh per [Workflow: Refresh Semantic Model](#workflow-refresh-semantic-model). Credential errors -> stop and direct the user to the Service portal (per TROUBLESHOOTING).\n\n---\n\n## TROUBLESHOOTING\n\n| Symptom                              | Fix                                                                                                                   |\n| ------------------------------------ | --------------------------------------------------------------------------------------------------------------------- |\n| MCP connection failure               | Fall back to TMDL editing (see Tool Selection Priority). Inform the user about the fallback.                          |\n| TMDL validation errors               | Read error details, fix syntax, re-validate. Load [tmdl-guidelines.md](.\u002Freferences\u002Ftmdl-guidelines.md).              |\n| `403 Forbidden` \u002F `identity None`    | User needs Contributor+ role - stop immediately. Do not retry.                                                        |\n| `401 Unauthorized`                   | Correct the `--resource` audience once (see [semantic-model-rest-api.md](.\u002Freferences\u002Fsemantic-model-rest-api.md)). If it persists after the audience is right, it is missing permissions - stop and tell the user. Do not retry-loop. |\n| `202 Accepted` but no result         | Poll LRO to completion.                                                                                               |\n| Parts missing after updateDefinition | Must include ALL parts - modified + unmodified.                                                                       |\n| Refresh credential error             | Direct user to configure in Service portal. Do not retry.                                                             |\n| DAX errors in measures               | Check column\u002Ftable name references (case-sensitive). Verify referenced objects exist.                                 |\n| Deployment failure                   | Check workspace permissions, model compatibility level, and Direct Lake expression source references.                 |\n| Missing data source                  | Verify M parameters or named expressions are correctly defined.                                                       |\n",{"data":37,"body":38},{"name":4,"description":6},{"type":39,"children":40},"root",[41,104,151,158,165,170,400,406,411,878,882,888,893,1040,1057,1078,1085,1096,1165,1171,1182,1190,1221,1236,1270,1273,1279,1289,1294,1563,1566,1571,1598,1626,1631,1852,1887,1905,1908,1914,1923,1927,2056,2059,2065,2074,2087,2104,2122,2125,2131,2140,2144,2265,2268,2274,2283,2293,2297,2409,2412,2418,2427,2462,2472,2476,2713,2716,2722,2731,2763,2768,2860,2871,2913,2916,2922,2931,2936,2946,2973,2985,2988,2994,3003,3027,3033,3044,3050,3061,3066,3092,3097,3171,3174,3179,3184,3192,3232,3240,3279,3284,3287,3293,3298,3341,3347,3396,3402,3504,3510,3530,3533,3538,3591,3597,3621,3636,3822,3825,3831,3853,3866,4009,4012,4018,4045,4074,4377,4380,4386,4578],{"type":42,"tag":43,"props":44,"children":45},"element","blockquote",{},[46,66],{"type":42,"tag":47,"props":48,"children":49},"p",{},[50,57,59,64],{"type":42,"tag":51,"props":52,"children":53},"strong",{},[54],{"type":55,"value":56},"text","Update Check — ONCE PER SESSION (mandatory)",{"type":55,"value":58},"\nThe first time this skill is used in a session, run the ",{"type":42,"tag":51,"props":60,"children":61},{},[62],{"type":55,"value":63},"check-updates",{"type":55,"value":65}," skill before proceeding.",{"type":42,"tag":67,"props":68,"children":69},"ul",{},[70,89,99],{"type":42,"tag":71,"props":72,"children":73},"li",{},[74,79,81,87],{"type":42,"tag":51,"props":75,"children":76},{},[77],{"type":55,"value":78},"GitHub Copilot CLI \u002F VS Code",{"type":55,"value":80},": invoke the ",{"type":42,"tag":82,"props":83,"children":85},"code",{"className":84},[],[86],{"type":55,"value":63},{"type":55,"value":88}," skill.",{"type":42,"tag":71,"props":90,"children":91},{},[92,97],{"type":42,"tag":51,"props":93,"children":94},{},[95],{"type":55,"value":96},"Claude Code \u002F Cowork \u002F Cursor \u002F Windsurf \u002F Codex",{"type":55,"value":98},": compare local vs remote package.json version.",{"type":42,"tag":71,"props":100,"children":101},{},[102],{"type":55,"value":103},"Skip if the check was already performed earlier in this session.",{"type":42,"tag":43,"props":105,"children":106},{},[107,115],{"type":42,"tag":47,"props":108,"children":109},{},[110],{"type":42,"tag":51,"props":111,"children":112},{},[113],{"type":55,"value":114},"CRITICAL NOTES",{"type":42,"tag":116,"props":117,"children":118},"ol",{},[119,124,129],{"type":42,"tag":71,"props":120,"children":121},{},[122],{"type":55,"value":123},"To find the workspace details (including its ID) from workspace name: list all workspaces and, then, use JMESPath filtering",{"type":42,"tag":71,"props":125,"children":126},{},[127],{"type":55,"value":128},"To find the item details (including its ID) from workspace ID, item type, and item name: list all items of that type in that workspace and, then, use JMESPath filtering",{"type":42,"tag":71,"props":130,"children":131},{},[132,134,141,143,149],{"type":55,"value":133},"Always consider the ",{"type":42,"tag":135,"props":136,"children":138},"a",{"href":137},"#tool-selection-priority",[139],{"type":55,"value":140},"Tool selection priority",{"type":55,"value":142}," when choosing which tool to use for each operation. Do not default to TMDL edits or ",{"type":42,"tag":82,"props":144,"children":146},{"className":145},[],[147],{"type":55,"value":148},"az rest",{"type":55,"value":150}," if MCP is available and connected to the target model.",{"type":42,"tag":152,"props":153,"children":155},"h1",{"id":154},"power-bi-semantic-model-authoring-cli-skill",[156],{"type":55,"value":157},"Power BI Semantic Model Authoring — CLI Skill",{"type":42,"tag":159,"props":160,"children":162},"h2",{"id":161},"workflow-selector",[163],{"type":55,"value":164},"Workflow Selector",{"type":42,"tag":47,"props":166,"children":167},{},[168],{"type":55,"value":169},"Use this decision tree to route to the correct workflow based on user intent:",{"type":42,"tag":171,"props":172,"children":173},"table",{},[174,193],{"type":42,"tag":175,"props":176,"children":177},"thead",{},[178],{"type":42,"tag":179,"props":180,"children":181},"tr",{},[182,188],{"type":42,"tag":183,"props":184,"children":185},"th",{},[186],{"type":55,"value":187},"User wants to...",{"type":42,"tag":183,"props":189,"children":190},{},[191],{"type":55,"value":192},"Workflow",{"type":42,"tag":194,"props":195,"children":196},"tbody",{},[197,215,232,249,264,281,298,315,332,349,366,383],{"type":42,"tag":179,"props":198,"children":199},{},[200,206],{"type":42,"tag":201,"props":202,"children":203},"td",{},[204],{"type":55,"value":205},"Create a semantic model from scratch",{"type":42,"tag":201,"props":207,"children":208},{},[209],{"type":42,"tag":135,"props":210,"children":212},{"href":211},"#workflow-create-new-semantic-model",[213],{"type":55,"value":214},"Create new semantic model",{"type":42,"tag":179,"props":216,"children":217},{},[218,223],{"type":42,"tag":201,"props":219,"children":220},{},[221],{"type":55,"value":222},"Inspect or discover model metadata (tables, columns, measures, relationships)",{"type":42,"tag":201,"props":224,"children":225},{},[226],{"type":42,"tag":135,"props":227,"children":229},{"href":228},"#workflow-discover-semantic-model-metadata",[230],{"type":55,"value":231},"Discover Semantic Model Metadata",{"type":42,"tag":179,"props":233,"children":234},{},[235,240],{"type":42,"tag":201,"props":236,"children":237},{},[238],{"type":55,"value":239},"Add\u002Fedit semantic model objects (e.g. measures, tables, columns, relationships)",{"type":42,"tag":201,"props":241,"children":242},{},[243],{"type":42,"tag":135,"props":244,"children":246},{"href":245},"#workflow-modify-an-existing-model",[247],{"type":55,"value":248},"Modify an Existing Model",{"type":42,"tag":179,"props":250,"children":251},{},[252,257],{"type":42,"tag":201,"props":253,"children":254},{},[255],{"type":55,"value":256},"Write or refactor DAX code",{"type":42,"tag":201,"props":258,"children":259},{},[260],{"type":42,"tag":135,"props":261,"children":262},{"href":245},[263],{"type":55,"value":248},{"type":42,"tag":179,"props":265,"children":266},{},[267,272],{"type":42,"tag":201,"props":268,"children":269},{},[270],{"type":55,"value":271},"Improve DAX query or measure performance",{"type":42,"tag":201,"props":273,"children":274},{},[275],{"type":42,"tag":135,"props":276,"children":278},{"href":277},"#workflow-optimize-dax-performance",[279],{"type":55,"value":280},"Optimize DAX Performance",{"type":42,"tag":179,"props":282,"children":283},{},[284,289],{"type":42,"tag":201,"props":285,"children":286},{},[287],{"type":55,"value":288},"Analyze semantic model against best practices",{"type":42,"tag":201,"props":290,"children":291},{},[292],{"type":42,"tag":135,"props":293,"children":295},{"href":294},"#workflow-analyze-best-practices",[296],{"type":55,"value":297},"Analyze Best Practices",{"type":42,"tag":179,"props":299,"children":300},{},[301,306],{"type":42,"tag":201,"props":302,"children":303},{},[304],{"type":55,"value":305},"Prepare a semantic model for AI consumption (Copilot \u002F Data Agents)",{"type":42,"tag":201,"props":307,"children":308},{},[309],{"type":42,"tag":135,"props":310,"children":312},{"href":311},"#workflow-semantic-model-ai-readiness",[313],{"type":55,"value":314},"Semantic Model AI Readiness",{"type":42,"tag":179,"props":316,"children":317},{},[318,323],{"type":42,"tag":201,"props":319,"children":320},{},[321],{"type":55,"value":322},"Deploy a model to a Fabric workspace",{"type":42,"tag":201,"props":324,"children":325},{},[326],{"type":42,"tag":135,"props":327,"children":329},{"href":328},"#workflow-deploy-to-fabric",[330],{"type":55,"value":331},"Deploy to Fabric",{"type":42,"tag":179,"props":333,"children":334},{},[335,340],{"type":42,"tag":201,"props":336,"children":337},{},[338],{"type":55,"value":339},"Refresh a semantic model",{"type":42,"tag":201,"props":341,"children":342},{},[343],{"type":42,"tag":135,"props":344,"children":346},{"href":345},"#workflow-refresh-semantic-model",[347],{"type":55,"value":348},"Refresh Semantic Model",{"type":42,"tag":179,"props":350,"children":351},{},[352,357],{"type":42,"tag":201,"props":353,"children":354},{},[355],{"type":55,"value":356},"Configure data sources, parameters, or permissions",{"type":42,"tag":201,"props":358,"children":359},{},[360],{"type":42,"tag":135,"props":361,"children":363},{"href":362},"#workflow-manage-semantic-model-in-fabric",[364],{"type":55,"value":365},"Manage Semantic Model in Fabric",{"type":42,"tag":179,"props":367,"children":368},{},[369,374],{"type":42,"tag":201,"props":370,"children":371},{},[372],{"type":55,"value":373},"Bind a semantic model to a Fabric connection (or unbind)",{"type":42,"tag":201,"props":375,"children":376},{},[377],{"type":42,"tag":135,"props":378,"children":380},{"href":379},"#workflow-bind-semantic-model-to-a-connection",[381],{"type":55,"value":382},"Bind Semantic Model to a Connection",{"type":42,"tag":179,"props":384,"children":385},{},[386,391],{"type":42,"tag":201,"props":387,"children":388},{},[389],{"type":55,"value":390},"Export \u002F Get semantic model definition as PBIP",{"type":42,"tag":201,"props":392,"children":393},{},[394],{"type":42,"tag":135,"props":395,"children":397},{"href":396},"#workflow-export-to-pbip",[398],{"type":55,"value":399},"Export to PBIP",{"type":42,"tag":159,"props":401,"children":403},{"id":402},"table-of-contents",[404],{"type":55,"value":405},"Table of Contents",{"type":42,"tag":47,"props":407,"children":408},{},[409],{"type":55,"value":410},"Load these references on demand when a workflow step requires them. Do not load all at once.",{"type":42,"tag":171,"props":412,"children":413},{},[414,435],{"type":42,"tag":175,"props":415,"children":416},{},[417],{"type":42,"tag":179,"props":418,"children":419},{},[420,425,430],{"type":42,"tag":183,"props":421,"children":422},{},[423],{"type":55,"value":424},"Topic",{"type":42,"tag":183,"props":426,"children":427},{},[428],{"type":55,"value":429},"Reference",{"type":42,"tag":183,"props":431,"children":432},{},[433],{"type":55,"value":434},"When to load",{"type":42,"tag":194,"props":436,"children":437},{},[438,460,482,504,526,548,570,599,621,643,664,693,715,737,764,791,813,835,857],{"type":42,"tag":179,"props":439,"children":440},{},[441,446,455],{"type":42,"tag":201,"props":442,"children":443},{},[444],{"type":55,"value":445},"Modeling Best Practices",{"type":42,"tag":201,"props":447,"children":448},{},[449],{"type":42,"tag":135,"props":450,"children":452},{"href":451},".\u002Freferences\u002Fmodeling-guidelines.md",[453],{"type":55,"value":454},"modeling-guidelines.md",{"type":42,"tag":201,"props":456,"children":457},{},[458],{"type":55,"value":459},"Before creating or editing any model",{"type":42,"tag":179,"props":461,"children":462},{},[463,468,477],{"type":42,"tag":201,"props":464,"children":465},{},[466],{"type":55,"value":467},"Naming Conventions",{"type":42,"tag":201,"props":469,"children":470},{},[471],{"type":42,"tag":135,"props":472,"children":474},{"href":473},".\u002Freferences\u002Fnaming-conventions.md",[475],{"type":55,"value":476},"naming-conventions.md",{"type":42,"tag":201,"props":478,"children":479},{},[480],{"type":55,"value":481},"When naming or renaming tables, columns, measures",{"type":42,"tag":179,"props":483,"children":484},{},[485,490,499],{"type":42,"tag":201,"props":486,"children":487},{},[488],{"type":55,"value":489},"Direct Lake Modeling",{"type":42,"tag":201,"props":491,"children":492},{},[493],{"type":42,"tag":135,"props":494,"children":496},{"href":495},".\u002Freferences\u002Fdirect-lake-guidelines.md",[497],{"type":55,"value":498},"direct-lake-guidelines.md",{"type":42,"tag":201,"props":500,"children":501},{},[502],{"type":55,"value":503},"When model connects to OneLake",{"type":42,"tag":179,"props":505,"children":506},{},[507,512,521],{"type":42,"tag":201,"props":508,"children":509},{},[510],{"type":55,"value":511},"TMDL Editing",{"type":42,"tag":201,"props":513,"children":514},{},[515],{"type":42,"tag":135,"props":516,"children":518},{"href":517},".\u002Freferences\u002Ftmdl-guidelines.md",[519],{"type":55,"value":520},"tmdl-guidelines.md",{"type":42,"tag":201,"props":522,"children":523},{},[524],{"type":55,"value":525},"Before generating or editing any TMDL file",{"type":42,"tag":179,"props":527,"children":528},{},[529,534,543],{"type":42,"tag":201,"props":530,"children":531},{},[532],{"type":55,"value":533},"PBIP Projects",{"type":42,"tag":201,"props":535,"children":536},{},[537],{"type":42,"tag":135,"props":538,"children":540},{"href":539},".\u002Freferences\u002Fpbip.md",[541],{"type":55,"value":542},"pbip.md",{"type":42,"tag":201,"props":544,"children":545},{},[546],{"type":55,"value":547},"When working with PBIP folders",{"type":42,"tag":179,"props":549,"children":550},{},[551,556,565],{"type":42,"tag":201,"props":552,"children":553},{},[554],{"type":55,"value":555},"DAX Language",{"type":42,"tag":201,"props":557,"children":558},{},[559],{"type":42,"tag":135,"props":560,"children":562},{"href":561},".\u002Freferences\u002Fdax-guidelines.md",[563],{"type":55,"value":564},"dax-guidelines.md",{"type":42,"tag":201,"props":566,"children":567},{},[568],{"type":55,"value":569},"When writing or reviewing any DAX code",{"type":42,"tag":179,"props":571,"children":572},{},[573,578,587],{"type":42,"tag":201,"props":574,"children":575},{},[576],{"type":55,"value":577},"Metadata Discovery (DAX INFO functions)",{"type":42,"tag":201,"props":579,"children":580},{},[581],{"type":42,"tag":135,"props":582,"children":584},{"href":583},".\u002Freferences\u002Fmetadata-discovery.md",[585],{"type":55,"value":586},"metadata-discovery.md",{"type":42,"tag":201,"props":588,"children":589},{},[590,592,597],{"type":55,"value":591},"When discovering model metadata via DAX INFO functions (see ",{"type":42,"tag":135,"props":593,"children":594},{"href":228},[595],{"type":55,"value":596},"Workflow: Discover Semantic Model Metadata",{"type":55,"value":598},")",{"type":42,"tag":179,"props":600,"children":601},{},[602,607,616],{"type":42,"tag":201,"props":603,"children":604},{},[605],{"type":55,"value":606},"DAX Performance Decision Guide",{"type":42,"tag":201,"props":608,"children":609},{},[610],{"type":42,"tag":135,"props":611,"children":613},{"href":612},".\u002Freferences\u002Fdax-perf-decision-guide.md",[614],{"type":55,"value":615},"dax-perf-decision-guide.md",{"type":42,"tag":201,"props":617,"children":618},{},[619],{"type":55,"value":620},"Start here when optimizing DAX",{"type":42,"tag":179,"props":622,"children":623},{},[624,629,638],{"type":42,"tag":201,"props":625,"children":626},{},[627],{"type":55,"value":628},"DAX Performance Pattern Catalog",{"type":42,"tag":201,"props":630,"children":631},{},[632],{"type":42,"tag":135,"props":633,"children":635},{"href":634},".\u002Freferences\u002Fdax-perf-patterns.md",[636],{"type":55,"value":637},"dax-perf-patterns.md",{"type":42,"tag":201,"props":639,"children":640},{},[641],{"type":55,"value":642},"Load on demand after the decision guide identifies candidate patterns",{"type":42,"tag":179,"props":644,"children":645},{},[646,650,659],{"type":42,"tag":201,"props":647,"children":648},{},[649],{"type":55,"value":314},{"type":42,"tag":201,"props":651,"children":652},{},[653],{"type":42,"tag":135,"props":654,"children":656},{"href":655},".\u002Freferences\u002Fsemantic-model-ai-readiness.md",[657],{"type":55,"value":658},"semantic-model-ai-readiness.md",{"type":42,"tag":201,"props":660,"children":661},{},[662],{"type":55,"value":663},"When preparing a model for Copilot or Data Agents",{"type":42,"tag":179,"props":665,"children":666},{},[667,672,681],{"type":42,"tag":201,"props":668,"children":669},{},[670],{"type":55,"value":671},"Semantic Model REST API",{"type":42,"tag":201,"props":673,"children":674},{},[675],{"type":42,"tag":135,"props":676,"children":678},{"href":677},".\u002Freferences\u002Fsemantic-model-rest-api.md",[679],{"type":55,"value":680},"semantic-model-rest-api.md",{"type":42,"tag":201,"props":682,"children":683},{},[684,686,691],{"type":55,"value":685},"When using ",{"type":42,"tag":82,"props":687,"children":689},{"className":688},[],[690],{"type":55,"value":148},{"type":55,"value":692}," for TMDL CRUD, refresh, parameters, permissions, or property retrieval",{"type":42,"tag":179,"props":694,"children":695},{},[696,701,710],{"type":42,"tag":201,"props":697,"children":698},{},[699],{"type":55,"value":700},"Connection Binding",{"type":42,"tag":201,"props":702,"children":703},{},[704],{"type":42,"tag":135,"props":705,"children":707},{"href":706},".\u002Freferences\u002Fconnection-binding.md",[708],{"type":55,"value":709},"connection-binding.md",{"type":42,"tag":201,"props":711,"children":712},{},[713],{"type":55,"value":714},"When binding\u002Funbinding a semantic model to a Fabric data connection (gateway, cloud, VNet, automatic, none)",{"type":42,"tag":179,"props":716,"children":717},{},[718,723,732],{"type":42,"tag":201,"props":719,"children":720},{},[721],{"type":55,"value":722},"Finding Workspaces\u002FItems",{"type":42,"tag":201,"props":724,"children":725},{},[726],{"type":42,"tag":135,"props":727,"children":729},{"href":728},"..\u002F..\u002Fcommon\u002FCOMMON-CLI.md#finding-workspaces-and-items-in-fabric",[730],{"type":55,"value":731},"COMMON-CLI.md",{"type":42,"tag":201,"props":733,"children":734},{},[735],{"type":55,"value":736},"When resolving workspace\u002Fitem IDs",{"type":42,"tag":179,"props":738,"children":739},{},[740,745,753],{"type":42,"tag":201,"props":741,"children":742},{},[743],{"type":55,"value":744},"Fabric Control-Plane API",{"type":42,"tag":201,"props":746,"children":747},{},[748],{"type":42,"tag":135,"props":749,"children":751},{"href":750},"..\u002F..\u002Fcommon\u002FCOMMON-CLI.md#fabric-control-plane-api-via-az-rest",[752],{"type":55,"value":731},{"type":42,"tag":201,"props":754,"children":755},{},[756,757,762],{"type":55,"value":685},{"type":42,"tag":82,"props":758,"children":760},{"className":759},[],[761],{"type":55,"value":148},{"type":55,"value":763}," patterns, LRO, pagination",{"type":42,"tag":179,"props":765,"children":766},{},[767,772,780],{"type":42,"tag":201,"props":768,"children":769},{},[770],{"type":55,"value":771},"Authentication",{"type":42,"tag":201,"props":773,"children":774},{},[775],{"type":42,"tag":135,"props":776,"children":778},{"href":777},"..\u002F..\u002Fcommon\u002FCOMMON-CLI.md#authentication-recipes",[779],{"type":55,"value":731},{"type":42,"tag":201,"props":781,"children":782},{},[783,785],{"type":55,"value":784},"When authenticating with ",{"type":42,"tag":82,"props":786,"children":788},{"className":787},[],[789],{"type":55,"value":790},"az login",{"type":42,"tag":179,"props":792,"children":793},{},[794,799,808],{"type":42,"tag":201,"props":795,"children":796},{},[797],{"type":55,"value":798},"Authentication & Token Acquisition",{"type":42,"tag":201,"props":800,"children":801},{},[802],{"type":42,"tag":135,"props":803,"children":805},{"href":804},"..\u002F..\u002Fcommon\u002FCOMMON-CORE.md#authentication--token-acquisition",[806],{"type":55,"value":807},"COMMON-CORE.md § Authentication & Token Acquisition",{"type":42,"tag":201,"props":809,"children":810},{},[811],{"type":55,"value":812},"Wrong audience = 401; read before any auth issue",{"type":42,"tag":179,"props":814,"children":815},{},[816,821,830],{"type":42,"tag":201,"props":817,"children":818},{},[819],{"type":55,"value":820},"Core Control-Plane REST APIs",{"type":42,"tag":201,"props":822,"children":823},{},[824],{"type":42,"tag":135,"props":825,"children":827},{"href":826},"..\u002F..\u002Fcommon\u002FCOMMON-CORE.md#core-control-plane-rest-apis",[828],{"type":55,"value":829},"COMMON-CORE.md § Core Control-Plane REST APIs",{"type":42,"tag":201,"props":831,"children":832},{},[833],{"type":55,"value":834},"Includes pagination, LRO polling, and rate-limiting patterns",{"type":42,"tag":179,"props":836,"children":837},{},[838,843,852],{"type":42,"tag":201,"props":839,"children":840},{},[841],{"type":55,"value":842},"Definition Envelope",{"type":42,"tag":201,"props":844,"children":845},{},[846],{"type":42,"tag":135,"props":847,"children":849},{"href":848},"..\u002F..\u002Fcommon\u002FITEM-DEFINITIONS-CORE.md#semanticmodel",[850],{"type":55,"value":851},"ITEM-DEFINITIONS-CORE.md",{"type":42,"tag":201,"props":853,"children":854},{},[855],{"type":55,"value":856},"When building TMDL definition payloads",{"type":42,"tag":179,"props":858,"children":859},{},[860,865,873],{"type":42,"tag":201,"props":861,"children":862},{},[863],{"type":55,"value":864},"Examples",{"type":42,"tag":201,"props":866,"children":867},{},[868],{"type":42,"tag":135,"props":869,"children":871},{"href":870},"#examples",[872],{"type":55,"value":864},{"type":42,"tag":201,"props":874,"children":875},{},[876],{"type":55,"value":877},"Reference end-to-end walkthroughs.",{"type":42,"tag":879,"props":880,"children":881},"hr",{},[],{"type":42,"tag":159,"props":883,"children":885},{"id":884},"tool-selection-priority",[886],{"type":55,"value":887},"Tool Selection Priority",{"type":42,"tag":47,"props":889,"children":890},{},[891],{"type":55,"value":892},"Priority order (highest first):",{"type":42,"tag":116,"props":894,"children":895},{},[896,990],{"type":42,"tag":71,"props":897,"children":898},{},[899,912,914,918,923,925,931,933,938,940,943,948],{"type":42,"tag":51,"props":900,"children":901},{},[902,904,910],{"type":55,"value":903},"Tier 1 — ",{"type":42,"tag":82,"props":905,"children":907},{"className":906},[],[908],{"type":55,"value":909},"powerbi-modeling-mcp",{"type":55,"value":911}," MCP is registered",{"type":55,"value":913}," -> Use MCP for authoring (new or edit) operations against the model from any source: Power BI Desktop, Fabric workspace, or local PBIP folder. MCP is the most reliable and full-featured way to edit semantic models, with immediate effect on the live model and no risk of TMDL desync.",{"type":42,"tag":915,"props":916,"children":917},"br",{},[],{"type":42,"tag":51,"props":919,"children":920},{},[921],{"type":55,"value":922},"Important:",{"type":55,"value":924}," In case of dynamic search tools is available (e.g. ",{"type":42,"tag":82,"props":926,"children":928},{"className":927},[],[929],{"type":55,"value":930},"tool_search_tool_regex",{"type":55,"value":932},") search for an available MCP server matching the pattern ",{"type":42,"tag":82,"props":934,"children":936},{"className":935},[],[937],{"type":55,"value":909},{"type":55,"value":939},".",{"type":42,"tag":915,"props":941,"children":942},{},[],{"type":42,"tag":51,"props":944,"children":945},{},[946],{"type":55,"value":947},"This includes BOTH writes AND reads\u002Finspection.",{"type":42,"tag":67,"props":949,"children":950},{},[951,956],{"type":42,"tag":71,"props":952,"children":953},{},[954],{"type":55,"value":955},"To inspect or verify changes -> use the corresponding MCP operations (List \u002F Get).",{"type":42,"tag":71,"props":957,"children":958},{},[959,964,966,972,974,980,982,988],{"type":42,"tag":51,"props":960,"children":961},{},[962],{"type":55,"value":963},"Anti-pattern:",{"type":55,"value":965}," opening, ",{"type":42,"tag":82,"props":967,"children":969},{"className":968},[],[970],{"type":55,"value":971},"view",{"type":55,"value":973},"-ing, ",{"type":42,"tag":82,"props":975,"children":977},{"className":976},[],[978],{"type":55,"value":979},"glob",{"type":55,"value":981},"-ing or otherwise reading TMDL files (",{"type":42,"tag":82,"props":983,"children":985},{"className":984},[],[986],{"type":55,"value":987},"*.tmdl",{"type":55,"value":989},") while MCP is connected. The MCP-loaded model is the source of truth - the on-disk TMDL is stale. The only exceptions is when the user explicitly asks to work with the TMDL files.",{"type":42,"tag":71,"props":991,"children":992},{},[993,998,1000,1004,1006,1010,1012,1017,1019,1023,1025,1031,1033,1039],{"type":42,"tag":51,"props":994,"children":995},{},[996],{"type":55,"value":997},"Tier 2 — MCP not registered + PBIP folder or Fabric workspace",{"type":55,"value":999}," -> Edit TMDL files directly. Load ",{"type":42,"tag":135,"props":1001,"children":1002},{"href":517},[1003],{"type":55,"value":520},{"type":55,"value":1005}," and ",{"type":42,"tag":135,"props":1007,"children":1008},{"href":539},[1009],{"type":55,"value":542},{"type":55,"value":1011},". When the source is a Fabric workspace, use ",{"type":42,"tag":82,"props":1013,"children":1015},{"className":1014},[],[1016],{"type":55,"value":148},{"type":55,"value":1018}," to round-trip the TMDL (load ",{"type":42,"tag":135,"props":1020,"children":1021},{"href":677},[1022],{"type":55,"value":680},{"type":55,"value":1024},"): ",{"type":42,"tag":82,"props":1026,"children":1028},{"className":1027},[],[1029],{"type":55,"value":1030},"getDefinition",{"type":55,"value":1032}," -> edit TMDL locally -> ",{"type":42,"tag":82,"props":1034,"children":1036},{"className":1035},[],[1037],{"type":55,"value":1038},"updateDefinition",{"type":55,"value":939},{"type":42,"tag":47,"props":1041,"children":1042},{},[1043,1048,1050,1055],{"type":42,"tag":51,"props":1044,"children":1045},{},[1046],{"type":55,"value":1047},"Fallback — none of the above available (e.g., Power BI Desktop with no PBIP and no MCP)",{"type":55,"value":1049}," -> STOP. The agent cannot author the model in this configuration. Instruct the user to either (a) install and register the ",{"type":42,"tag":82,"props":1051,"children":1053},{"className":1052},[],[1054],{"type":55,"value":909},{"type":55,"value":1056}," MCP server, or (b) save the PBIX as a PBIP project, then restart the workflow.",{"type":42,"tag":43,"props":1058,"children":1059},{},[1060],{"type":42,"tag":47,"props":1061,"children":1062},{},[1063,1068,1070,1076],{"type":42,"tag":51,"props":1064,"children":1065},{},[1066],{"type":55,"value":1067},"All workflows below are tool-agnostic.",{"type":55,"value":1069}," Workflow steps describe the ",{"type":42,"tag":1071,"props":1072,"children":1073},"em",{},[1074],{"type":55,"value":1075},"intent",{"type":55,"value":1077}," (connect, create, edit, save, deploy, refresh). The tool used to perform each step is determined here. Always select the highest-priority tool available for the current environment; do not mix tools when a higher-priority option works. Some workflows OVERRIDE this default priority, always check the workflow's own tool-selection rules before defaulting to Tier 1.",{"type":42,"tag":1079,"props":1080,"children":1082},"h3",{"id":1081},"connecting-to-a-semantic-model",[1083],{"type":55,"value":1084},"Connecting to a Semantic Model",{"type":42,"tag":47,"props":1086,"children":1087},{},[1088,1090,1094],{"type":55,"value":1089},"A semantic model can live in three locations. Resolve the connection per ",{"type":42,"tag":135,"props":1091,"children":1092},{"href":137},[1093],{"type":55,"value":887},{"type":55,"value":1095},":",{"type":42,"tag":67,"props":1097,"children":1098},{},[1099,1109,1134],{"type":42,"tag":71,"props":1100,"children":1101},{},[1102,1107],{"type":42,"tag":51,"props":1103,"children":1104},{},[1105],{"type":55,"value":1106},"Power BI Desktop",{"type":55,"value":1108},": Locate the running Power BI Desktop instance and connect to its local model.",{"type":42,"tag":71,"props":1110,"children":1111},{},[1112,1117,1119,1124,1126,1132],{"type":42,"tag":51,"props":1113,"children":1114},{},[1115],{"type":55,"value":1116},"Fabric workspace",{"type":55,"value":1118},": First, find the workspace and semantic model using the ",{"type":42,"tag":135,"props":1120,"children":1121},{"href":728},[1122],{"type":55,"value":1123},"Finding Workspaces and Items",{"type":55,"value":1125}," pattern: list workspaces to resolve the workspace ID by name, then list items of type ",{"type":42,"tag":82,"props":1127,"children":1129},{"className":1128},[],[1130],{"type":55,"value":1131},"SemanticModel",{"type":55,"value":1133}," in that workspace to resolve the model ID by name. Then connect to the model (live) or export its TMDL definition for local editing.",{"type":42,"tag":71,"props":1135,"children":1136},{},[1137,1142,1144,1150,1152,1156,1158,1163],{"type":42,"tag":51,"props":1138,"children":1139},{},[1140],{"type":55,"value":1141},"PBIP project",{"type":55,"value":1143},": Connect to the ",{"type":42,"tag":82,"props":1145,"children":1147},{"className":1146},[],[1148],{"type":55,"value":1149},"[Name].SemanticModel\u002Fdefinition",{"type":55,"value":1151}," folder. Load ",{"type":42,"tag":135,"props":1153,"children":1154},{"href":539},[1155],{"type":55,"value":542},{"type":55,"value":1157}," to understand the PBIP folder structure - only load the ",{"type":42,"tag":82,"props":1159,"children":1161},{"className":1160},[],[1162],{"type":55,"value":1149},{"type":55,"value":1164}," folder that includes the TMDL code.",{"type":42,"tag":1079,"props":1166,"children":1168},{"id":1167},"saving-changes-to-a-semantic-model",[1169],{"type":55,"value":1170},"Saving Changes to a Semantic Model",{"type":42,"tag":47,"props":1172,"children":1173},{},[1174,1176,1180],{"type":55,"value":1175},"How changes are persisted depends on where the model lives and which tool tier (per ",{"type":42,"tag":135,"props":1177,"children":1178},{"href":137},[1179],{"type":55,"value":887},{"type":55,"value":1181},") is in use:",{"type":42,"tag":47,"props":1183,"children":1184},{},[1185],{"type":42,"tag":51,"props":1186,"children":1187},{},[1188],{"type":55,"value":1189},"Live connection (Tier 1 - MCP against Desktop or Fabric workspace):",{"type":42,"tag":67,"props":1191,"children":1192},{},[1193,1198],{"type":42,"tag":71,"props":1194,"children":1195},{},[1196],{"type":55,"value":1197},"Changes are applied immediately as each operation executes against the live model. No explicit save step is needed.",{"type":42,"tag":71,"props":1199,"children":1200},{},[1201,1206,1208,1213,1215,1219],{"type":42,"tag":51,"props":1202,"children":1203},{},[1204],{"type":55,"value":1205},"PBIP project (live via MCP)",{"type":55,"value":1207},": Serialize the model back to the ",{"type":42,"tag":82,"props":1209,"children":1211},{"className":1210},[],[1212],{"type":55,"value":1149},{"type":55,"value":1214}," folder at the end of the session. If the PBIP folder does not exist yet, follow ",{"type":42,"tag":135,"props":1216,"children":1217},{"href":396},[1218],{"type":55,"value":399},{"type":55,"value":1220}," to create the full structure first.",{"type":42,"tag":47,"props":1222,"children":1223},{},[1224],{"type":42,"tag":51,"props":1225,"children":1226},{},[1227,1229,1234],{"type":55,"value":1228},"Local TMDL editing (Tier 2 - direct file edits or ",{"type":42,"tag":82,"props":1230,"children":1232},{"className":1231},[],[1233],{"type":55,"value":148},{"type":55,"value":1235}," round-trip):",{"type":42,"tag":67,"props":1237,"children":1238},{},[1239,1248],{"type":42,"tag":71,"props":1240,"children":1241},{},[1242,1246],{"type":42,"tag":51,"props":1243,"children":1244},{},[1245],{"type":55,"value":1141},{"type":55,"value":1247},": Changes are already written to the TMDL files during editing. No additional save step is needed.",{"type":42,"tag":71,"props":1249,"children":1250},{},[1251,1255,1257,1261,1263,1268],{"type":42,"tag":51,"props":1252,"children":1253},{},[1254],{"type":55,"value":1116},{"type":55,"value":1256},": Changes were made to local TMDL files exported from the service. Re-deploy the model (load ",{"type":42,"tag":135,"props":1258,"children":1259},{"href":677},[1260],{"type":55,"value":680},{"type":55,"value":1262}," for the ",{"type":42,"tag":82,"props":1264,"children":1266},{"className":1265},[],[1267],{"type":55,"value":1038},{"type":55,"value":1269}," flow) to push changes back to the workspace.",{"type":42,"tag":879,"props":1271,"children":1272},{},[],{"type":42,"tag":159,"props":1274,"children":1276},{"id":1275},"workflow-create-new-semantic-model",[1277],{"type":55,"value":1278},"Workflow: Create new Semantic Model",{"type":42,"tag":47,"props":1280,"children":1281},{},[1282,1287],{"type":42,"tag":51,"props":1283,"children":1284},{},[1285],{"type":55,"value":1286},"When this applies:",{"type":55,"value":1288}," User asks to create a new semantic model from scratch.",{"type":42,"tag":47,"props":1290,"children":1291},{},[1292],{"type":55,"value":1293},"Steps:",{"type":42,"tag":116,"props":1295,"children":1296},{},[1297,1320,1351,1369,1398,1517,1546],{"type":42,"tag":71,"props":1298,"children":1299},{},[1300,1305,1307],{"type":42,"tag":51,"props":1301,"children":1302},{},[1303],{"type":55,"value":1304},"Gather requirements",{"type":55,"value":1306}," - interview the user until both reach a shared understanding of: purpose of the model, data source connection details and schemas, and key business entities\u002Ffacts. ",{"type":42,"tag":51,"props":1308,"children":1309},{},[1310,1312,1318],{"type":55,"value":1311},"If data source information is not available, STOP and use ",{"type":42,"tag":82,"props":1313,"children":1315},{"className":1314},[],[1316],{"type":55,"value":1317},"ask_user",{"type":55,"value":1319},". Do not guess or fabricate.",{"type":42,"tag":71,"props":1321,"children":1322},{},[1323,1328,1330,1335,1337,1342,1344,1349],{"type":42,"tag":51,"props":1324,"children":1325},{},[1326],{"type":55,"value":1327},"Determine storage mode",{"type":55,"value":1329}," - data source is Fabric OneLake -> ",{"type":42,"tag":51,"props":1331,"children":1332},{},[1333],{"type":55,"value":1334},"Direct Lake",{"type":55,"value":1336},"; otherwise default to ",{"type":42,"tag":51,"props":1338,"children":1339},{},[1340],{"type":55,"value":1341},"Import",{"type":55,"value":1343},". Only use ",{"type":42,"tag":51,"props":1345,"children":1346},{},[1347],{"type":55,"value":1348},"DirectQuery",{"type":55,"value":1350}," when the user explicitly asks for it.",{"type":42,"tag":71,"props":1352,"children":1353},{},[1354,1359,1361],{"type":42,"tag":51,"props":1355,"children":1356},{},[1357],{"type":55,"value":1358},"Design star schema",{"type":55,"value":1360}," - identify fact and dimension tables and relationship keys.",{"type":42,"tag":67,"props":1362,"children":1363},{},[1364],{"type":42,"tag":71,"props":1365,"children":1366},{},[1367],{"type":55,"value":1368},"If fact table includes date field(s), create a separate date dimension table and link it to the fact with a relationship. If not explicitly requested, use PowerQuery\u002FM partition instead of DAX calculated table.",{"type":42,"tag":71,"props":1370,"children":1371},{},[1372,1377,1379,1390,1392,1396],{"type":42,"tag":51,"props":1373,"children":1374},{},[1375],{"type":55,"value":1376},"Load applicable guidelines",{"type":55,"value":1378}," - ",{"type":42,"tag":51,"props":1380,"children":1381},{},[1382,1384,1388],{"type":55,"value":1383},"MANDATORY: load ",{"type":42,"tag":135,"props":1385,"children":1386},{"href":451},[1387],{"type":55,"value":454},{"type":55,"value":1389}," before building any object",{"type":55,"value":1391}," (including the Tier 1 MCP path below); also load ",{"type":42,"tag":135,"props":1393,"children":1394},{"href":495},[1395],{"type":55,"value":498},{"type":55,"value":1397}," if Direct Lake. Don't build from memory.",{"type":42,"tag":71,"props":1399,"children":1400},{},[1401,1406,1408,1412,1414,1419,1421,1425,1427,1504],{"type":42,"tag":51,"props":1402,"children":1403},{},[1404],{"type":55,"value":1405},"Build",{"type":55,"value":1407}," - follow ",{"type":42,"tag":135,"props":1409,"children":1410},{"href":137},[1411],{"type":55,"value":887},{"type":55,"value":1413},": ",{"type":42,"tag":51,"props":1415,"children":1416},{},[1417],{"type":55,"value":1418},"prefer the modeling MCP to build the whole model when one is available; otherwise use the TMDL code-edit path.",{"type":55,"value":1420}," Create an empty database (compatibility level 1702+), then for each table follow the execution order from ",{"type":42,"tag":135,"props":1422,"children":1423},{"href":245},[1424],{"type":55,"value":248},{"type":55,"value":1426}," (partitions -> columns -> relationships -> measures). Storage-mode specifics:",{"type":42,"tag":67,"props":1428,"children":1429},{},[1430,1471],{"type":42,"tag":71,"props":1431,"children":1432},{},[1433,1438,1440,1446,1448,1454,1456,1462,1463,1469],{"type":42,"tag":51,"props":1434,"children":1435},{},[1436],{"type":55,"value":1437},"Import \u002F DirectQuery",{"type":55,"value":1439}," - create M parameters for the data source (",{"type":42,"tag":82,"props":1441,"children":1443},{"className":1442},[],[1444],{"type":55,"value":1445},"Server",{"type":55,"value":1447},", ",{"type":42,"tag":82,"props":1449,"children":1451},{"className":1450},[],[1452],{"type":55,"value":1453},"Database",{"type":55,"value":1455},", ...) and reference them in partition M code; ensure proper ",{"type":42,"tag":82,"props":1457,"children":1459},{"className":1458},[],[1460],{"type":55,"value":1461},"dataType",{"type":55,"value":1005},{"type":42,"tag":82,"props":1464,"children":1466},{"className":1465},[],[1467],{"type":55,"value":1468},"sourceColumn",{"type":55,"value":1470}," mapping on columns.",{"type":42,"tag":71,"props":1472,"children":1473},{},[1474,1478,1480,1486,1488,1494,1496,1502],{"type":42,"tag":51,"props":1475,"children":1476},{},[1477],{"type":55,"value":1334},{"type":55,"value":1479}," - create a shared named expression for the Direct Lake connection using the ",{"type":42,"tag":82,"props":1481,"children":1483},{"className":1482},[],[1484],{"type":55,"value":1485},"AzureStorage.DataLake",{"type":55,"value":1487}," connector; use ",{"type":42,"tag":82,"props":1489,"children":1491},{"className":1490},[],[1492],{"type":55,"value":1493},"EntityPartitionSource",{"type":55,"value":1495}," with ",{"type":42,"tag":82,"props":1497,"children":1499},{"className":1498},[],[1500],{"type":55,"value":1501},"directLake",{"type":55,"value":1503}," mode mapped to the lakehouse table columns.",{"type":42,"tag":43,"props":1505,"children":1506},{},[1507],{"type":42,"tag":47,"props":1508,"children":1509},{},[1510,1515],{"type":42,"tag":51,"props":1511,"children":1512},{},[1513],{"type":55,"value":1514},"Build the whole model in one pass, then deploy once.",{"type":55,"value":1516}," Add every table, column, relationship and measure before deploying - don't deploy a partial model and edit-redeploy. On the MCP path, keep the model in the session end to end.",{"type":42,"tag":71,"props":1518,"children":1519},{},[1520,1525,1527,1531,1533,1537,1539,1544],{"type":42,"tag":51,"props":1521,"children":1522},{},[1523],{"type":55,"value":1524},"Deploy or save",{"type":55,"value":1526}," - Fabric workspace available -> ",{"type":42,"tag":135,"props":1528,"children":1529},{"href":328},[1530],{"type":55,"value":331},{"type":55,"value":1532},"; otherwise -> ",{"type":42,"tag":135,"props":1534,"children":1535},{"href":396},[1536],{"type":55,"value":399},{"type":55,"value":1538},". See ",{"type":42,"tag":135,"props":1540,"children":1542},{"href":1541},"#saving-changes-to-a-semantic-model",[1543],{"type":55,"value":1170},{"type":55,"value":1545},". Deploy through the same path you built with.",{"type":42,"tag":71,"props":1547,"children":1548},{},[1549,1554,1556,1562],{"type":42,"tag":51,"props":1550,"children":1551},{},[1552],{"type":55,"value":1553},"Validate",{"type":55,"value":1555}," - run ",{"type":42,"tag":135,"props":1557,"children":1559},{"href":1558},"#validation-checklist",[1560],{"type":55,"value":1561},"Validation Checklist",{"type":55,"value":939},{"type":42,"tag":879,"props":1564,"children":1565},{},[],{"type":42,"tag":159,"props":1567,"children":1569},{"id":1568},"workflow-discover-semantic-model-metadata",[1570],{"type":55,"value":596},{"type":42,"tag":47,"props":1572,"children":1573},{},[1574,1578,1580,1585,1586,1590,1591,1596],{"type":42,"tag":51,"props":1575,"children":1576},{},[1577],{"type":55,"value":1286},{"type":55,"value":1579}," User asks to inspect, list, or discover the model's structure - tables, columns, measures, relationships, hierarchies, partitions, roles, or storage internals. Also used internally by other workflows (",{"type":42,"tag":135,"props":1581,"children":1582},{"href":245},[1583],{"type":55,"value":1584},"Modify",{"type":55,"value":1447},{"type":42,"tag":135,"props":1587,"children":1588},{"href":294},[1589],{"type":55,"value":297},{"type":55,"value":1447},{"type":42,"tag":135,"props":1592,"children":1593},{"href":311},[1594],{"type":55,"value":1595},"AI Readiness",{"type":55,"value":1597},") to inventory the model before editing.",{"type":42,"tag":43,"props":1599,"children":1600},{},[1601],{"type":42,"tag":47,"props":1602,"children":1603},{},[1604,1609,1611,1616,1618,1624],{"type":42,"tag":51,"props":1605,"children":1606},{},[1607],{"type":55,"value":1608},"Scope:",{"type":55,"value":1610}," This workflow covers ",{"type":42,"tag":51,"props":1612,"children":1613},{},[1614],{"type":55,"value":1615},"metadata",{"type":55,"value":1617}," discovery only. To answer natural-language\u002Fdata questions against the model, use the ",{"type":42,"tag":82,"props":1619,"children":1621},{"className":1620},[],[1622],{"type":55,"value":1623},"FabricIQ",{"type":55,"value":1625}," skill instead.",{"type":42,"tag":47,"props":1627,"children":1628},{},[1629],{"type":55,"value":1630},"Pick a discovery method (highest priority first):",{"type":42,"tag":116,"props":1632,"children":1633},{},[1634,1663],{"type":42,"tag":71,"props":1635,"children":1636},{},[1637,1647,1649,1654,1656,1661],{"type":42,"tag":51,"props":1638,"children":1639},{},[1640,1645],{"type":42,"tag":82,"props":1641,"children":1643},{"className":1642},[],[1644],{"type":55,"value":909},{"type":55,"value":1646}," TOM inspection (List \u002F Get)",{"type":55,"value":1648}," - the default when ",{"type":42,"tag":82,"props":1650,"children":1652},{"className":1651},[],[1653],{"type":55,"value":909},{"type":55,"value":1655}," is registered and connected to the target model ",{"type":42,"tag":51,"props":1657,"children":1658},{},[1659],{"type":55,"value":1660},"with Write access",{"type":55,"value":1662},". It returns the structured object model directly and stays in sync with pending edits, so it is preferred while authoring.",{"type":42,"tag":71,"props":1664,"children":1665},{},[1666,1679,1681,1687,1689,1695,1697,1715,1717,1722,1724,1729,1771,1774,1776,1781,1783],{"type":42,"tag":51,"props":1667,"children":1668},{},[1669,1671,1677],{"type":55,"value":1670},"DAX ",{"type":42,"tag":82,"props":1672,"children":1674},{"className":1673},[],[1675],{"type":55,"value":1676},"INFO",{"type":55,"value":1678}," functions",{"type":55,"value":1680}," - query the model's ",{"type":42,"tag":82,"props":1682,"children":1684},{"className":1683},[],[1685],{"type":55,"value":1686},"INFO.VIEW.*",{"type":55,"value":1688}," \u002F ",{"type":42,"tag":82,"props":1690,"children":1692},{"className":1691},[],[1693],{"type":55,"value":1694},"INFO.*",{"type":55,"value":1696}," metadata rowsets. ",{"type":42,"tag":51,"props":1698,"children":1699},{},[1700,1702,1707,1709,1713],{"type":55,"value":1701},"MANDATORY: before writing or running ANY ",{"type":42,"tag":82,"props":1703,"children":1705},{"className":1704},[],[1706],{"type":55,"value":1676},{"type":55,"value":1708},"-function DAX, you MUST load ",{"type":42,"tag":135,"props":1710,"children":1711},{"href":583},[1712],{"type":55,"value":586},{"type":55,"value":1714}," first",{"type":55,"value":1716},". Do NOT compose ",{"type":42,"tag":82,"props":1718,"children":1720},{"className":1719},[],[1721],{"type":55,"value":1676},{"type":55,"value":1723}," queries from memory; load the reference and use its patterns. ",{"type":42,"tag":51,"props":1725,"children":1726},{},[1727],{"type":55,"value":1728},"Prioritize this method when any of the following is true:",{"type":42,"tag":67,"props":1730,"children":1731},{},[1732,1756],{"type":42,"tag":71,"props":1733,"children":1734},{},[1735,1740,1742,1747,1749,1754],{"type":42,"tag":51,"props":1736,"children":1737},{},[1738],{"type":55,"value":1739},"You lack Write permission",{"type":55,"value":1741}," on the model. ",{"type":42,"tag":82,"props":1743,"children":1745},{"className":1744},[],[1746],{"type":55,"value":909},{"type":55,"value":1748}," operations require Write access; with Read or Build access, use ",{"type":42,"tag":82,"props":1750,"children":1752},{"className":1751},[],[1753],{"type":55,"value":1676},{"type":55,"value":1755}," functions.",{"type":42,"tag":71,"props":1757,"children":1758},{},[1759,1769],{"type":42,"tag":51,"props":1760,"children":1761},{},[1762,1767],{"type":42,"tag":82,"props":1763,"children":1765},{"className":1764},[],[1766],{"type":55,"value":909},{"type":55,"value":1768}," is not registered or not available",{"type":55,"value":1770}," in the current environment.",{"type":42,"tag":915,"props":1772,"children":1773},{},[],{"type":55,"value":1775},"Execute the ",{"type":42,"tag":82,"props":1777,"children":1779},{"className":1778},[],[1780],{"type":55,"value":1676},{"type":55,"value":1782},"-function DAX through one of these tools (highest priority first):",{"type":42,"tag":67,"props":1784,"children":1785},{},[1786,1824],{"type":42,"tag":71,"props":1787,"children":1788},{},[1789,1800,1802,1807,1809,1814,1816,1822],{"type":42,"tag":51,"props":1790,"children":1791},{},[1792,1794],{"type":55,"value":1793},"FabricIQ ",{"type":42,"tag":82,"props":1795,"children":1797},{"className":1796},[],[1798],{"type":55,"value":1799},"ExecuteQuery",{"type":55,"value":1801}," - requires only ",{"type":42,"tag":51,"props":1803,"children":1804},{},[1805],{"type":55,"value":1806},"Read",{"type":55,"value":1808}," permission on the model. Load the ",{"type":42,"tag":82,"props":1810,"children":1812},{"className":1811},[],[1813],{"type":55,"value":1623},{"type":55,"value":1815}," skill for artifact discovery (",{"type":42,"tag":82,"props":1817,"children":1819},{"className":1818},[],[1820],{"type":55,"value":1821},"DiscoverArtifacts",{"type":55,"value":1823},") and execution mechanics.",{"type":42,"tag":71,"props":1825,"children":1826},{},[1827,1843,1845,1850],{"type":42,"tag":51,"props":1828,"children":1829},{},[1830,1835,1837],{"type":42,"tag":82,"props":1831,"children":1833},{"className":1832},[],[1834],{"type":55,"value":909},{"type":55,"value":1836}," ",{"type":42,"tag":82,"props":1838,"children":1840},{"className":1839},[],[1841],{"type":55,"value":1842},"dax_query_operations",{"type":55,"value":1844}," - requires ",{"type":42,"tag":51,"props":1846,"children":1847},{},[1848],{"type":55,"value":1849},"Write",{"type":55,"value":1851}," permission. Use this when the modeling MCP is already connected with Write access.",{"type":42,"tag":43,"props":1853,"children":1854},{},[1855],{"type":42,"tag":47,"props":1856,"children":1857},{},[1858,1871,1873,1878,1880,1885],{"type":42,"tag":51,"props":1859,"children":1860},{},[1861,1863,1869],{"type":55,"value":1862},"Do NOT use FabricIQ ",{"type":42,"tag":82,"props":1864,"children":1866},{"className":1865},[],[1867],{"type":55,"value":1868},"GetSemanticModelSchema",{"type":55,"value":1870}," for authoring metadata discovery",{"type":55,"value":1872}," - it is a data-consumption tool that can return stale metadata and miss recent edits. Even when FabricIQ is available, always use the ",{"type":42,"tag":82,"props":1874,"children":1876},{"className":1875},[],[1877],{"type":55,"value":1676},{"type":55,"value":1879}," functions (via ",{"type":42,"tag":82,"props":1881,"children":1883},{"className":1882},[],[1884],{"type":55,"value":1799},{"type":55,"value":1886},"); they query the live model.",{"type":42,"tag":47,"props":1888,"children":1889},{},[1890,1892,1897,1899,1903],{"type":55,"value":1891},"Start narrow: run the scope-estimation and ",{"type":42,"tag":82,"props":1893,"children":1895},{"className":1894},[],[1896],{"type":55,"value":1686},{"type":55,"value":1898}," queries first, then project\u002Ffilter to only the objects relevant to the task (see ",{"type":42,"tag":135,"props":1900,"children":1901},{"href":583},[1902],{"type":55,"value":586},{"type":55,"value":1904},").",{"type":42,"tag":879,"props":1906,"children":1907},{},[],{"type":42,"tag":159,"props":1909,"children":1911},{"id":1910},"workflow-modify-an-existing-model",[1912],{"type":55,"value":1913},"Workflow: Modify an Existing Model",{"type":42,"tag":47,"props":1915,"children":1916},{},[1917,1921],{"type":42,"tag":51,"props":1918,"children":1919},{},[1920],{"type":55,"value":1286},{"type":55,"value":1922}," User asks to add\u002Fedit\u002Fremove measures, tables, columns, relationships, write DAX code, refactor with UDFs, or edit TMDL directly.",{"type":42,"tag":47,"props":1924,"children":1925},{},[1926],{"type":55,"value":1293},{"type":42,"tag":116,"props":1928,"children":1929},{},[1930,1952,1984,1994,2037],{"type":42,"tag":71,"props":1931,"children":1932},{},[1933,1938,1940,1945,1946,1950],{"type":42,"tag":51,"props":1934,"children":1935},{},[1936],{"type":55,"value":1937},"Connect & discover",{"type":55,"value":1939}," - per ",{"type":42,"tag":135,"props":1941,"children":1943},{"href":1942},"#connecting-to-a-semantic-model",[1944],{"type":55,"value":1084},{"type":55,"value":1005},{"type":42,"tag":135,"props":1947,"children":1948},{"href":228},[1949],{"type":55,"value":231},{"type":55,"value":1951},". List tables, relationships, existing measures, and identify storage mode (it dictates which guidelines apply).",{"type":42,"tag":71,"props":1953,"children":1954},{},[1955,1959,1960,1964,1966,1970,1972,1976,1978,1982],{"type":42,"tag":51,"props":1956,"children":1957},{},[1958],{"type":55,"value":1376},{"type":55,"value":1378},{"type":42,"tag":135,"props":1961,"children":1962},{"href":451},[1963],{"type":55,"value":454},{"type":55,"value":1965}," always; ",{"type":42,"tag":135,"props":1967,"children":1968},{"href":495},[1969],{"type":55,"value":498},{"type":55,"value":1971}," if Direct Lake; ",{"type":42,"tag":135,"props":1973,"children":1974},{"href":517},[1975],{"type":55,"value":520},{"type":55,"value":1977}," when editing TMDL directly; ",{"type":42,"tag":135,"props":1979,"children":1980},{"href":561},[1981],{"type":55,"value":564},{"type":55,"value":1983}," for any DAX changes (includes UDF refactoring).",{"type":42,"tag":71,"props":1985,"children":1986},{},[1987,1992],{"type":42,"tag":51,"props":1988,"children":1989},{},[1990],{"type":55,"value":1991},"Plan changes",{"type":55,"value":1993}," - identify exactly what to add, modify, or remove. Check for naming conflicts and duplicates.",{"type":42,"tag":71,"props":1995,"children":1996},{},[1997,2002,2004],{"type":42,"tag":51,"props":1998,"children":1999},{},[2000],{"type":55,"value":2001},"Execute",{"type":55,"value":2003}," in correct order:\n",{"type":42,"tag":67,"props":2005,"children":2006},{},[2007,2017,2027],{"type":42,"tag":71,"props":2008,"children":2009},{},[2010,2015],{"type":42,"tag":51,"props":2011,"children":2012},{},[2013],{"type":55,"value":2014},"Adding tables",{"type":55,"value":2016}," - partitions -> columns -> relationships -> measures.",{"type":42,"tag":71,"props":2018,"children":2019},{},[2020,2025],{"type":42,"tag":51,"props":2021,"children":2022},{},[2023],{"type":55,"value":2024},"Adding relationships",{"type":55,"value":2026}," - ensure key columns exist on both sides with matching data types;",{"type":42,"tag":71,"props":2028,"children":2029},{},[2030,2035],{"type":42,"tag":51,"props":2031,"children":2032},{},[2033],{"type":55,"value":2034},"Adding measures",{"type":55,"value":2036}," - verify referenced columns\u002Ftables exist;",{"type":42,"tag":71,"props":2038,"children":2039},{},[2040,2045,2046,2050,2051,2055],{"type":42,"tag":51,"props":2041,"children":2042},{},[2043],{"type":55,"value":2044},"Save & validate",{"type":55,"value":1939},{"type":42,"tag":135,"props":2047,"children":2048},{"href":1541},[2049],{"type":55,"value":1170},{"type":55,"value":1005},{"type":42,"tag":135,"props":2052,"children":2053},{"href":1558},[2054],{"type":55,"value":1561},{"type":55,"value":939},{"type":42,"tag":879,"props":2057,"children":2058},{},[],{"type":42,"tag":159,"props":2060,"children":2062},{"id":2061},"workflow-optimize-dax-performance",[2063],{"type":55,"value":2064},"Workflow: Optimize DAX Performance",{"type":42,"tag":47,"props":2066,"children":2067},{},[2068,2072],{"type":42,"tag":51,"props":2069,"children":2070},{},[2071],{"type":55,"value":1286},{"type":55,"value":2073}," User asks to improve DAX query performance, diagnose slow measures, or optimize calculations.",{"type":42,"tag":43,"props":2075,"children":2076},{},[2077],{"type":42,"tag":47,"props":2078,"children":2079},{},[2080,2085],{"type":42,"tag":51,"props":2081,"children":2082},{},[2083],{"type":55,"value":2084},"Hard requirement:",{"type":55,"value":2086}," Requires a trace-capable client (MCP preferred))",{"type":42,"tag":47,"props":2088,"children":2089},{},[2090,2092,2096,2098,2102],{"type":55,"value":2091},"Load ",{"type":42,"tag":135,"props":2093,"children":2094},{"href":612},[2095],{"type":55,"value":615},{"type":55,"value":2097}," first and follow the framework defined there. Load ",{"type":42,"tag":135,"props":2099,"children":2100},{"href":634},[2101],{"type":55,"value":637},{"type":55,"value":2103}," only when applying candidate optimization patterns. The framework includes:",{"type":42,"tag":116,"props":2105,"children":2106},{},[2107,2112,2117],{"type":42,"tag":71,"props":2108,"children":2109},{},[2110],{"type":55,"value":2111},"Tier model for categorizing optimization effort",{"type":42,"tag":71,"props":2113,"children":2114},{},[2115],{"type":55,"value":2116},"Trace diagnostics to identify bottlenecks",{"type":42,"tag":71,"props":2118,"children":2119},{},[2120],{"type":55,"value":2121},"Pattern catalog with candidate optimization techniques to test and validate",{"type":42,"tag":879,"props":2123,"children":2124},{},[],{"type":42,"tag":159,"props":2126,"children":2128},{"id":2127},"workflow-analyze-best-practices",[2129],{"type":55,"value":2130},"Workflow: Analyze Best Practices",{"type":42,"tag":47,"props":2132,"children":2133},{},[2134,2138],{"type":42,"tag":51,"props":2135,"children":2136},{},[2137],{"type":55,"value":1286},{"type":55,"value":2139}," User asks to review, audit, or analyze a semantic model against best practices.",{"type":42,"tag":47,"props":2141,"children":2142},{},[2143],{"type":55,"value":1293},{"type":42,"tag":116,"props":2145,"children":2146},{},[2147,2167,2197,2222,2232,2247],{"type":42,"tag":71,"props":2148,"children":2149},{},[2150,2155,2156,2160,2161,2165],{"type":42,"tag":51,"props":2151,"children":2152},{},[2153],{"type":55,"value":2154},"Connect & inventory",{"type":55,"value":1939},{"type":42,"tag":135,"props":2157,"children":2158},{"href":1942},[2159],{"type":55,"value":1084},{"type":55,"value":1005},{"type":42,"tag":135,"props":2162,"children":2163},{"href":228},[2164],{"type":55,"value":231},{"type":55,"value":2166},". Capture all tables, columns, relationships, measures, and storage mode.",{"type":42,"tag":71,"props":2168,"children":2169},{},[2170,2174,2175,2179,2180,2184,2185,2189,2191,2195],{"type":42,"tag":51,"props":2171,"children":2172},{},[2173],{"type":55,"value":1376},{"type":55,"value":1378},{"type":42,"tag":135,"props":2176,"children":2177},{"href":451},[2178],{"type":55,"value":454},{"type":55,"value":1965},{"type":42,"tag":135,"props":2181,"children":2182},{"href":495},[2183],{"type":55,"value":498},{"type":55,"value":1971},{"type":42,"tag":135,"props":2186,"children":2187},{"href":473},[2188],{"type":55,"value":476},{"type":55,"value":2190}," when assessing naming; ",{"type":42,"tag":135,"props":2192,"children":2193},{"href":561},[2194],{"type":55,"value":564},{"type":55,"value":2196}," when assessing DAX.",{"type":42,"tag":71,"props":2198,"children":2199},{},[2200,2205,2207,2213,2215,2220],{"type":42,"tag":51,"props":2201,"children":2202},{},[2203],{"type":55,"value":2204},"Evaluate",{"type":55,"value":2206}," - compare the model against the loaded guidelines (star schema, naming, relationship cardinality and cross-filter, explicit measures with ",{"type":42,"tag":82,"props":2208,"children":2210},{"className":2209},[],[2211],{"type":55,"value":2212},"formatString",{"type":55,"value":2214},", column data types and ",{"type":42,"tag":82,"props":2216,"children":2218},{"className":2217},[],[2219],{"type":55,"value":1468},{"type":55,"value":2221},", hidden FK columns, calculated-column-vs-measure choices, Direct Lake constraints, etc.).",{"type":42,"tag":71,"props":2223,"children":2224},{},[2225,2230],{"type":42,"tag":51,"props":2226,"children":2227},{},[2228],{"type":55,"value":2229},"Present findings",{"type":55,"value":2231}," grouped by severity (critical, recommended, optional). For each item state the rule violated and the proposed fix. Wait for user approval.",{"type":42,"tag":71,"props":2233,"children":2234},{},[2235,2240,2242,2246],{"type":42,"tag":51,"props":2236,"children":2237},{},[2238],{"type":55,"value":2239},"Apply approved fixes",{"type":55,"value":2241}," via ",{"type":42,"tag":135,"props":2243,"children":2244},{"href":245},[2245],{"type":55,"value":248},{"type":55,"value":939},{"type":42,"tag":71,"props":2248,"children":2249},{},[2250,2254,2255,2259,2260,2264],{"type":42,"tag":51,"props":2251,"children":2252},{},[2253],{"type":55,"value":2044},{"type":55,"value":1939},{"type":42,"tag":135,"props":2256,"children":2257},{"href":1541},[2258],{"type":55,"value":1170},{"type":55,"value":1005},{"type":42,"tag":135,"props":2261,"children":2262},{"href":1558},[2263],{"type":55,"value":1561},{"type":55,"value":939},{"type":42,"tag":879,"props":2266,"children":2267},{},[],{"type":42,"tag":159,"props":2269,"children":2271},{"id":2270},"workflow-semantic-model-ai-readiness",[2272],{"type":55,"value":2273},"Workflow: Semantic Model AI Readiness",{"type":42,"tag":47,"props":2275,"children":2276},{},[2277,2281],{"type":42,"tag":51,"props":2278,"children":2279},{},[2280],{"type":55,"value":1286},{"type":55,"value":2282}," User asks to make a semantic model ready for Microsoft Fabric Copilot, a Power BI Data Agent, or any conversational BI experience. Triggers include \"Copilot readiness\", \"AI readiness\", \"Prep for AI\", \"prepare model for Copilot\".",{"type":42,"tag":47,"props":2284,"children":2285},{},[2286,2287,2291],{"type":55,"value":2091},{"type":42,"tag":135,"props":2288,"children":2289},{"href":655},[2290],{"type":55,"value":658},{"type":55,"value":2292}," before starting.",{"type":42,"tag":47,"props":2294,"children":2295},{},[2296],{"type":55,"value":1293},{"type":42,"tag":116,"props":2298,"children":2299},{},[2300,2324,2338,2364,2373,2389],{"type":42,"tag":71,"props":2301,"children":2302},{},[2303,2308,2310,2315,2317,2322],{"type":42,"tag":51,"props":2304,"children":2305},{},[2306],{"type":55,"value":2307},"Confirm scope & gather context",{"type":55,"value":2309}," - via ",{"type":42,"tag":82,"props":2311,"children":2313},{"className":2312},[],[2314],{"type":55,"value":1317},{"type":55,"value":2316},", confirm consumption mode (reports only \u002F conversational BI \u002F both) and model stability per the ",{"type":42,"tag":1071,"props":2318,"children":2319},{},[2320],{"type":55,"value":2321},"When to Apply",{"type":55,"value":2323}," section. Collect business context (process, key metrics, common natural-language questions, vocabulary). Do not invent.",{"type":42,"tag":71,"props":2325,"children":2326},{},[2327,2331,2332,2336],{"type":42,"tag":51,"props":2328,"children":2329},{},[2330],{"type":55,"value":2154},{"type":55,"value":1939},{"type":42,"tag":135,"props":2333,"children":2334},{"href":1942},[2335],{"type":55,"value":1084},{"type":55,"value":2337},". Capture model contents and the source location (PBIP \u002F Fabric workspace \u002F Desktop-only).",{"type":42,"tag":71,"props":2339,"children":2340},{},[2341,2346,2348,2354,2356,2362],{"type":42,"tag":51,"props":2342,"children":2343},{},[2344],{"type":55,"value":2345},"Evaluate & route",{"type":55,"value":2347}," - walk the ",{"type":42,"tag":135,"props":2349,"children":2351},{"href":2350},".\u002Freferences\u002Fsemantic-model-ai-readiness.md#readiness-checklist",[2352],{"type":55,"value":2353},"Readiness Checklist",{"type":55,"value":2355}," in order; for each gap, classify the fix per ",{"type":42,"tag":135,"props":2357,"children":2359},{"href":2358},".\u002Freferences\u002Fsemantic-model-ai-readiness.md#editing-capability",[2360],{"type":55,"value":2361},"Editing Capability",{"type":55,"value":2363}," (agent-editable TOM metadata vs AI-specific artifacts the user configures in the Power BI \"Prep data for AI\" UI).",{"type":42,"tag":71,"props":2365,"children":2366},{},[2367,2371],{"type":42,"tag":51,"props":2368,"children":2369},{},[2370],{"type":55,"value":2229},{"type":55,"value":2372}," grouped by severity, each tagged with routing (agent-applicable vs user-action-required). Wait for approval.",{"type":42,"tag":71,"props":2374,"children":2375},{},[2376,2381,2383,2387],{"type":42,"tag":51,"props":2377,"children":2378},{},[2379],{"type":55,"value":2380},"Apply approved changes",{"type":55,"value":2382}," - apply TOM metadata fixes via ",{"type":42,"tag":135,"props":2384,"children":2385},{"href":245},[2386],{"type":55,"value":248},{"type":55,"value":2388},"; for AI instructions, AI Data Schema, and Verified Answers, instruct the user to configure them in the Power BI \"Prep data for AI\" UI and, only if the user agrees, offer suggestions per the readiness reference; Desktop-only PBIX -> instruct user.",{"type":42,"tag":71,"props":2390,"children":2391},{},[2392,2397,2398,2402,2403,2407],{"type":42,"tag":51,"props":2393,"children":2394},{},[2395],{"type":55,"value":2396},"Save, validate, recommend live testing",{"type":55,"value":1939},{"type":42,"tag":135,"props":2399,"children":2400},{"href":1541},[2401],{"type":55,"value":1170},{"type":55,"value":1005},{"type":42,"tag":135,"props":2404,"children":2405},{"href":1558},[2406],{"type":55,"value":1561},{"type":55,"value":2408},"; advise the user to test representative natural-language prompts in Copilot or the Data Agent and iterate.",{"type":42,"tag":879,"props":2410,"children":2411},{},[],{"type":42,"tag":159,"props":2413,"children":2415},{"id":2414},"workflow-export-to-pbip",[2416],{"type":55,"value":2417},"Workflow: Export to PBIP",{"type":42,"tag":47,"props":2419,"children":2420},{},[2421,2425],{"type":42,"tag":51,"props":2422,"children":2423},{},[2424],{"type":55,"value":1286},{"type":55,"value":2426}," User asks to export or save a semantic model to a PBIP project folder, or there is no Fabric workspace available to deploy to (e.g., after building a model in-memory).",{"type":42,"tag":43,"props":2428,"children":2429},{},[2430],{"type":42,"tag":47,"props":2431,"children":2432},{},[2433,2438,2440,2446,2447,2453,2454,2460],{"type":42,"tag":51,"props":2434,"children":2435},{},[2436],{"type":55,"value":2437},"Key fact:",{"type":55,"value":2439}," Exporting a model only produces the TMDL definition files. It does NOT create the surrounding PBIP folder structure (Report folder, ",{"type":42,"tag":82,"props":2441,"children":2443},{"className":2442},[],[2444],{"type":55,"value":2445},"definition.pbism",{"type":55,"value":1447},{"type":42,"tag":82,"props":2448,"children":2450},{"className":2449},[],[2451],{"type":55,"value":2452},"definition.pbir",{"type":55,"value":1447},{"type":42,"tag":82,"props":2455,"children":2457},{"className":2456},[],[2458],{"type":55,"value":2459},".pbip",{"type":55,"value":2461}," entry point). The agent must scaffold these before exporting, otherwise the result cannot be opened in Power BI Desktop.",{"type":42,"tag":47,"props":2463,"children":2464},{},[2465,2466,2470],{"type":55,"value":2091},{"type":42,"tag":135,"props":2467,"children":2468},{"href":539},[2469],{"type":55,"value":542},{"type":55,"value":2471}," before starting and follow the PBIP folder structure defined there.",{"type":42,"tag":47,"props":2473,"children":2474},{},[2475],{"type":55,"value":1293},{"type":42,"tag":116,"props":2477,"children":2478},{},[2479,2495,2568,2645],{"type":42,"tag":71,"props":2480,"children":2481},{},[2482,2487,2488,2493],{"type":42,"tag":51,"props":2483,"children":2484},{},[2485],{"type":55,"value":2486},"Determine target",{"type":55,"value":2309},{"type":42,"tag":82,"props":2489,"children":2491},{"className":2490},[],[2492],{"type":55,"value":1317},{"type":55,"value":2494},", get the target folder path and the semantic model name. If only a folder is provided, use the model's database name as the semantic model folder name.",{"type":42,"tag":71,"props":2496,"children":2497},{},[2498,2503,2504,2508,2510,2516,2518,2524,2525,2530,2532,2538,2539,2544,2545,2550,2552,2558,2560,2566],{"type":42,"tag":51,"props":2499,"children":2500},{},[2501],{"type":55,"value":2502},"Scaffold the PBIP structure",{"type":55,"value":1939},{"type":42,"tag":135,"props":2505,"children":2506},{"href":539},[2507],{"type":55,"value":542},{"type":55,"value":2509},", ensure ",{"type":42,"tag":82,"props":2511,"children":2513},{"className":2512},[],[2514],{"type":55,"value":2515},"\u003CName>.SemanticModel\u002F",{"type":55,"value":2517}," (with ",{"type":42,"tag":82,"props":2519,"children":2521},{"className":2520},[],[2522],{"type":55,"value":2523},"definition\u002F",{"type":55,"value":1005},{"type":42,"tag":82,"props":2526,"children":2528},{"className":2527},[],[2529],{"type":55,"value":2445},{"type":55,"value":2531},"), ",{"type":42,"tag":82,"props":2533,"children":2535},{"className":2534},[],[2536],{"type":55,"value":2537},"\u003CName>.Report\u002F",{"type":55,"value":2517},{"type":42,"tag":82,"props":2540,"children":2542},{"className":2541},[],[2543],{"type":55,"value":2523},{"type":55,"value":1005},{"type":42,"tag":82,"props":2546,"children":2548},{"className":2547},[],[2549],{"type":55,"value":2452},{"type":55,"value":2551}," using a ",{"type":42,"tag":82,"props":2553,"children":2555},{"className":2554},[],[2556],{"type":55,"value":2557},"byPath",{"type":55,"value":2559}," reference), and ",{"type":42,"tag":82,"props":2561,"children":2563},{"className":2562},[],[2564],{"type":55,"value":2565},"\u003CName>.pbip",{"type":55,"value":2567}," exist. Create any missing piece.",{"type":42,"tag":71,"props":2569,"children":2570},{},[2571,2576,2578,2584,2586,2590,2592],{"type":42,"tag":51,"props":2572,"children":2573},{},[2574],{"type":55,"value":2575},"Export TMDL",{"type":55,"value":2577}," into ",{"type":42,"tag":82,"props":2579,"children":2581},{"className":2580},[],[2582],{"type":55,"value":2583},"\u003CName>.SemanticModel\u002Fdefinition\u002F",{"type":55,"value":2585},", per ",{"type":42,"tag":135,"props":2587,"children":2588},{"href":137},[2589],{"type":55,"value":887},{"type":55,"value":2591},":\n",{"type":42,"tag":67,"props":2593,"children":2594},{},[2595,2605,2628],{"type":42,"tag":71,"props":2596,"children":2597},{},[2598,2603],{"type":42,"tag":51,"props":2599,"children":2600},{},[2601],{"type":55,"value":2602},"Tier 1 (MCP)",{"type":55,"value":2604}," - use the MCP export\u002Fsave operation against the live model.",{"type":42,"tag":71,"props":2606,"children":2607},{},[2608,2613,2615,2620,2622,2626],{"type":42,"tag":51,"props":2609,"children":2610},{},[2611],{"type":55,"value":2612},"Tier 2 (Fabric workspace, no MCP)",{"type":55,"value":2614}," - call ",{"type":42,"tag":82,"props":2616,"children":2618},{"className":2617},[],[2619],{"type":55,"value":1030},{"type":55,"value":2621}," (load ",{"type":42,"tag":135,"props":2623,"children":2624},{"href":677},[2625],{"type":55,"value":680},{"type":55,"value":2627},") and write the returned parts.",{"type":42,"tag":71,"props":2629,"children":2630},{},[2631,2636,2638,2643],{"type":42,"tag":51,"props":2632,"children":2633},{},[2634],{"type":55,"value":2635},"Local TMDL files already on disk",{"type":55,"value":2637}," - copy or move them into the ",{"type":42,"tag":82,"props":2639,"children":2641},{"className":2640},[],[2642],{"type":55,"value":2523},{"type":55,"value":2644}," folder.",{"type":42,"tag":71,"props":2646,"children":2647},{},[2648,2652,2654,2659,2661,2667,2669,2675,2677,2682,2683,2689,2691,2696,2698,2704,2706,2711],{"type":42,"tag":51,"props":2649,"children":2650},{},[2651],{"type":55,"value":1553},{"type":55,"value":2653}," - confirm the ",{"type":42,"tag":82,"props":2655,"children":2657},{"className":2656},[],[2658],{"type":55,"value":2523},{"type":55,"value":2660}," folder contains at minimum ",{"type":42,"tag":82,"props":2662,"children":2664},{"className":2663},[],[2665],{"type":55,"value":2666},"model.tmdl",{"type":55,"value":2668}," and table ",{"type":42,"tag":82,"props":2670,"children":2672},{"className":2671},[],[2673],{"type":55,"value":2674},".tmdl",{"type":55,"value":2676}," files; confirm ",{"type":42,"tag":82,"props":2678,"children":2680},{"className":2679},[],[2681],{"type":55,"value":2445},{"type":55,"value":1447},{"type":42,"tag":82,"props":2684,"children":2686},{"className":2685},[],[2687],{"type":55,"value":2688},"\u003CName>.Report\u002Fdefinition.pbir",{"type":55,"value":2690}," (with correct ",{"type":42,"tag":82,"props":2692,"children":2694},{"className":2693},[],[2695],{"type":55,"value":2557},{"type":55,"value":2697}," to ",{"type":42,"tag":82,"props":2699,"children":2701},{"className":2700},[],[2702],{"type":55,"value":2703},"..\u002F\u003CName>.SemanticModel",{"type":55,"value":2705},"), and ",{"type":42,"tag":82,"props":2707,"children":2709},{"className":2708},[],[2710],{"type":55,"value":2565},{"type":55,"value":2712}," exist and reference each other correctly.",{"type":42,"tag":879,"props":2714,"children":2715},{},[],{"type":42,"tag":159,"props":2717,"children":2719},{"id":2718},"workflow-deploy-to-fabric",[2720],{"type":55,"value":2721},"Workflow: Deploy to Fabric",{"type":42,"tag":47,"props":2723,"children":2724},{},[2725,2729],{"type":42,"tag":51,"props":2726,"children":2727},{},[2728],{"type":55,"value":1286},{"type":55,"value":2730}," User asks to deploy or publish a semantic model to a Fabric workspace.",{"type":42,"tag":43,"props":2732,"children":2733},{},[2734],{"type":42,"tag":47,"props":2735,"children":2736},{},[2737,2747,2749,2754,2756,2761],{"type":42,"tag":51,"props":2738,"children":2739},{},[2740,2742,2746],{"type":55,"value":2741},"Hard rule — this workflow OVERRIDES the default ",{"type":42,"tag":135,"props":2743,"children":2744},{"href":137},[2745],{"type":55,"value":887},{"type":55,"value":939},{"type":55,"value":2748}," Do not default to MCP just because it is available. The deployment path is determined by the ",{"type":42,"tag":51,"props":2750,"children":2751},{},[2752],{"type":55,"value":2753},"source of the model",{"type":55,"value":2755},", not by which tools are connected. If the source is PBIP\u002FTMDL files on disk, you ",{"type":42,"tag":51,"props":2757,"children":2758},{},[2759],{"type":55,"value":2760},"MUST",{"type":55,"value":2762}," use the Fabric REST API even when an MCP session is active.",{"type":42,"tag":47,"props":2764,"children":2765},{},[2766],{"type":55,"value":2767},"Decision tree (pick exactly one — top-down, first match wins):",{"type":42,"tag":116,"props":2769,"children":2770},{},[2771,2833,2850],{"type":42,"tag":71,"props":2772,"children":2773},{},[2774,2779,2781,2786,2788,2793,2794,2800,2802,2807,2809,2813,2815],{"type":42,"tag":51,"props":2775,"children":2776},{},[2777],{"type":55,"value":2778},"Are there PBIP \u002F TMDL files on disk that need to be deployed?",{"type":55,"value":2780},"\n-> ",{"type":42,"tag":51,"props":2782,"children":2783},{},[2784],{"type":55,"value":2785},"YES — use Fabric REST API.",{"type":55,"value":2787}," Call ",{"type":42,"tag":82,"props":2789,"children":2791},{"className":2790},[],[2792],{"type":55,"value":148},{"type":55,"value":1495},{"type":42,"tag":82,"props":2795,"children":2797},{"className":2796},[],[2798],{"type":55,"value":2799},"createItemWithDefinition",{"type":55,"value":2801}," (new model) or ",{"type":42,"tag":82,"props":2803,"children":2805},{"className":2804},[],[2806],{"type":55,"value":1038},{"type":55,"value":2808}," (existing model). Load ",{"type":42,"tag":135,"props":2810,"children":2811},{"href":677},[2812],{"type":55,"value":680},{"type":55,"value":2814},".\n",{"type":42,"tag":67,"props":2816,"children":2817},{},[2818,2823],{"type":42,"tag":71,"props":2819,"children":2820},{},[2821],{"type":55,"value":2822},"Rationale: deploying TMDL files directly via the Fabric API is more reliable, faster, and avoids unnecessarily loading the model into MCP only to push it back out.",{"type":42,"tag":71,"props":2824,"children":2825},{},[2826,2831],{"type":42,"tag":51,"props":2827,"children":2828},{},[2829],{"type":55,"value":2830},"Do NOT",{"type":55,"value":2832}," open the PBIP in MCP first and then deploy via MCP. That is an explicit anti-pattern for this workflow.",{"type":42,"tag":71,"props":2834,"children":2835},{},[2836,2841,2843,2848],{"type":42,"tag":51,"props":2837,"children":2838},{},[2839],{"type":55,"value":2840},"Is the model already loaded in a live MCP session",{"type":55,"value":2842}," (e.g., just built in-memory, or currently being edited via MCP) ",{"type":42,"tag":51,"props":2844,"children":2845},{},[2846],{"type":55,"value":2847},"with no PBIP\u002FTMDL files involved?",{"type":55,"value":2849},"\n-> Use MCP tool to deploy with the target workspace and semantic model name.",{"type":42,"tag":71,"props":2851,"children":2852},{},[2853,2858],{"type":42,"tag":51,"props":2854,"children":2855},{},[2856],{"type":55,"value":2857},"Is the model live in Power BI Desktop with no PBIP saved?",{"type":55,"value":2859},"\n-> Use MCP Deploy if MCP is connected to Desktop. If MCP is not available, instruct the user to save as PBIP first, then restart this workflow at step 1.",{"type":42,"tag":47,"props":2861,"children":2862},{},[2863,2865,2870],{"type":55,"value":2864},"Verify deployment succeeded by listing workspace items of type ",{"type":42,"tag":82,"props":2866,"children":2868},{"className":2867},[],[2869],{"type":55,"value":1131},{"type":55,"value":939},{"type":42,"tag":43,"props":2872,"children":2873},{},[2874],{"type":42,"tag":47,"props":2875,"children":2876},{},[2877,2882,2884,2889,2891,2897,2899,2904,2906,2911],{"type":42,"tag":51,"props":2878,"children":2879},{},[2880],{"type":55,"value":2881},"Deploy exactly once; the deploy is NOT idempotent.",{"type":55,"value":2883}," A retried deploy creates a ",{"type":42,"tag":1071,"props":2885,"children":2886},{},[2887],{"type":55,"value":2888},"second",{"type":55,"value":2890}," model with the same name, after which the deploy fails with ",{"type":42,"tag":82,"props":2892,"children":2894},{"className":2893},[],[2895],{"type":55,"value":2896},"There are multiple datasets named '\u003Cname>'",{"type":55,"value":2898},". If you hit that error, do NOT retry blindly: list the workspace's semantic models, ",{"type":42,"tag":51,"props":2900,"children":2901},{},[2902],{"type":55,"value":2903},"delete every duplicate with that name",{"type":55,"value":2905},", then deploy once from the clean state. If deploying a model that may already exist, delete the existing same-named model(s) ",{"type":42,"tag":1071,"props":2907,"children":2908},{},[2909],{"type":55,"value":2910},"before",{"type":55,"value":2912}," the single deploy.",{"type":42,"tag":879,"props":2914,"children":2915},{},[],{"type":42,"tag":159,"props":2917,"children":2919},{"id":2918},"workflow-refresh-semantic-model",[2920],{"type":55,"value":2921},"Workflow: Refresh Semantic Model",{"type":42,"tag":47,"props":2923,"children":2924},{},[2925,2929],{"type":42,"tag":51,"props":2926,"children":2927},{},[2928],{"type":55,"value":1286},{"type":55,"value":2930}," User asks to refresh data in a semantic model.",{"type":42,"tag":47,"props":2932,"children":2933},{},[2934],{"type":55,"value":2935},"Refresh is only possible when working against a live model in Desktop or Fabric Service. If working with local TMDL files, deploy the model first.",{"type":42,"tag":47,"props":2937,"children":2938},{},[2939,2941,2945],{"type":55,"value":2940},"Trigger a refresh per ",{"type":42,"tag":135,"props":2942,"children":2943},{"href":137},[2944],{"type":55,"value":887},{"type":55,"value":1095},{"type":42,"tag":67,"props":2947,"children":2948},{},[2949,2958],{"type":42,"tag":71,"props":2950,"children":2951},{},[2952,2956],{"type":42,"tag":51,"props":2953,"children":2954},{},[2955],{"type":55,"value":1106},{"type":55,"value":2957},": Tier 1 (MCP) only — use the MCP Refresh operation.",{"type":42,"tag":71,"props":2959,"children":2960},{},[2961,2966,2968,2972],{"type":42,"tag":51,"props":2962,"children":2963},{},[2964],{"type":55,"value":2965},"Fabric Service",{"type":55,"value":2967},": Tier 1 (MCP Refresh operation) or fallback to the Power BI Enhanced Refresh API (load ",{"type":42,"tag":135,"props":2969,"children":2970},{"href":677},[2971],{"type":55,"value":680},{"type":55,"value":1904},{"type":42,"tag":47,"props":2974,"children":2975},{},[2976,2978,2983],{"type":55,"value":2977},"If the refresh fails with a credential error, ",{"type":42,"tag":51,"props":2979,"children":2980},{},[2981],{"type":55,"value":2982},"stop immediately",{"type":55,"value":2984}," and instruct the user to configure the data source connections manually in Power BI Service. Do not attempt to retry or work around credential errors programmatically.",{"type":42,"tag":879,"props":2986,"children":2987},{},[],{"type":42,"tag":159,"props":2989,"children":2991},{"id":2990},"workflow-manage-semantic-model-in-fabric",[2992],{"type":55,"value":2993},"Workflow: Manage Semantic Model in Fabric",{"type":42,"tag":47,"props":2995,"children":2996},{},[2997,3001],{"type":42,"tag":51,"props":2998,"children":2999},{},[3000],{"type":55,"value":1286},{"type":55,"value":3002}," User asks to configure data sources, update parameters, or manage permissions for a semantic model in Fabric Service.",{"type":42,"tag":43,"props":3004,"children":3005},{},[3006],{"type":42,"tag":47,"props":3007,"children":3008},{},[3009,3018,3020,3025],{"type":42,"tag":51,"props":3010,"children":3011},{},[3012,3013,3017],{"type":55,"value":2741},{"type":42,"tag":135,"props":3014,"children":3015},{"href":137},[3016],{"type":55,"value":887},{"type":55,"value":939},{"type":55,"value":3019}," Do not default to MCP (Tier 1) prefer using ",{"type":42,"tag":82,"props":3021,"children":3023},{"className":3022},[],[3024],{"type":55,"value":148},{"type":55,"value":3026}," and REST APIs.",{"type":42,"tag":1079,"props":3028,"children":3030},{"id":3029},"data-sources-parameters",[3031],{"type":55,"value":3032},"Data Sources & Parameters",{"type":42,"tag":47,"props":3034,"children":3035},{},[3036,3038,3043],{"type":55,"value":3037},"Get\u002Fupdate data sources and parameters via Power BI REST API. Load ",{"type":42,"tag":135,"props":3039,"children":3041},{"href":3040},".\u002Freferences\u002Fsemantic-model-rest-api.md#4-data-sources--parameters-power-bi-datasets-api",[3042],{"type":55,"value":680},{"type":55,"value":939},{"type":42,"tag":1079,"props":3045,"children":3047},{"id":3046},"permissions",[3048],{"type":55,"value":3049},"Permissions",{"type":42,"tag":47,"props":3051,"children":3052},{},[3053,3055,3060],{"type":55,"value":3054},"List\u002Fgrant\u002Fupdate dataset user permissions via Power BI REST API. Load ",{"type":42,"tag":135,"props":3056,"children":3058},{"href":3057},".\u002Freferences\u002Fsemantic-model-rest-api.md#5-permissions-power-bi-datasets-api",[3059],{"type":55,"value":680},{"type":55,"value":939},{"type":42,"tag":1079,"props":3062,"children":3064},{"id":3063},"connection-binding",[3065],{"type":55,"value":700},{"type":42,"tag":47,"props":3067,"children":3068},{},[3069,3070,3074,3076,3082,3084,3090],{"type":55,"value":2091},{"type":42,"tag":135,"props":3071,"children":3072},{"href":706},[3073],{"type":55,"value":709},{"type":55,"value":3075}," and follow it. The reference covers prerequisites, the ",{"type":42,"tag":82,"props":3077,"children":3079},{"className":3078},[],[3080],{"type":55,"value":3081},"bindConnection",{"type":55,"value":3083}," endpoint, the discover -> match -> bind -> validate steps, all ",{"type":42,"tag":82,"props":3085,"children":3087},{"className":3086},[],[3088],{"type":55,"value":3089},"connectivityType",{"type":55,"value":3091}," values, the unbind pattern, and troubleshooting.",{"type":42,"tag":47,"props":3093,"children":3094},{},[3095],{"type":55,"value":3096},"Key rules (full details in the reference):",{"type":42,"tag":67,"props":3098,"children":3099},{},[3100,3119,3129,3166],{"type":42,"tag":71,"props":3101,"children":3102},{},[3103,3105,3110,3112,3118],{"type":55,"value":3104},"Use the Fabric ",{"type":42,"tag":51,"props":3106,"children":3107},{},[3108],{"type":55,"value":3109},"Bind Semantic Model Connection",{"type":55,"value":3111}," REST API (supersedes the legacy Power BI ",{"type":42,"tag":82,"props":3113,"children":3115},{"className":3114},[],[3116],{"type":55,"value":3117},"BindToGateway",{"type":55,"value":1904},{"type":42,"tag":71,"props":3120,"children":3121},{},[3122,3127],{"type":42,"tag":51,"props":3123,"children":3124},{},[3125],{"type":55,"value":3126},"One bind request per data source reference",{"type":55,"value":3128}," - the API does not support bulk binding.",{"type":42,"tag":71,"props":3130,"children":3131},{},[3132,3134,3140,3142,3148,3150,3156,3158,3164],{"type":55,"value":3133},"Discover the model's data source references via ",{"type":42,"tag":82,"props":3135,"children":3137},{"className":3136},[],[3138],{"type":55,"value":3139},"List Item Connections",{"type":55,"value":3141},", then match ",{"type":42,"tag":82,"props":3143,"children":3145},{"className":3144},[],[3146],{"type":55,"value":3147},"connectionDetails",{"type":55,"value":3149}," against ",{"type":42,"tag":82,"props":3151,"children":3153},{"className":3152},[],[3154],{"type":55,"value":3155},"List Connections",{"type":55,"value":3157}," to find the target ",{"type":42,"tag":82,"props":3159,"children":3161},{"className":3160},[],[3162],{"type":55,"value":3163},"id",{"type":55,"value":3165},". Create a connection first if no match exists.",{"type":42,"tag":71,"props":3167,"children":3168},{},[3169],{"type":55,"value":3170},"Validate by re-listing item connections and triggering a refresh.",{"type":42,"tag":879,"props":3172,"children":3173},{},[],{"type":42,"tag":159,"props":3175,"children":3177},{"id":3176},"validation-checklist",[3178],{"type":55,"value":1561},{"type":42,"tag":47,"props":3180,"children":3181},{},[3182],{"type":55,"value":3183},"Run after any model creation or modification:",{"type":42,"tag":47,"props":3185,"children":3186},{},[3187],{"type":42,"tag":51,"props":3188,"children":3189},{},[3190],{"type":55,"value":3191},"Always (works with PBIP, Desktop, and Fabric Service):",{"type":42,"tag":116,"props":3193,"children":3194},{},[3195,3210],{"type":42,"tag":71,"props":3196,"children":3197},{},[3198,3203,3205,3209],{"type":42,"tag":51,"props":3199,"children":3200},{},[3201],{"type":55,"value":3202},"Check the PBIP structure",{"type":55,"value":3204}," - if the model is sourced from a PBIP folder, ensure the folder structure and files are correct (see ",{"type":42,"tag":135,"props":3206,"children":3207},{"href":539},[3208],{"type":55,"value":542},{"type":55,"value":1904},{"type":42,"tag":71,"props":3211,"children":3212},{},[3213,3218,3220,3224,3226,3230],{"type":42,"tag":51,"props":3214,"children":3215},{},[3216],{"type":55,"value":3217},"Verify against modeling guidelines",{"type":55,"value":3219}," - re-check every change against ",{"type":42,"tag":135,"props":3221,"children":3222},{"href":451},[3223],{"type":55,"value":454},{"type":55,"value":3225}," (and ",{"type":42,"tag":135,"props":3227,"children":3228},{"href":495},[3229],{"type":55,"value":498},{"type":55,"value":3231}," for Direct Lake models).",{"type":42,"tag":47,"props":3233,"children":3234},{},[3235],{"type":42,"tag":51,"props":3236,"children":3237},{},[3238],{"type":55,"value":3239},"Only when connected to an Analysis Services database (Power BI Desktop or Fabric Service):",{"type":42,"tag":116,"props":3241,"children":3243},{"start":3242},3,[3244,3262],{"type":42,"tag":71,"props":3245,"children":3246},{},[3247,3252,3254,3260],{"type":42,"tag":51,"props":3248,"children":3249},{},[3250],{"type":55,"value":3251},"Test new measures",{"type":55,"value":3253}," - for each new measure, run a simple DAX query to validate it returns expected results (e.g., ",{"type":42,"tag":82,"props":3255,"children":3257},{"className":3256},[],[3258],{"type":55,"value":3259},"EVALUATE { [Measure Name] }",{"type":55,"value":3261},"). Skip this step when working with local TMDL\u002FPBIP files only.",{"type":42,"tag":71,"props":3263,"children":3264},{},[3265,3270,3272,3277],{"type":42,"tag":51,"props":3266,"children":3267},{},[3268],{"type":55,"value":3269},"Test table refresh",{"type":55,"value":3271}," - when new tables were created, trigger a refresh to verify that partitions, data source expressions, and column mappings are correct. A failed refresh typically indicates mismatched ",{"type":42,"tag":82,"props":3273,"children":3275},{"className":3274},[],[3276],{"type":55,"value":1468},{"type":55,"value":3278}," names, invalid M expressions, or incorrect Direct Lake entity references. Skip this step when working with local TMDL\u002FPBIP files only.",{"type":42,"tag":47,"props":3280,"children":3281},{},[3282],{"type":55,"value":3283},"If any check fails, fix the issue and re-run validation.",{"type":42,"tag":879,"props":3285,"children":3286},{},[],{"type":42,"tag":159,"props":3288,"children":3290},{"id":3289},"mustpreferavoid",[3291],{"type":55,"value":3292},"Must\u002FPrefer\u002FAvoid",{"type":42,"tag":1079,"props":3294,"children":3296},{"id":3295},"must",[3297],{"type":55,"value":2760},{"type":42,"tag":67,"props":3299,"children":3300},{},[3301,3311,3327],{"type":42,"tag":71,"props":3302,"children":3303},{},[3304,3309],{"type":42,"tag":51,"props":3305,"children":3306},{},[3307],{"type":55,"value":3308},"Understand the data source schema before starting",{"type":55,"value":3310}," - analyze source tables, columns, and data types before designing or modifying the model.",{"type":42,"tag":71,"props":3312,"children":3313},{},[3314,3319,3321,3325],{"type":42,"tag":51,"props":3315,"children":3316},{},[3317],{"type":55,"value":3318},"Follow modeling guidelines",{"type":55,"value":3320}," - load ",{"type":42,"tag":135,"props":3322,"children":3323},{"href":451},[3324],{"type":55,"value":454},{"type":55,"value":3326}," before creating or editing any model; apply star schema design, naming conventions, and column\u002Fmeasure rules",{"type":42,"tag":71,"props":3328,"children":3329},{},[3330,3339],{"type":42,"tag":51,"props":3331,"children":3332},{},[3333,3335],{"type":55,"value":3334},"Follow ",{"type":42,"tag":135,"props":3336,"children":3337},{"href":137},[3338],{"type":55,"value":887},{"type":55,"value":3340}," - always pick the highest-priority tool tier available for the current environment; do not mix tiers when a higher-priority option works",{"type":42,"tag":1079,"props":3342,"children":3344},{"id":3343},"prefer",[3345],{"type":55,"value":3346},"PREFER",{"type":42,"tag":67,"props":3348,"children":3349},{},[3350,3360,3370,3380],{"type":42,"tag":71,"props":3351,"children":3352},{},[3353,3358],{"type":42,"tag":51,"props":3354,"children":3355},{},[3356],{"type":55,"value":3357},"Star schema over snowflake or flat tables",{"type":55,"value":3359}," - denormalized dimensions with single-column relationship keys",{"type":42,"tag":71,"props":3361,"children":3362},{},[3363,3368],{"type":42,"tag":51,"props":3364,"children":3365},{},[3366],{"type":55,"value":3367},"Consistency with existing model patterns",{"type":55,"value":3369}," - when editing an existing model, match its naming conventions and structure rather than imposing new ones",{"type":42,"tag":71,"props":3371,"children":3372},{},[3373,3378],{"type":42,"tag":51,"props":3374,"children":3375},{},[3376],{"type":55,"value":3377},"TMDL format over TMSL",{"type":55,"value":3379}," - text-based, diff-friendly, preferred for Fabric",{"type":42,"tag":71,"props":3381,"children":3382},{},[3383,3388,3390,3394],{"type":42,"tag":51,"props":3384,"children":3385},{},[3386],{"type":55,"value":3387},"Validate after changes",{"type":55,"value":3389}," - use ",{"type":42,"tag":135,"props":3391,"children":3392},{"href":228},[3393],{"type":55,"value":596},{"type":55,"value":3395}," to confirm objects landed.",{"type":42,"tag":1079,"props":3397,"children":3399},{"id":3398},"avoid",[3400],{"type":55,"value":3401},"AVOID",{"type":42,"tag":67,"props":3403,"children":3404},{},[3405,3415,3450],{"type":42,"tag":71,"props":3406,"children":3407},{},[3408,3413],{"type":42,"tag":51,"props":3409,"children":3410},{},[3411],{"type":55,"value":3412},"Hardcoded workspace\u002Fitem IDs",{"type":55,"value":3414}," - resolve dynamically via API",{"type":42,"tag":71,"props":3416,"children":3417},{},[3418,3423,3424,3429,3431,3436,3438,3443,3445,3449],{"type":42,"tag":51,"props":3419,"children":3420},{},[3421],{"type":55,"value":3422},"Reading TMDL files when MCP is connected",{"type":55,"value":1378},{"type":42,"tag":82,"props":3425,"children":3427},{"className":3426},[],[3428],{"type":55,"value":971},{"type":55,"value":3430},"\u002F",{"type":42,"tag":82,"props":3432,"children":3434},{"className":3433},[],[3435],{"type":55,"value":979},{"type":55,"value":3437}," on ",{"type":42,"tag":82,"props":3439,"children":3441},{"className":3440},[],[3442],{"type":55,"value":987},{"type":55,"value":3444}," while a Tier 1 MCP session is live is an anti-pattern (see ",{"type":42,"tag":135,"props":3446,"children":3447},{"href":137},[3448],{"type":55,"value":887},{"type":55,"value":1904},{"type":42,"tag":71,"props":3451,"children":3452},{},[3453,3458,3460,3466,3467,3473,3475,3480,3481,3487,3488,3494,3496,3502],{"type":42,"tag":51,"props":3454,"children":3455},{},[3456],{"type":55,"value":3457},"Hand-authoring TMDL files when MCP is registered",{"type":55,"value":3459}," - using ",{"type":42,"tag":82,"props":3461,"children":3463},{"className":3462},[],[3464],{"type":55,"value":3465},"create",{"type":55,"value":3430},{"type":42,"tag":82,"props":3468,"children":3470},{"className":3469},[],[3471],{"type":55,"value":3472},"edit",{"type":55,"value":3474},"\u002Ffile-write tools to scaffold ",{"type":42,"tag":82,"props":3476,"children":3478},{"className":3477},[],[3479],{"type":55,"value":2666},{"type":55,"value":1447},{"type":42,"tag":82,"props":3482,"children":3484},{"className":3483},[],[3485],{"type":55,"value":3486},"database.tmdl",{"type":55,"value":1447},{"type":42,"tag":82,"props":3489,"children":3491},{"className":3490},[],[3492],{"type":55,"value":3493},"relationships.tmdl",{"type":55,"value":3495},", or ",{"type":42,"tag":82,"props":3497,"children":3499},{"className":3498},[],[3500],{"type":55,"value":3501},"tables\u002F*.tmdl",{"type":55,"value":3503}," is a Tier 1 anti-pattern, including for brand-new models. Build and export via MCP tools.",{"type":42,"tag":1079,"props":3505,"children":3507},{"id":3506},"deny",[3508],{"type":55,"value":3509},"DENY",{"type":42,"tag":67,"props":3511,"children":3512},{},[3513],{"type":42,"tag":71,"props":3514,"children":3515},{},[3516,3521,3523,3528],{"type":42,"tag":51,"props":3517,"children":3518},{},[3519],{"type":55,"value":3520},"Manage RLS\u002FOLS role membership",{"type":55,"value":3522}," - do not propose REST calls, ",{"type":42,"tag":82,"props":3524,"children":3526},{"className":3525},[],[3527],{"type":55,"value":148},{"type":55,"value":3529}," URLs, MCP operations, or TMDL changes to add\u002Fremove users or groups from a security role. Refuse the request as out-of-scope here and redirect the user to the Power BI portal.",{"type":42,"tag":879,"props":3531,"children":3532},{},[],{"type":42,"tag":159,"props":3534,"children":3536},{"id":3535},"examples",[3537],{"type":55,"value":864},{"type":42,"tag":43,"props":3539,"children":3540},{},[3541],{"type":42,"tag":47,"props":3542,"children":3543},{},[3544,3549,3551,3556,3558,3563,3565,3569,3571,3576,3578,3583,3584,3589],{"type":42,"tag":51,"props":3545,"children":3546},{},[3547],{"type":55,"value":3548},"Scope note",{"type":55,"value":3550}," — examples use ",{"type":42,"tag":82,"props":3552,"children":3554},{"className":3553},[],[3555],{"type":55,"value":148},{"type":55,"value":3557}," for discovery to resolve ID's and discover Fabric metadata (see ",{"type":42,"tag":135,"props":3559,"children":3560},{"href":728},[3561],{"type":55,"value":3562},"COMMON-CLI.md § Finding Workspaces and Items",{"type":55,"value":3564},"). Authoring of the semantic model definition is routed through ",{"type":42,"tag":135,"props":3566,"children":3567},{"href":137},[3568],{"type":55,"value":887},{"type":55,"value":3570},": Tier 1 MCP ",{"type":42,"tag":82,"props":3572,"children":3574},{"className":3573},[],[3575],{"type":55,"value":909},{"type":55,"value":3577}," when available, Tier 2 TMDL editing via ",{"type":42,"tag":82,"props":3579,"children":3581},{"className":3580},[],[3582],{"type":55,"value":1030},{"type":55,"value":1688},{"type":42,"tag":82,"props":3585,"children":3587},{"className":3586},[],[3588],{"type":55,"value":1038},{"type":55,"value":3590}," otherwise.",{"type":42,"tag":1079,"props":3592,"children":3594},{"id":3593},"example-1-modify-an-existing-semantic-model",[3595],{"type":55,"value":3596},"Example 1: Modify an Existing Semantic Model",{"type":42,"tag":47,"props":3598,"children":3599},{},[3600,3605,3607,3612,3614,3619],{"type":42,"tag":51,"props":3601,"children":3602},{},[3603],{"type":55,"value":3604},"Prompt",{"type":55,"value":3606},": \"Create base measures for all aggregable columns in the semantic model ",{"type":42,"tag":51,"props":3608,"children":3609},{},[3610],{"type":55,"value":3611},"Sales",{"type":55,"value":3613}," in workspace ",{"type":42,"tag":51,"props":3615,"children":3616},{},[3617],{"type":55,"value":3618},"Marketing",{"type":55,"value":3620},".\"",{"type":42,"tag":47,"props":3622,"children":3623},{},[3624,3629,3631,3635],{"type":42,"tag":51,"props":3625,"children":3626},{},[3627],{"type":55,"value":3628},"Agent response",{"type":55,"value":3630}," - follows ",{"type":42,"tag":135,"props":3632,"children":3633},{"href":245},[3634],{"type":55,"value":1913},{"type":55,"value":939},{"type":42,"tag":116,"props":3637,"children":3638},{},[3639,3654,3689,3745,3809],{"type":42,"tag":71,"props":3640,"children":3641},{},[3642,3647,3648,3653],{"type":42,"tag":51,"props":3643,"children":3644},{},[3645],{"type":55,"value":3646},"Discover IDs",{"type":55,"value":2241},{"type":42,"tag":82,"props":3649,"children":3651},{"className":3650},[],[3652],{"type":55,"value":148},{"type":55,"value":939},{"type":42,"tag":71,"props":3655,"children":3656},{},[3657,3662,3664,3668,3669,3673,3675,3680,3682,3687],{"type":42,"tag":51,"props":3658,"children":3659},{},[3660],{"type":55,"value":3661},"Connect to the model",{"type":55,"value":3663}," per ",{"type":42,"tag":135,"props":3665,"children":3666},{"href":1942},[3667],{"type":55,"value":1084},{"type":55,"value":1005},{"type":42,"tag":135,"props":3670,"children":3671},{"href":137},[3672],{"type":55,"value":887},{"type":55,"value":3674},". With ",{"type":42,"tag":82,"props":3676,"children":3678},{"className":3677},[],[3679],{"type":55,"value":909},{"type":55,"value":3681}," registered, connect MCP directly to the Fabric workspace model (Tier 1). Otherwise fall back to Tier 2 (",{"type":42,"tag":82,"props":3683,"children":3685},{"className":3684},[],[3686],{"type":55,"value":1030},{"type":55,"value":3688}," -> edit TMDL locally).",{"type":42,"tag":71,"props":3690,"children":3691},{},[3692,3697,3699,3705,3706,3712,3713,3719,3720,3726,3728,3732,3733,3737,3739,3743],{"type":42,"tag":51,"props":3693,"children":3694},{},[3695],{"type":55,"value":3696},"Inspect & plan",{"type":55,"value":3698}," - list tables and columns via the active tool tier; identify aggregable columns (numeric, not foreign keys, not hidden surrogate IDs) and decide on ",{"type":42,"tag":82,"props":3700,"children":3702},{"className":3701},[],[3703],{"type":55,"value":3704},"SUM",{"type":55,"value":1688},{"type":42,"tag":82,"props":3707,"children":3709},{"className":3708},[],[3710],{"type":55,"value":3711},"AVERAGE",{"type":55,"value":1688},{"type":42,"tag":82,"props":3714,"children":3716},{"className":3715},[],[3717],{"type":55,"value":3718},"MIN",{"type":55,"value":1688},{"type":42,"tag":82,"props":3721,"children":3723},{"className":3722},[],[3724],{"type":55,"value":3725},"MAX",{"type":55,"value":3727}," per column following ",{"type":42,"tag":135,"props":3729,"children":3730},{"href":451},[3731],{"type":55,"value":454},{"type":55,"value":1005},{"type":42,"tag":135,"props":3734,"children":3735},{"href":473},[3736],{"type":55,"value":476},{"type":55,"value":3738},". Load ",{"type":42,"tag":135,"props":3740,"children":3741},{"href":561},[3742],{"type":55,"value":564},{"type":55,"value":3744}," before writing DAX.",{"type":42,"tag":71,"props":3746,"children":3747},{},[3748,3753,3754,3758,3759],{"type":42,"tag":51,"props":3749,"children":3750},{},[3751],{"type":55,"value":3752},"Add measures",{"type":55,"value":3663},{"type":42,"tag":135,"props":3755,"children":3756},{"href":245},[3757],{"type":55,"value":1913},{"type":55,"value":2814},{"type":42,"tag":67,"props":3760,"children":3761},{},[3762,3785],{"type":42,"tag":71,"props":3763,"children":3764},{},[3765,3769,3771,3777,3778,3783],{"type":42,"tag":51,"props":3766,"children":3767},{},[3768],{"type":55,"value":2602},{"type":55,"value":3770},": call tool create for each new measure with ",{"type":42,"tag":82,"props":3772,"children":3774},{"className":3773},[],[3775],{"type":55,"value":3776},"expression",{"type":55,"value":1447},{"type":42,"tag":82,"props":3779,"children":3781},{"className":3780},[],[3782],{"type":55,"value":2212},{"type":55,"value":3784},", and target table. Do not hand-author TMDL.",{"type":42,"tag":71,"props":3786,"children":3787},{},[3788,3793,3795,3800,3802,3807],{"type":42,"tag":51,"props":3789,"children":3790},{},[3791],{"type":55,"value":3792},"Tier 2 (no MCP)",{"type":55,"value":3794},": edit the table's ",{"type":42,"tag":82,"props":3796,"children":3798},{"className":3797},[],[3799],{"type":55,"value":2674},{"type":55,"value":3801}," file directly and round-trip via ",{"type":42,"tag":82,"props":3803,"children":3805},{"className":3804},[],[3806],{"type":55,"value":1038},{"type":55,"value":3808}," REST API.",{"type":42,"tag":71,"props":3810,"children":3811},{},[3812,3816,3817,3821],{"type":42,"tag":51,"props":3813,"children":3814},{},[3815],{"type":55,"value":2044},{"type":55,"value":3663},{"type":42,"tag":135,"props":3818,"children":3819},{"href":1541},[3820],{"type":55,"value":1170},{"type":55,"value":939},{"type":42,"tag":879,"props":3823,"children":3824},{},[],{"type":42,"tag":1079,"props":3826,"children":3828},{"id":3827},"example-2-create-a-new-semantic-model-from-a-fabric-lakehouse",[3829],{"type":55,"value":3830},"Example 2: Create a New Semantic Model from a Fabric Lakehouse",{"type":42,"tag":47,"props":3832,"children":3833},{},[3834,3838,3840,3844,3846,3851],{"type":42,"tag":51,"props":3835,"children":3836},{},[3837],{"type":55,"value":3604},{"type":55,"value":3839},": \"Create a new Power BI semantic model in workspace ",{"type":42,"tag":51,"props":3841,"children":3842},{},[3843],{"type":55,"value":3618},{"type":55,"value":3845},", using the ",{"type":42,"tag":51,"props":3847,"children":3848},{},[3849],{"type":55,"value":3850},"SalesLakehouse",{"type":55,"value":3852}," in the same workspace as the data source.\"",{"type":42,"tag":47,"props":3854,"children":3855},{},[3856,3860,3861,3865],{"type":42,"tag":51,"props":3857,"children":3858},{},[3859],{"type":55,"value":3628},{"type":55,"value":3630},{"type":42,"tag":135,"props":3862,"children":3863},{"href":211},[3864],{"type":55,"value":1278},{"type":55,"value":939},{"type":42,"tag":116,"props":3867,"children":3868},{},[3869,3884,3894,3916,3980,3994],{"type":42,"tag":71,"props":3870,"children":3871},{},[3872,3877,3878,3883],{"type":42,"tag":51,"props":3873,"children":3874},{},[3875],{"type":55,"value":3876},"Discover workspace + lakehouse IDs",{"type":55,"value":2241},{"type":42,"tag":82,"props":3879,"children":3881},{"className":3880},[],[3882],{"type":55,"value":148},{"type":55,"value":939},{"type":42,"tag":71,"props":3885,"children":3886},{},[3887,3892],{"type":42,"tag":51,"props":3888,"children":3889},{},[3890],{"type":55,"value":3891},"Discover lakehouse schema",{"type":55,"value":3893}," - list tables and columns via the Lakehouse OneLake APIs or the SQL Endpoint of the lakehouse. Capture table names, column names, and data types - these drive semantic model table, column definitions and partition metadata.",{"type":42,"tag":71,"props":3895,"children":3896},{},[3897,3902,3903,3907,3909,3914],{"type":42,"tag":51,"props":3898,"children":3899},{},[3900],{"type":55,"value":3901},"Select tool tier",{"type":55,"value":3663},{"type":42,"tag":135,"props":3904,"children":3905},{"href":137},[3906],{"type":55,"value":887},{"type":55,"value":3908},": prefer Tier 1 (",{"type":42,"tag":82,"props":3910,"children":3912},{"className":3911},[],[3913],{"type":55,"value":909},{"type":55,"value":3915},") for the full build. Tier 2 (PBIP\u002FTMDL scaffolding then deploy) only if MCP is not registered.",{"type":42,"tag":71,"props":3917,"children":3918},{},[3919,3924,3926,3930,3932,3936,3937,3941,3942,3946,3948],{"type":42,"tag":51,"props":3920,"children":3921},{},[3922],{"type":55,"value":3923},"Build the model",{"type":55,"value":3925}," following ",{"type":42,"tag":135,"props":3927,"children":3928},{"href":211},[3929],{"type":55,"value":1278},{"type":55,"value":3931}," - data source is OneLake so the storage mode is ",{"type":42,"tag":51,"props":3933,"children":3934},{},[3935],{"type":55,"value":1334},{"type":55,"value":2621},{"type":42,"tag":135,"props":3938,"children":3939},{"href":495},[3940],{"type":55,"value":498},{"type":55,"value":1005},{"type":42,"tag":135,"props":3943,"children":3944},{"href":451},[3945],{"type":55,"value":454},{"type":55,"value":3947},"). Design a star schema from the lakehouse tables, then:\n",{"type":42,"tag":67,"props":3949,"children":3950},{},[3951,3956,3961],{"type":42,"tag":71,"props":3952,"children":3953},{},[3954],{"type":55,"value":3955},"Create the empty database.",{"type":42,"tag":71,"props":3957,"children":3958},{},[3959],{"type":55,"value":3960},"Create one shared named expression for the lakehouse connection.",{"type":42,"tag":71,"props":3962,"children":3963},{},[3964,3966,3971,3973,3978],{"type":55,"value":3965},"For each table: add ",{"type":42,"tag":82,"props":3967,"children":3969},{"className":3968},[],[3970],{"type":55,"value":1493},{"type":55,"value":3972}," (mode ",{"type":42,"tag":82,"props":3974,"children":3976},{"className":3975},[],[3977],{"type":55,"value":1501},{"type":55,"value":3979},") -> columns mapped to lakehouse columns -> relationships -> measures.",{"type":42,"tag":71,"props":3981,"children":3982},{},[3983,3988,3989,3993],{"type":42,"tag":51,"props":3984,"children":3985},{},[3986],{"type":55,"value":3987},"Deploy",{"type":55,"value":3663},{"type":42,"tag":135,"props":3990,"children":3991},{"href":328},[3992],{"type":55,"value":2721},{"type":55,"value":1095},{"type":42,"tag":71,"props":3995,"children":3996},{},[3997,4001,4003,4007],{"type":42,"tag":51,"props":3998,"children":3999},{},[4000],{"type":55,"value":1553},{"type":55,"value":4002}," per the ",{"type":42,"tag":135,"props":4004,"children":4005},{"href":1558},[4006],{"type":55,"value":1561},{"type":55,"value":4008}," - confirm the model appears in the workspace and trigger an initial refresh to verify Direct Lake column mappings resolve.",{"type":42,"tag":879,"props":4010,"children":4011},{},[],{"type":42,"tag":1079,"props":4013,"children":4015},{"id":4014},"example-3-bind-a-semantic-model-to-a-fabric-connection",[4016],{"type":55,"value":4017},"Example 3: Bind a Semantic Model to a Fabric Connection",{"type":42,"tag":47,"props":4019,"children":4020},{},[4021,4025,4027,4031,4032,4036,4038,4043],{"type":42,"tag":51,"props":4022,"children":4023},{},[4024],{"type":55,"value":3604},{"type":55,"value":4026},": \"Bind semantic model ",{"type":42,"tag":51,"props":4028,"children":4029},{},[4030],{"type":55,"value":3611},{"type":55,"value":3613},{"type":42,"tag":51,"props":4033,"children":4034},{},[4035],{"type":55,"value":3618},{"type":55,"value":4037}," to the ",{"type":42,"tag":51,"props":4039,"children":4040},{},[4041],{"type":55,"value":4042},"sql-prod",{"type":55,"value":4044}," connection.\"",{"type":42,"tag":47,"props":4046,"children":4047},{},[4048,4052,4053,4059,4061,4066,4068,4072],{"type":42,"tag":51,"props":4049,"children":4050},{},[4051],{"type":55,"value":3628},{"type":55,"value":3630},{"type":42,"tag":135,"props":4054,"children":4056},{"href":4055},"#connection-binding",[4057],{"type":55,"value":4058},"Workflow: Manage Semantic Model in Fabric § Connection Binding",{"type":55,"value":4060},". ",{"type":42,"tag":51,"props":4062,"children":4063},{},[4064],{"type":55,"value":4065},"No MCP",{"type":55,"value":4067}," - this workflow overrides ",{"type":42,"tag":135,"props":4069,"children":4070},{"href":137},[4071],{"type":55,"value":887},{"type":55,"value":4073}," and is REST-only.",{"type":42,"tag":116,"props":4075,"children":4076},{},[4077,4092,4294,4362],{"type":42,"tag":71,"props":4078,"children":4079},{},[4080,4085,4086,4091],{"type":42,"tag":51,"props":4081,"children":4082},{},[4083],{"type":55,"value":4084},"Discover workspace + model IDs",{"type":55,"value":2241},{"type":42,"tag":82,"props":4087,"children":4089},{"className":4088},[],[4090],{"type":55,"value":148},{"type":55,"value":939},{"type":42,"tag":71,"props":4093,"children":4094},{},[4095,4100,4102,4277,4280,4282,4287,4289,4293],{"type":42,"tag":51,"props":4096,"children":4097},{},[4098],{"type":55,"value":4099},"Discover the target connection",{"type":55,"value":4101}," in Fabric by matching the server name:",{"type":42,"tag":4103,"props":4104,"children":4109},"pre",{"className":4105,"code":4106,"language":4107,"meta":4108,"style":4108},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","SERVER=\"sql-prod\"\nCONN_ID=$(az rest --method get --resource \"https:\u002F\u002Fapi.fabric.microsoft.com\" \\\n  --url \"https:\u002F\u002Fapi.fabric.microsoft.com\u002Fv1\u002Fconnections\" \\\n  --query \"value[?connectionDetails.path | contains(@, '$SERVER')] | [0].id\" -o tsv)\n","bash","",[4110],{"type":42,"tag":82,"props":4111,"children":4112},{"__ignoreMap":4108},[4113,4146,4205,4230],{"type":42,"tag":4114,"props":4115,"children":4118},"span",{"class":4116,"line":4117},"line",1,[4119,4125,4131,4136,4141],{"type":42,"tag":4114,"props":4120,"children":4122},{"style":4121},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[4123],{"type":55,"value":4124},"SERVER",{"type":42,"tag":4114,"props":4126,"children":4128},{"style":4127},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[4129],{"type":55,"value":4130},"=",{"type":42,"tag":4114,"props":4132,"children":4133},{"style":4127},[4134],{"type":55,"value":4135},"\"",{"type":42,"tag":4114,"props":4137,"children":4139},{"style":4138},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[4140],{"type":55,"value":4042},{"type":42,"tag":4114,"props":4142,"children":4143},{"style":4127},[4144],{"type":55,"value":4145},"\"\n",{"type":42,"tag":4114,"props":4147,"children":4149},{"class":4116,"line":4148},2,[4150,4155,4160,4166,4171,4176,4181,4186,4191,4196,4200],{"type":42,"tag":4114,"props":4151,"children":4152},{"style":4121},[4153],{"type":55,"value":4154},"CONN_ID",{"type":42,"tag":4114,"props":4156,"children":4157},{"style":4127},[4158],{"type":55,"value":4159},"=$(",{"type":42,"tag":4114,"props":4161,"children":4163},{"style":4162},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[4164],{"type":55,"value":4165},"az",{"type":42,"tag":4114,"props":4167,"children":4168},{"style":4138},[4169],{"type":55,"value":4170}," rest",{"type":42,"tag":4114,"props":4172,"children":4173},{"style":4138},[4174],{"type":55,"value":4175}," --method",{"type":42,"tag":4114,"props":4177,"children":4178},{"style":4138},[4179],{"type":55,"value":4180}," get",{"type":42,"tag":4114,"props":4182,"children":4183},{"style":4138},[4184],{"type":55,"value":4185}," --resource",{"type":42,"tag":4114,"props":4187,"children":4188},{"style":4127},[4189],{"type":55,"value":4190}," \"",{"type":42,"tag":4114,"props":4192,"children":4193},{"style":4138},[4194],{"type":55,"value":4195},"https:\u002F\u002Fapi.fabric.microsoft.com",{"type":42,"tag":4114,"props":4197,"children":4198},{"style":4127},[4199],{"type":55,"value":4135},{"type":42,"tag":4114,"props":4201,"children":4202},{"style":4121},[4203],{"type":55,"value":4204}," \\\n",{"type":42,"tag":4114,"props":4206,"children":4207},{"class":4116,"line":3242},[4208,4213,4217,4222,4226],{"type":42,"tag":4114,"props":4209,"children":4210},{"style":4138},[4211],{"type":55,"value":4212},"  --url",{"type":42,"tag":4114,"props":4214,"children":4215},{"style":4127},[4216],{"type":55,"value":4190},{"type":42,"tag":4114,"props":4218,"children":4219},{"style":4138},[4220],{"type":55,"value":4221},"https:\u002F\u002Fapi.fabric.microsoft.com\u002Fv1\u002Fconnections",{"type":42,"tag":4114,"props":4223,"children":4224},{"style":4127},[4225],{"type":55,"value":4135},{"type":42,"tag":4114,"props":4227,"children":4228},{"style":4121},[4229],{"type":55,"value":4204},{"type":42,"tag":4114,"props":4231,"children":4233},{"class":4116,"line":4232},4,[4234,4239,4243,4248,4253,4258,4262,4267,4272],{"type":42,"tag":4114,"props":4235,"children":4236},{"style":4138},[4237],{"type":55,"value":4238},"  --query",{"type":42,"tag":4114,"props":4240,"children":4241},{"style":4127},[4242],{"type":55,"value":4190},{"type":42,"tag":4114,"props":4244,"children":4245},{"style":4138},[4246],{"type":55,"value":4247},"value[?connectionDetails.path | contains(@, '",{"type":42,"tag":4114,"props":4249,"children":4250},{"style":4121},[4251],{"type":55,"value":4252},"$SERVER",{"type":42,"tag":4114,"props":4254,"children":4255},{"style":4138},[4256],{"type":55,"value":4257},"')] | [0].id",{"type":42,"tag":4114,"props":4259,"children":4260},{"style":4127},[4261],{"type":55,"value":4135},{"type":42,"tag":4114,"props":4263,"children":4264},{"style":4138},[4265],{"type":55,"value":4266}," -o",{"type":42,"tag":4114,"props":4268,"children":4269},{"style":4138},[4270],{"type":55,"value":4271}," tsv",{"type":42,"tag":4114,"props":4273,"children":4274},{"style":4127},[4275],{"type":55,"value":4276},")\n",{"type":42,"tag":915,"props":4278,"children":4279},{},[],{"type":55,"value":4281},"If no connection matches, ",{"type":42,"tag":51,"props":4283,"children":4284},{},[4285],{"type":55,"value":4286},"stop",{"type":55,"value":4288}," and instruct the user to create one first per ",{"type":42,"tag":135,"props":4290,"children":4291},{"href":706},[4292],{"type":55,"value":709},{"type":55,"value":939},{"type":42,"tag":71,"props":4295,"children":4296},{},[4297,4302,4303,4307,4308,4312,4314],{"type":42,"tag":51,"props":4298,"children":4299},{},[4300],{"type":55,"value":4301},"Execute the bind",{"type":55,"value":3663},{"type":42,"tag":135,"props":4304,"children":4305},{"href":4055},[4306],{"type":55,"value":4058},{"type":55,"value":3320},{"type":42,"tag":135,"props":4309,"children":4310},{"href":706},[4311],{"type":55,"value":709},{"type":55,"value":4313}," and follow the discover -> match -> bind -> validate flow:",{"type":42,"tag":67,"props":4315,"children":4316},{},[4317,4328],{"type":42,"tag":71,"props":4318,"children":4319},{},[4320,4322,4327],{"type":55,"value":4321},"List the model's data source references (",{"type":42,"tag":82,"props":4323,"children":4325},{"className":4324},[],[4326],{"type":55,"value":3139},{"type":55,"value":1904},{"type":42,"tag":71,"props":4329,"children":4330},{},[4331,4333,4338,4340,4346,4348,4353,4355,4360],{"type":55,"value":4332},"For each reference whose ",{"type":42,"tag":82,"props":4334,"children":4336},{"className":4335},[],[4337],{"type":55,"value":3147},{"type":55,"value":4339}," matches ",{"type":42,"tag":82,"props":4341,"children":4343},{"className":4342},[],[4344],{"type":55,"value":4345},"$CONN_ID",{"type":55,"value":4347},", call the Fabric ",{"type":42,"tag":82,"props":4349,"children":4351},{"className":4350},[],[4352],{"type":55,"value":3081},{"type":55,"value":4354}," endpoint ",{"type":42,"tag":51,"props":4356,"children":4357},{},[4358],{"type":55,"value":4359},"one request per data source reference",{"type":55,"value":4361}," (no bulk binding).",{"type":42,"tag":71,"props":4363,"children":4364},{},[4365,4369,4371,4375],{"type":42,"tag":51,"props":4366,"children":4367},{},[4368],{"type":55,"value":1553},{"type":55,"value":4370}," - re-list item connections to confirm the binding, prompt the user to trigger a refresh per ",{"type":42,"tag":135,"props":4372,"children":4373},{"href":345},[4374],{"type":55,"value":2921},{"type":55,"value":4376},". Credential errors -> stop and direct the user to the Service portal (per TROUBLESHOOTING).",{"type":42,"tag":879,"props":4378,"children":4379},{},[],{"type":42,"tag":159,"props":4381,"children":4383},{"id":4382},"troubleshooting",[4384],{"type":55,"value":4385},"TROUBLESHOOTING",{"type":42,"tag":171,"props":4387,"children":4388},{},[4389,4405],{"type":42,"tag":175,"props":4390,"children":4391},{},[4392],{"type":42,"tag":179,"props":4393,"children":4394},{},[4395,4400],{"type":42,"tag":183,"props":4396,"children":4397},{},[4398],{"type":55,"value":4399},"Symptom",{"type":42,"tag":183,"props":4401,"children":4402},{},[4403],{"type":55,"value":4404},"Fix",{"type":42,"tag":194,"props":4406,"children":4407},{},[4408,4421,4439,4463,4494,4513,4526,4539,4552,4565],{"type":42,"tag":179,"props":4409,"children":4410},{},[4411,4416],{"type":42,"tag":201,"props":4412,"children":4413},{},[4414],{"type":55,"value":4415},"MCP connection failure",{"type":42,"tag":201,"props":4417,"children":4418},{},[4419],{"type":55,"value":4420},"Fall back to TMDL editing (see Tool Selection Priority). Inform the user about the fallback.",{"type":42,"tag":179,"props":4422,"children":4423},{},[4424,4429],{"type":42,"tag":201,"props":4425,"children":4426},{},[4427],{"type":55,"value":4428},"TMDL validation errors",{"type":42,"tag":201,"props":4430,"children":4431},{},[4432,4434,4438],{"type":55,"value":4433},"Read error details, fix syntax, re-validate. Load ",{"type":42,"tag":135,"props":4435,"children":4436},{"href":517},[4437],{"type":55,"value":520},{"type":55,"value":939},{"type":42,"tag":179,"props":4440,"children":4441},{},[4442,4458],{"type":42,"tag":201,"props":4443,"children":4444},{},[4445,4451,4452],{"type":42,"tag":82,"props":4446,"children":4448},{"className":4447},[],[4449],{"type":55,"value":4450},"403 Forbidden",{"type":55,"value":1688},{"type":42,"tag":82,"props":4453,"children":4455},{"className":4454},[],[4456],{"type":55,"value":4457},"identity None",{"type":42,"tag":201,"props":4459,"children":4460},{},[4461],{"type":55,"value":4462},"User needs Contributor+ role - stop immediately. Do not retry.",{"type":42,"tag":179,"props":4464,"children":4465},{},[4466,4475],{"type":42,"tag":201,"props":4467,"children":4468},{},[4469],{"type":42,"tag":82,"props":4470,"children":4472},{"className":4471},[],[4473],{"type":55,"value":4474},"401 Unauthorized",{"type":42,"tag":201,"props":4476,"children":4477},{},[4478,4480,4486,4488,4492],{"type":55,"value":4479},"Correct the ",{"type":42,"tag":82,"props":4481,"children":4483},{"className":4482},[],[4484],{"type":55,"value":4485},"--resource",{"type":55,"value":4487}," audience once (see ",{"type":42,"tag":135,"props":4489,"children":4490},{"href":677},[4491],{"type":55,"value":680},{"type":55,"value":4493},"). If it persists after the audience is right, it is missing permissions - stop and tell the user. Do not retry-loop.",{"type":42,"tag":179,"props":4495,"children":4496},{},[4497,4508],{"type":42,"tag":201,"props":4498,"children":4499},{},[4500,4506],{"type":42,"tag":82,"props":4501,"children":4503},{"className":4502},[],[4504],{"type":55,"value":4505},"202 Accepted",{"type":55,"value":4507}," but no result",{"type":42,"tag":201,"props":4509,"children":4510},{},[4511],{"type":55,"value":4512},"Poll LRO to completion.",{"type":42,"tag":179,"props":4514,"children":4515},{},[4516,4521],{"type":42,"tag":201,"props":4517,"children":4518},{},[4519],{"type":55,"value":4520},"Parts missing after updateDefinition",{"type":42,"tag":201,"props":4522,"children":4523},{},[4524],{"type":55,"value":4525},"Must include ALL parts - modified + unmodified.",{"type":42,"tag":179,"props":4527,"children":4528},{},[4529,4534],{"type":42,"tag":201,"props":4530,"children":4531},{},[4532],{"type":55,"value":4533},"Refresh credential error",{"type":42,"tag":201,"props":4535,"children":4536},{},[4537],{"type":55,"value":4538},"Direct user to configure in Service portal. Do not retry.",{"type":42,"tag":179,"props":4540,"children":4541},{},[4542,4547],{"type":42,"tag":201,"props":4543,"children":4544},{},[4545],{"type":55,"value":4546},"DAX errors in measures",{"type":42,"tag":201,"props":4548,"children":4549},{},[4550],{"type":55,"value":4551},"Check column\u002Ftable name references (case-sensitive). Verify referenced objects exist.",{"type":42,"tag":179,"props":4553,"children":4554},{},[4555,4560],{"type":42,"tag":201,"props":4556,"children":4557},{},[4558],{"type":55,"value":4559},"Deployment failure",{"type":42,"tag":201,"props":4561,"children":4562},{},[4563],{"type":55,"value":4564},"Check workspace permissions, model compatibility level, and Direct Lake expression source references.",{"type":42,"tag":179,"props":4566,"children":4567},{},[4568,4573],{"type":42,"tag":201,"props":4569,"children":4570},{},[4571],{"type":55,"value":4572},"Missing data source",{"type":42,"tag":201,"props":4574,"children":4575},{},[4576],{"type":55,"value":4577},"Verify M parameters or named expressions are correctly defined.",{"type":42,"tag":4579,"props":4580,"children":4581},"style",{},[4582],{"type":55,"value":4583},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":4585,"total":4777},[4586,4608,4629,4648,4663,4680,4691,4704,4719,4734,4752,4765],{"slug":4587,"name":4587,"fn":4588,"description":4589,"org":4590,"tags":4591,"stars":4605,"repoUrl":4606,"updatedAt":4607},"rushstack-best-practices","manage Rush monorepos with best practices","Provides best practices and guidance for working with Rush monorepos. Use when the user is working in a Rush-based repository, asks about Rush commands (install, update, build, rebuild), needs help with project selection, dependency management, build caching, subspace configuration, or troubleshooting Rush-specific issues.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4592,4595,4598,4599,4602],{"name":4593,"slug":4594,"type":15},"Engineering","engineering",{"name":4596,"slug":4597,"type":15},"Local Development","local-development",{"name":9,"slug":8,"type":15},{"name":4600,"slug":4601,"type":15},"Project Management","project-management",{"name":4603,"slug":4604,"type":15},"Rush","rush",6484,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Frushstack","2026-04-06T18:34:44.965032",{"slug":4609,"name":4609,"fn":4610,"description":4611,"org":4612,"tags":4613,"stars":4626,"repoUrl":4627,"updatedAt":4628},"azure-ai-agents-persistent-dotnet","build AI agents with Azure .NET SDK","Azure AI Agents Persistent SDK for .NET. Low-level SDK for creating and managing AI agents with threads, messages, runs, and tools. Use for agent CRUD, conversation threads, streaming responses, function calling, file search, and code interpreter. Triggers: \"PersistentAgentsClient\", \"persistent agents\", \"agent threads\", \"agent runs\", \"streaming agents\", \"function calling agents .NET\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4614,4617,4620,4623],{"name":4615,"slug":4616,"type":15},".NET","net",{"name":4618,"slug":4619,"type":15},"Agents","agents",{"name":4621,"slug":4622,"type":15},"Azure","azure",{"name":4624,"slug":4625,"type":15},"LLM","llm",2804,"https:\u002F\u002Fgithub.com\u002Fmicrosoft\u002Fskills","2026-07-03T16:32:10.297433",{"slug":4630,"name":4630,"fn":4631,"description":4632,"org":4633,"tags":4634,"stars":4626,"repoUrl":4627,"updatedAt":4647},"azure-ai-anomalydetector-java","build anomaly detection applications with Java","Build anomaly detection applications with Azure AI Anomaly Detector SDK for Java. Use when implementing univariate\u002Fmultivariate anomaly detection, time-series analysis, or AI-powered monitoring.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4635,4638,4639,4640,4643,4644],{"name":4636,"slug":4637,"type":15},"Analytics","analytics",{"name":4621,"slug":4622,"type":15},{"name":13,"slug":14,"type":15},{"name":4641,"slug":4642,"type":15},"Java","java",{"name":9,"slug":8,"type":15},{"name":4645,"slug":4646,"type":15},"Monitoring","monitoring","2026-05-13T06:14:16.261754",{"slug":4649,"name":4649,"fn":4650,"description":4651,"org":4652,"tags":4653,"stars":4626,"repoUrl":4627,"updatedAt":4662},"azure-ai-contentsafety-java","build content moderation applications with Azure AI","Build content moderation applications with Azure AI Content Safety SDK for Java. Use when implementing text\u002Fimage analysis, blocklist management, or harm detection for hate, violence, sexual content, and self-harm.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4654,4657,4658,4659],{"name":4655,"slug":4656,"type":15},"AI Infrastructure","ai-infrastructure",{"name":4621,"slug":4622,"type":15},{"name":4641,"slug":4642,"type":15},{"name":4660,"slug":4661,"type":15},"Security","security","2026-07-07T06:53:31.293235",{"slug":4664,"name":4664,"fn":4665,"description":4666,"org":4667,"tags":4668,"stars":4626,"repoUrl":4627,"updatedAt":4679},"azure-ai-contentsafety-py","detect harmful content with Azure AI Content Safety","Azure AI Content Safety SDK for Python. Use for detecting harmful content in text and images with multi-severity classification.\nTriggers: \"azure-ai-contentsafety\", \"ContentSafetyClient\", \"content moderation\", \"harmful content\", \"text analysis\", \"image analysis\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4669,4670,4673,4674,4675,4678],{"name":4621,"slug":4622,"type":15},{"name":4671,"slug":4672,"type":15},"Compliance","compliance",{"name":4624,"slug":4625,"type":15},{"name":9,"slug":8,"type":15},{"name":4676,"slug":4677,"type":15},"Python","python",{"name":4660,"slug":4661,"type":15},"2026-07-18T05:14:23.017504",{"slug":4681,"name":4681,"fn":4682,"description":4683,"org":4684,"tags":4685,"stars":4626,"repoUrl":4627,"updatedAt":4690},"azure-ai-language-conversations-py","implement conversational language understanding with Python","Implement Conversational Language Understanding (CLU) using the azure-ai-language-conversations Python SDK. Use when working with ConversationAnalysisClient to analyze conversation intent and entities, building NLP features, or integrating language understanding into applications.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4686,4687,4688,4689],{"name":4636,"slug":4637,"type":15},{"name":4621,"slug":4622,"type":15},{"name":4624,"slug":4625,"type":15},{"name":4676,"slug":4677,"type":15},"2026-07-31T05:54:29.068751",{"slug":4692,"name":4692,"fn":4693,"description":4694,"org":4695,"tags":4696,"stars":4626,"repoUrl":4627,"updatedAt":4703},"azure-ai-translation-text-py","translate text using Azure AI services","Azure AI Text Translation SDK for real-time text translation, transliteration, language detection, and dictionary lookup. Use for translating text content in applications.\nTriggers: \"text translation\", \"translator\", \"translate text\", \"transliterate\", \"TextTranslationClient\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4697,4700,4701,4702],{"name":4698,"slug":4699,"type":15},"API Development","api-development",{"name":4621,"slug":4622,"type":15},{"name":9,"slug":8,"type":15},{"name":4676,"slug":4677,"type":15},"2026-07-18T05:14:16.988376",{"slug":4705,"name":4705,"fn":4706,"description":4707,"org":4708,"tags":4709,"stars":4626,"repoUrl":4627,"updatedAt":4718},"azure-ai-vision-imageanalysis-py","analyze images with Azure AI Vision","Azure AI Vision Image Analysis SDK for captions, tags, objects, OCR, people detection, and smart cropping. Use for computer vision and image understanding tasks.\nTriggers: \"image analysis\", \"computer vision\", \"OCR\", \"object detection\", \"ImageAnalysisClient\", \"image caption\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4710,4711,4714,4717],{"name":4621,"slug":4622,"type":15},{"name":4712,"slug":4713,"type":15},"Computer Vision","computer-vision",{"name":4715,"slug":4716,"type":15},"Images","images",{"name":4676,"slug":4677,"type":15},"2026-07-18T05:14:18.007737",{"slug":4720,"name":4720,"fn":4721,"description":4722,"org":4723,"tags":4724,"stars":4626,"repoUrl":4627,"updatedAt":4733},"azure-appconfiguration-java","manage configuration with Azure App Configuration","Azure App Configuration SDK for Java. Centralized application configuration management with key-value settings, feature flags, and snapshots.\nTriggers: \"ConfigurationClient java\", \"app configuration java\", \"feature flag java\", \"configuration setting java\", \"azure config java\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4725,4726,4729,4732],{"name":4621,"slug":4622,"type":15},{"name":4727,"slug":4728,"type":15},"Configuration","configuration",{"name":4730,"slug":4731,"type":15},"Feature Flags","feature-flags",{"name":4641,"slug":4642,"type":15},"2026-07-03T16:32:01.278468",{"slug":4735,"name":4735,"fn":4736,"description":4737,"org":4738,"tags":4739,"stars":4626,"repoUrl":4627,"updatedAt":4751},"azure-cosmos-rust","build applications with Azure Cosmos DB","Azure Cosmos DB library for Rust (NoSQL API). Document CRUD, containers, and globally distributed data.\nTriggers: \"cosmos db rust\", \"CosmosClient rust\", \"document crud rust\", \"NoSQL rust\", \"partition key rust\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4740,4743,4745,4748],{"name":4741,"slug":4742,"type":15},"Cosmos DB","cosmos-db",{"name":1453,"slug":4744,"type":15},"database",{"name":4746,"slug":4747,"type":15},"NoSQL","nosql",{"name":4749,"slug":4750,"type":15},"Rust","rust","2026-07-31T05:54:27.021432",{"slug":4753,"name":4753,"fn":4736,"description":4754,"org":4755,"tags":4756,"stars":4626,"repoUrl":4627,"updatedAt":4764},"azure-cosmos-ts","Azure Cosmos DB JavaScript\u002FTypeScript SDK (@azure\u002Fcosmos) for data plane operations. Use for CRUD operations on documents, queries, bulk operations, and container management. Triggers: \"Cosmos DB\", \"@azure\u002Fcosmos\", \"CosmosClient\", \"document CRUD\", \"NoSQL queries\", \"bulk operations\", \"partition key\", \"container.items\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4757,4758,4759,4760,4761],{"name":4741,"slug":4742,"type":15},{"name":1453,"slug":4744,"type":15},{"name":9,"slug":8,"type":15},{"name":4746,"slug":4747,"type":15},{"name":4762,"slug":4763,"type":15},"TypeScript","typescript","2026-07-03T16:31:19.368382",{"slug":4766,"name":4766,"fn":4767,"description":4768,"org":4769,"tags":4770,"stars":4626,"repoUrl":4627,"updatedAt":4776},"azure-data-tables-java","build table storage applications with Java","Build table storage applications with Azure Tables SDK for Java. Use when working with Azure Table Storage or Cosmos DB Table API for NoSQL key-value data, schemaless storage, or structured data at scale.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4771,4772,4773,4774,4775],{"name":4621,"slug":4622,"type":15},{"name":4741,"slug":4742,"type":15},{"name":1453,"slug":4744,"type":15},{"name":4641,"slug":4642,"type":15},{"name":4746,"slug":4747,"type":15},"2026-05-13T06:14:17.582229",267,{"items":4779,"total":4885},[4780,4791,4812,4830,4846,4860,4874],{"slug":63,"name":63,"fn":4781,"description":4782,"org":4783,"tags":4784,"stars":25,"repoUrl":26,"updatedAt":4790},"check for Fabric skill marketplace updates","Check an installed skills-for-fabric plugin bundle or git clone for updates, show the matching changelog, and provide host-appropriate update guidance. Use when the user wants to: (1) check for skill updates, (2) see what changed, (3) verify the installed version. Triggers: \"check for updates\", \"am I up to date\", \"what version\", \"update skills\", \"show changelog\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4785,4786,4787],{"name":9,"slug":8,"type":15},{"name":20,"slug":21,"type":15},{"name":4788,"slug":4789,"type":15},"Operations","operations","2026-07-24T05:41:25.892114",{"slug":4792,"name":4792,"fn":4793,"description":4794,"org":4795,"tags":4796,"stars":25,"repoUrl":26,"updatedAt":4811},"databricks-migration","migrate Databricks notebooks to Microsoft Fabric","Port Databricks notebooks and jobs to Microsoft Fabric. Provides an exhaustive dbutils to notebookutils substitution table: fs operations (runtime mounts or OneLake Shortcuts), secret scope to Key Vault URL conversion, notebook run and exit, widget replacement with parameter-tagged cells, and library install replacement with Fabric Environments. Covers Unity Catalog three-level namespace reduction to Lakehouse two-level schemas, DBFS path conversion to OneLake, Databricks Jobs to Spark Job Definitions, MLflow tracking URI removal, and Photon to Native Execution Engine substitution. Use when the user wants to: (1) replace dbutils with notebookutils, (2) collapse Unity Catalog namespaces to Lakehouse schemas, (3) convert Databricks Jobs or Delta Live Tables. Triggers: \"migrate from databricks\", \"databricks to fabric\", \"dbutils to notebookutils\", \"dbutils fabric\", \"unity catalog migration\", \"dbfs to onelake\", \"databricks notebook migration\", \"delta live tables fabric\", \"photon native execution\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4797,4800,4803,4804,4805,4808],{"name":4798,"slug":4799,"type":15},"Data Engineering","data-engineering",{"name":4801,"slug":4802,"type":15},"Databricks","databricks",{"name":9,"slug":8,"type":15},{"name":20,"slug":21,"type":15},{"name":4806,"slug":4807,"type":15},"Migration","migration",{"name":4809,"slug":4810,"type":15},"Notebooks","notebooks","2026-07-24T05:41:22.914341",{"slug":4813,"name":4813,"fn":4814,"description":4815,"org":4816,"tags":4817,"stars":25,"repoUrl":26,"updatedAt":4829},"dataflows-authoring-cli","manage Microsoft Fabric Dataflows via CLI","Create, update, delete, and refresh Fabric Dataflows Gen2 with write-side CLI via Fabric APIs. Build mashup.pq and queryMetadata.json, preview candidate M with executeQuery\u002FcustomMashupDocument, bind connections, and configure output destinations. For saved query execution or refresh-status reads, use `dataflows-consumption-cli`. If a request explicitly insists on the Dataflows consumption or read-only path for a mutation, do not route here; let consumption refuse before any separately confirmed authoring handoff. Triggers: \"create dataflow\", \"update dataflow\", \"delete dataflow\", \"trigger dataflow refresh\", \"preview Power Query M\", \"preview before save\", \"customMashupDocument\", \"create Fabric data source connection\", \"create SQL Server source REST\", \"POST \u002Fv1\u002Fconnections\", \"supportedConnectionTypes\", \"passwordReference\", \"bind connection\", \"dataflow output destination\", \"dataflow write to lakehouse\", \"dataflow write to warehouse\", \"dataflow write to ADX\", \"DataDestinations annotation\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4818,4821,4822,4825,4826],{"name":4819,"slug":4820,"type":15},"CLI","cli",{"name":4798,"slug":4799,"type":15},{"name":4823,"slug":4824,"type":15},"Data Pipeline","data-pipeline",{"name":20,"slug":21,"type":15},{"name":4827,"slug":4828,"type":15},"REST API","rest-api","2026-07-31T05:54:59.059517",{"slug":4831,"name":4831,"fn":4832,"description":4833,"org":4834,"tags":4835,"stars":25,"repoUrl":26,"updatedAt":4845},"e2e-medallion-architecture","implement Medallion Architecture in Microsoft Fabric","Plan and implement end-to-end Microsoft Fabric data platforms and Medallion Architecture (Bronze\u002FSilver\u002FGold) lakehouse patterns using PySpark, Delta Lake, Lakehouse\u002FWarehouse items, Fabric Pipelines, and semantic-model handoff. Use when the user wants to: (1) design a Bronze\u002FSilver\u002FGold data lakehouse, (2) plan an ingestion-to-semantic-model Fabric data platform, (3) set up multi-layer workspaces with lakehouses for each tier, (4) build ingestion-to-analytics pipelines with data quality enforcement, (5) orchestrate Bronze-to-Silver-to-Gold flows via notebooks. For natural-language business questions over existing Power BI report data, use `fabriciq`. Triggers: \"medallion architecture\", \"bronze silver gold\", \"lakehouse layers\", \"e2e data pipeline\", \"end-to-end lakehouse\", \"data lakehouse pattern\", \"multi-layer lakehouse\", \"build medallion\", \"setup medallion\", \"end-to-end Fabric data platform\", \"bronze silver gold platform\", \"ingestion semantic model platform\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4836,4839,4840,4841,4842],{"name":4837,"slug":4838,"type":15},"Architecture","architecture",{"name":4798,"slug":4799,"type":15},{"name":9,"slug":8,"type":15},{"name":20,"slug":21,"type":15},{"name":4843,"slug":4844,"type":15},"PySpark","pyspark","2026-07-31T05:54:57.038396",{"slug":4847,"name":4847,"fn":4848,"description":4849,"org":4850,"tags":4851,"stars":25,"repoUrl":26,"updatedAt":4859},"eventhouse-authoring-cli","manage Fabric Eventhouse and KQL databases","Execute KQL management commands (table management, ingestion, policies, functions, materialized views) against Fabric Eventhouse and KQL Databases via CLI. Use when the user wants to:\n  1. Create or alter KQL tables, columns, or functions\n  2. Ingest data into an Eventhouse (inline, from storage, streaming)\n  3. Configure retention, caching, or partitioning policies\n  4. Create or manage materialized views and update policies\n  5. Manage data mappings for ingestion pipelines\n  6. Deploy KQL schema via scripts\nTriggers: \"create kql table\", \"kql ingestion\", \"ingest into eventhouse\", \"kql function\", \"materialized view\", \"kql retention policy\", \"eventhouse schema\", \"kql authoring\", \"create eventhouse table\", \"kql mapping\"\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4852,4853,4856,4857,4858],{"name":1453,"slug":4744,"type":15},{"name":4854,"slug":4855,"type":15},"KQL","kql",{"name":9,"slug":8,"type":15},{"name":20,"slug":21,"type":15},{"name":4788,"slug":4789,"type":15},"2026-04-06T18:36:51.340409",{"slug":4861,"name":4861,"fn":4862,"description":4863,"org":4864,"tags":4865,"stars":25,"repoUrl":26,"updatedAt":4873},"eventhouse-consumption-cli","query Fabric Eventhouse with KQL","Run KQL queries against Fabric Eventhouse for real-time intelligence and time-series analytics using `az rest` against the Kusto REST API. Covers KQL operators (where, summarize, join, render), Eventhouse schema discovery (.show tables), time-series patterns with bin(), and ingestion monitoring. Use when the user wants to:\n  1. Run read-only KQL queries against an Eventhouse or KQL Database\n  2. Discover Eventhouse table schema and metadata\n  3. Analyse real-time or time-series data with KQL operators\n  4. Monitor ingestion health and active KQL queries\n  5. Export KQL results to JSON\nTriggers: \"kql query\", \"kusto query\", \"eventhouse query\", \"kql database\", \"real-time intelligence\", \"time-series kql\", \"query eventhouse\", \"explore eventhouse\", \"show tables kql\"\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4866,4867,4868,4869,4870],{"name":4636,"slug":4637,"type":15},{"name":4854,"slug":4855,"type":15},{"name":9,"slug":8,"type":15},{"name":20,"slug":21,"type":15},{"name":4871,"slug":4872,"type":15},"Real-Time Intelligence","real-time-intelligence","2026-04-06T18:36:45.018807",{"slug":4875,"name":4875,"fn":4876,"description":4877,"org":4878,"tags":4879,"stars":25,"repoUrl":26,"updatedAt":4884},"eventstream-consumption-cli","monitor Fabric Eventstream ingestion pipelines","List, inspect, and monitor Fabric Eventstream real-time ingestion pipelines via the Items REST API. Discover Eventstreams across workspaces, decode base64 graph topologies tracing event flow from source through operators to destination nodes. Validate connection IDs, wiring, retention policies (1-90 days), and throughput levels. Retrieve Custom Endpoint Kafka credentials via Topology API. **Invoke this skill** to: (1) list Eventstreams, (2) inspect Eventstream topology showing sources and destinations, (3) validate Eventstream configurations, (4) check Eventstream retention policy and throughput level, (5) get connection strings. Triggers: \"list eventstreams\", \"inspect eventstream\", \"describe eventstream topology\", \"eventstream operator nodes\", \"eventstream sources and destinations\", \"eventstream health\", \"eventstream status\", \"eventstream configuration\", \"eventstream retention\", \"eventstream throughput level\", \"eventstream connection string\", \"custom endpoint credentials\", \"check eventstream\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[4880,4881,4882,4883],{"name":4819,"slug":4820,"type":15},{"name":4798,"slug":4799,"type":15},{"name":20,"slug":21,"type":15},{"name":4645,"slug":4646,"type":15},"2026-07-31T05:55:03.045486",19]