Power BI Local MCP
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Power BI Local MCPCreate SalesReview from RetailDemo with KPI cards, a revenue line chart, and a channel filter."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Power BI Local MCP
Describe a dashboard in plain language. An MCP client uses this local server to bind existing measures and columns to Power BI visuals. The server creates a validated new project copy without opening Power BI Desktop or changing the source.
Try the retail demo
The retail template combines three KPI cards, a monthly revenue trend, and a channel comparison. The channel filter updates the whole page.

View the Online-only screenshot. Selecting Online changes revenue to 114,312 and orders to 2,622.
Open RetailDemo.pbip in a recent Power BI Desktop. On the first open, choose Home > Refresh to load the embedded sample. No database, account, or credentials are needed. The 36 fictional rows cover 12 months and three sales channels. The expected totals are 399,426 revenue, 9,126 orders, and 43.77 average order value.
For the full MCP workflow, install Node.js 22 or newer, then run these commands from the repository:
npm ci
npm test
npm run demoThe last command creates workspace/RetailDemo/RetailDemo.pbip. Alternatively, call create_retail_demo after connecting an MCP client. Both refuse to overwrite an existing demo.
Related MCP server: powerbi-mcp-server
Connect an MCP client
Configure a local stdio server in your MCP-capable client. For clients that use an mcpServers JSON file:
{
"mcpServers": {
"powerbi-local": {
"command": "node",
"args": ["C:/path/to/powerbi-local-mcp/src/server.mjs"],
"env": { "POWERBI_MCP_ROOT": "C:/path/to/powerbi-local-mcp/workspace" }
}
}
}Use absolute paths for both values. The server does not listen on a port. The client interprets plain language; the server runs the structured actions.
Inspect RetailDemo. Make a new project named SalesReview with Revenue, Orders and Average order value cards, a monthly Revenue line chart and a Channel filter.
The client calls inspect_project, then create_dashboard, and can call validate_report on the result. To adjust an existing layout, use edit_layout to change visual titles, sizes or positions in a separate copy. Open SalesReview/SalesReview.pbip in Desktop to view it.
Bring your own report
Put one project in a folder under the configured workspace, with its folder and .pbip sharing a name. This release requires the enhanced PBIR report format and a TMSL model.bim local semantic model. It does not inspect TMDL models or remotely bound semantic models. The first release creates new pages using three cards, a line or bar chart, and a slicer.
The server does not create measures, refresh a database, convert to PBIX, or deploy to Fabric. Power BI Desktop is needed for rendering and PBIX export. Report validation may fetch public Microsoft JSON schemas; it does not need your database or a Fabric account. External source paths are not rewritten in authored copies.
Data and safety
The repository demo is generated from scratch, contains no real business data, and has no external data source. The server rejects path traversal and project symlinks, does not overwrite projects, and omits local Power BI cache files when making copies. Keep only trusted projects in the configured folder. Power Query and DAX definitions in a source project are carried over unchanged; review a project's definitions before sharing it. Tool output includes field names and visual bindings that an MCP client may send to its model.
This is an independent project, not a Microsoft product. It uses Microsoft's Power BI report authoring toolkit for structural validation.
Available Tools
5 toolscreate_dashboardB
Add three KPI cards, a chart and a slicer in a new validated copy. Use inspect_project first; the source is not changed.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| page | Yes | ||
| cards | Yes | ||
| chart | Yes | ||
| value | Yes | ||
| slicer | Yes | ||
| source | Yes | ||
| category | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false and openWorldHint=false, so safety is partly structured. The description adds two genuinely useful facts: the output is a new validated copy and the source is not changed, confirming the write is isolated. It does not disclose what 'validated' entails or what happens if validation fails.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with zero filler and the action front-loaded ahead of the prerequisite. The phrasing 'in a new validated copy' is compressed to the point of ambiguity about what is being copied.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Eight required parameters, nested objects, no schema descriptions and no output schema make this a high-complexity call. The description maps no parameter meaning and gives no hint about the source project identifier or how category/value relate to the cards, leaving an agent unable to construct a valid call from the description alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 8 required parameters, so the description carries the full burden and largely does not meet it. It hints at cards (exactly three), chart, slicer and a new copy, but never explains source, page, category or value, nor the table/name pairing structure required by every object parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a concrete composition action: adding three KPI cards, a chart and a slicer into a new validated copy. The artifacts are specific enough to distinguish it from validate_report and edit_layout, though 'copy' of what (a project/report) is only implied by the sibling inspect_project.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use inspect_project first' gives an explicit ordered prerequisite and names a sibling tool, which is real routing guidance. It stops short of saying when to prefer this over create_retail_demo or edit_layout, so it is clear context without full alternative/exclusion coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_retail_demoA
Create a fully synthetic retail sales PBIP. No source connection or credentials needed.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a non-destructive, non-open-world creation tool; the description adds meaningful context that no credentials or data connection are required. However, it does not say where the project is written, whether it overwrites existing artifacts, or what the caller receives back — gaps that matter for a creation tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences with zero filler, and the core action is front-loaded ahead of the precondition. Nothing can be trimmed without losing information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no parameters and no output schema, the description is the only source of information about what is produced, and it stops short of describing the resulting artifact (name, location, whether a workspace/project already exists). Adequate to know what the tool does, but not complete enough to predict the outcome.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so the baseline is 4; there is nothing for the description to compensate for. The note about no credentials is a useful precondition even though no parameters express it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ("Create") and resource ("fully synthetic retail sales PBIP"), which is enough to distinguish it from siblings like create_dashboard and validate_report. The only weakness is that the acronym PBIP is never expanded, so an agent unfamiliar with the format must infer what artifact is produced.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase "No source connection or credentials needed" implies the scenario (generating a demo when no data source exists), but there is no explicit when-to-use/when-not-to-use guidance and no reference to alternative siblings for building projects or dashboards.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
edit_layoutB
Change the titles or positions of existing ungrouped visuals in a new validated copy. Keeps field bindings and filters.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| pageId | Yes | ||
| source | Yes | ||
| changes | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, destructiveHint=false, and openWorldHint=false; the description adds real value on top by clarifying that changes land in a new validated copy rather than mutating the original, and that field bindings and filters are preserved. It still omits what happens when validation fails and how the resulting copy is identified.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero filler, and the most decision-relevant fact (a new validated copy is produced) is placed immediately after the action statement. Nothing needs trimming.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with four required parameters, no output schema, and zero schema description coverage, the description covers behavior but not inputs. An agent can infer the operation but not how to supply source, name, or pageId, or that at most 30 change entries are allowed, so it is not complete enough to call reliably without reading the schema closely.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% and all four top-level parameters are required, yet the description never explains what "source" versus "name" mean, nor that "changes" carries per-visual id/title/position entries and that pageId scopes the page. Only the title/position concepts are echoed, leaving the most consequential identifiers undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a concrete verb+resource pair ("Change the titles or positions of existing ungrouped visuals") and adds a material scope detail: the edit happens in "a new validated copy." That is enough to separate it from siblings like create_dashboard or validate_report, though the qualifier "ungrouped" is left undefined.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied by the scope restriction to "existing ungrouped visuals," which tells the agent this is not for creating or grouping visuals. However, there is no explicit when-to-use/when-not guidance, no prerequisites (e.g., that source and name identify the origin and the new copy), and no named alternative tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
inspect_projectBRead-only
List visible model fields and existing pages and visual bindings in a local PBIP with model.bim.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds useful scope context (only visible fields, only existing pages, requires model.bim) but says nothing about behavior when model.bim is absent or what the listing contains structurally.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the resource list comes before the scoping condition. It is dense but not padded, and every clause carries information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter, read-only inspection tool with no output schema, the description covers what is returned at a high level. It is incomplete on the one thing an agent must get right: what "name" must refer to and what happens on a missing or mismatched model.bim.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description carries the full burden for the single "name" parameter, yet it never says whether name is the project, folder, or PBIP file identifier. The regex-constrained string is left entirely unexplained, which is a real gap for a tool whose only input is that name.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ("List") with three concrete resources (visible model fields, existing pages, visual bindings) and a scoping condition (local PBIP with model.bim). This clearly separates it from the write-oriented siblings (create_dashboard, edit_layout). It stops short of naming the sibling it complements, which keeps it from a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase "in a local PBIP with model.bim" implies a precondition for calling it, and the read-only listing framing implies it is the discovery step before edit_layout or validate_report. However, no explicit when-to-use or when-not guidance is given, and no alternative is named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
validate_reportBRead-only
Run Microsoft PBIR structural validation on a local report. Does not evaluate report data.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered structurally. The description adds scope context by excluding data evaluation, which is genuinely useful. It still says nothing about what a validation failure looks like, how errors are reported, or whether validation is strict versus advisory.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, both front-loaded and free of filler. The capability comes first and the scoping exclusion immediately after, which is exactly the right ordering for a validation tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-parameter tool this is close to adequate, but with no output schema the description should hint at what validation produces (pass/fail, diagnostics list). Combined with the unexplained 'name' parameter, an agent has enough to attempt the call but not enough to interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There is a single required parameter, 'name', with zero schema description coverage and a regex pattern that hints at a report identifier. The description never clarifies whether 'name' is a report name, file name, or path, which is the main ambiguity an agent faces. With 0% coverage, the description needed to compensate and does not.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Run Microsoft PBIR structural validation on a local report.' The domain qualifier (PBIR, structural) makes the operation concrete. It does not distinguish itself from the closest sibling, inspect_project, which an agent might reasonably pick instead, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The clause 'Does not evaluate report data' sets a useful negative boundary on when this tool is not the right call. However, there is no positive guidance on when to run validation versus inspecting a project, and no mention of prerequisites such as whether the report must be local and already open.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
5 tool updates
v0.1.0- First observed
create_dashboard - First observed
create_retail_demo - First observed
edit_layout - First observed
inspect_project - First observed
validate_report
TDQS
Scored across 5 tools
Each tool targets a distinct phase: scaffolding a demo project, inspecting, adding visuals, editing layout, and validating. The only mild overlap is between create_retail_demo and create_dashboard, since both 'create' report content, but the descriptions make clear one builds a whole synthetic PBIP and the other extends an existing one.
All five tools follow a strict verb_noun snake_case pattern (create_retail_demo, inspect_project, create_dashboard, edit_layout, validate_report). No mixed conventions or vague one-word names.
Five tools is a tight, well-scoped set for a local PBIP manipulation server, and each tool maps to a distinct step in the workflow (scaffold, inspect, build, edit, validate). Nothing feels redundant or padded.
The surface covers a reasonable lifecycle (inspect -> create -> edit -> validate), but there are notable gaps: no way to create a blank/non-retail project, no visual deletion or generic visual creation, and no page-level operations. Agents needing anything beyond layout tweaks or the canned KPI dashboard will hit a dead end.
Maintenance
Related MCP Connectors
Forge designed Power BI projects (.pbip) from your agent, bound to your own semantic model.
Dashboards as data. Author, validate, render, and share dvt dashboards from any MCP client.
Governed BI MCP. Ask questions of live company data and list workspace sources via OAuth.
Governed data discovery, exact queries, decisions, simulations, and runtime utilities over MCP.
Related MCP Servers
- AlicenseBqualityDmaintenanceBuild Power BI reports with natural language through an MCP server that connects AI assistants to Power BI's PBIR file format for creating pages, visuals, themes, and filters locally.85721MIT
- AlicenseNot gradedqualityDmaintenanceEnables natural language interaction with Power BI Desktop via MCP, allowing DAX authoring, measure optimization, and model inspection.MIT
- FlicenseAqualityCmaintenanceEnables natural-language interaction with Power BI REST API through MCP tools, allowing GenAI applications to access approved business intelligence capabilities and analytics.28-
- AlicenseNot gradedqualityCmaintenanceEnables an AI assistant to build Power BI projects end to end: data modeling (tables, DAX measures, relationships, calculation groups, roles, field parameters) against an open Power BI Desktop via TOM/XMLA, and reports (pages, visuals, formatting, bookmarks, themes) as PBIR files in a .pbip project. Every visual is cross-checked against the real model before being written, so generated dashboards don't break on open.MIT