io.github.mafaq229/pbirb-mcp
PYPI · PBIRB-MCP · SCANNED SEP 20
MCP server for editing Power BI Report Builder paginated reports (RDL)
Available components
How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. How we score → Why this is hard to score →
Supply Chain Security50
- Malware scan not yet available for this package.Unverified
- No known CVEs affecting this package version or its production dependencies.Pass
- Runs setuptools.build_meta at install time, a recognised native-build step with no shell scripting around it. View diagnostics → Pass
- 0 of 1 dependencies flagged as unhealthy. View diagnostics → Pass
Provenance & Transparency48
- Source repository is publicly reachable at the declared URL. View diagnostics → Pass
- Provenance check failed: no build-provenance attestation is published. See how to fix → View diagnostics → Fail
- Clear OSI-approved license (MIT).Pass
- Actively maintained (last published 93 days ago).Pass
- Publishes a security disclosure policy (SECURITY.md).Pass
Schema Quality & AI Usability76
- AI-judged instruction clarity (excellent).Pass
- Context-footprint check failed: tool/resource definitions use about 17305 tokens (~121/item across 143 items; 143 tools + 0 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management87
- Stability observed for 26 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage70
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 10% of tool parameters carry a description.Partial
Tool Safety75
- No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.Pass
- 0 of 15 tool(s) whose name or description implies an irreversible operation declare an MCP destructiveHint annotation; "remove_data_source" implies "remove" and declares no destructiveHint at all, which the MCP spec reads as destructive by default. See how to fix → Fail
- An AI judge read all 143 captured unit(s) of tool text and found none that tries to manipulate the model reading it.Pass
Capabilities20
- Spec-recency check failed: implements MCP spec 2024-11-05; the latest is 2026-07-28. See how to fix → Fail
How do I install the io.github.mafaq229/pbirb-mcp server?
io.github.mafaq229/pbirb-mcp runs locally as a PyPI package, launched with uvx pbirb-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.
pypi · pbirb-mcp
claude mcp add mafaq229-pbirb-mcp -- uvx pbirb-mcp
{
"mcpServers": {
"mafaq229-pbirb-mcp": {
"command": "uvx",
"args": [
"pbirb-mcp"
]
}
}
} {
"servers": {
"mafaq229-pbirb-mcp": {
"command": "uvx",
"args": [
"pbirb-mcp"
]
}
}
} codex mcp add mafaq229-pbirb-mcp -- uvx pbirb-mcp
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"mafaq229-pbirb-mcp": {
"type": "local",
"command": [
"uvx",
"pbirb-mcp"
],
"enabled": true
}
}
} openclaw mcp add mafaq229-pbirb-mcp --command uvx --arg pbirb-mcp
mcp_servers:
mafaq229-pbirb-mcp:
command: "uvx"
args: ["pbirb-mcp"] {
"McpServers": {
"mafaq229-pbirb-mcp": {
"Transport": "stdio",
"Command": "uvx",
"Arguments": [
"pbirb-mcp"
]
}
}
} assistant mcp add mafaq229-pbirb-mcp -t stdio -c uvx -a pbirb-mcp
{
"mcpServers": {
"mafaq229-pbirb-mcp": {
"command": "uvx",
"args": [
"pbirb-mcp"
]
}
}
} Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 19 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 80 to 83. That category is still filling its 30-day observation window: 24 days of observed history at the previous scan, 25 at this one. The score rises as the window fills, whether or not the server changes.
- 17 Sept 26 −3
- Stability: pass → 0.77 functional
- 16 Sept 26 0
- Stability: 0.97 → pass security
- 15 Sept 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 93 to 97. That category is still filling its 30-day observation window: 28 days of observed history at the previous scan, 29 at this one. The score rises as the window fills, whether or not the server changes.
- 13 Sept 26 −14
- Malware scan: pass → unverified ▼ security
- 12 Sept 26 +15
- Malware scan: unverified → pass ▲ security
- 11 Sept 26 −2
- Stability: pass → 0.83 functional
- 10 Sept 26 0
- Stability: 0.97 → pass security
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 20 Sept 2026 · Analysed pypi/pbirb-mcp@0.4.1
Provenance No attestation
The registry publishes no build provenance for this version, so there is nothing to verify.
| Result | No attestation |
|---|---|
| Ecosystem | pypi |
Background: How many MCP packages publish verified provenance →
Install scripts 1 script
| Hook | Tier | Command |
|---|---|---|
| build_backend | allowlisted | setuptools.build_meta |
Background: Why install scripts are a supply-chain risk →
Dependencies 1 package
| Packages resolved | 1 |
|---|---|
| Tree resolution | Complete |
Background: SBOMs and build attestations, explained →
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability. A tool's description is untrusted text the model reads on every call, which is what makes this list a security surface and not just an inventory: how tool poisoning works →
add_body_image ~96
Add an Image to <Body>/<ReportItems>. image_source: External (URL), Embedded (EmbeddedImage Name), Database (=Fields!Photo.Value).
| Name | Type | Req | Description |
|---|---|---|---|
| height | string | yes | – |
| image_source | string | yes | – |
| left | string | yes | – |
| name | string | yes | – |
| path | string | yes | – |
| top | string | yes | – |
| value | string | yes | – |
| width | string | yes | – |
No output schema declared.
No examples provided.
add_body_textbox ~147
Add a Textbox to <Body>/<ReportItems>. text accepts static strings or RDL expressions (e.g. =Globals!ReportName). Coexists with the existing tablix; rejects names already in use. Pass raw text — encoding is handled; don't pre-encode XML entities (use `&` not `&`, including for the VB.NET string-concat operator in expressions).
| Name | Type | Req | Description |
|---|---|---|---|
| height | string | yes | – |
| left | string | yes | – |
| name | string | yes | – |
| path | string | yes | – |
| text | string | yes | Static text or RDL expression (=...). |
| top | string | yes | – |
| width | string | yes | – |
No output schema declared.
No examples provided.
add_calculated_field ~126
Append a calculated <Field> to the named dataset. Calculated fields carry an expression (<Value>) instead of a column reference (<DataField>); use them for derived fields like Total = Amount * Quantity that aren't in the source query but should be available via Fields!Name.Value. Refuses if a field of the same name already exists.
| Name | Type | Req | Description |
|---|---|---|---|
| dataset_name | string | yes | – |
| expression | string | yes | RDL expression, e.g. '=Fields!Amount.Value * Fields!Quantity.Value'. |
| field_name | string | yes | – |
| path | string | yes | – |
No output schema declared.
No examples provided.
add_chart_series ~184
Append a new <ChartSeries> to a named chart. value_field is the dataset field whose Sum becomes the Y expression (=Sum(Fields!<value_field>.Value)). series_type defaults to Column; combine series of different types in one chart for combo charts (e.g. Bar + Line). series_subtype defaults to Plain. Refuses if series_name already exists.
| Name | Type | Req | Description |
|---|---|---|---|
| chart_name | string | yes | – |
| path | string | yes | – |
| series_name | string | yes | – |
| series_subtype | string | – | Plain / Stacked / PercentStacked / Smooth / Exploded / SmoothLine / 100 / Line / Spline |
| series_type | string | – | Column / Bar / Line / Area / Pie / Doughnut / Range / Scatter / Bubble / Stock / Polar / Radar / Funnel / Pyramid |
| value_field | string | yes | – |
No output schema declared.
No examples provided.
add_column_group ~138
Add a column group that wraps the current top-level column hierarchy. Inserts a matching column at body column 0 (default 1in width) and a header cell at column 0 of every existing row with the group expression in the topmost cell. Mirrors add_row_group on the column axis. parent_group nesting is reserved for a future commit and currently raises NotImplementedError.
| Name | Type | Req | Description |
|---|---|---|---|
| group_expression | string | yes | RDL expression, e.g. =Fields!Region.Value |
| group_name | string | yes | – |
| parent_group | string|null | – | – |
| path | string | yes | – |
| tablix_name | string | yes | – |
No output schema declared.
No examples provided.
add_data_source ~197
Create a new <DataSource> for a Power BI XMLA endpoint. workspace_url accepts a bare workspace name or a full powerbi:// URL. Generates a fresh rd:DataSourceID GUID. Refuses if a DataSource of the same name already exists. provider='sql' (default) emits the legacy DataProvider=SQL + powerbi:// ConnectString + <rd:SecurityType> shape; provider='pbidataset' emits the modern PBI Desktop shape — DataProvider=PBIDATASET, pbiazure:// ConnectString with ClaimsToken auth, plus <rd:PowerBIWorkspaceName> / <rd:PowerBIDatasetName> siblings, no <rd:SecurityType>.
| Name | Type | Req | Description |
|---|---|---|---|
| dataset_name | string | yes | – |
| integrated_security | boolean | – | – |
| name | string | yes | – |
| path | string | yes | – |
| provider | string | – | – |
| workspace_url | string | yes | – |
No output schema declared.
No examples provided.
add_dataset_field ~186
Append a data-bound <Field> to a dataset's <Fields> block. Writes <DataField>data_field</DataField> (and optional <rd:TypeName>type_name</rd:TypeName>). Distinct from add_calculated_field which writes <Value> for derived fields. Use after rewriting the DAX to declare a new column that came back from the query but isn't yet in <Fields>. Refuses on duplicate field name.
| Name | Type | Req | Description |
|---|---|---|---|
| data_field | string | yes | Source column reference, e.g. 'Sales[ProductID]' or '[Region]' (the form depends on DAX shape). |
| dataset_name | string | yes | – |
| field_name | string | yes | – |
| path | string | yes | – |
| type_name | string|null | – | .NET type, e.g. 'System.String', 'System.DateTime', 'System.Decimal'. Optional. |
No output schema declared.
No examples provided.
add_dataset_filter ~208
Append a <Filter> to the named dataset's <Filters> block. operator ∈ Equal / NotEqual / GreaterThan / LessThan / GreaterThanOrEqual / LessThanOrEqual / Like / In / Between / TopN / BottomN / TopPercent / BottomPercent. values must be non-empty (single-value filters use a one-element list). Returns the new filter's index for later removal. Optional field_format wraps the expression as Format(<body>, fmt) to coerce typed fields for string-parameter comparison. Response includes warnings for field/parameter type mismatches detected via best-effort cross-check.
| Name | Type | Req | Description |
|---|---|---|---|
| dataset_name | string | yes | – |
| expression | string | yes | FilterExpression — usually a Fields! reference. |
| field_format | string | – | Optional format string (e.g. 'MMM, yyyy') wrapping the expression as Format(<body>, '<fmt>'). |
| operator | string | yes | – |
| path | string | yes | – |
| values | array | yes | – |
No output schema declared.
No examples provided.
add_embedded_image ~139
Read a real image file off disk, base64-encode it, and store it under <EmbeddedImages>. Reference it later with image_source='Embedded' + value=<name>. Supported MIME types: image/bmp, image/gif, image/jpeg, image/png, image/x-png. The file's magic bytes are sniffed and must match mime_type — claiming PNG bytes as image/jpeg is rejected here rather than letting Report Builder fail at preview time.
| Name | Type | Req | Description |
|---|---|---|---|
| image_path | string | yes | Filesystem path to the source image. |
| mime_type | string | yes | – |
| name | string | yes | – |
| path | string | yes | – |
No output schema declared.
No examples provided.
add_footer_image ~95
Same as add_header_image, for <PageFooter>.
| Name | Type | Req | Description |
|---|---|---|---|
| height | string | yes | – |
| image_source | string | yes | – |
| left | string | yes | – |
| name | string | yes | – |
| path | string | yes | – |
| top | string | yes | – |
| value | string | yes | URL for External, embedded-image name for Embedded, or =Fields!X.Value for Database. |
| width | string | yes | – |
No output schema declared.
No examples provided.
add_footer_textbox ~79
Same as add_header_textbox, for <PageFooter>.
| Name | Type | Req | Description |
|---|---|---|---|
| height | string | yes | – |
| left | string | yes | – |
| name | string | yes | – |
| path | string | yes | – |
| text | string | yes | Static text or RDL expression (=...). |
| top | string | yes | – |
| width | string | yes | – |
No output schema declared.
No examples provided.
add_header_image ~122
Add an Image to <PageHeader>/<ReportItems>. image_source is External (URL in value), Embedded (EmbeddedImage Name in value), or Database (=Fields!Photo.Value-style expression).
| Name | Type | Req | Description |
|---|---|---|---|
| height | string | yes | – |
| image_source | string | yes | – |
| left | string | yes | – |
| name | string | yes | – |
| path | string | yes | – |
| top | string | yes | – |
| value | string | yes | URL for External, embedded-image name for Embedded, or =Fields!X.Value for Database. |
| width | string | yes | – |
No output schema declared.
No examples provided.
add_header_textbox ~131
Add a Textbox to <PageHeader>/<ReportItems>. text accepts static strings or RDL expressions (=Parameters!DateFrom.Value). Pass raw text — encoding is handled; don't pre-encode XML entities (use `&` not `&`, including for the VB.NET string-concat operator in expressions).
| Name | Type | Req | Description |
|---|---|---|---|
| height | string | yes | – |
| left | string | yes | – |
| name | string | yes | – |
| path | string | yes | – |
| text | string | yes | Static text or RDL expression (=...). |
| top | string | yes | – |
| width | string | yes | – |
No output schema declared.
No examples provided.
add_line ~163
Add a <Line> to <Body>/<ReportItems>. RDL Line semantics: top/left is the start point; width/height is the offset (vector) to the end point — horizontal line uses height='0in', vertical uses width='0in'. Optional color, line_thickness ('1pt' default), line_style (Solid/Dashed/Dotted/Double/etc.). Returns {name, kind: 'Line'}.
| Name | Type | Req | Description |
|---|---|---|---|
| color | string | – | – |
| height | string | yes | – |
| left | string | yes | – |
| line_style | string | – | – |
| line_thickness | string | – | – |
| name | string | yes | – |
| path | string | yes | – |
| top | string | yes | – |
| width | string | yes | – |
No output schema declared.
No examples provided.
add_list ~149
Add a List (single-cell repeating Tablix) bound to a dataset. RDL has no distinct <List> element — Report Builder's List is a Tablix with one column, one detail row, and a Rectangle inside the cell. Items placed in the rectangle repeat once per dataset row. The inner rectangle is named '<name>_Rect' for subsequent lookup. Returns {name, kind: 'Tablix', dataset, rectangle}.
| Name | Type | Req | Description |
|---|---|---|---|
| dataset_name | string | yes | – |
| height | string | yes | – |
| left | string | yes | – |
| name | string | yes | – |
| path | string | yes | – |
| top | string | yes | – |
| width | string | yes | – |
No output schema declared.
No examples provided.
add_parameter ~125
Create a new ReportParameter with a minimal valid declaration. Appends to <ReportParameters> (creating it if absent). Pair with set_parameter_available_values / set_parameter_default_values afterwards for value lists. Booleans are only emitted when an explicit value is supplied.
| Name | Type | Req | Description |
|---|---|---|---|
| allow_blank | boolean|null | – | – |
| allow_null | boolean|null | – | – |
| hidden | boolean|null | – | – |
| multi_value | boolean|null | – | – |
| name | string | yes | – |
| path | string | yes | – |
| prompt | string|null | – | – |
| type | string | yes | – |
No output schema declared.
No examples provided.
add_query_parameter ~186
Add a <QueryParameter> binding to a dataset's query. Use to wire report parameters into DAX (e.g. =Parameters!DateFrom.Value). PBIDATASET parameter naming rule: in DAX/<CommandText>, write @MyParam (with @). In <QueryParameter Name=...>, write MyParam (no @). SQL/MDX use @ in both places. This tool detects the dataset's provider and AUTO-STRIPS a leading @ from `name` for PBIDATASET datasets, returning {normalised: true, warning: ...}. Pass force_at_prefix=true to override (rare; needed for some RSCustomDaxFilter patterns).
| Name | Type | Req | Description |
|---|---|---|---|
| dataset_name | string | yes | – |
| force_at_prefix | boolean | – | – |
| name | string | yes | – |
| path | string | yes | – |
| value_expression | string | yes | – |
No output schema declared.
No examples provided.
add_rectangle ~180
Add a <Rectangle> to <Body>/<ReportItems>. With no contained_items the rectangle is empty (a visual frame). With contained_items=[name1, name2, ...], each named body item is MOVED into the rectangle's <ReportItems> and its <Top>/<Left> recalculated so the on-screen position is preserved. Refuses on duplicate name or if any contained_item isn't in <Body>/<ReportItems>. Returns {name, kind: 'Rectangle', moved}.
| Name | Type | Req | Description |
|---|---|---|---|
| contained_items | array | – | Optional names of existing body items to move into the rectangle. Omit or pass [] for an empty rectangle (visual frame). |
| height | string | yes | – |
| left | string | yes | – |
| name | string | yes | – |
| path | string | yes | – |
| top | string | yes | – |
| width | string | yes | – |
No output schema declared.
No examples provided.
add_row_group ~119
Add a row group that wraps the entire current top-level row hierarchy. Inserts a matching group-header row at body row 0 with the group expression in the first cell. parent_group (nesting under an existing group) is reserved for a future commit and currently raises NotImplementedError.
| Name | Type | Req | Description |
|---|---|---|---|
| group_expression | string | yes | RDL expression, e.g. =Fields!Region.Value |
| group_name | string | yes | – |
| parent_group | string|null | – | – |
| path | string | yes | – |
| tablix_name | string | yes | – |
No output schema declared.
No examples provided.
add_static_column ~143
Add a static (no-group) column to a tablix. Each cell holds literal text. cells is a list of strings, one per body row (top to bottom); shorter list = blank trailing cells, longer list errors. Cell textboxes are named column_name (row 0) and column_name_<row_index> (others). position is 0-indexed; default appends. width defaults to 1in.
| Name | Type | Req | Description |
|---|---|---|---|
| cells | array|null | – | – |
| column_name | string | yes | – |
| path | string | yes | – |
| position | integer|null | – | – |
| tablix_name | string | yes | – |
| width | string|null | – | – |
No output schema declared.
No examples provided.
add_static_row ~160
Add a static (no-group) row to a tablix. Each cell holds literal text. cells is a list of strings, one per body column (left to right); shorter list = blank trailing cells, longer list errors. Cell textboxes are named row_name (col 0) and row_name_<col_index> (others) — unique report-wide so row_name must not clash with any existing textbox. position is 0-indexed; default appends. height defaults to 0.25in.
| Name | Type | Req | Description |
|---|---|---|---|
| cells | array|null | – | – |
| height | string|null | – | – |
| path | string | yes | – |
| position | integer|null | – | – |
| row_name | string | yes | – |
| tablix_name | string | yes | – |
No output schema declared.
No examples provided.
add_subtotal_column ~190
Column-axis mirror of add_subtotal_row. Adds a static TablixMember inside the column-group's <TablixMembers>, a new <TablixColumn> in TablixBody, and a cell at the new column index in every body row. aggregates is a list of {row, expression} entries where row is the 0-based body row index; rows not listed get blank cells. position='after' (default — canonical Grand Total slot, appends to the right of the column group) or 'before' (prepends to the group's left edge). width defaults to '1in'. Group must have been added via add_column_group.
| Name | Type | Req | Description |
|---|---|---|---|
| aggregates | array | yes | – |
| group_name | string | yes | – |
| path | string | yes | – |
| position | string | – | – |
| tablix_name | string | yes | – |
| width | string | – | – |
No output schema declared.
No examples provided.
add_subtotal_row ~157
Append a subtotal row to a row-axis group. aggregates is a list of {column, expression} entries; column matches against the Details row's textbox names (the same names add_tablix_column uses as column_name — NOT field names). expression is the aggregate (e.g. =Sum(Fields!X.Value)). Columns not listed get blank cells. position='footer' (default) appends; 'header' inserts at body row 1 (right after the group-header row). Group must have been added via add_row_group.
| Name | Type | Req | Description |
|---|---|---|---|
| aggregates | array | yes | – |
| group_name | string | yes | – |
| path | string | yes | – |
| position | string | – | – |
| tablix_name | string | yes | – |
No output schema declared.
No examples provided.
add_tablix_column ~192
Append (or insert) a column into a tablix. column_name is the textbox name placed in the data row's new cell — must be unique report-wide. expression goes inside that textbox's TextRun (typically =Fields!X.Value). For a tablix with >= 2 rows the first row gets header_text (default = column_name) as a literal, middle rows get blank cells, and the last row gets expression. position is 0-indexed; default appends at end. width defaults to 1in. Inserts a matching top-level TablixMember in the column hierarchy at the same index.
| Name | Type | Req | Description |
|---|---|---|---|
| column_name | string | yes | – |
| expression | string | yes | – |
| header_text | string|null | – | – |
| path | string | yes | – |
| position | integer|null | – | – |
| tablix_name | string | yes | – |
| width | string|null | – | – |
No output schema declared.
No examples provided.
add_tablix_filter ~166
Append a <Filter> to a tablix. Operator must be one of the RDL 2016 enumeration (Equal, NotEqual, GreaterThan, In, Between, ...). Returns the new filter's index for follow-up calls. Optional field_format wraps the expression as Format(<body>, fmt) to coerce typed fields for string-parameter comparison. The response includes warnings for cross-checked field/parameter type mismatches.
| Name | Type | Req | Description |
|---|---|---|---|
| expression | string | yes | – |
| field_format | string | – | Optional format string (e.g. 'MMM, yyyy') wrapping the expression as Format(<body>, '<fmt>'). |
| operator | string | yes | – |
| path | string | yes | – |
| tablix_name | string | yes | – |
| values | array | yes | – |
No output schema declared.
No examples provided.
apply_edits ~157
Atomic batch: open once → apply ops → lint → save once. Opens an internal transaction against path, dispatches each {tool, args} op through the JSON-RPC tools/call path with transaction_id injected, and commits at the end. On any op failure or lint-error at commit, rolls back — disk is byte-identical to its pre-call state. Compare with dry_run_edit (clones to tempfile, never touches the real file): use dry_run_edit to preview a plan, apply_edits to land it. Returns {applied: [{tool, ok, result|error}], verify, committed}.
| Name | Type | Req | Description |
|---|---|---|---|
| ops | array | yes | Ordered list of tool calls to apply atomically. |
| path | string | yes | – |
No output schema declared.
No examples provided.
backup_report ~89
Copy the report to <path>.bak.<UTC-timestamp>. Original is untouched. Cheap explicit checkpoint to call before a destructive batch (remove_*, rename_parameter, etc.). Returns the backup path. Set PBIRB_MCP_AUTO_BACKUP=1 to opt into automatic backups before destructive ops (off by default).
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | Absolute path to the .rdl file to read. |
No output schema declared.
No examples provided.
cancel_editing_transaction ~53
Discard a transaction. The in-memory tree is dropped; the on-disk file is unchanged from when the transaction was started. Returns {transaction_id, path, discarded}.
| Name | Type | Req | Description |
|---|---|---|---|
| transaction_id | string | yes | – |
No output schema declared.
No examples provided.
commit_editing_transaction ~84
Lint the in-memory tree, save to disk once (atomic .tmp + rename), and deregister. Aborts (saved=False) if lint surfaces any severity='error' issue — the transaction stays OPEN so the caller can fix the offending state and re-commit. Returns {transaction_id, path, saved, verify}.
| Name | Type | Req | Description |
|---|---|---|---|
| transaction_id | string | yes | – |
No output schema declared.
No examples provided.
convert_to_matrix ~185
Convert a row-grouped + column-grouped tablix into a matrix by dropping the residual Details row group and its body row. Pre-conditions (all checked): the named row_group and column_group must already exist (call add_row_group + add_column_group first); a <Group Name='Details'> must still be present in the row hierarchy. Refuses on second call (already a matrix). Use this after the standard insert_tablix_from_template + add_row_group + add_column_group flow to make the leaf the row group instead of Details — without this, cells render at detail granularity. Pair with set_tablix_corner (v0.4 commit 18) to author the top-left label.
| Name | Type | Req | Description |
|---|---|---|---|
| column_group | string | yes | – |
| path | string | yes | – |
| row_group | string | yes | – |
| tablix_name | string | yes | – |
No output schema declared.
No examples provided.
count_where ~88
Emit =Sum(IIf(<condition>, 1, 0)) — the SSRS conditional-count idiom. condition is an RDL expression body (no leading '='). Returns a complete top-level expression suitable for set_textbox_value or any RDL <Value> sink.
| Name | Type | Req | Description |
|---|---|---|---|
| condition | string | yes | RDL expression body, e.g. 'Fields!Status.Value = "Active"'. |
No output schema declared.
No examples provided.
create_report ~195
Emit a minimal valid RDL from scratch at `path`. Refuses if `path` exists (no clobbering). Default page_setup is US Letter portrait with 1in margins; pass any subset of {page_height, page_width, margin_top, margin_bottom, margin_left, margin_right, body_width, body_height} to override. `datasource` is a forward-compat hook — pass {name, workspace_url, dataset_name, provider, integrated_security} to wire a real PBI XMLA endpoint (v0.4 commit 14); omit for a placeholder DataSource1 + DataSet1 stub the caller fills in via subsequent tools. Validates structurally + against the bundled XSD before saving (atomic .tmp + rename). Returns {path, validated, size_bytes}.
| Name | Type | Req | Description |
|---|---|---|---|
| datasource | object|null | – | – |
| page_setup | object|null | – | – |
| path | string | yes | – |
No output schema declared.
No examples provided.
describe_report ~128
Top-level inventory of an RDL: data sources, datasets, parameters, tablixes, charts, and page setup. Always the first call when planning edits. v0.4: `tablixes` returns rich shape hints [{name, rows, columns, has_groups, has_subtotals, has_spans}] (was bare strings — migrate with `[t['name'] for t in tablixes]`). `charts` (new in v0.4) is a top-level array of chart names.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | Absolute path to the .rdl file to read. |
No output schema declared.
No examples provided.
dry_run_edit ~118
Apply a list of {tool, args} ops to a tempfile clone of the report; return the unified diff and a verify (validate + lint) report. The original file is NEVER modified. The harness auto-injects `path` into each op's args, so callers don't supply it. On op failure, dispatch stops; partial diff + verify are still returned. Use this to preview risky multi-step edits before committing.
| Name | Type | Req | Description |
|---|---|---|---|
| ops | array | yes | Sequence of tool calls to dispatch against the tempfile. |
| path | string | yes | – |
No output schema declared.
No examples provided.
duplicate_report ~120
Clone an .rdl to a new path. When regenerate_ids=true (default), every <rd:DataSourceID> and any <rd:ReportID> is rewritten to a fresh uuid4() so Power BI Report Builder doesn't refuse to load the duplicate due to identity collision. Atomic-write convention from RDLDocument.save_as. Refuses if dst_path already exists. Returns {src, dst, regenerated_ids: list[str]}.
| Name | Type | Req | Description |
|---|---|---|---|
| dst_path | string | yes | – |
| regenerate_ids | boolean | – | – |
| src_path | string | yes | – |
No output schema declared.
No examples provided.
find_textbox_by_value ~103
Find every Textbox whose <Value> text matches a Python regex pattern. Searches Body / PageHeader / PageFooter. A textbox with multiple matching runs surfaces once per match. Returns [{textbox, value, region}]. Useful for finding stale =Parameters!Old.Value references after rename_parameter, or any cross-cutting expression edit.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | – |
| pattern | string | yes | Python regex (re.search); not RDL/SQL glob. |
No output schema declared.
No examples provided.
find_textboxes_by_style ~251
Search for textboxes matching one or more style filters. Filters AND together (every supplied filter must match). Returns [{name, location, matched_fields}] where location is best-effort 'body' / 'header' / 'footer' / 'tablix:<name>' / 'rectangle:<name>'. Returns [] when no filters supplied. Pair with set_textbox_style_bulk for discovery+apply patterns (e.g. 'recolor every red textbox').
| Name | Type | Req | Description |
|---|---|---|---|
| background_color | string | – | – |
| border_color | string | – | – |
| border_style | string | – | – |
| border_width | string | – | – |
| color | string | – | – |
| font_family | string | – | – |
| font_size | string | – | – |
| font_style | string | – | – |
| font_weight | string | – | – |
| format | string | – | – |
| padding_bottom | string | – | – |
| padding_left | string | – | – |
| padding_right | string | – | – |
| padding_top | string | – | – |
| path | string | yes | – |
| text_align | string | – | – |
| text_decoration | string | – | – |
| vertical_align | string | – | – |
| writing_mode | string | – | – |
No output schema declared.
No examples provided.
get_chart ~85
Return effective state of a named Chart: position, size, dataset, palette, series list (name/type/subtype/value expression/color), category groups (name/expression/label), axes (category and value), legend, title, Style, Visibility. Symmetric with get_textbox / get_image / get_rectangle.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | – |
| path | string | yes | – |
No output schema declared.
No examples provided.
get_data_source ~58
Single-DataSource read-back (parity with get_textbox / get_image / get_rectangle / get_chart). Returns the same shape as one entry of list_data_sources.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | – |
| path | string | yes | – |
No output schema declared.
No examples provided.
get_dataset ~78
Single-DataSet read-back (parity with get_textbox / get_image / get_rectangle / get_chart / get_data_source). Returns dataset name, data_source, command_text, fields (with both data_field and value), query_parameters, filters, and designer_state_present.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | – |
| path | string | yes | – |
No output schema declared.
No examples provided.
get_datasets ~49
Full DAX command text, fields, query parameters, and dataset-level filters for every DataSet in the report.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | Absolute path to the .rdl file to read. |
No output schema declared.
No examples provided.
get_embedded_image_data ~102
Read an embedded image's base64 <ImageData> for porting it to another report without re-reading from disk. Returns {name, mime_type, base64, byte_size}. base64 is the raw text of the ImageData element; byte_size is the decoded size for sanity-checking. Refuses with ElementNotFoundError if the named entry isn't in <EmbeddedImages>.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | – |
| path | string | yes | – |
No output schema declared.
No examples provided.
get_expression_reference ~77
Return a static cheat-sheet of common RDL expression patterns: globals, parameters, fields, aggregates, conditionals, strings, dates. Each entry is {name, syntax, example, description}. Call this when authoring a textbox value or filter expression instead of guessing — and note the explicit encoding hint for the `&` concat operator.
Input schema present but exposes no named parameters.
No output schema declared.
No examples provided.
get_image ~66
Return effective state of a named Image: position, size, Source (External / Embedded / Database), Value, Sizing (AutoSize / Fit / FitProportional / Clip), MIMEType, Style, Visibility.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | – |
| path | string | yes | – |
No output schema declared.
No examples provided.
get_parameters ~38
Report parameter declarations: name, data type, prompt, flags.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | Absolute path to the .rdl file to read. |
No output schema declared.
No examples provided.
get_rectangle ~44
Return effective state of a named Rectangle: position, size, names of contained ReportItems, Style, Visibility.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | – |
| path | string | yes | – |
No output schema declared.
No examples provided.
get_tablixes ~57
Tablix layout with stable IDs: columns, row/column groups, sort expressions, filters, visibility. Required input for any tablix edit.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | Absolute path to the .rdl file to read. |
No output schema declared.
No examples provided.
get_textbox ~169
Return effective state of a named Textbox: position, size, Visibility, CanGrow, CanShrink, plus a nested style dict that mirrors set_textbox_style's routing — {box: {BackgroundColor, VerticalAlign, padding, ...}, border: {Style, Color, Width}, paragraph: {TextAlign}, run: {FontFamily, FontSize, FontWeight, Color, Format, ...}}. Empty branches are dropped. runs[] entries each carry their own per-run style. Searches the entire report; tablix-cell textboxes have None for top/left/width/height. Top-level positioned items with a missing <Top> or <Left> coerce to '0in' (RDL default).
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | – |
| path | string | yes | – |
No output schema declared.
No examples provided.
iif_format ~74
Emit =IIf(<condition>, <true_value>, <false_value>). All three args are expression bodies (no leading '='); string literals must already be quoted, e.g. true_value='"Yes"'.
| Name | Type | Req | Description |
|---|---|---|---|
| condition | string | yes | – |
| false_value | string | yes | – |
| true_value | string | yes | – |
No output schema declared.
No examples provided.
insert_chart_from_template ~141
Build and append a basic Column chart to <Body>/<ReportItems>. Single category axis grouped by category_field; single Y series Sum(Fields!<value_field>.Value). dataset_name must already exist. Change <Type> post-insert (e.g. to Bar / Line / Pie) by editing the chart directly.
| Name | Type | Req | Description |
|---|---|---|---|
| category_field | string | yes | – |
| dataset_name | string | yes | – |
| height | string | yes | – |
| left | string | yes | – |
| name | string | yes | – |
| path | string | yes | – |
| top | string | yes | – |
| value_field | string | yes | – |
| width | string | yes | – |
No output schema declared.
No examples provided.
What is the io.github.mafaq229/pbirb-mcp server?
io.github.mafaq229/pbirb-mcp is listed in the public MCP registry as io.github.mafaq229/pbirb-mcp. MCP server for editing Power BI Report Builder paginated reports (RDL). This page covers its PyPI package (pbirb-mcp).
Is the io.github.mafaq229/pbirb-mcp server safe to use?
io.github.mafaq229/pbirb-mcp scores 61 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 20 September 2026. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.
What tools does the io.github.mafaq229/pbirb-mcp server expose?
io.github.mafaq229/pbirb-mcp exposes 143 tools: describe_report, get_datasets, get_parameters, get_tablixes, update_dataset_query, and 138 more. Their descriptions and schemas cost roughly 17,305 tokens of context every time the server is loaded.
Is the io.github.mafaq229/pbirb-mcp server still maintained?
io.github.mafaq229/pbirb-mcp is still listed as active in the MCP registry. We last reached this channel on 20 September 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.
What licence is the io.github.mafaq229/pbirb-mcp server under?
io.github.mafaq229/pbirb-mcp declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.