Skip to main content
Glama
Divyansh-dev12

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.