Power BI分析工具

一个本地运行的Power BI数据分析工具,通过LLM(如Claude)连接Power BI语义模型,执行DAX查询并分析数据,支持大规模数据集处理。

  • by mbrummerstedt
  • Python
  • 本地部署
  • 14 星标
  • 更新于
在 GitHub 查看 mbrummerstedt/powerbi-remote-mcp-server

使用说明

Power BI分析师MCP

请Claude分析您的Power BI数据。获取答案——而不是上下文窗口崩溃。

将Claude(或任何MCP客户端)连接到您的Power BI语义模型。探索表和度量值,运行DAX查询,并处理真实结果——即使是在包含数万行的数据集上。大型查询结果会自动保存到本地文件,并按需分页到代理,因此无论您提取多少数据,您的AI会话都会保持快速和专注。

一切都在你的机器上运行。您的数据永远不会通过第三方中继。


什么是可能的

分析的瓶颈从来不是数据访问——Power BI已经为人们提供了访问权限。瓶颈是翻译:将数据转化为决策的熟练、耗时的工作。此服务器将该翻译移动到LLM。

整个模型的复合推理 人类分析师运行一个查询,读取结果,形成假设,运行另一个查询。这部连续剧连载了好几个小时。一个代理可以按顺序运行20个查询——每个查询由最后一个查询通知——综合所有查询,并在几分钟内得出合理的结论。问“是什么导致了EMEA地区的利润率下降?”Claude将探索衡量标准,深入市场,检查时间趋势,隔离异常值,并解释它——而无需你指导每一步。

面向所有人的自然语言分析 任何利益相关者都可以提出数据问题,并获得实时DAX支持的真实答案,而无需知道DAX是什么,无需提交工单,也无需等待。翻译层过去需要训练有素的分析师按需运行。

主动异常检测 根据你的关键指标,按照时间表运行克劳德。它查询数据,与之前的时期进行比较,并用简单的英语标记任何超出预期范围的东西——在任何人打开仪表板发现问题之前。

自文档语义模型 “列出此数据集中的每个度量,并解释它的计算结果。”Claude探索了该模式并生成了一个数据字典,这对入职培训、治理以及任何试图理解模型实际包含内容的人都很有用。

大型数据集,自动处理 Power BI查询可以返回数万行。返回所有内联将占用LLM的大部分上下文窗口并使会话崩溃。此服务器将大型结果保存到本地CSV,并为代理提供一个简洁的摘要——行数、列名、5行预览——然后让它按需浏览文件。您将获得完整的数据集。AI会话保持精简。

查询随时间复合的历史记录 每个成功的DAX查询都会在本地记录在JSONL审计跟踪中——用户询问的内容、生成的DAX、返回的列以及CSV的保存位置。在下一个会话中,代理将搜索此历史记录以查找相关的先前工作:可重用的DAX模式、先前计算的结果文件以及早期分析的上下文。你使用它的次数越多,它就越快、越聪明——而且你总是有一个审计跟踪,知道每个数字的来源。

您的数据保留在您的计算机上 查询、结果和令牌永远不会通过云中继。服务器在本地运行,通过与Power BI web应用程序相同的OAuth设备代码流进行身份验证,并将令牌存储在操作系统的本机安全存储(Keychain/DPAPI/LibSecret)中。


它与微软的官方MCP服务器相比如何

微软为Power BI发布了两个MCP服务器。这个服务器在用途和架构上与两者都不同。

此服务器 微软远程MCP 微软建模MCP
目的 查询和分析现有模型 查询现有模型 构建和修改模型
跑 本地在您的计算机上 Microsoft的云基础架构 本地(Power BI桌面)
数据路径 直接供电BI REST API 通过Microsoft的MCP中继 本地XMLA
认证 OAuth设备代码(委托) 通过远程服务的OAuth 本地会话
大型结果 自动保存到本地CSV 仅在上下文中 不适用
只读 是 是 否
给谁的 使用Claude/Cursor的分析师 使用Copilot的分析师 模型开发人员

它看起来像什么

You: Analyse revenue by market and product category for Q1 2025

Claude: Let me explore the dataset first.
        [calls list_tables → list_measures → execute_dax]

        The query returned 73,840 rows — saved to:
        ~/powerbi_output/dax_result_revenue_q1_2025_20260313_091204.csv

        [pages through results with read_query_result]

        Summary: EMEA leads at 44% of total revenue. The top category
        is Premium Hardware in both EMEA and AMER. APAC shows the
        strongest quarter-over-quarter growth at +18%...

代理探索模式、写入DAX、处理文件并交付分析,而无需您触摸Power BI UI。


工具

工具 它做什么
authenticate 通过OAuth设备代码登录——返回URL+一次性代码;再次呼叫以完成
logout 清除缓存的令牌(强制重新身份验证)
list_apps 列出您有权访问的所有Power BI应用程序-- 从这里开始;退货 workspaceId 对于每个应用程序
list_datasets 列出工作区中的数据集/语义模型(使用 workspaceId 从 list_apps)
get_dataset_info 数据集的元数据和最后5个刷新历史条目
list_tables 数据集中的所有可见表
list_measures 具有名称、表、描述和格式字符串的度量值
list_columns 具有数据类型和键标志的列
execute_dax 运行DAX查询——内联用于小结果,本地CSV用于大结果。通过 query_summary 记录查询以供将来参考。
read_query_result 浏览大型CSV结果,而无需将其全部加载到上下文中
search_query_history 按关键字、数据集或时间范围搜索本地查询日志——在会话中查找之前的DAX和结果
delete_query_log_entry 删除查询日志条目(例如,当方法被证明是错误的时)

用户指南

先决条件

  • Python 3.10+
  • Power BI Pro、高级每用户(PPU)或高级容量许可证
  • Azure AD应用程序注册(免费,约5分钟——见下文)

步骤1--创建Azure AD应用程序注册

OAuth 2.0需要 客户端ID 以确定哪个应用程序代表您。注册是免费的,不需要客户端密码,也不需要Power BI管理员同意此处使用的两个只读范围。

  1. 首选 portal.azure.com → Azure Active Directory → 应用注册 → 新注册.

  2. 命名(例如。 PowerBI MCP).对于帐户类型,请选择 仅此组织目录中的帐户 (单租户)。点击 注册.

  3. 在...之下 认证 → 平台配置,添加 移动和桌面应用程序 并勾选此重定向URI:

    https://login.microsoftonline.com/common/oauth2/nativeclient
    
  4. 仍在进行中 认证 → 高级设置,set 允许公共客户端流 到 是。保存。

  5. 在...之下 API权限 → 添加权限 → Power BI服务,添加:

    • Dataset.Read.All
    • Workspace.Read.All

    如果您的租户需要管理员同意,请请求管理员授予。

  6. 从 概述 第页,复制这两个文件——您将在步骤2中需要它们:

    • 应用程序(客户端)ID
    • 目录(租户)ID

注: Power BI租户设置 “数据集执行查询REST API” 必须在Power BI管理门户(集成设置)中启用 execute_dax 工作。


步骤2——安装并连接

服务器发布在PyPI上。最快的跑步方式是 uvx,不需要手动安装或虚拟环境。

克劳德桌面版

将以下内容添加到您的 claude_desktop_config.json:

{
  "mcpServers": {
    "powerbi": {
      "command": "uvx",
      "args": ["powerbi-analyst-mcp"],
      "env": {
        "POWERBI_CLIENT_ID": "your-application-client-id",
        "POWERBI_TENANT_ID": "your-directory-tenant-id"
      }
    }
  }
}

配置文件位于:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  • 视窗: %APPDATA%\Claude\claude_desktop_config.json

POWERBI_TENANT_ID 几乎所有用户都需要。 大多数组织只有一个Azure AD租户。将此设置为您的 目录(租户)ID 从步骤1开始。留下它作为 organizations (默认)将导致身份验证失败或针对错误的租户。

光标

添加a .cursor/mcp.json 项目中的文件(或使用全局配置):

{
  "mcpServers": {
    "powerbi": {
      "command": "uvx",
      "args": ["powerbi-analyst-mcp"],
      "env": {
        "POWERBI_CLIENT_ID": "your-application-client-id",
        "POWERBI_TENANT_ID": "your-directory-tenant-id"
      }
    }
  }
}

pip安装(替代)

pip install powerbi-analyst-mcp

然后更换 uvx 命令块包含:

"command": "powerbi-analyst-mcp",
"args": []

Claude Desktop捆绑包(.mcpb)——用于组织范围内的分发

A. .mcpb (MCP Bundle)是Claude Desktop通过拖放安装的ZIP存档,无需手动编辑配置。捆绑包在第一次运行时自动安装所有Python依赖项;唯一的先决条件是Python 3.10+。

两个清单住在 bundle/:

文件 目的 Git
manifest.template.json 通用--在安装时通过Claude的UI提示用户输入凭据 已提交
manifest.json 特定于组织的--为静默部署硬编码的凭据 Gitigned --永不承诺

构建一个组织包:

# 1. Create your org manifest (one-time setup)
cp bundle/manifest.template.json bundle/manifest.json

编辑 bundle/manifest.json 并设定你的价值观 mcp_config.env:

"env": {
  "POWERBI_CLIENT_ID": "your-application-client-id",
  "POWERBI_TENANT_ID": "your-directory-tenant-id",
  "POWERBI_OUTPUT_DIR": "/custom/output/path"
}

POWERBI_OUTPUT_DIR 是可选的--完全省略它以使用默认值 ~/powerbi_output.

# 2. Build the bundle
chmod +x bundle/build.sh
./bundle/build.sh
# → dist/miinto-powerbi-analyst.mcpb  (gitignored)

分发: 分享 dist/*.mcpb 与同事。他们把它拖放到上面 克劳德桌面版→ 设置→ 开发者。适用于macOS和Windows。

安全: bundle/manifest.json 和 dist/ 两者都被忽视了。仅提交无凭据模板。永远不要向git跟踪的任何文件添加凭据。


典型分析工作流程

连接后,要求您的LLM自然地遵循以下顺序:

1. authenticate          ← first run only; returns a URL + code to open in browser,
                           then call authenticate again to complete sign-in
2. list_apps             → returns installed apps, each with a workspaceId
3. list_datasets         workspace_id=<workspaceId from app>   → returns dataset IDs
4. list_tables           workspace_id=<id>   dataset_id=<id>
5. list_measures         workspace_id=<id>   dataset_id=<id>   [table_name=<name>]
6. list_columns          workspace_id=<id>   dataset_id=<id>   [table_name=<name>]
7. search_query_history  [keyword="revenue"]  ← check if similar work exists from a prior session
8. execute_dax           workspace_id=<id>   dataset_id=<id>
                         dax_query="EVALUATE SUMMARIZECOLUMNS(...)"
                         [query_summary="Revenue by market and product for Q1 2025"]
                         [result_name="revenue by market q1"]  ← names the saved CSV
                         [max_rows=500]                        ← optional row cap for sampling
9. read_query_result     file_path=<savedTo>   [offset=0]   [limit=100]
                         ← page through large results without filling context

注: 总是使用 list_apps (不是 list_workspaces)以发现工作区ID。在应用程序管理的组织中,数据集访问是通过Power BI应用程序授予的——使用来自的工作区ID list_workspaces 可能会导致权限错误。

DAX查询示例

-- Total sales by year
EVALUATE
SUMMARIZECOLUMNS(
    'Date'[Year],
    "Total Sales", [Total Sales]
)
ORDER BY 'Date'[Year]

-- Top 10 customers by revenue
EVALUATE
TOPN(
    10,
    SUMMARIZECOLUMNS('Customer'[Name], "Revenue", [Revenue]),
    [Revenue], DESC
)

-- Filtered subset
EVALUATE
CALCULATETABLE(
    'Sales',
    'Date'[Year] = 2024
)

大结果处理——详细

结果大小 会发生什么
≤50行 以JSON形式内联返回——零摩擦
>50行 完整结果保存到带时间戳的CSV中;代理收到一个简洁的摘要

返回的大型结果摘要包含:

  • rowCount --写入的行总数
  • columns --列名和类型
  • preview --前5行
  • savedTo --CSV文件的绝对路径

然后,代理可以使用以下命令浏览文件 read_query_result:

read_query_result(
    file_path = "/path/from/savedTo",
    offset    = 0,      # zero-based row offset
    limit     = 100     # rows per page (default 100)
)

退货 rows, totalRows, offset, limit,以及 hasMore.增量 offset 通过 limit 以获取下一页。

execute_dax 用于控制结果大小的参数:

参数 类型 说明
query_summary str (可选) 用户请求的简短描述——记录到本地查询历史中,以实现可审计性和跨会话重用。
result_name str (可选) CSV文件名中使用的短标签,例如。 "gmv by market 2024" → dax_result_gmv_by_market_2024_20260305_143022.csv最多40个字符。
max_rows int (可选) 通过以下方式施加硬帽 TOPN 在Power BI发动机级别。可用于快速采样,而无需重写DAX。

输出目录 默认为 ~/powerbi_output.用覆盖 POWERBI_OUTPUT_DIR 在您的MCP客户的 env 块。CSV文件和查询历史日志不会自动清理——手动管理目录或添加保留策略。


局限性

  • 只读。 不支持创建、修改和删除Power BI工件。
  • execute_dax 限制:每次查询100000行或1000000个值(Power BI API硬上限)。
  • 速率限制:每位用户每分钟120个DAX查询请求。
  • list_tables, list_measures,以及 list_columns 使用DAX INFO.VIEW.* 这些函数需要启用XMLA读取访问的导入或DirectQuery模型。
  • CSV文件写入者 execute_dax 不会自动清理。

安全

  • 令牌通过操作系统本机安全存储进行持久化 msal-extensions:
    • macOS --钥匙扣
    • 视窗 --DPAPI加密文件
    • Linux --LibSecret(侏儒钥匙圈/KWallet);如果不可用,则回退到加密文件
  • 缓存文件被写入 ~/.powerbi_mcp_token_cache.bin 并且被覆盖 .gitignore.
  • 服务器从不记录访问令牌。
  • 所有数据访问都由用户自己的Power BI权限(委派的OAuth 2.0——没有服务主体,没有客户端机密)控制。

贡献

看 贡献.md 关于项目结构、开发环境设置、架构说明以及如何添加新工具。