plugins/lobbi-bi-reports/skills/dashboard-embedder/SKILL.md
Design embedded analytics integration specifications for embedding Power BI dashboards in SharePoint pages, Power Apps, Teams tabs, and custom web portals.
npx skillsauth add markus41/claude plugins/lobbi-bi-reports/skills/dashboard-embedderInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Produce a complete embedded analytics specification for surfacing Power BI reports inside a client application. The choice of embedding approach, authentication design, and RLS configuration is made explicitly based on the embedding context provided.
Identify the embedding context and select the approach:
| Context | Approach | Complexity | License Required | |---------|----------|------------|-----------------| | SharePoint Online page | Built-in Power BI web part | Low — no code | Power BI Pro per viewer | | Power Apps canvas app | Power BI tile control | Low — no code | Power BI Pro per viewer | | Microsoft Teams tab | Power BI Teams app or web part | Low — configuration only | Power BI Pro per viewer | | Custom web portal (internal) | Power BI Embedded REST API + JavaScript SDK | High — development required | Power BI Pro per viewer OR Premium capacity | | Custom web portal (external / client-facing) | Power BI Embedded API with service principal (app-owns-data) | High | Power BI Embedded A-SKU or Premium P-SKU | | SharePoint Framework (SPFx) web part | Custom SPFx component with Embedded SDK | High | Power BI Pro per viewer |
For SharePoint pages, use the built-in Power BI web part:
Configuration steps:
Limitation: The viewer must have a Power BI Pro license. If the organization has Power BI Premium Per User (PPU) or Premium capacity, viewers without Pro licenses can view reports embedded on SharePoint pages.
Access control: The SharePoint page inherits SharePoint permissions. The report's Row-Level Security (RLS) in Power BI applies on top of page access. A user who can view the page will only see data their RLS role permits.
Recommendation for insurance/financial services: Embed operational reports on SharePoint sites scoped to the relevant department. Do not embed firm-wide financial reports on SharePoint sites accessible to all staff.
For Power Apps canvas apps, use the Power BI tile control:
Configuration steps:
ShowFilter = true if users need slicer interactionCross-filtering: To pass a filter from Power Apps into the embedded report, use the Filter property of the Power BI Tile control:
Filter: "Table/Column eq '" & Gallery1.Selected.ClientID & "'"
License note: Users running the Power App must have both a Power Apps license and a Power BI Pro license. Confirm both are assigned to the target user group.
For Microsoft Teams tabs:
Option A — Power BI native Teams app (recommended for interactive use):
Option B — Website tab (for a pinned read-only view):
For financial services: Always use Option A. Never use the public "Embed in website" URL for reports containing client financial data or production metrics.
Two authentication patterns. Choose based on whether users have Azure AD accounts:
Users authenticate with their own Azure AD (Microsoft 365) account. The report is displayed in their security context, including RLS roles assigned to their identity.
Authentication flow:
https://analysis.windows.net/powerbi/api/.default)powerbi.embed() with the report embed URL and access tokenLicense requirement: Each user viewing the embedded report must have a Power BI Pro license. Premium Per User also satisfies this requirement.
Implementation note: Do not store the Azure AD token in browser local storage — use in-memory token storage. Implement token refresh before the token expires (tokens expire in ~1 hour).
Used when viewers do not have Azure AD accounts in the firm's tenant (external clients, agents on a portal, public-facing tools).
Authentication flow:
Report.Read.All, Dataset.Read.All)POST /reports/{reportId}/GenerateTokenpowerbi.embed() with embed tokenEmbed token with RLS:
POST https://api.powerbi.com/v1.0/myorg/groups/{workspaceId}/reports/{reportId}/GenerateToken
{
"accessLevel": "View",
"identities": [
{
"username": "{client-portal-user-identifier}",
"roles": ["AgentRole"],
"datasets": ["{datasetId}"]
}
]
}
License requirement: Power BI Embedded A-SKU (Azure capacity) or Premium P-SKU. The capacity node size depends on the number of concurrent users and report complexity. Start with A1 for < 50 concurrent users, scale up as needed.
Security: Store the client secret in Azure Key Vault. Never embed it in frontend code or configuration files. Rotate the secret every 90 days.
Define RLS for every embedding scenario that shows user-specific data:
RLS role matrix:
| Role Name | Filter Rule | Assigned To (AAD Group) | |-----------|-------------|------------------------| | ProducerView | Producers[Email] = USERPRINCIPALNAME() | Producers AD Group | | ManagerView | No filter — sees all | Managers AD Group | | BranchView | Branch[BranchID] IN VALUES(UserBranch[BranchID]) | Branch staff per branch |
Dynamic RLS using a security table (for complex multi-level access):
UserSecurity table in the Power BI dataset mapping email to allowed entities (branches, producers, clients)UserSecurity[UserEmail] = USERPRINCIPALNAME()UserSecurity table whenever user assignments changeRLS testing checklist:
Report optimization for embedding:
Embed container sizing:
const embedConfig = {
type: 'report',
id: reportId,
embedUrl: embedUrl,
accessToken: accessToken,
settings: {
filterPaneEnabled: false, // hide filter pane for cleaner embed
navContentPaneEnabled: false, // hide page navigation if showing single page
background: models.BackgroundType.Transparent // match portal background
}
};
const report = powerbi.embed(embedContainer, embedConfig);
// Responsive sizing — call on window resize
report.updateSettings({
layoutType: models.LayoutType.Custom,
customLayout: {
pageSize: { type: models.PageSizeType.Custom, width: container.clientWidth, height: container.clientHeight }
}
});
Deliver as:
development
Enhanced plan-authoring skill with Pre-Writing context gathering, task metadata, non-TDD templates, Red Flags, telemetry, and an automated plan linter. Use when you have a spec or requirements for a multi-step task, before touching code.
tools
Documentation intelligence engine with graph-based API docs, algorithm library, and drift detection
tools
Ultraplan cloud planning — kick off a plan in the cloud from your terminal, review and revise in the browser, then execute remotely or send back to CLI
tools
--- name: mcp description: Configure MCP servers for Claude Code — stdio vs HTTP, authentication, Tools/Resources/Prompts distinction, channels (CI webhook, mobile relay, Discord bridge, fakechat), and cost of always-loaded tools. Use this skill whenever adding an MCP server, debugging connection issues, choosing between MCP Tools vs Prompts vs Resources, installing channel servers, or managing .mcp.json. Triggers on: "MCP server", "mcp config", "add Obsidian MCP", "install context7", "channels"