pbi-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@pbi-mcpscaffold a multi-page report from the sales project model"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
pbi-mcp
MCP servers for local-file Power BI Project (.pbip) automation — model
(TMDL) and report (PBIR) layers. No Power BI API, no auth, no cloud: the
tools read and write the on-disk project files Power BI Desktop itself uses.
Build a correctly-bound, themed, filtered, multi-page report — or bulk-author hundreds of measures — from a prompt, in minutes. 56 tools across two MCP servers; every report write is pre-flight validated against the official Fabric schemas.
Fastest path: pbi_set_project(path) → pbi_scaffold_report() profiles
the model and builds a themed, navigable, multi-page designed report in one
call (use dry_run=true to review the proposal first). Or compose it yourself
with pbi_build_designed_page, the design elements, and the theme generator.
Scope honesty. This builds structure, speed, consistency. It does not do custom Deneb/Vega visuals, AppSource visual sourcing, or replace design taste. It's a fast report builder, not an autonomous report designer.
Safety model (the part that matters)
The one unforgivable bug for a tool like this is producing a project Desktop refuses to open. Every mutation therefore goes through:
atomic writes (temp file + rename — a crash never leaves a half file)
backup-once-per-file snapshots (
*.bak-<timestamp>), withpbi_list_backups/pbi_restore_backupto recoversurgical text edits for TMDL — the parsed model is never re-emitted, so partitions, annotations, and M source are preserved byte-for-byte
style preservation — each file keeps its exact line endings + BOM (Desktop mixes CRLF and LF across file types)
deletion fail-safes — deleting a measure that other measures, visuals, or filters depend on is refused (transitive DAX lineage + report usage);
force=trueoverrides,dry_run=truepreviewsrecoverable visual deletes — removed visuals move to
Report/.pbi/mcp-trash/, which Desktop ignores
Related MCP server: PBIXRay MCP Server
Download the plugin
For the easiest install, download one of the bundles from dist/:
pbi-mcp-standalone-win32-amd64.plugin- self-contained Windows build; no local Python setup required.pbi-mcp.plugin- source plugin bundle; requires Python 3.11+ and the package dependencies on the host.
Drag the .plugin file into a plugin-aware MCP host, then call
pbi_set_project(path) first in both pbi-model and pbi-report sessions.
Quickstart
git clone <repo> && cd pbi-mcp
python -m venv .venv
.venv\Scripts\pip install -e ".[dev]"
.venv\Scripts\python -m pytest # green suite = good to goRegister in Claude Desktop: run scripts/package.py, then merge
dist/claude_desktop_config.snippet.json into your
claude_desktop_config.json and restart. Or drag-drop dist/pbi-mcp.plugin
into a plugin-aware host. Details: INSTALL.md inside the bundle.
Every session starts with pbi_set_project(path) — point it at a .pbip
saved with Desktop's PBIP preview format (enable Power BI Project (.pbip)
save option + PBIR enhanced metadata in Options → Preview features).
Tool reference
pbi-model server (semantic model / TMDL)
Tool | What it does |
| Select the project; returns table/measure counts |
| Tables, columns, measures, relationships snapshot |
| Measures with DAX + format string |
| DAX dependency graph; per-measure deps + direct/transitive dependents |
| Create (name must be unique model-wide) |
| Partial update; omitted fields kept |
| Delete with lineage + report-usage guards |
| Data column, or calculated column with |
| Endpoints validated; duplicates detected |
| Full calc-group table + model.tmdl registration |
| Batch create; whole batch validated before any write |
| Recovery |
pbi-report server (report / PBIR)
Tool | What it does |
| Select the project; returns page/visual counts |
| Pages: id, name, size, visual count, hidden |
| Visuals with type, position, title, bindings |
| Full config incl. raw visual.json |
| Classify every field direct / indirect / unused — the deletion fail-safe |
| New page, registered in pages.json |
| Batch add; buckets + model refs validated before any write |
| One call: page + visuals + auto-layout (KPI row, 2-col grid) |
| Rebind; formatting/position preserved |
| Partial move/resize |
| Recoverable delete (→ .pbi/mcp-trash) |
|
|
| Install + activate a standard PBI theme JSON |
| Categorical / Advanced / TopN / RelativeDate at report, page, or visual scope |
pbi-report — design, intelligence & lifecycle (v2)
Tool | What it does |
| Machine-readable spec: visual types, buckets, filters, examples |
| Autopilot: profile the model → themed multi-page designed report (dry_run to review) |
| Classify fact/dimension/date tables, measure roles, grouping columns |
| Header band + KPI strip on backplates + chart grid, one call |
| Brand color → coherent theme (palette, text classes, light/dark) |
| Design elements: titles, logos, backplates, dividers |
| Canvas background + wallpaper |
| Group as one block; raw escape hatch for any visual |
| Sort; page-navigation buttons |
| Drillthrough/tooltip pages; cross-filter control |
| Capture page + filter state |
| Page lifecycle (delete is recoverable) |
| Filter + trash management |
| Schema validation + design lint |
| Diff vs another project/backup; overview |
Binding format
Bindings are {bucket: ["Table.Field", ...]}. Measures vs columns are
resolved automatically. Bucket names are per-visual-type and validated from
core/visual_specs.py, whose contents were surveyed from real Desktop
exports (150+ visuals) — notably: the Legend bucket is Series, combo
charts use Y + Y2, donut charts have no Category.
// a bar chart spec for pbi_add_visual / pbi_build_page
{
"visual_type": "clusteredBarChart",
"bindings": {"Category": ["Date.Year"], "Y": ["Sales.Net Revenue"]},
"title": "Revenue by Year",
"position": {"x": 40, "y": 40, "width": 600, "height": 360} // optional
}Layout
pbi-mcp/
core/ # PbipProject + TMDL/PBIR read-write, specs, lineage,
# usage classifier, formatting/filter builders, safe I/O
model_server/ # MCP server: pbi-model
report_server/ # MCP server: pbi-report
scripts/ # smoke test, M5 demo, packager
tests/ # 220+ tests; fixtures/ (synthetic + real, gitignored)Testing
Fixture-based + golden files + fuzz. The suite runs against a synthetic PBIP
project (committed) and any real exports dropped under tests/fixtures/real/
(auto-discovered, never committed). Golden snapshots of emitted visual.json
live in tests/goldens/ (regenerate deliberately with
PBI_MCP_REGEN_GOLDENS=1). A seeded 60-op fuzz storm asserts the project
always reloads parseable. The reopen-in-Desktop check stays a manual gate
before each release.
License
MIT.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/rajdeepraoextras-dev/PBI-MCP-Server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server