powerbi-mcp-server
README.md
# powerbi-mcp
An [MCP](https://modelcontextprotocol.io) server that connects Claude (and any MCP-compatible client) to **Microsoft Power BI** via the Power BI REST API using a Service Principal.
## Tools exposed
| Tool | Description |
|---|---|
| `list_workspaces` | List all workspaces the SP has access to |
| `list_datasets` | List datasets in a workspace (or all) |
| `execute_dax_query` | Run a DAX query against a dataset and get results |
| `refresh_dataset` | Trigger an on-demand dataset refresh |
| `list_reports` | List reports in a workspace (or all) |
| `get_report_pages` | Get all pages in a report |
| `get_report_visuals` | Get all visuals on a report page |
## Prerequisites
1. **Azure App Registration** with these Power BI API permissions (Application, not Delegated):
- `Dataset.Read.All`
- `Dataset.ReadWrite.All` (for refresh)
- `Report.Read.All`
- `Workspace.Read.All`
2. In Power BI Admin Portal → **Tenant settings**, enable:
- *Allow service principals to use Power BI APIs*
- Add the security group containing your App Registration
3. Add the service principal as a **Member or Admin** to the workspaces you want to access.
## Setup
```bash
# Clone and install
git clone <this-repo>
cd powerbi-mcp-server
pip install -e .
# Copy and fill in credentials
cp .env.example .env
# Edit .env with your tenant ID, client ID, client secret
```
## Configure in Claude Code / Claude Desktop
Add this to your MCP configuration (`~/.claude/claude_desktop_config.json` for Desktop, or `claude mcp add` for Claude Code):
```json
{
"mcpServers": {
"powerbi": {
"command": "python",
"args": ["-m", "powerbi_mcp"],
"env": {
"POWERBI_TENANT_ID": "your-tenant-id",
"POWERBI_CLIENT_ID": "your-client-id",
"POWERBI_CLIENT_SECRET": "your-client-secret"
}
}
}
}
```
Or using `uv` (no install needed):
```json
{
"mcpServers": {
"powerbi": {
"command": "uvx",
"args": ["--from", "/path/to/powerbi-mcp-server", "powerbi-mcp"],
"env": {
"POWERBI_TENANT_ID": "...",
"POWERBI_CLIENT_ID": "...",
"POWERBI_CLIENT_SECRET": "..."
}
}
}
}
```
### Claude Code CLI
```bash
claude mcp add powerbi \
--command python \
--args "-m powerbi_mcp" \
-e POWERBI_TENANT_ID=your-tenant-id \
-e POWERBI_CLIENT_ID=your-client-id \
-e POWERBI_CLIENT_SECRET=your-client-secret
```
## Example prompts
Once connected, you can ask Claude:
- *"List all Power BI workspaces I have access to."*
- *"Run this DAX query on dataset abc-123: EVALUATE SUMMARIZE(Sales, Sales[Region], \"Total\", SUM(Sales[Amount]))"*
- *"Refresh the dataset named 'Monthly Sales' in the Finance workspace."*
- *"Show me all the pages and visuals in the Executive Dashboard report."*
## Development
```bash
pip install -e ".[dev]"
python -m powerbi_mcp # runs the MCP server via stdio
```
TDQS
A3.9/5.0
Scored across 7 tools
Disambiguation5/5
Each tool has a clearly distinct purpose: querying, listing, getting details, or refreshing. No overlap in functionality.
Naming Consistency5/5
All tool names follow a consistent verb_noun pattern in snake_case, using verbs like execute, get, list, and refresh.
Tool Count5/5
7 tools is well-scoped for a Power BI server covering listing, querying, and refreshing resources without being excessive or too thin.
Completeness4/5
The tool set covers core read, query, and refresh operations, but lacks create/update/delete capabilities for datasets and reports, which are minor gaps.