Skip to content
verify mcp Beta VerifyMCP is currently in beta. If you notice any issues, get in touch and we’ll put it right.

io.github.mafaq229/pbirb-mcp

PYPI · PBIRB-MCP · SCANNED SEP 20

MCP server for editing Power BI Report Builder paginated reports (RDL)

Available components

−1 this week 61 Trust /100
Trust breakdown (7 categories)

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
Install

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

# add to Claude Code
claude mcp add mafaq229-pbirb-mcp -- uvx pbirb-mcp
// .cursor/mcp.json
{
  "mcpServers": {
    "mafaq229-pbirb-mcp": {
      "command": "uvx",
      "args": [
        "pbirb-mcp"
      ]
    }
  }
}
// .vscode/mcp.json
{
  "servers": {
    "mafaq229-pbirb-mcp": {
      "command": "uvx",
      "args": [
        "pbirb-mcp"
      ]
    }
  }
}
# add to Codex CLI
codex mcp add mafaq229-pbirb-mcp -- uvx pbirb-mcp
// opencode.json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "mafaq229-pbirb-mcp": {
      "type": "local",
      "command": [
        "uvx",
        "pbirb-mcp"
      ],
      "enabled": true
    }
  }
}
# add to OpenClaw
openclaw mcp add mafaq229-pbirb-mcp --command uvx --arg pbirb-mcp
# ~/.hermes/config.yaml
mcp_servers:
  mafaq229-pbirb-mcp:
    command: "uvx"
    args: ["pbirb-mcp"]
// ~/.netclaw/config/netclaw.json
{
  "McpServers": {
    "mafaq229-pbirb-mcp": {
      "Transport": "stdio",
      "Command": "uvx",
      "Arguments": [
        "pbirb-mcp"
      ]
    }
  }
}
# add to Vellum
assistant mcp add mafaq229-pbirb-mcp -t stdio -c uvx -a pbirb-mcp
// mcp.json
{
  "mcpServers": {
    "mafaq229-pbirb-mcp": {
      "command": "uvx",
      "args": [
        "pbirb-mcp"
      ]
    }
  }
}
Changelog

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
Diagnostics

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 →

MCP tools · 143 exposed · ~17,305 tokens

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 →

Tool Tokens
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.

NameTypeReqDescription
columnsarrayyes
dataset_namestringyes
heightstringyes
leftstringyes
namestringyes
pathstringyes
topstringyes
widthstringyes

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.

NameTypeReqDescription
pathstringyes
rulesarrayOptional 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.

NameTypeReqDescription
pathstringyesAbsolute 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.

NameTypeReqDescription
pathstringyesAbsolute 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.

NameTypeReqDescription
dataset_namestringyes
pathstringyes

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.

NameTypeReqDescription
pathstringyes

No output schema declared.

No examples provided.

list_footer_items ~38

Same shape as list_body_items but for <PageFooter>.

NameTypeReqDescription
pathstringyesAbsolute 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>.

NameTypeReqDescription
pathstringyesAbsolute 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.

NameTypeReqDescription
pathstringyes
tablix_namestringyes

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}.

NameTypeReqDescription
contentstringyesXML for the replacement element. Exactly one top-level element.
pathstringyes
xpathstringyes

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.

NameTypeReqDescription
pathstringyes
xpathstringyes

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.

NameTypeReqDescription
dataset_namestringyes
pathstringyes

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.

NameTypeReqDescription
namestringyes
pathstringyes

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.

NameTypeReqDescription
dataset_namestringyes
field_namestringyes
pathstringyes

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}.

NameTypeReqDescription
chart_namestringyes
pathstringyes
series_namestringyes

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.

NameTypeReqDescription
group_namestringyes
pathstringyes
tablix_namestringyes

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.

NameTypeReqDescription
forceboolean
namestringyes
pathstringyes

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'}.

NameTypeReqDescription
dataset_namestringyes
field_namestringyes
forcebooleanDefault false: refuse if the field is still referenced anywhere. true: delete anyway (prefer fixing the references first).
pathstringyes

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.

NameTypeReqDescription
dataset_namestringyes
filter_indexintegeryes
pathstringyes

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.

NameTypeReqDescription
forceboolean
namestringyes
pathstringyes

No output schema declared.

No examples provided.

remove_footer_item ~34

Same as remove_header_item, for <PageFooter>.

NameTypeReqDescription
namestringyes
pathstringyes

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.

NameTypeReqDescription
namestringyes
pathstringyes

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.

NameTypeReqDescription
forceboolean
namestringyes
pathstringyes

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.

NameTypeReqDescription
dataset_namestringyes
namestringyes
pathstringyes

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.

NameTypeReqDescription
group_namestringyes
pathstringyes
tablix_namestringyes

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.

NameTypeReqDescription
column_namestringyes
pathstringyes
tablix_namestringyes

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.

NameTypeReqDescription
filter_indexintegeryes
pathstringyes
tablix_namestringyes

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.

NameTypeReqDescription
new_namestringyes
old_namestringyes
pathstringyes

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.

NameTypeReqDescription
new_namestringyes
old_namestringyes
pathstringyes

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.

NameTypeReqDescription
namesarrayyes
pathstringyes

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}.

NameTypeReqDescription
backup_pathstringyes
forceboolean
target_pathstring|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.

NameTypeReqDescription
color_astringyesOdd-row color, e.g. '#F2F2F2'.
color_bstringyesEven-row color, e.g. '#FFFFFF'.
pathstringyes
tablix_namestringyes

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.

NameTypeReqDescription
leftstringyes
namestringyes
pathstringyes
topstringyes

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.

NameTypeReqDescription
heightstring|null
namestringyes
pathstringyes
widthstring|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]}.

NameTypeReqDescription
heightstring|null
pathstringyes
widthstring|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.

NameTypeReqDescription
col_spaninteger|null
column_namestringyes
pathstringyes
row_indexintegeryes
row_spaninteger|null
tablix_namestringyes

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.

NameTypeReqDescription
axisstringyesCategory or Value
axis_namestring
chart_namestringyes
formatstringNumeric/date format, e.g. '#,0.00' or 'MMM yyyy'.
intervalstring
log_scaleboolean
maxstring
minstring
pathstringyes
titlestring
visibleboolean

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}.

NameTypeReqDescription
chart_namestringyes
colorstring
font_weightstring
formatstring
pathstringyes
positionstring
series_namestring
use_value_as_labelboolean
visibleboolean
visible_expressionstring

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.

NameTypeReqDescription
chart_namestringyes
legend_namestring
pathstringyes
positionstring
visibleboolean

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}.

NameTypeReqDescription
chart_namestringyes
palettestringyes
pathstringyes

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.

NameTypeReqDescription
action_typestringyes
chart_namestringyes
drillthrough_parametersarray
pathstringyes
series_namestringyes
target_expressionstringyes

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}.

NameTypeReqDescription
chart_namestringyes
group_expressionstring|null
group_fieldstring|null
pathstringyes
replaceboolean
series_namestringyes

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.

NameTypeReqDescription
chart_namestringyes
pathstringyes
series_namestringyes
series_subtypestring|null
series_typestringyes

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}.

NameTypeReqDescription
chart_namestringyes
pathstringyes
textstringyes
title_namestring

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).

NameTypeReqDescription
group_namestringyes
pathstringyes
sort_expressionsarrayyes
tablix_namestringyes

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.

NameTypeReqDescription
group_namestringyes
pathstringyes
tablix_namestringyes
toggle_textboxstring|null
visibility_expressionstringyes

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.

NameTypeReqDescription
columnyes0-based column index or textbox name in any column cell.
pathstringyes
tablix_namestringyes
widthstringyes

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.

NameTypeReqDescription
case_sensitiveboolean
color_mapobjectyesOrdered map of expected values to color strings. First match in declaration order wins.
default_colorstring
pathstringyes
tablix_namestringyes
value_expressionstringyesField 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).

NameTypeReqDescription
dataset_namestringyesPBI semantic model (Initial Catalog).
integrated_securitybooleanDefault true. False omits the element.
namestringyesRDL DataSource Name attribute.
pathstringyes
workspace_urlstringyesWorkspace 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.

NameTypeReqDescription
expressionstringyes
pathstringyes
tablix_namestringyes
toggle_textboxstring|null

No output schema declared.

No examples provided.

Common questions

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.