Skip to main content
Glama
powerbi-mcp-server

powerbi-mcp-server

powerbi-mcp

An MCP 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

Related MCP server: Power BI MCP for Claude

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

# 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):

{
  "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):

{
  "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

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

pip install -e ".[dev]"
python -m powerbi_mcp   # runs the MCP server via stdio

Available Tools

7 tools
execute_dax_queryB

Execute a DAX query against a Power BI dataset and return results.

Args: dataset_id: The dataset ID to query. dax_query: A valid DAX query string, e.g. "EVALUATE SUMMARIZE(Sales, Sales[Region])". workspace_id: Optional workspace ID that contains the dataset.

Inputs: dax_query (required), dataset_id (required), workspace_id.

get_report_pagesB

Get all pages in a Power BI report.

Args: report_id: The report ID. workspace_id: Optional workspace ID that contains the report.

Inputs: report_id (required), workspace_id. Returns: result

get_report_visualsA

Get all visuals on a specific page of a Power BI report.

Args: report_id: The report ID. page_name: The page name (from get_report_pages). workspace_id: Optional workspace ID that contains the report.

Inputs: page_name (required), report_id (required), workspace_id. Returns: result

list_datasetsA

List datasets in a workspace or across all workspaces.

Args: workspace_id: Optional workspace (group) ID. Omit for the default workspace.

Inputs: workspace_id. Returns: result

list_reportsA

List reports in a workspace or across all workspaces.

Args: workspace_id: Optional workspace ID. Omit for the default workspace.

Inputs: workspace_id. Returns: result

list_workspacesA

List all Power BI workspaces (groups) the service principal has access to.

Inputs: no named parameters. Returns: result

refresh_datasetB

Trigger an on-demand refresh of a Power BI dataset.

Args: dataset_id: The dataset ID to refresh. workspace_id: Optional workspace ID that contains the dataset.

Inputs: dataset_id (required), workspace_id.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    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.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • A
      license
      Not graded
      quality
      D
      maintenance
      An MCP server for interacting with Microsoft PowerBI REST API, providing tools for data cleaning, transformation, analysis, and visualization within PowerBI.
      4
      MIT
    • A
      license
      Not graded
      quality
      D
      maintenance
      A self-hosted MCP server that proxies MCP clients to Power BI, using your own Entra tenant and Azure subscription. It enables DAX queries, workspace listing, and dataset management while preserving user-specific row-level security.
      2
      MIT