Power BI MCP Server
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 MCP ServerShow me the latest sales performance for this quarter."
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 MCP Server
Overview
Power BI MCP Server is a Python-based Model Context Protocol (MCP) server designed to integrate the Power BI REST API with GenAI applications.
The project provides an interface through which an AI application can interact with Power BI capabilities using MCP-based tools.
Related MCP server: powerbi-mcp-server
Objective
Business intelligence platforms traditionally require users to navigate dashboards and reports manually.
An MCP integration can provide a conversational interface where an AI application can access approved business intelligence capabilities and help users work with analytics using natural-language requests.
High-Level Architecture
User
|
v
GenAI Application
|
v
Model Context Protocol
|
v
Power BI MCP Server
|
v
Power BI REST API
|
v
Power BI / Business DataKey Capabilities
MCP server implementation
Power BI REST API integration
Python-based backend
Tool-based AI integration
Business intelligence access through MCP
Integration with compatible GenAI applications
Example Interaction
User:
"Show me the latest sales performance."
|
v
GenAI Application
|
v
MCP Tool Selection
|
v
Power BI MCP Server
|
v
Power BI REST API
|
v
Business Intelligence Data
|
v
AI-generated responseTechnology
Python
Model Context Protocol (MCP)
Power BI REST API
GenAI application integration
API authentication
pytest / Python testing tools
Business Use Cases
Potential enterprise use cases include:
Natural-language business analytics
KPI retrieval
Power BI report interaction
AI-assisted business intelligence
Automated analytics workflows
Conversational access to approved BI capabilities
Security Considerations
Power BI and MCP integrations should carefully protect:
Access tokens
API credentials
Business data
User permissions
Tool execution permissions
Credentials should be stored securely and never committed to source control.
Future Enhancements
Additional Power BI tools
Role-based access control
Azure-hosted deployment
Azure OpenAI integration
Audit logging
More business analytics functions
Automated KPI monitoring
Enterprise authentication
Disclaimer
This README documents the Power BI MCP Server repository. If the repository is not your original work, do not claim the entire project as your own. Retain the original author's license, copyright, attribution, and repository notices, and clearly document any modifications you personally make.
Available Tools
8 toolsexecute_dax_queryB
Execute a DAX query against a dataset and return tabular results.
| Name | Required | Description | Default |
|---|---|---|---|
| query | Yes | ||
| dataset_id | Yes | ||
| workspace_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. It only mentions returning tabular results, but does not disclose whether the operation is read-only, any required permissions, error behavior, or other side effects. This is a significant gap for a query execution 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?
The description is a single, front-loaded sentence that directly states the primary action and outcome. There is no wasted wording, making it highly concise and clearly structured.
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?
The description is minimal and does not provide enough context for the agent to understand when to use the tool, parameter semantics, or behavioral implications. Although an output schema exists, the lack of annotations and usage guidance leaves the description incomplete for effective tool selection and invocation.
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 input schema has 0% description coverage, and the description does not compensate by explaining any of the parameters. It does not clarify what dataset_id, query, or workspace_id mean or how they relate. The only clue is 'DAX query' implying the query parameter, but it does not provide meaningful semantic detail.
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 clearly states the tool's action: 'Execute a DAX query against a dataset' and specifies the output ('return tabular results'). This distinguishes it from sibling tools such as list_datasets, refresh_dataset, and export_report, which serve different purposes.
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 description implies usage when a DAX query needs to be executed, and it is clear from context that this is the only tool for that purpose. However, it does not explicitly state when to use it versus alternatives, nor does it mention any prerequisites or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_reportB
Start an export job for a report. format is one of PDF, PPTX, PNG, etc.
| Name | Required | Description | Default |
|---|---|---|---|
| format | Yes | ||
| report_id | Yes | ||
| workspace_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries full responsibility for behavioral disclosure. It indicates the operation is asynchronous ('Start an export job') but does not mention required permissions, job lifecycle, side effects, or how to retrieve the result. This is a significant gap for a mutation-like operation.
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?
The description is a single, front-loaded sentence with no unnecessary words. It directly states the action and provides the key parameter detail. Extremely concise and well-structured.
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?
Given three parameters and an output schema, the description only addresses one parameter and lacks context on job handling, workspace scope, or how the export artifacts are delivered. It is insufficient for the agent to understand the full workflow, even with the output schema present.
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 must compensate. It partially does for 'format' by giving examples ('PDF, PPTX, PNG, etc.'), but the list is vague with 'etc.' and does not cover 'report_id' or 'workspace_id' at all. Meaning is added only for one parameter and incompletely.
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 clearly states the tool's purpose with a specific verb and resource: 'Start an export job for a report.' It differentiates from sibling tools (list_reports, refresh_dataset, execute_dax_query) as the only export-related tool. The mention of format adds specificity.
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 description implies usage context (exporting a report) but does not explicitly state when to use it vs. alternatives or any exclusions. There is no reference to sibling tools or conditions under which this tool is preferred, so guidance remains implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_dataset_refresh_historyB
Return the refresh history entries for a dataset (most recent first).
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | ||
| dataset_id | Yes | ||
| workspace_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the burden of behavioral disclosure. It adds the ordering behavior ('most recent first'), which is useful, but it does not explicitly state read-only safety, pagination behavior, or error conditions. The name 'get' implies a read, but no explicit safety guarantee is given.
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?
The description is a single, front-loaded sentence with no redundant wording. Every word contributes to conveying the core function and ordering, making it appropriately concise.
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?
The tool has 3 parameters and no annotations, yet the description is extremely sparse. It does not explain the meaning or purpose of 'top' or 'workspace_id', nor provide usage guidance. The output schema helps with return values, but the description alone is insufficient for an agent to use the tool correctly without additional inference.
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 must compensate by explaining parameter semantics. It does not mention 'dataset_id', 'top', or 'workspace_id' at all, adding no meaning beyond the schema's type and title information. This is a critical gap for correct invocation.
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 clearly identifies the action ('Return'), the resource ('refresh history entries for a dataset'), and the ordering ('most recent first'). This distinguishes it from sibling tools like refresh_dataset (which performs a refresh) and the listing tools.
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 description implies usage—when you need refresh history for a dataset—but does not explicitly state when to use it versus alternatives. No exclusions or alternative tool names are mentioned, so guidance is minimal.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_dashboardsA
List dashboards, optionally scoped to a workspace (group) ID.
| Name | Required | Description | Default |
|---|---|---|---|
| workspace_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, and the description only states the basic list operation without disclosing behavioral traits such as pagination, sorting, sorting order, or permission requirements. It adds minimal information beyond the input schema.
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?
The description is a single sentence, front-loaded with the action verb, and contains no redundant words. It is highly concise.
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?
Given the tool's simplicity (one optional parameter, output schema present), the description is adequately complete for basic usage. It covers the core function and the optional filter, though it omits potential behavioral details like sorting or permissions.
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% in the description, but the description clarifies the workspace_id parameter as a 'workspace (group) ID' and signals its optionality. This adds meaning beyond the schema's basic type and title, compensating for the coverage gap.
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 clearly states 'List dashboards' with a specific verb and resource, and the optional workspace scoping distinguishes it from sibling tools like list_workspaces and list_datasets.
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 description provides clear context for when to use the tool (listing dashboards) and mentions the optional workspace scoping, giving a useful usage hint. It does not explicitly name alternatives or exclusions, but the resource-specific context is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_datasetsA
List datasets, optionally scoped to a workspace (group) ID.
| Name | Required | Description | Default |
|---|---|---|---|
| workspace_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden for behavioral disclosure. It adds the useful behavior of optional workspace scoping, but does not mention any other behavioral traits such as pagination, permissions, or filtering behavior beyond the workspace scope. For a simple list operation, this is acceptable but leaves some gaps.
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 sentence that is front-loaded with the action and immediately describes the optional parameter. Every word earns its place; there is no waste.
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?
The tool has one optional parameter and an output schema, so the description does not need to explain return values. The description covers the scanning behavior and the parameter semantics. However, given the absence of annotations and the existence of sibling tools, a brief note on when to prefer this over list_reports would have made it fully complete, but overall it is sufficient for a simple list operation.
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 schema has zero description coverage, but the description explicitly states 'optionally scoped to a workspace (group) ID', which explains the purpose of the workspace_id parameter. This compensates for the lack of schema descriptions, though it does not specify format or constraints.
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 clearly states the tool's action ('List datasets') and its resource (datasets), distinguishing it from sibling tools like list_workspaces, list_reports, and list_dashboards. The optional workspace scoping is a specific qualifier that further clarifies the purpose.
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 description provides clear context on when to use the tool (to list datasets, optionally scoped by workspace ID). It does not explicitly mention alternatives or when not to use, but the sibling list makes the differentiation clear, and the optional scope gives a targeted use case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_reportsB
List reports, optionally scoped to a workspace (group) ID.
| Name | Required | Description | Default |
|---|---|---|---|
| workspace_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description must carry the full burden of behavioral disclosure. 'List' implies a read-only operation, but the description does not explicitly confirm safety, mention auth requirements, describe what is returned, or note any side effects. It adds minimal behavioral context beyond the tool's name.
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?
The description is a single, clear sentence that front-loads the main action and resource. It uses no unnecessary words and directly conveys the essential function and the optional parameter, earning its place with zero waste.
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?
Given the tool's simplicity and the presence of an output schema, the description provides an adequate baseline. However, it lacks context about filtering behavior, pagination, or permission implications, which could be important for an agent deciding whether to call this tool among several list-based siblings. The description is minimally sufficient but not fully informative.
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 description partially compensates for the 0% schema coverage by explaining that workspace_id is optional and represents a workspace (group) ID. However, it does not explain the format, constraints, or what happens when null. The schema names the parameter, so description adds understanding of its semantic role, but gaps remain.
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 clearly states the action 'List reports' with a specific resource, distinguishing it from sibling tools like list_workspaces, list_datasets, and list_dashboards. The optional scoping to a workspace (group) ID adds specific context that further clarifies the tool's function.
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 description provides no guidance on when to use this tool versus alternatives. Although sibling list tools exist, there is no comparison, no mention of preferred use cases, and no exclusions. The optional workspace scoping is mentioned but not framed as a decision criterion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_workspacesA
List all Power BI workspaces (groups) accessible to the caller.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of disclosure. It adds an important behavioral constraint: only workspaces 'accessible to the caller' are returned, which goes beyond the tool name. It does not detail pagination or auth requirements, but for a simple list operation with an output schema, this is adequate.
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?
The description is a single concise sentence, front-loads the action ('List'), and contains no filler or redundant language.
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 zero-parameter list operation with an output schema, the description fully communicates the tool's purpose and scope. It is complete enough for an agent to select and invoke it correctly.
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 has zero parameters, so there is nothing for the description to clarify beyond the schema. Baseline of 4 is appropriate because no parameter information is needed.
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 uses a specific verb 'List' and identifies the resource as 'Power BI workspaces (groups)' with the scope 'accessible to the caller'. This clearly distinguishes it from sibling list tools aimed at datasets, reports, or dashboards.
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 description clearly indicates the tool is for listing workspaces, which implies when to use it among sibling list tools. However, it does not explicitly name alternatives or provide when-not-to-use guidance, so it falls short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
refresh_datasetB
Trigger a dataset refresh. notify_option may be 'MailOnCompletion',
'MailOnFailure', or 'NoNotification'.
| Name | Required | Description | Default |
|---|---|---|---|
| dataset_id | Yes | ||
| workspace_id | No | ||
| notify_option | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full responsibility for disclosing behavioral traits. It only states 'Trigger a dataset refresh,' implying a state change, but omits details about asynchronous execution, required permissions, failure modes, or side effects. This is a significant gap for a mutation 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?
The description is extremely concise—two short sentences with no filler. The action is front-loaded, and the second sentence adds useful parameter-specific information. It is appropriately sized for the tool's simplicity.
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?
Despite having an output schema (so return values are covered), the description lacks essential context for a mutation tool: no usage guidance, no behavioral transparency, and incomplete parameter semantics. It does not sufficiently support an agent selecting and invoking the tool correctly.
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 must compensate. It adds meaning only for notify_option by listing valid values, but provides no explanation for dataset_id or workspace_id. With 3 parameters, this partial coverage is inadequate.
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 uses the specific verb 'Trigger' with the resource 'dataset refresh', making the action unambiguous. It distinguishes from sibling tools like list_datasets (listing) and get_dataset_refresh_history (history) by clearly indicating a mutation action.
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?
No guidance is provided on when to use this tool vs alternatives, such as checking refresh history or listing datasets. The description only states what the tool does, leaving the agent to infer appropriate usage contexts.
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.
8 tool updates
v0.1.0- First observed
execute_dax_query - First observed
export_report - First observed
get_dataset_refresh_history - First observed
list_dashboards - First observed
list_datasets - First observed
list_reports - First observed
list_workspaces - First observed
refresh_dataset
TDQS
Scored across 8 tools
Each tool targets a distinct resource or action: workspaces, datasets, reports, dashboards, dataset refresh, refresh history, DAX query, and report export. There is no overlap or ambiguity.
All tool names follow a consistent verb_noun pattern (e.g., list_workspaces, refresh_dataset, execute_dax_query). The style is uniform and predictable.
Eight tools is a well-scoped set for a Power BI server focused on listing resources and performing common actions like refresh, query, and export. No redundant tools.
The surface covers listing and key actions (refresh, query, export), but lacks get-by-id operations and any create/update/delete tools. This is a notable gap for full lifecycle management, though the server appears oriented toward read and operational tasks.
Maintenance
Related MCP Connectors
- BasedashOAuthcom.basedash
Governed BI MCP. Ask questions of live company data and list workspace sources via OAuth.
Let AI agents query data and act across all your business apps via MCP.
Query your org's data in natural language — read-only MCP access to SQL, NoSQL, files & warehouses.
Official Microsoft MCP Server to query Microsoft Entra data using natural language
Related MCP Servers
- AlicenseAqualityCmaintenanceEnables AI assistants to query PowerBI workspaces, datasets, and execute DAX queries through the PowerBI REST API.7MIT
- AlicenseNot gradedqualityDmaintenanceEnables natural language interaction with Power BI Desktop via MCP, allowing DAX authoring, measure optimization, and model inspection.MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to query Power BI datasets via MCP, automatically anonymizing sensitive data before it reaches the AI, and generating rich HTML reports from natural language questions.MIT
- FlicenseNot gradedqualityBmaintenanceMCP server enabling AI agents to directly query and manage Power BI datasets, reports, and workspaces via DAX, with built-in data security policies and support for both Power BI Desktop and Service.1-