Metadata-Version: 2.4
Name: pbi-cli-tool
Version: 0.1.0
Summary: CLI for Power BI semantic models - wraps the Power BI MCP server for token-efficient AI agent usage
Author: pbi-cli contributors
License: MIT
Project-URL: Homepage, https://github.com/MinaSaad1/pbi-cli
Project-URL: Repository, https://github.com/MinaSaad1/pbi-cli
Project-URL: Issues, https://github.com/MinaSaad1/pbi-cli/issues
Keywords: power-bi,cli,mcp,semantic-model,dax,claude-code
Classifier: Development Status :: 3 - Alpha
Classifier: Environment :: Console
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Topic :: Database
Classifier: Topic :: Software Development :: Libraries
Requires-Python: >=3.10
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: click>=8.0.0
Requires-Dist: mcp>=1.20.0
Requires-Dist: rich>=13.0.0
Requires-Dist: httpx>=0.24.0
Requires-Dist: prompt-toolkit>=3.0.0
Provides-Extra: dev
Requires-Dist: pytest>=7.0; extra == "dev"
Requires-Dist: pytest-cov>=4.0; extra == "dev"
Requires-Dist: pytest-asyncio>=0.21; extra == "dev"
Requires-Dist: ruff>=0.4.0; extra == "dev"
Requires-Dist: mypy>=1.10; extra == "dev"
Dynamic: license-file

# pbi-cli

**Token-efficient CLI for Power BI semantic models.**

pbi-cli wraps Microsoft's Power BI MCP server so you can manage semantic models from the terminal. MCP tool schemas consume ~4,000+ tokens in an AI agent's context window; a `pbi` command uses ~30. One install, no separate MCP server configuration required.

```
pip install pbi-cli-tool
pbi setup
pbi connect --data-source localhost:54321
pbi measure list
```

## Why pbi-cli?

| Approach | Context cost | Setup |
|----------|-------------|-------|
| Raw MCP server | ~4,000 tokens per tool schema | Manual config per project |
| **pbi-cli** | **~30 tokens per command** | **`pip install pbi-cli-tool`** |

Designed for Claude Code and other AI agents, but works great for humans too. Use `--json` for machine-readable output or enjoy Rich-formatted tables by default.

## Installation

```bash
pip install pbi-cli-tool
```

### Prerequisites

- Python 3.10+
- Power BI Desktop (for local development) or a Fabric workspace

### First-time setup

Download the Power BI MCP binary:

```bash
pbi setup
```

This downloads the official Microsoft binary from the VS Code Marketplace to `~/.pbi-cli/bin/`. You can also point to an existing binary:

```bash
export PBI_MCP_BINARY=/path/to/powerbi-modeling-mcp
```

## Quick Start

### Connect to Power BI Desktop

```bash
# Connect to a local Power BI Desktop instance
pbi connect --data-source localhost:54321

# Connect to a Fabric workspace model
pbi connect-fabric --workspace "My Workspace" --model "Sales Model"
```

### Run DAX queries

```bash
pbi dax execute "EVALUATE TOPN(10, Sales)"
pbi dax execute --file query.dax
cat query.dax | pbi dax execute -
```

### Manage measures

```bash
pbi measure list
pbi measure create "Total Revenue" --expression "SUM(Sales[Revenue])" --table Sales
pbi measure get "Total Revenue" --table Sales
```

### Export and import models

```bash
pbi database export-tmdl ./my-model/
pbi database import-tmdl ./my-model/
```

## Command Reference

| Group | Description | Examples |
|-------|-------------|---------|
| `setup` | Download and manage the MCP binary | `pbi setup`, `pbi setup --check` |
| `connect` | Connect to Power BI via data source | `pbi connect -d localhost:54321` |
| `connect-fabric` | Connect to Fabric workspace | `pbi connect-fabric -w "WS" -m "Model"` |
| `disconnect` | Disconnect from active connection | `pbi disconnect` |
| `connections` | Manage saved connections | `pbi connections list` |
| `dax` | Execute and validate DAX queries | `pbi dax execute "EVALUATE Sales"` |
| `measure` | CRUD for measures | `pbi measure list`, `pbi measure create` |
| `table` | CRUD for tables | `pbi table list`, `pbi table get Sales` |
| `column` | CRUD for columns | `pbi column list --table Sales` |
| `relationship` | Manage relationships | `pbi relationship list` |
| `model` | Model metadata and refresh | `pbi model get`, `pbi model refresh` |
| `database` | Import/export TMDL and TMSL | `pbi database export-tmdl ./out/` |
| `security-role` | Row-level security roles | `pbi security-role list` |
| `calc-group` | Calculation groups and items | `pbi calc-group list` |
| `partition` | Table partitions | `pbi partition list --table Sales` |
| `perspective` | Model perspectives | `pbi perspective list` |
| `hierarchy` | User hierarchies | `pbi hierarchy list --table Date` |
| `expression` | Named expressions | `pbi expression list` |
| `calendar` | Calendar table management | `pbi calendar list` |
| `trace` | Diagnostic traces | `pbi trace start` |
| `transaction` | Explicit transactions | `pbi transaction begin` |
| `advanced` | Cultures, translations, functions | `pbi advanced culture list` |
| `repl` | Interactive REPL session | `pbi repl` |

Run `pbi <command> --help` for full option details.

## REPL Mode

The interactive REPL keeps the MCP server process alive across commands, avoiding the 2-3 second startup cost on each invocation:

```
$ pbi repl
pbi-cli interactive mode. Type 'exit' or Ctrl+D to quit.
pbi> connect --data-source localhost:54321
Connected: localhost-54321 (localhost:54321)
pbi(localhost-54321)> measure list
...
pbi(localhost-54321)> dax execute "EVALUATE Sales"
...
pbi(localhost-54321)> exit
Goodbye.
```

Features:
- Persistent MCP server connection (no restart between commands)
- Command history (stored at `~/.pbi-cli/repl_history`)
- Tab completion for commands and subcommands
- Dynamic prompt showing active connection name

## For AI Agents

Use `--json` before the subcommand for machine-readable JSON output:

```bash
pbi --json measure list
pbi --json dax execute "EVALUATE Sales"
pbi --json model get
```

JSON output goes to stdout. Status messages go to stderr. This makes piping and parsing straightforward.

### Named connections

Use `-c` to target a specific named connection:

```bash
pbi -c my-conn measure list
pbi -c prod-model dax execute "EVALUATE Sales"
```

## Configuration

pbi-cli stores its configuration in `~/.pbi-cli/`:

```
~/.pbi-cli/
  config.json          # Binary version, path, args
  connections.json     # Named connections
  repl_history         # REPL command history
  bin/
    {version}/
      powerbi-modeling-mcp[.exe]
```

### Binary resolution order

1. `PBI_MCP_BINARY` environment variable (explicit override)
2. `~/.pbi-cli/bin/{version}/` (managed by `pbi setup`)
3. VS Code extension fallback (`~/.vscode/extensions/analysis-services.powerbi-modeling-mcp-*/server/`)

## Development

```bash
git clone https://github.com/pbi-cli/pbi-cli.git
cd pbi-cli
pip install -e ".[dev]"

# Lint
ruff check src/ tests/

# Type check
mypy src/

# Test
pytest -m "not e2e"
```

## Contributing

Contributions are welcome! Please open an issue first to discuss what you would like to change.

1. Fork the repository
2. Create a feature branch (`git checkout -b feature/my-change`)
3. Make your changes with tests
4. Run `ruff check` and `mypy` before submitting
5. Open a pull request

## License

[MIT](LICENSE)
