Power BI report, dataset, and workspace management — refresh datasets, manage reports, deploy content, administer workspaces, embed analytics, author themes, develop custom visuals, and work with PBIR/PBIP code-first report formats. Use when working with Power BI Service, managing datasets/reports, triggering refreshes, automating Power BI administration, building embedded analytics, creating themes, or developing Power BI frontend experiences.
npx claudepluginhub francoisbgdw/claude-skillsThis skill is limited to using the following tools:
Power BI has no dedicated CLI. Use the Power BI REST API via `az rest` or Python. The user authenticates via `az login`.
Manages Power BI semantic models in Fabric workspaces via az rest CLI: create from TMDL, download/update definitions, refresh datasets, configure permissions, deploy across pipelines.
Automates Power BI via REST API: service principal authentication, dataset refreshes, report embedding/export/clone, workspace/admin operations.
Develops Power BI reports in PBIR format: create on semantic models, edit visuals/pages/bookmarks, align layouts, rebind models, deploy/export to Fabric workspaces.
Share bugs, ideas, or general feedback.
Power BI has no dedicated CLI. Use the Power BI REST API via az rest or Python. The user authenticates via az login.
az account show --query "{name:name, id:id}" -o tsv 2>/dev/null || echo "not logged in — run: az login"The Power BI REST API base URL is https://api.powerbi.com/v1.0/myorg.
For workspace-scoped operations, use: https://api.powerbi.com/v1.0/myorg/groups/{workspaceId}
# List all workspaces the user has access to
az rest --method GET --url "https://api.powerbi.com/v1.0/myorg/groups"
# Get a specific workspace
az rest --method GET --url "https://api.powerbi.com/v1.0/myorg/groups/{workspaceId}"
# Create a workspace
az rest --method POST --url "https://api.powerbi.com/v1.0/myorg/groups?workspaceV2=true" --body '{"name": "New Workspace"}'
# Add a user to a workspace
az rest --method POST --url "https://api.powerbi.com/v1.0/myorg/groups/{workspaceId}/users" --body '{"emailAddress": "user@domain.com", "groupUserAccessRight": "Member"}'
# List datasets in a workspace
az rest --method GET --url "https://api.powerbi.com/v1.0/myorg/groups/{workspaceId}/datasets"
# Get dataset details
az rest --method GET --url "https://api.powerbi.com/v1.0/myorg/groups/{workspaceId}/datasets/{datasetId}"
# Trigger dataset refresh
az rest --method POST --url "https://api.powerbi.com/v1.0/myorg/groups/{workspaceId}/datasets/{datasetId}/refreshes"
# Get refresh history
az rest --method GET --url "https://api.powerbi.com/v1.0/myorg/groups/{workspaceId}/datasets/{datasetId}/refreshes"
# Execute a DAX query against a dataset
az rest --method POST --url "https://api.powerbi.com/v1.0/myorg/groups/{workspaceId}/datasets/{datasetId}/executeQueries" --body '{
"queries": [{"query": "EVALUATE SUMMARIZECOLUMNS('\''Date'\''[Year], \"Total Sales\", [Total Sales])"}],
"serializerSettings": {"includeNulls": true}
}'
# Update dataset parameters
az rest --method POST --url "https://api.powerbi.com/v1.0/myorg/groups/{workspaceId}/datasets/{datasetId}/Default.UpdateParameters" --body '{
"updateDetails": [{"name": "ServerName", "newValue": "newserver.database.windows.net"}]
}'
# Take over a dataset (change owner)
az rest --method POST --url "https://api.powerbi.com/v1.0/myorg/groups/{workspaceId}/datasets/{datasetId}/Default.TakeOver"
# Update data source credentials
az rest --method PATCH --url "https://api.powerbi.com/v1.0/myorg/gateways/{gatewayId}/datasources/{datasourceId}" --body '{
"credentialDetails": {
"credentialType": "OAuth2",
"credentials": "{\"credentialData\":\"\"}",
"encryptedConnection": "Encrypted",
"encryptionAlgorithm": "None",
"privacyLevel": "Organizational"
}
}'
# List reports in a workspace
az rest --method GET --url "https://api.powerbi.com/v1.0/myorg/groups/{workspaceId}/reports"
# Get a specific report
az rest --method GET --url "https://api.powerbi.com/v1.0/myorg/groups/{workspaceId}/reports/{reportId}"
# Clone a report to another workspace
az rest --method POST --url "https://api.powerbi.com/v1.0/myorg/reports/{reportId}/Clone" --body '{"name": "Cloned Report", "targetWorkspaceId": "{targetWorkspaceId}"}'
# Rebind a report to a different dataset
az rest --method POST --url "https://api.powerbi.com/v1.0/myorg/groups/{workspaceId}/reports/{reportId}/Rebind" --body '{"datasetId": "{newDatasetId}"}'
# Export report (download .pbix)
az rest --method GET --url "https://api.powerbi.com/v1.0/myorg/groups/{workspaceId}/reports/{reportId}/Export" --output-file report.pbix
# Export report to file (PDF, PNG, PPTX)
az rest --method POST --url "https://api.powerbi.com/v1.0/myorg/groups/{workspaceId}/reports/{reportId}/ExportTo" --body '{
"format": "PDF",
"powerBIReportConfiguration": {
"pages": [{"pageName": "ReportSection1"}]
}
}'
# List dashboards in a workspace
az rest --method GET --url "https://api.powerbi.com/v1.0/myorg/groups/{workspaceId}/dashboards"
# List tiles on a dashboard
az rest --method GET --url "https://api.powerbi.com/v1.0/myorg/groups/{workspaceId}/dashboards/{dashboardId}/tiles"
# List deployment pipelines
az rest --method GET --url "https://api.powerbi.com/v1.0/myorg/pipelines"
# Get pipeline stages
az rest --method GET --url "https://api.powerbi.com/v1.0/myorg/pipelines/{pipelineId}/stages"
# Deploy content to next stage
az rest --method POST --url "https://api.powerbi.com/v1.0/myorg/pipelines/{pipelineId}/deployAll" --body '{
"sourceStageOrder": 0,
"options": {"allowOverwriteArtifact": true, "allowCreateArtifact": true}
}'
# List workspaces (admin scope — requires Power BI Admin role)
az rest --method GET --url "https://api.powerbi.com/v1.0/myorg/admin/groups?%24top=100"
# Get workspace info with datasets, reports, etc.
az rest --method POST --url "https://api.powerbi.com/v1.0/myorg/admin/workspaces/getInfo" --body '{"workspaces": ["{workspaceId}"]}'
# List capacities
az rest --method GET --url "https://api.powerbi.com/v1.0/myorg/capacities"
# Get refresh schedule
az rest --method GET --url "https://api.powerbi.com/v1.0/myorg/groups/{workspaceId}/datasets/{datasetId}/refreshSchedule"
For a full API reference, see api-reference.md.
from azure.identity import DefaultAzureCredential
import requests
credential = DefaultAzureCredential()
token = credential.get_token("https://analysis.windows.net/powerbi/api/.default")
headers = {
"Authorization": f"Bearer {token.token}",
"Content-Type": "application/json"
}
# List workspaces
resp = requests.get("https://api.powerbi.com/v1.0/myorg/groups", headers=headers)
workspaces = resp.json()["value"]
for ws in workspaces:
print(f"{ws['name']} ({ws['id']})")
import sempy.fabric as fabric
# List datasets
datasets = fabric.list_datasets(workspace="<workspace-name>")
# Execute DAX query
result = fabric.evaluate_dax(
dataset="<dataset-name>",
dax_string='EVALUATE ROW("Test", 1 + 1)',
workspace="<workspace-name>"
)
pip install pbipy
from pbipy import PowerBI
pbi = PowerBI(bearer_token)
# List workspaces
workspaces = pbi.groups()
# Get datasets in a workspace
datasets = pbi.datasets(group=workspace)
# Trigger refresh
pbi.refresh_dataset(dataset, group=workspace)
# Refresh all datasets in a workspace
datasets = requests.get(f"{BASE}/groups/{ws_id}/datasets", headers=headers).json()["value"]
for ds in datasets:
if ds.get("isRefreshable"):
requests.post(f"{BASE}/groups/{ws_id}/datasets/{ds['id']}/refreshes", headers=headers)
print(f"Triggered refresh: {ds['name']}")
refreshes = requests.get(
f"{BASE}/groups/{ws_id}/datasets/{ds_id}/refreshes?$top=1",
headers=headers
).json()["value"]
latest = refreshes[0]
print(f"Status: {latest['status']}, Start: {latest.get('startTime')}, End: {latest.get('endTime')}")
Use deployment pipelines for managed promotion:
# Deploy from Development (stage 0) to Test (stage 1)
az rest --method POST --url "https://api.powerbi.com/v1.0/myorg/pipelines/{pipelineId}/deployAll" --body '{"sourceStageOrder": 0}'
Power BI themes are JSON files that control colors, typography, and visual formatting across an entire report. For full schema, starter templates, accessibility best practices, and application methods, see themes.md.
Quick reference:
# Apply theme via Power BI Embedded JS SDK
# report.applyTheme({ themeJson: themeObject });
# Apply theme via Semantic Link Labs (Fabric notebooks)
# rpt = labs.get_report("My Report", workspace="My Workspace")
# rpt.set_theme(theme_json=theme)
Theme files in PBIR projects live at: MyReport.Report/StaticResources/SharedResources/BaseThemes/.
PBIR (Enhanced Report Format) decomposes reports into individual JSON files per visual, page, and bookmark — enabling git-friendly, code-first Power BI development. PBIP (Power BI Project) is the project container pairing a PBIR report with a TMDL semantic model.
PBIR is the default format for new reports as of March 2026. For folder structure, JSON schemas, git workflow, and programmatic editing patterns, see pbir-reference.md.
Key capabilities:
For building web applications with embedded Power BI content, creating custom visuals, or programmatic report authoring, see embedded.md.
Covers:
powerbi-client JS SDK) — embed reports/dashboards in web apps, handle events, runtime theme switchingpowerbi-report-authoring) — programmatic visual CRUD, data binding, layout manipulationpbiviz) — create, develop, and package custom visualsexecuteQueries endpoint from this skill or evaluate_dax() from semantic-link to run DAX against Power BI datasets..Report/ folder (PBIR, managed by this skill) and a .SemanticModel/ folder (TMDL, editable with the DAX skill or Tabular Editor).Microsoft's powerbi-modeling-mcp (announced at Ignite 2025) enables AI agents to interact with semantic models:
maxanatsko/pbi-desktop-mcp-public{
"mcpServers": {
"powerbi": {
"command": "npx",
"args": ["-y", "@anthropic/powerbi-mcp"]
}
}
}
Note: Verify the exact package name and setup at the MCP server's documentation, as implementations are evolving.