内容
# pbi_mcp
本地MCP服务器,用于查询当前打开的Power BI Desktop模型,支持DAX查询。
## 功能
- 查找最新的Power BI Desktop Analysis Services工作区。
- 从`msmdsrv.port.txt`文件中读取实时的SSAS端口。
- 直接通过pythonnet加载Power BI ADOMD客户端。
- 运行DAX查询并返回JSON记录。
## 要求
- Windows
- 打开的Power BI Desktop,加载报表
- Python 3.12+
- 通过Power BI Desktop或Microsoft.NET安装的ADOMD.NET客户端
## 安装依赖
```bat
python -m pip install mcp pandas pythonnet
```
## 本地测试
直接运行一个简单查询:
```bat
python -c "from pbi_mcp import execute_dax_query; print(execute_dax_query('EVALUATE ROW(\"Ok\", 1)'))"
```
预期输出:
```json
[{"[Ok]":1}]
```
如果您的Power BI安装程序捆绑了`Microsoft.PowerBI.AdomdClient.dll`而不是`Microsoft.AnalysisServices.AdomdClient.dll`,代码将直接加载它。
## 端到端DAX流程
测试路径为:
1. 使用编译器生成DAX,例如通过`npx ts-node -e ...`生成`generateDax(...)`。
2. 打印一个JSON信封,如`{"kind":"powerbi.dax","version":1,"daxQuery":"..."}`。
3. 捕获`stdout`,解析JSON,提取`daxQuery`,并将该字符串传递给`query_powerbi_dax`。
这样可以减少人为输入。手动部分是生成器配置;DAX本身是一个工件。
`query_powerbi_dax`期望原始DAX文本。JSON信封仅用于生成器输出。
Python示例:
```python
import json
import subprocess
from pbi_mcp import query_powerbi_dax
generated = subprocess.run(
[
"npx",
"ts-node",
"-e",
"import { generateDax } from './src/insight/powerbi/daxStudioCompiler'; const daxQuery = generateDax({ dashboard: 'financials', date: { mode: 'last_n_months', months: 12, granularity: 'month' }, measures: ['NetCrDr Total'], top_n: { metric: 'NetCrDr Total', group_by: ['customer_l2', 'month'], n: 100, order: 'desc' } }); process.stdout.write(JSON.stringify({ kind: 'powerbi.dax', version: 1, daxQuery }));",
],
cwd=r"C:\Users\BrandonGomez\AgentToolkit\IG-CG-TEAMS-APPS\apps\chatbot",
capture_output=True,
text=True,
check=True,
).stdout
payload = json.loads(generated)
result = query_powerbi_dax(payload["daxQuery"].strip())
print(result)
```
如果生成器发出纯DAX而不是JSON,请修剪输出并直接传递:
```python
raw_dax = generated.strip()
result = query_powerbi_dax(raw_dax)
print(result)
```
如果您只想确认端口发现:
```bat
python -c "from pbi_mcp import discover_powerbi_port; print(discover_powerbi_port())"
```
## 在Codex中注册
使用Windows Python可执行文件和脚本的绝对路径:
```bat
codex mcp add pbi_mcp -- "C:\Users\BrandonGomez\AppData\Local\Programs\Python\Python312\python.exe" "C:\Users\BrandonGomez\AgentToolkit\PBIMCP2\pbi_mcp.py"
```
检查它:
```bat
codex mcp list
codex mcp get pbi_mcp
```
## 在Claude Code中注册
```bat
claude mcp add --scope user --transport stdio pbi_mcp -- "C:\Users\BrandonGomez\AppData\Local\Programs\Python\Python312\python.exe" "C:\Users\BrandonGomez\AgentToolkit\PBIMCP2\pbi_mcp.py"
```
检查它:
```bat
claude mcp list
claude mcp get pbi_mcp
```
## 示例DAX
```DAX
EVALUATE ROW("Ok", 1)
```
对于实际模型查询,请将表和列名替换为报表中存在的名称。