Skip to main content
Glama
djorshuam

powerbi-local

by djorshuam
README.md
# Power BI Local MCP Server (Python)

Servidor MCP que conecta ao motor Analysis Services Tabular local que o
Power BI Desktop expõe enquanto está com um arquivo aberto. Funciona com
`.pbix` e `.pbip`. 100% local: sem Azure AD, sem login online, sem publicar
nada na nuvem.

## Pré-requisitos

- **Windows.** O driver ADOMD.NET e a descoberta de porta são específicos
  de Windows.
- **Python 3.10+** (`python --version`).
- **.NET Runtime 8** — [download](https://dotnet.microsoft.com/download).
  Não é o .NET Framework que já vem no Windows: o driver roda sobre o .NET
  moderno (CoreCLR). O *Runtime* basta; o SDK não é necessário.
- **Power BI Desktop**, com um arquivo aberto na hora do uso.

Você **não** precisa do SQL Server Management Studio. O driver ADOMD.NET é
baixado direto do nuget.org (~2 MB) pelo `driver_setup.py`.

## Instalar

Rode o `instalar.bat` (duplo clique), ou manualmente:

```
pip install -r requirements.txt
python driver_setup.py
```

O `driver_setup.py` baixa o pacote NuGet oficial
`Microsoft.AnalysisServices.AdomdClient.NetCore.retail.amd64` e extrai os
DLLs para `vendor/`. Se a máquina já tiver o driver no cache do NuGet ou no
GAC, ele reaproveita e não baixa nada.

## Instalar como plugin do Claude Code

Este repositorio e um plugin do Claude Code e tambem um marketplace de um
plugin so. Para instalar:

```
/plugin marketplace add djorshuam/claude-mcp-powerbi
/plugin install powerbi-local@powerbi-local-marketplace
```

Depois de instalar, rode `/powerbi-setup` uma vez: ele instala as
dependencias Python, confere o runtime .NET e baixa o driver ADOMD.

Se voce tem varias versoes de Python, informe o caminho completo do
`python.exe` na opcao **Caminho do python.exe** do plugin -- e o mesmo
problema que o `command` do Claude Desktop resolve, so que pela config do
plugin.

O plugin traz:

- o servidor MCP `powerbi-local` com as 5 ferramentas
- a skill `powerbi-analysis`, que ensina o fluxo correto (porta primeiro) e
  as armadilhas de DAX/DMV
- o comando `/powerbi-setup` para diagnostico

## Configurar no Claude Desktop

No `claude_desktop_config.json`:

```json
{
  "mcpServers": {
    "powerbi-local": {
      "command": "C:\\Python314\\python.exe",
      "args": ["C:\\CAMINHO\\PARA\\powerbi-mcp-python\\server.py"]
    }
  }
}
```

Use o **caminho completo** do `python.exe`, não só `"python"`, se houver
mais de uma versão instalada — o Claude Desktop pode resolver para uma que
não tem as dependências.

Salve e **reinicie o Claude Desktop completamente**.

## Ferramentas

| Ferramenta | O que faz |
|---|---|
| `list_open_instances` | Descobre instâncias abertas do Power BI e suas portas |
| `list_databases` | Lista modelos disponíveis numa porta |
| `list_tables` | Lista tabelas visíveis do modelo |
| `list_measures` | Lista medidas com a expressão DAX completa |
| `run_dax_query` | Executa `EVALUATE ...` e retorna as linhas (máx. 500) |

Comece sempre por `list_open_instances` para obter a porta.

## Testar manualmente

```
python server.py
```

O processo fica esperando input via stdio — é o comportamento normal de um
servidor MCP, não um travamento. Ctrl+C para sair.

## Notas de implementação

Coisas que custaram tempo para descobrir e que não são óbvias:

- **`pythonnet.load("coreclr")` antes de `import clr`.** No pythonnet 3.x o
  runtime .NET não é carregado sozinho, e sem isso o `clr.AddReference`
  falha em resolver os tipos do assembly.
- **A pasta de workspace muda conforme a instalação do Power BI.** Versão
  MSI usa `%LOCALAPPDATA%\Microsoft\Power BI Desktop\`; versão da Microsoft
  Store usa `%USERPROFILE%\Microsoft\Power BI Desktop Store App\`. O
  `pbi_discovery.py` varre as duas.
- **`msmdsrv.port.txt` é UTF-16 little-endian sem BOM.**
- **Os DMVs aceitam só um subconjunto restrito de SQL.** Não permitem
  `WHERE` sobre coluna booleana (`WHERE [IsHidden] = FALSE` falha com "Uma
  expressão Booliana não é permitida no contexto") nem `INNER JOIN`. Por
  isso o filtro de tabelas ocultas e o cruzamento medida→tabela são feitos
  em Python.

## Limitações conhecidas

- Só enxerga instâncias do **usuário Windows atual** (lê `%USERPROFILE%`).
- `run_dax_query` trunca em 500 linhas.
- Somente leitura: não cria nem altera medidas.
- Requer acesso a `nuget.org` na primeira instalação. Em rede corporativa
  com proxy bloqueando, copie a pasta `vendor/` de outra máquina.