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
add_body_image ~96

Add an Image to <Body>/<ReportItems>. image_source: External (URL), Embedded (EmbeddedImage Name), Database (=Fields!Photo.Value).

NameTypeReqDescription
heightstringyes
image_sourcestringyes
leftstringyes
namestringyes
pathstringyes
topstringyes
valuestringyes
widthstringyes

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 `&amp;`, including for the VB.NET string-concat operator in expressions).

NameTypeReqDescription
heightstringyes
leftstringyes
namestringyes
pathstringyes
textstringyesStatic text or RDL expression (=...).
topstringyes
widthstringyes

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.

NameTypeReqDescription
dataset_namestringyes
expressionstringyesRDL expression, e.g. '=Fields!Amount.Value * Fields!Quantity.Value'.
field_namestringyes
pathstringyes

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.

NameTypeReqDescription
chart_namestringyes
pathstringyes
series_namestringyes
series_subtypestringPlain / Stacked / PercentStacked / Smooth / Exploded / SmoothLine / 100 / Line / Spline
series_typestringColumn / Bar / Line / Area / Pie / Doughnut / Range / Scatter / Bubble / Stock / Polar / Radar / Funnel / Pyramid
value_fieldstringyes

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.

NameTypeReqDescription
group_expressionstringyesRDL expression, e.g. =Fields!Region.Value
group_namestringyes
parent_groupstring|null
pathstringyes
tablix_namestringyes

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

NameTypeReqDescription
dataset_namestringyes
integrated_securityboolean
namestringyes
pathstringyes
providerstring
workspace_urlstringyes

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.

NameTypeReqDescription
data_fieldstringyesSource column reference, e.g. 'Sales[ProductID]' or '[Region]' (the form depends on DAX shape).
dataset_namestringyes
field_namestringyes
pathstringyes
type_namestring|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.

NameTypeReqDescription
dataset_namestringyes
expressionstringyesFilterExpression — usually a Fields! reference.
field_formatstringOptional format string (e.g. 'MMM, yyyy') wrapping the expression as Format(<body>, '<fmt>').
operatorstringyes
pathstringyes
valuesarrayyes

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.

NameTypeReqDescription
image_pathstringyesFilesystem path to the source image.
mime_typestringyes
namestringyes
pathstringyes

No output schema declared.

No examples provided.

add_footer_image ~95

Same as add_header_image, for <PageFooter>.

NameTypeReqDescription
heightstringyes
image_sourcestringyes
leftstringyes
namestringyes
pathstringyes
topstringyes
valuestringyesURL for External, embedded-image name for Embedded, or =Fields!X.Value for Database.
widthstringyes

No output schema declared.

No examples provided.

add_footer_textbox ~79

Same as add_header_textbox, for <PageFooter>.

NameTypeReqDescription
heightstringyes
leftstringyes
namestringyes
pathstringyes
textstringyesStatic text or RDL expression (=...).
topstringyes
widthstringyes

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

NameTypeReqDescription
heightstringyes
image_sourcestringyes
leftstringyes
namestringyes
pathstringyes
topstringyes
valuestringyesURL for External, embedded-image name for Embedded, or =Fields!X.Value for Database.
widthstringyes

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 `&amp;`, including for the VB.NET string-concat operator in expressions).

NameTypeReqDescription
heightstringyes
leftstringyes
namestringyes
pathstringyes
textstringyesStatic text or RDL expression (=...).
topstringyes
widthstringyes

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

NameTypeReqDescription
colorstring
heightstringyes
leftstringyes
line_stylestring
line_thicknessstring
namestringyes
pathstringyes
topstringyes
widthstringyes

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

NameTypeReqDescription
dataset_namestringyes
heightstringyes
leftstringyes
namestringyes
pathstringyes
topstringyes
widthstringyes

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.

NameTypeReqDescription
allow_blankboolean|null
allow_nullboolean|null
hiddenboolean|null
multi_valueboolean|null
namestringyes
pathstringyes
promptstring|null
typestringyes

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

NameTypeReqDescription
dataset_namestringyes
force_at_prefixboolean
namestringyes
pathstringyes
value_expressionstringyes

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

NameTypeReqDescription
contained_itemsarrayOptional names of existing body items to move into the rectangle. Omit or pass [] for an empty rectangle (visual frame).
heightstringyes
leftstringyes
namestringyes
pathstringyes
topstringyes
widthstringyes

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.

NameTypeReqDescription
group_expressionstringyesRDL expression, e.g. =Fields!Region.Value
group_namestringyes
parent_groupstring|null
pathstringyes
tablix_namestringyes

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.

NameTypeReqDescription
cellsarray|null
column_namestringyes
pathstringyes
positioninteger|null
tablix_namestringyes
widthstring|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.

NameTypeReqDescription
cellsarray|null
heightstring|null
pathstringyes
positioninteger|null
row_namestringyes
tablix_namestringyes

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.

NameTypeReqDescription
aggregatesarrayyes
group_namestringyes
pathstringyes
positionstring
tablix_namestringyes
widthstring

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.

NameTypeReqDescription
aggregatesarrayyes
group_namestringyes
pathstringyes
positionstring
tablix_namestringyes

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.

NameTypeReqDescription
column_namestringyes
expressionstringyes
header_textstring|null
pathstringyes
positioninteger|null
tablix_namestringyes
widthstring|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.

NameTypeReqDescription
expressionstringyes
field_formatstringOptional format string (e.g. 'MMM, yyyy') wrapping the expression as Format(<body>, '<fmt>').
operatorstringyes
pathstringyes
tablix_namestringyes
valuesarrayyes

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

NameTypeReqDescription
opsarrayyesOrdered list of tool calls to apply atomically.
pathstringyes

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

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

NameTypeReqDescription
transaction_idstringyes

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

NameTypeReqDescription
transaction_idstringyes

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.

NameTypeReqDescription
column_groupstringyes
pathstringyes
row_groupstringyes
tablix_namestringyes

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.

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

NameTypeReqDescription
datasourceobject|null
page_setupobject|null
pathstringyes

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.

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

NameTypeReqDescription
opsarrayyesSequence of tool calls to dispatch against the tempfile.
pathstringyes

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

NameTypeReqDescription
dst_pathstringyes
regenerate_idsboolean
src_pathstringyes

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.

NameTypeReqDescription
pathstringyes
patternstringyesPython 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').

NameTypeReqDescription
background_colorstring
border_colorstring
border_stylestring
border_widthstring
colorstring
font_familystring
font_sizestring
font_stylestring
font_weightstring
formatstring
padding_bottomstring
padding_leftstring
padding_rightstring
padding_topstring
pathstringyes
text_alignstring
text_decorationstring
vertical_alignstring
writing_modestring

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.

NameTypeReqDescription
namestringyes
pathstringyes

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.

NameTypeReqDescription
namestringyes
pathstringyes

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.

NameTypeReqDescription
namestringyes
pathstringyes

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.

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

NameTypeReqDescription
namestringyes
pathstringyes

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.

NameTypeReqDescription
namestringyes
pathstringyes

No output schema declared.

No examples provided.

get_parameters ~38

Report parameter declarations: name, data type, prompt, flags.

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

NameTypeReqDescription
namestringyes
pathstringyes

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.

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

NameTypeReqDescription
namestringyes
pathstringyes

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

NameTypeReqDescription
conditionstringyes
false_valuestringyes
true_valuestringyes

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.

NameTypeReqDescription
category_fieldstringyes
dataset_namestringyes
heightstringyes
leftstringyes
namestringyes
pathstringyes
topstringyes
value_fieldstringyes
widthstringyes

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.