Loading...
Loading...
Answer natural-language business questions over existing Power BI reports and semantic models through the FabricIQ MCP endpoint. Orchestrates artifact discovery, schema inspection, entity resolution, DAX generation, and query execution to return plain-language answers. Use when the user asks what, which, compare, rank, explain, or summarize questions about the data in a Power BI report or semantic model, including asking for a DAX query to be run against a named model. Triggers: "ask power bi", "PBI question", "discover my Power BI report", "report data", "dashboard data", "what are the top", "show me the power bi data", "which products sold", "compare sales in report", "which customers churned", "ask the Power BI report", "query a Power BI semantic model", "run a DAX query against a semantic model".
npx skill4agent add microsoft/skills-for-fabric fabriciqCRITICAL NOTES
- To find artifact details (including artifact ID) from a search query: use
with the search term — do not call workspace/item list APIsDiscoverArtifacts- To find the semantic model behind a report: call
and extract the model GUID from the responseGetReportMetadata- When the user provides a Power BI URL: call
to get the correct report GUID before proceedingResolveReportIdFromUrl
⚠️ STOP — Read this entire skill document in full before taking any action. Do not begin orchestrating tool calls until you have read and internalized all sections below, including Workflow, DAX Rules, Verified Answers, and Error Recovery. Skipping ahead leads to incorrect queries and missed instructions.
| Task | Reference | Notes |
|---|---|---|
| Fabric Topology & Key Concepts | COMMON-CORE.md § Fabric Topology & Key Concepts | Hierarchy; Finding Things in Fabric |
| Environment URLs | COMMON-CORE.md § Environment URLs | Production (Public Cloud) |
| Authentication & Token Acquisition | COMMON-CORE.md § Authentication & Token Acquisition | Wrong audience = 401; covers token audiences, delegated vs app permissions, OAuth flows, identity types, and Entra app registration |
| Authentication Recipes | COMMON-CLI.md § Authentication Recipes | |
| Gotchas, Best Practices & Troubleshooting | COMMON-CORE.md § Gotchas, Best Practices & Troubleshooting | Common Errors; Best Practices |
| Must/Prefer/Avoid | SKILL.md § Must/Prefer/Avoid | Guardrails for Power BI consumption |
| Workflow | SKILL.md § Workflow | FabricIQ orchestration steps |
| Tool | Purpose |
|---|---|
| Search for Power BI reports and semantic models by free text. Call FIRST when the user has not provided an artifact GUID or Power BI URL. Maximum 50 results. Prefer reports over standalone semantic models |
| Call when the user pastes a Power BI or Fabric URL whose report ID has not already been resolved. Required for workspace-App URLs ( |
| Retrieve report pages, visuals, filters, workspace info. Supports optional |
| Retrieve table/column/measure definitions, relationships, custom AI instructions, and verified answers. Supports optional |
| Call BEFORE writing a DAX filter on a named entity (customer, product, region, etc.). Returns the column + exact value to filter against so DAX does not guess canonical spelling |
| Execute 1–4 DAX queries (one EVALUATE per entry) and return tabular results. Default 250 rows per query, max 1,000. Set |
GetReportMetadataGetSemanticModelSchemaDiscoverArtifactsValueSearchResolveReportIdFromUrl(url)[rpt_N][dataset_N]ResolveReportIdFromUrlDiscoverArtifacts(searchQuery=<keywords from user request>)DiscoverArtifactsGetReportMetadatareportObjectIdGetSemanticModelSchemaExecuteQueryValueSearchartifactIdDiscoverArtifactsGetReportMetadatasemanticModelGetReportMetadata(reportObjectId=...)queriesqueriesTREATAS'Budget'[Scenario]('Actual', 'Forecast')TREATAS({"Actual", "Forecast"}, 'Budget'[Scenario])GetSemanticModelSchema(artifactId=...)queriesqueriesschema.VerifiedAnswersschema.CustomInstructionsGetSemanticModelSchemaqueries=["schema.CustomInstructions"]GetSemanticModelSchemaqueries=["schema.VerifiedAnswers[].{Title: Title, Question: Question}"]ValueSearch(artifactId=<model guid>, searchTerms=[<value>])ExecuteQuerydaxQueriesValueSearchExecuteQueryExecuteQuery| Error | Action |
|---|---|
| Invalid DAX | Read the error message, fix the DAX, retry once |
| Unauthorized (no PBI access) | May be a real access issue (admin needs to enable Power BI MCP access), or a known limitation where the tool reports "no access" for artifacts it can't reach. Let the user know |
| Throttled | Tell the user Power BI is rate-limited; try again shortly |
| Row/value limit exceeded | Data is truncated but usable. Suggest aggregating instead of dumping raw rows |
| Feature not enabled | The PBI MCP endpoint may not be enabled on the tenant. Ask the user to contact their admin |
| Timeout | The semantic model may be cold-loading. Retry once. If it times out again, suggest the user retry in a few minutes |
⚠️ Verified answers are the HIGHEST-PRIORITY source of truth. When a VA matches the user's question, it supersedes any custom DAX you would otherwise write — including any filters or scopes derived from CustomInstructions. Use the VA definition verbatim; apply CustomInstructions only when they don't conflict with the VA's bindings, filters, or granularity, and never modify VA-defined elements based on CustomInstructions alone.
schema.VerifiedAnswers[?regex_match(Question, 'keyword')] | [0]BindingsFiltersIsLevel1Subtotal DESC, IsLevel2Subtotal DESC, …Important: Use JMESPathonly on follow-up calls — after the initial call withoutquerieshas returned a full or truncated response. Never skip the initial full call in favor of a targeted JMESPath query.queries
| Purpose | Query |
|---|---|
| Overview of pages and visual titles | |
| Search visuals by keyword | |
| Extract report and page filters | |
| Find report-defined measures | |
| Purpose | Query |
|---|---|
| Get Verified Answers (priority 1 when truncated) | |
| Get Custom Instructions (priority 2 when truncated) | |
| Search measures by keyword | |
| Get table details | |
| Search verified answers by keyword | |
| List all relationships | |
EVALUATEORDER BYEVALUATEORDERBYDEFINEVARMEASURECOLUMNTABLEEVALUATEDEFINEDEFINEDEFINE MEASURE 'TableName'[MeasureName] = ...[MeasureName]CALCULATEINVARSUMMARIZESUMMARIZE(<table expression>, <column1>, ..., <columnN>)SUMMARIZECOLUMNSVALUES('Table'[Column])[Column]_TableVar[Column]CURRENTGROUPGROUPBYTOPNORDER BYORDER BYFILTERSELECTCOLUMNSCALCULATETABLEINTERSECTUNIONEXCEPTROWCALCULATETABLEMAX('Calendar'[Date])LASTNONBLANK[Measure] <> BLANK()GetReportMetadataDEFINE MEASURETOPNDiscoverArtifactsArtifactIdGetReportMetadataGetSemanticModelSchemaExecuteQueryExecuteQueryValueSearchExecuteQuery