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 →
insert_tablix_from_template ~176
Build and append a basic Tablix to <Body>/<ReportItems>. One column per name in `columns`; header row gets the column name as a static label, detail row binds to =Fields!<column>.Value. dataset_name must already exist. `width` is the tablix outer width — each column defaults to 1in regardless, so for a 3-column tablix the columns sum to 3in even if you pass width=10cm. Resize columns afterwards via direct edits or future column-width tools.
| Name | Type | Req | Description |
|---|---|---|---|
| columns | array | yes | – |
| 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.
lint_report ~145
Run static-analysis lint rules against an .rdl. Sixteen rules cover the v0.2/v0.3 sweep bug classes (multi-value-eq, missing-field-reference, dangling-embedded-image, pbidataset-at-prefix, parameter-layout-out-of-sync, double-encoded-entities, stale-designer-state, tablix-span-misplaced, dataset-fields-out-of-sync, etc.). Returns {issues, rules_run} with each issue {severity, rule, location, message, suggestion?}. Optional `rules` selects a subset by name.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | – |
| rules | array | – | Optional subset of rule names; default runs all 16. |
No output schema declared.
No examples provided.
list_body_items ~91
List every named ReportItem at the top level of <Body>. Returns name, type (Tablix / Textbox / Image / Rectangle / Subreport / Chart / etc.), top, left, width, height. Use before set_body_item_position / set_body_item_size when you don't already know what's in the body.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | Absolute path to the .rdl file to read. |
No output schema declared.
No examples provided.
list_data_sources ~78
Return a rich list of every <DataSource> in the report — name, data_provider, connect_string, integrated_security, shared_reference, security_type, data_source_id. describe_report.data_sources returns names only; this tool is the authoring-friendly read.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | Absolute path to the .rdl file to read. |
No output schema declared.
No examples provided.
list_dataset_filters ~88
List dataset-level filters in document order. Returns [{expression, operator, values}]; index in the list is the stable handle for remove_dataset_filter. DataSet filters apply to every consumer of the dataset (every Tablix / Chart bound to it); use list_tablix_filters for per-tablix filtering.
| Name | Type | Req | Description |
|---|---|---|---|
| dataset_name | string | yes | – |
| path | string | yes | – |
No output schema declared.
No examples provided.
list_embedded_images ~41
List embedded images in the report by name and MIME type. Returns an empty list when <EmbeddedImages> is absent.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | – |
No output schema declared.
No examples provided.
list_footer_items ~38
Same shape as list_body_items but for <PageFooter>.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | Absolute path to the .rdl file to read. |
No output schema declared.
No examples provided.
list_header_items ~38
Same shape as list_body_items but for <PageHeader>.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | Absolute path to the .rdl file to read. |
No output schema declared.
No examples provided.
list_tablix_filters ~64
List all filters on a named tablix in document order. Returns expression, operator, and values per filter; index in the list is the stable handle for remove_tablix_filter.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | – |
| tablix_name | string | yes | – |
No output schema declared.
No examples provided.
raw_xml_replace ~119
Replace the single element matched by xpath with new content. content is parsed with RDL as the default namespace and 'rd:' bound, so bare names like <Textbox><Value>x</Value></Textbox> work without explicit xmlns. Refuses on zero matches, multiple matches, or if the xpath targets the <Report> root. Saves atomically. Returns {xpath, kind, changed}.
| Name | Type | Req | Description |
|---|---|---|---|
| content | string | yes | XML for the replacement element. Exactly one top-level element. |
| path | string | yes | – |
| xpath | string | yes | – |
No output schema declared.
No examples provided.
raw_xml_view ~112
Read-only XPath query against the report. Returns matched elements as serialised XML strings. XPath context is <Report> (the root); 'r:' is bound to the RDL namespace, 'rd:' to the rd namespace. Examples: "r:DataSources/r:DataSource[@Name='X']" / ".//r:Textbox[@Name='X']/r:Style". Returns [] when nothing matches; raises on malformed xpath.
| Name | Type | Req | Description |
|---|---|---|---|
| path | string | yes | – |
| xpath | string | yes | – |
No output schema declared.
No examples provided.
refresh_dataset_fields ~133
Sync a dataset's <Fields> block against the shape detected in its DAX <CommandText>. Eliminates the manual 'open Report Builder → right-click → Refresh Fields' step after a query rewrite. Recognises SELECTCOLUMNS aliases and Table[Col] tokens (SUMMARIZECOLUMNS / ad-hoc). Adds missing fields; lists orphans without auto-removing (caller decides what to drop). Returns {added, orphans, unchanged, warnings}. Cheap regex-based detection — bare EVALUATE 'Table' returns a warning.
| Name | Type | Req | Description |
|---|---|---|---|
| dataset_name | string | yes | – |
| path | string | yes | – |
No output schema declared.
No examples provided.
remove_body_item ~57
Remove a named item (Textbox, Image, or Tablix) from <Body>/<ReportItems>. Destructive but explicit — raises if the name doesn't match anything.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | – |
| path | string | yes | – |
No output schema declared.
No examples provided.
remove_calculated_field ~91
Remove a calculated <Field> by name. Refuses if the field is data-bound (carries <DataField> instead of <Value>) — those reflect the source query's columns. Drop a data-bound field via remove_dataset_field, or rewrite the dataset query via update_dataset_query.
| Name | Type | Req | Description |
|---|---|---|---|
| dataset_name | string | yes | – |
| field_name | string | yes | – |
| path | string | yes | – |
No output schema declared.
No examples provided.
remove_chart_series ~71
Remove a named <ChartSeries> from a chart. Refuses to remove the last remaining series (use remove_body_item to drop the whole chart instead). Returns {chart, removed, remaining}.
| Name | Type | Req | Description |
|---|---|---|---|
| chart_name | string | yes | – |
| path | string | yes | – |
| series_name | string | yes | – |
No output schema declared.
No examples provided.
remove_column_group ~85
Inverse of add_column_group: unwraps a column-axis group's children back to the top of the column hierarchy and removes the matching body column at position 0 (along with each row's first cell). Errors if group_name only exists on the row axis.
| Name | Type | Req | Description |
|---|---|---|---|
| group_name | string | yes | – |
| path | string | yes | – |
| tablix_name | string | yes | – |
No output schema declared.
No examples provided.
remove_data_source ~75
Remove a named <DataSource>. Refuses by default if any DataSet/Query/DataSourceName or DataSource/DataSourceReference still references it; the error lists the offending locators. Pass force=True to remove anyway.
| Name | Type | Req | Description |
|---|---|---|---|
| force | boolean | – | – |
| name | string | yes | – |
| path | string | yes | – |
No output schema declared.
No examples provided.
remove_dataset_field ~163
Remove a data-bound <Field> by name (one with <DataField>). Symmetric counterpart to remove_calculated_field. Refuses on calculated fields (use remove_calculated_field instead) and on still-referenced fields (any expression containing Fields!<name>.Value / .IsMissing / .Count). Pass force=True to delete anyway. Closes the cookbook flow: refresh_dataset_fields lists orphans, remove_dataset_field drops them. Returns {dataset, removed, kind: 'DataBoundField'}.
| Name | Type | Req | Description |
|---|---|---|---|
| dataset_name | string | yes | – |
| field_name | string | yes | – |
| force | boolean | – | Default false: refuse if the field is still referenced anywhere. true: delete anyway (prefer fixing the references first). |
| path | string | yes | – |
No output schema declared.
No examples provided.
remove_dataset_filter ~61
Remove a dataset-level filter by its 0-based document-order index. Cleans up the empty <Filters> block when removing the last entry.
| Name | Type | Req | Description |
|---|---|---|---|
| dataset_name | string | yes | – |
| filter_index | integer | yes | – |
| path | string | yes | – |
No output schema declared.
No examples provided.
remove_embedded_image ~87
Remove a named embedded image. Refuses (lists offending Image elements) when any <Image Source="Embedded"><Value>=name> still references it; pass force=True to remove anyway and accept the dangling references. Drops the empty <EmbeddedImages/> block when removing the last entry.
| Name | Type | Req | Description |
|---|---|---|---|
| force | boolean | – | – |
| name | string | yes | – |
| path | string | yes | – |
No output schema declared.
No examples provided.
remove_footer_item ~34
Same as remove_header_item, for <PageFooter>.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | – |
| path | string | yes | – |
No output schema declared.
No examples provided.
remove_header_item ~51
Remove a named Textbox or Image from <PageHeader>/<ReportItems>. Empties the ReportItems block when the last item leaves.
| Name | Type | Req | Description |
|---|---|---|---|
| name | string | yes | – |
| path | string | yes | – |
No output schema declared.
No examples provided.
remove_parameter ~72
Remove a ReportParameter by name. Refuses (lists offending locators) if the parameter is still referenced anywhere in the report by Parameters!<name>.Value or .Label. Pass force=True to remove anyway.
| Name | Type | Req | Description |
|---|---|---|---|
| force | boolean | – | – |
| name | string | yes | – |
| path | string | yes | – |
No output schema declared.
No examples provided.
remove_query_parameter ~55
Remove a query parameter from a dataset. Cleans up the empty <QueryParameters/> block when removing the last one.
| Name | Type | Req | Description |
|---|---|---|---|
| dataset_name | string | yes | – |
| name | string | yes | – |
| path | string | yes | – |
No output schema declared.
No examples provided.
remove_row_group ~71
Inverse of add_row_group: unwraps a group's children back to its parent hierarchy and removes the matching header row at body row 0. Refuses to remove the conventional Details group.
| Name | Type | Req | Description |
|---|---|---|---|
| group_name | string | yes | – |
| path | string | yes | – |
| tablix_name | string | yes | – |
No output schema declared.
No examples provided.
remove_tablix_column ~110
Remove the tablix column whose data-row cell holds a textbox named column_name. Drops the matching TablixColumn, removes the top-level TablixMember at that column index (only if it's a leaf, never a column group wrapper), and removes the cell at that index from every TablixRow. Errors if no row contains a textbox with the given name.
| Name | Type | Req | Description |
|---|---|---|---|
| column_name | string | yes | – |
| path | string | yes | – |
| tablix_name | string | yes | – |
No output schema declared.
No examples provided.
remove_tablix_filter ~75
Remove a filter by index. Filters are anonymous in RDL, so use list_tablix_filters first to find the right index. Removing the last filter also drops the empty <Filters/> block.
| Name | Type | Req | Description |
|---|---|---|---|
| filter_index | integer | yes | – |
| path | string | yes | – |
| tablix_name | string | yes | – |
No output schema declared.
No examples provided.
rename_data_source ~81
Rename a <DataSource> and rewrite every reference: DataSet/Query/DataSourceName entries AND any DataSource/DataSourceReference shared-source links. Atomic: stages all matches before committing. Errors if new_name already exists or equals old_name.
| Name | Type | Req | Description |
|---|---|---|---|
| new_name | string | yes | – |
| old_name | string | yes | – |
| path | string | yes | – |
No output schema declared.
No examples provided.
rename_parameter ~80
Rename a ReportParameter and rewrite every textual occurrence of Parameters!<old_name>.Value / .Label across the entire report. Case-sensitive. Atomic: collects all matches first, then commits. Errors if new_name already exists or equals old_name.
| Name | Type | Req | Description |
|---|---|---|---|
| new_name | string | yes | – |
| old_name | string | yes | – |
| path | string | yes | – |
No output schema declared.
No examples provided.
reorder_parameters ~122
Reorder <ReportParameter> children to match the supplied names list. names MUST be a permutation of every existing parameter — no missing, no duplicates, no unknown names. When a <ReportParametersLayout> exists, its CellDefinition entries are reordered in lockstep so the parameter pane shows fields in the new declaration order. RowIndex / ColumnIndex are not recomputed (RB's layout grid is independent of declaration order). Returns {order, kind, changed: bool}; same order → no save.
| Name | Type | Req | Description |
|---|---|---|---|
| names | array | yes | – |
| path | string | yes | – |
No output schema declared.
No examples provided.
restore_from_backup ~111
Restore a backup file over its original target. target_path defaults to the path implied by the backup's <target>.bak.<UTC-timestamp> filename; pass target_path explicitly when the backup name doesn't match that shape. Refuses if target mtime is newer than backup (staleness guard) — pass force=True to override. Returns {source, restored_to, bytes_restored}.
| Name | Type | Req | Description |
|---|---|---|---|
| backup_path | string | yes | – |
| force | boolean | – | – |
| target_path | string|null | – | – |
No output schema declared.
No examples provided.
set_alternating_row_color ~134
Zebra-stripe a tablix's detail row by writing BackgroundColor=IIf(RowNumber(Nothing) Mod 2, color_a, color_b) on every detail cell's Textbox. Walks the row hierarchy to find the Details leaf — works after add_row_group nests the structure deeper. Replaces any existing BackgroundColor.
| Name | Type | Req | Description |
|---|---|---|---|
| color_a | string | yes | Odd-row color, e.g. '#F2F2F2'. |
| color_b | string | yes | Even-row color, e.g. '#FFFFFF'. |
| path | string | yes | – |
| tablix_name | string | yes | – |
No output schema declared.
No examples provided.
set_body_item_position ~105
Move an existing named ReportItem inside <Body> to (top, left). Preserves all other properties (size, style, group structure). top and left are passed through verbatim — RDL accepts any size unit (2cm, 0.75in, 108pt). Errors if no body item by that name.
| Name | Type | Req | Description |
|---|---|---|---|
| left | string | yes | – |
| name | string | yes | – |
| path | string | yes | – |
| top | string | yes | – |
No output schema declared.
No examples provided.
set_body_item_size ~78
Resize an existing named ReportItem inside <Body>. At least one of width / height must be supplied; missing fields are left untouched. Same RDL size-string convention as the position tools.
| Name | Type | Req | Description |
|---|---|---|---|
| height | string|null | – | – |
| name | string | yes | – |
| path | string | yes | – |
| width | string|null | – | – |
No output schema declared.
No examples provided.
set_body_size ~172
Set the body's rendering region inside the page. <Body>/<Height> and <ReportSection>/<Width> (the sibling of <Body>) — both are RDL size strings (e.g. '14in', '9in', '297mm'). Either or both kwargs required. Distinct from set_page_setup (which sets the paper chrome <Page>/<PageWidth>/<PageHeight>) and set_body_item_size (size of items inside the body). Use this when a wide tablix or chart needs the body region expanded — without it the right edge is clipped at preview time. Idempotent: same value → empty changed. Returns {kind: 'Body', changed: list[str]}.
| Name | Type | Req | Description |
|---|---|---|---|
| height | string|null | – | – |
| path | string | yes | – |
| width | string|null | – | – |
No output schema declared.
No examples provided.
set_cell_span ~135
Set <RowSpan> and/or <ColSpan> on a tablix cell. The cell is addressed by (row_index, column_name) where column_name is the textbox name inside the cell. At least one of row_span / col_span must be supplied; both must be >= 1. Pass 1 to explicitly reset a span. Replaces existing values if present.
| Name | Type | Req | Description |
|---|---|---|---|
| col_span | integer|null | – | – |
| column_name | string | yes | – |
| path | string | yes | – |
| row_index | integer | yes | – |
| row_span | integer|null | – | – |
| tablix_name | string | yes | – |
No output schema declared.
No examples provided.
set_chart_axis ~209
Configure a chart axis: title (Caption), format (numeric/date format string in <Style>/<Format>), min/max range, log_scale, interval, visible. axis ∈ {Category, Value}; axis_name defaults to 'Primary' (the only axis the template emits — pass a real name for secondary axes). All field args are optional; pass '' to clear an element. Returns {chart, axis, axis_name, kind, changed: list[str]} with the affected sub-element names.
| Name | Type | Req | Description |
|---|---|---|---|
| axis | string | yes | Category or Value |
| axis_name | string | – | – |
| chart_name | string | yes | – |
| format | string | – | Numeric/date format, e.g. '#,0.00' or 'MMM yyyy'. |
| interval | string | – | – |
| log_scale | boolean | – | – |
| max | string | – | – |
| min | string | – | – |
| path | string | yes | – |
| title | string | – | – |
| visible | boolean | – | – |
No output schema declared.
No examples provided.
set_chart_data_labels ~249
Configure <ChartDataLabel> on one or all series in a chart. When series_name is None, the change applies to every series; otherwise only the named series. visible writes <Visible>true|false</Visible>; visible_expression writes the same element with a VB.NET =IIf(...) expression (mutually exclusive with visible). format writes <Style>/<Format>; pass '' to clear. v0.4: position ∈ Auto/Top/TopLeft/TopCenter/TopRight/Left/Center/Right/BottomLeft/BottomCenter/BottomRight/Bottom/Outside; use_value_as_label ∈ true/false; font_weight + color write to <Style>/<FontWeight> and <Style>/<Color> (pass '' to clear). Returns {chart, series, kind, changed}.
| Name | Type | Req | Description |
|---|---|---|---|
| chart_name | string | yes | – |
| color | string | – | – |
| font_weight | string | – | – |
| format | string | – | – |
| path | string | yes | – |
| position | string | – | – |
| series_name | string | – | – |
| use_value_as_label | boolean | – | – |
| visible | boolean | – | – |
| visible_expression | string | – | – |
No output schema declared.
No examples provided.
set_chart_legend ~140
Configure a chart legend: position (TopLeft / TopCenter / TopRight / LeftTop / LeftCenter / LeftBottom / RightTop / RightCenter / RightBottom / BottomLeft / BottomCenter / BottomRight) and visible (writes <Hidden>true|false</Hidden>). legend_name defaults to 'Default' (the only one the template emits). Returns {chart, legend, kind, changed: list[str]}; no-op short-circuit when nothing supplied.
| Name | Type | Req | Description |
|---|---|---|---|
| chart_name | string | yes | – |
| legend_name | string | – | – |
| path | string | yes | – |
| position | string | – | – |
| visible | boolean | – | – |
No output schema declared.
No examples provided.
set_chart_palette ~99
Set <Palette> on a chart. palette ∈ Default / EarthTones / Excel / GrayScale / Light / Pastel / SemiTransparent / Berry / Chocolate / Fire / SeaGreen / BrightPastel. Pass '' to clear (RB falls back to its built-in default palette). Returns {chart, kind, changed: bool}.
| Name | Type | Req | Description |
|---|---|---|---|
| chart_name | string | yes | – |
| palette | string | yes | – |
| path | string | yes | – |
No output schema declared.
No examples provided.
set_chart_series_action ~132
Set <ChartSeries>/<Action> to a Hyperlink (URL), Drillthrough (another report + optional parameters), or BookmarkLink. Same kwarg surface as set_textbox_action / set_image_action; the chart series is addressed by (chart_name, series_name). Schema-aware insertion respects ChartSeries child order. Idempotent on structural equality of the inner block.
| Name | Type | Req | Description |
|---|---|---|---|
| action_type | string | yes | – |
| chart_name | string | yes | – |
| drillthrough_parameters | array | – | – |
| path | string | yes | – |
| series_name | string | yes | – |
| target_expression | string | yes | – |
No output schema declared.
No examples provided.
set_chart_series_grouping ~231
Promote a chart's static ChartMember to a dynamic-fanout series. Writes <ChartSeriesHierarchy>/<ChartMembers>/<ChartMember>/<Group Name='<series>_Group'>/<GroupExpressions>/<GroupExpression>. At render time, one rendered series is produced per distinct value of the group expression — the '13 violation types unknown at design time' fan-out. group_field='Type' is a shorthand for =Fields!Type.Value; group_expression accepts any VB.NET. Mutually exclusive. replace=False (default) refuses if the ChartMember already has a <Group>; pass replace=True to overwrite. Operates on the FIRST ChartMember in the hierarchy (v0.4 commit 21 scope; multi-member chains aren't reachable from any v0.4 tool). Returns {chart, series, kind: 'ChartGroup', group_name, expression, changed}.
| Name | Type | Req | Description |
|---|---|---|---|
| chart_name | string | yes | – |
| group_expression | string|null | – | – |
| group_field | string|null | – | – |
| path | string | yes | – |
| replace | boolean | – | – |
| series_name | string | yes | – |
No output schema declared.
No examples provided.
set_chart_series_type ~178
Update <Type> and optionally <Subtype> on a named ChartSeries. Combo charts work by setting different types per series in the same chart (e.g. one Bar series and one Line series). v0.4: series_subtype defaults to null/None — omit to PRESERVE the existing subtype. Pass 'Stacked' / 'PercentStacked' / 'Plain' / etc. to override. Pre-v0.4 always wrote 'Plain' by default, silently resetting stacked-bar charts on type-only edits. Returns {chart, series, kind, changed: list[str]} — empty when inputs match existing values.
| Name | Type | Req | Description |
|---|---|---|---|
| chart_name | string | yes | – |
| path | string | yes | – |
| series_name | string | yes | – |
| series_subtype | string|null | – | – |
| series_type | string | yes | – |
No output schema declared.
No examples provided.
set_chart_title ~83
Update <ChartTitle>/<Caption>. text can be literal text or an =expression. title_name defaults to 'Default' (the only title the template emits). Returns {chart, title, kind, changed: bool}.
| Name | Type | Req | Description |
|---|---|---|---|
| chart_name | string | yes | – |
| path | string | yes | – |
| text | string | yes | – |
| title_name | string | – | – |
No output schema declared.
No examples provided.
set_column_group_sort ~80
Replace a column-axis group's <SortExpressions> with a fresh list. Mirrors set_group_sort but refuses up front if group_name is on the row axis (use set_group_sort instead).
| Name | Type | Req | Description |
|---|---|---|---|
| group_name | string | yes | – |
| path | string | yes | – |
| sort_expressions | array | yes | – |
| tablix_name | string | yes | – |
No output schema declared.
No examples provided.
set_column_group_visibility ~103
Set <Visibility> on a column-axis group's TablixMember. Accepts a Hidden expression and an optional ToggleItem (textbox name that toggles expand/collapse). Mirrors set_group_visibility but refuses up front if group_name is on the row axis.
| Name | Type | Req | Description |
|---|---|---|---|
| group_name | string | yes | – |
| path | string | yes | – |
| tablix_name | string | yes | – |
| toggle_textbox | string|null | – | – |
| visibility_expression | string | yes | – |
No output schema declared.
No examples provided.
set_column_width ~130
Set <Width> on a tablix's body column. column accepts a 0-based integer index OR a textbox name living in any cell of that column (mirrors how set_cell_span / add_subtotal_row address columns). width is an RDL size ('1.5in', '4cm', '80pt'). Idempotent: same width → {changed: false}, no save.
| Name | Type | Req | Description |
|---|---|---|---|
| column | – | yes | 0-based column index or textbox name in any column cell. |
| path | string | yes | – |
| tablix_name | string | yes | – |
| width | string | yes | – |
No output schema declared.
No examples provided.
set_conditional_row_color ~256
Color every cell of a tablix's detail row based on the value of one of its fields. Builds a Switch(...) expression mapping field values to colors and writes it as BackgroundColor on every detail cell. value_expression is the field reference (e.g. 'Fields!Status.Value' — a leading '=' is accepted). color_map is an ordered dict of value->color (e.g. {"Red":"#FF0000","Yellow":"#FFFF00"}); first match wins. Unmatched values fall back to default_color (default 'Transparent'). When case_sensitive is False (default), wraps the field reference in UCase() and uppercases the keys for case-insensitive matching. Walks the row hierarchy to find the Details leaf — works after add_row_group nests the structure. Replaces any existing BackgroundColor.
| Name | Type | Req | Description |
|---|---|---|---|
| case_sensitive | boolean | – | – |
| color_map | object | yes | Ordered map of expected values to color strings. First match in declaration order wins. |
| default_color | string | – | – |
| path | string | yes | – |
| tablix_name | string | yes | – |
| value_expression | string | yes | Field reference to switch on, e.g. 'Fields!Status.Value'. Leading '=' optional. |
No output schema declared.
No examples provided.
set_datasource_connection ~122
Repoint a DataSource at a Power BI XMLA endpoint. workspace_url accepts a bare workspace name or a full powerbi:// URL; DataProvider is set to SQL (the AS provider id in RDL).
| Name | Type | Req | Description |
|---|---|---|---|
| dataset_name | string | yes | PBI semantic model (Initial Catalog). |
| integrated_security | boolean | – | Default true. False omits the element. |
| name | string | yes | RDL DataSource Name attribute. |
| path | string | yes | – |
| workspace_url | string | yes | Workspace name or full powerbi:// XMLA URL. |
No output schema declared.
No examples provided.
set_detail_row_visibility ~76
Set <Visibility> on the tablix's Details group, optionally with a ToggleItem textbox name. Use to hide detail rows by expression without restructuring the row hierarchy.
| Name | Type | Req | Description |
|---|---|---|---|
| expression | string | yes | – |
| path | string | yes | – |
| tablix_name | string | yes | – |
| toggle_textbox | string|null | – | – |
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.