vilsem-mcp
This server lets an agent connect read-only to a Power BI model, inspect schema/data, and author, preview, edit, and commit declarative Vilsem custom visuals into an existing enhanced PBIR report.
Connect to Desktop, Fabric, or report-bound models, including schema-only offline report bindings.
Read model schema in summary/full detail with calculations, relationships, statistics, samples, and optional page bindings.
Run bounded read-only DAX queries (
maxRowsup to 10,000).List shared visual templates and validate Vilsem specs.
Explain visuals with bindings, resolved ECharts option, and exact DAX before preview or commit.
Preview a visual or compare up to four variants with real bound data, PNG output, and actionable critique.
List report pages and existing Vilsem visuals with metadata, bindings, layout, and optional thumbnails.
Read a saved visual, diff it against a proposed spec, and update it via RFC6902 JSON Patch with dry-run and etag protection.
Commit a new Vilsem Renderer visual to an existing PBIR page and add missing renderer resources/registration.
Validate Vilsem visual containers only; native visuals, slicers, filters, bookmarks, themes, model objects, and PBIX files are not edited or validated.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@vilsem-mcp connect to my Power BI model, preview a sales bar chart, and insert it"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
vilsem-mcp
Author Vilsem custom visuals from chat into an existing Power BI report, using real model data and declarative specifications.
vilsem-mcp doesn't make charts - Claude Code and Codex make charts; vilsem-mcp gives them your model, real data, eyes, and a safe pen. The MCP contains no model and needs no LLM API key. The calling agent's own service/account may have its own costs.
This is the custom-visual layer for agentic Power BI authoring. Use it alongside Microsoft's Power BI Report skill for native visuals and the Power BI Modeling MCP for model changes. The shared, installed renderer executes trusted application code; the authored spec is declarative JSON, not executable source.
Release status: 0.8 evaluation
Current packages: vilsem-mcp 0.8.0, @vilsem/core 0.8.0, vilsem Renderer 4.43.0.0. They are published evaluation prereleases. They are suitable for testing on copies of your reports; production readiness, certification and exhaustive cross-target parity have not been established.
Read what was verified, known failures, and incomplete checks before relying on a result. Passing tests do not mean every visual, property, dataset, report interaction or export works. This README on main includes live checks performed after the original release archive was built; existing release tags/assets are not rewritten.
Related MCP server: superbi-mcp
Claude, Codex and other clients
Vilsem is not Codex-only. The same installed MCP server and the same example prompts can be used with Claude Code, Claude Desktop or Codex. The calling agent designs the visual; Vilsem supplies model access, validation, previews and scoped report edits.
Client | Connection | Setup |
Claude Code | Local stdio server | |
Claude Desktop | Local stdio server through its developer configuration | |
Codex | Local stdio server through | |
Other MCP clients | Must support local stdio tools, resources and image results | Use the same Node command/server path; individual clients are not certified here |
The current distribution is a local stdio server, not a hosted HTTP connector or a Claude .mcpb desktop extension. Pasting a local path into a browser-only chat does not connect it. For Desktop mode the server must run on the Windows machine containing the open Power BI model; a cloud/remote agent needs a local execution connection. Your agent account, tool permissions and organization policy still apply. Client setup follows official documentation; package/SDK tests do not mean every Claude/Codex UI version has been tested end to end.
Start with installation, review current limitations, then use the generic prompt cookbook.
Why not just ask Claude Code / Codex directly?
For a custom visual outside Power BI's native catalog:
Work | Agent without this custom-visual layer | With vilsem-mcp |
Understand the model | Find a connector, inspect fields and recover calculation context | get_schema summary/full with calculations, statistics and relationship context |
Choose an analytical design | Work out question, grain, units and alternatives | Still the agent's decision; design_visual and design-guide supply a structured brief |
Use real numbers | Implement a query bridge and field normalization | Read-only Desktop/Fabric DAX and actual field bindings |
See and improve a draft | Build a renderer and screenshot pipeline | preview_visual, critique and shared-data preview_variants |
Put it in a report | Implement/package/import a custom visual and configure queries | commit_visual writes one supported custom visual and missing renderer registration |
Edit the visual a month later, in a new chat | Find the old source/chat, re-explain, rebuild, repackage, re-import and rebind | Read the report's spec: "make the Sankey labels bigger"; preview a small patch |
What runs inside the report | Each separately authored compiled visual's implementation | One shared renderer plus plain declarative specifications |
Security review | Review each executable implementation and its dependencies | Review the shared renderer/dependencies and the bounded format; report policies still apply |
The comparison does not imply native Power BI visuals require custom coding. Microsoft's companion Report skill handles those.
Three authoring layers
Composition: a supported chart type and configuration; the smallest spec and maintenance cost.
Template: ECharts structure, declared slots, parameters and bounded transforms; more control, with explicit layout and unit responsibilities.
Expression series (0.7 prerelease): a closed JSON AST describes bounded custom geometry. One trusted interpreter runs it in previews and the renderer; arbitrary renderItem/JavaScript remains refused. See
vilsem://docs/expression-languagefor operations, limits and security boundaries.
Agent workflow
connect_model -> get_schema -> design_visual prompt -> validate_spec -> explain_visual -> preview_visual with critique -> compare variants/iterate -> list_pages -> commit_visual -> Desktop reload and native checks. Never commit without a preview. Read vilsem://docs/design-guide and vilsem://docs/workflow.
For edits: list_visuals -> read_visual -> update_visual(dryRun:true) -> inspect before/after and confirm when not already authorized -> update_visual(dryRun:false, etag) -> reload and verify. The report folder is the source of truth. Manual format-pane values win over authored formatting and survive updates unless resetFormatting:true is explicit.
Install
Requires Node.js 22.12+, 24, or 26+. Install from GitHub or clone this repository and run npm install, then npm test. Its prepare step builds the server. All model connections run through @vilsem/core/connect; no Vilsem app checkout, Electron installation or application path configuration is needed.
The 0.8 prerelease depends on the immutable public core-v0.8.0 release tarball. For local core development only, install a locally packed core tarball; restore the public release URL before distributing. Native physical interaction/export acceptance is incomplete and the5000-point60fps target is not met; this release is for evaluation, not a production-readiness claim. The previous stable release remains0.6.
Agents get the Vilsem playbook automatically through MCP server instructions and vilsem://skill/* resources. A client must read the linked resources to load the full playbook; the server does not force client behavior. Optional native installation: vilsem-mcp install-skill --target claude (use your installed CLI, not an unversioned npm-registry package).
Optional native skill installation
The MCP delivery works without copying anything into your agent configuration. To also make it a native skill, explicitly run one of:
node "$env:USERPROFILE/vilsem-mcp/node_modules/vilsem-mcp/dist/index.js" install-skill --target claude
node "$env:USERPROFILE/vilsem-mcp/node_modules/vilsem-mcp/dist/index.js" install-skill --target codex
node "$env:USERPROFILE/vilsem-mcp/node_modules/vilsem-mcp/dist/index.js" install-skill --target "C:/Team/agent-skills"claude installs to ~/.claude/skills/vilsem-powerbi-visuals; codex uses the current documented ~/.agents/skills/vilsem-powerbi-visuals (OpenAI documentation). For older clients or a custom location, pass the skills-root directory explicitly. With no target, the installer defaults to claude; with no subcommand, the CLI still starts the MCP server. Existing skill folders are refused unless --force is supplied. Force replaces only packaged files and retains unrelated files. Linked/non-regular destinations are refused. No install hook writes a skill into your home directory: only this explicit subcommand does so. Skill installation does not configure the MCP server connection.
Fresh Windows machine: recommended installation
You can use this with another report; the shipped examples are not tied to the QA model. Use your own model fields discovered by get_schema.
Install a supported Node.js version (for example, Node.js 24), Power BI Desktop, and a local MCP-capable agent such as Codex or Claude Code. The MCP and Desktop must run on the same Windows machine for Desktop mode. The Vilsem Electron app is not required.
In PowerShell, install the pinned, prebuilt public release (no Git/source checkout required):
node --version $vilsemDir = Join-Path $env:USERPROFILE 'vilsem-mcp' New-Item -ItemType Directory -Force -Path $vilsemDir | Out-Null npm.cmd install --prefix "$vilsemDir" "https://github.com/bcsnpc/vilsem-mcp/releases/download/v0.8.0/vilsem-mcp-0.8.0.tgz" Join-Path $vilsemDir 'node_modules/vilsem-mcp/dist/index.js' (Get-Command node).SourceKeep the printed server and Node paths. If Node is missing, reopen the terminal after installing it.
npm.cmdavoids PowerShell script execution-policy issues. Installation downloads core 0.8.0 and renderer 4.43 automatically; no application-path environment variable is needed.Configure your agent using one client example below. Replace
YOUR_NAMEwith your actual Windows profile path, or use the printed server path with forward slashes. If the client cannot findnode, use the printed full Node executable path ascommand. Restart/reconnect the client and confirm that the Vilsem tools are available. A stdio server does not open a website; the MCP client starts it.Save a test copy of the complete report project, preserving the relative report/model folder structure. Open it in Desktop. A
.pbixmust first be saved as a PBIP project using Desktop; MCP does not patch a PBIX binary. The target must use enhanced PBIR with<name>.Report/definition/pages/. If needed, convert the report using Desktop first. Create an empty page in Desktop if you want a dedicated test page, then save.For live external reload, use Desktop August 2026 or later, enable Detect and reload external PBIP changes under Preview features and restart Desktop. Earlier versions require a close/reopen workflow. See Microsoft's prerequisites and reload limits. Save Desktop changes before external edits.
Give the agent the absolute
.Reportfolder path, not the.pbipor.pbixfile, and use the starter prompt below. Prefersource:{kind:"report",reportDir:"C:/Reports/MyTest/MyTest.Report"}to follow that report's binding. For a local model it must be open in Desktop for real-data previews. If discovery is ambiguous, open only the intended model or supply its port. Never reuse port 62071 from this repository's QA session; ports are machine/session-specific.Inspect the real-data preview, then commit to an existing page. Accept Desktop's external-change prompt. First-time renderer registration can require closing/reopening the project because
report.jsondoes not support live external reload. Alternatively import the bundled renderer in Desktop and save before committing; its installed path is<vilsemDir>/node_modules/@vilsem/core/assets/renderer.pbiviz.Confirm real numbers, selection, slicers, hover/context menus, resize and save/reopen yourself. Existing native visuals should remain intact.
validate_visualschecks Vilsem objects only; it does not certify native behavior or model semantics.
For animated browser previews, install Chrome/Edge/Chromium or set VILSEM_PREVIEW_BROWSER_PATH in the MCP server environment. Static previews do not require that browser. Model connection/preview permissions still apply; see Fabric authentication below for remote models. Moving to a different machine does not transfer Fabric credentials.
First test: generate a new visual from scratch
Replace the path and analytical request, then send this to your agent:
Use the vilsem MCP with my open test report:
C:/Reports/MyTest/MyTest.Report
Connect using this report's binding and inspect get_schema. Author a NEW
.vilsem-visual.json specification from scratch for a useful category-versus-
measure visual using actual fields from this model. Do not reuse a shipped
template or copy example business values. Explain the chosen grain and units.
Run validate_spec, explain_visual and preview_visual with real data. Inspect
and improve the result. Use list_pages to choose the existing test page and
avoid overlapping its visuals. Then commit the new Vilsem visual, read it back
and run validate_visuals. Preserve the model, native visuals and manual format
settings. Tell me when to accept reload/reopen and what to check in Desktop.If schemaOnly:true, open the model in Desktop and reconnect before requesting real values. If tools are missing, check the client configuration/server path and restart it. For a renderer-version refusal, review and upgrade the registered renderer rather than changing its GUID. An administrator's custom-visual restrictions can prevent rendering; use the report's approved policy rather than bypassing it. A successful preview is not proof of native rendering. This is an evaluation release: native acceptance remains incomplete and the 5,000-point animated frame-rate target is not met.
Model authentication
Desktop requires Windows and a running Power BI Desktop model. Core identifies the Desktop Analysis Services process and reads its workspace port file. Pass source.port if multiple instances are open. ADOMD/XMLA uses your Windows identity; no cloud login is needed.
For Fabric, configure these environment variables on the MCP server process:
Service principal:
AUTH_MODE=service_principal,FABRIC_TENANT_ID,FABRIC_CLIENT_ID,FABRIC_CLIENT_SECRET.User login:
AUTH_MODE=device_code(default). Login instructions go to stderr; complete Microsoft's device-code login in your browser. Only the refresh token is cached under~/.vilsem/auth/, scoped to tenant/client/resource, in a 0700 directory and atomic 0600 file. Windows uses the user-profile ACLs; POSIX modes are not Windows ACLs.Optional
FABRIC_ACCESS_TOKENfor an externally supplied short-lived token. Refresh requires another configured credential flow.
No credentials are read from another repository's .env or Electron workspace store. Set credentials in your MCP client's server environment. Core also preserves setInteractiveTokens for Electron PKCE login.
Connect from an existing report binding
Call connect_model with source:{kind:"report",reportDir:"/path/to/Example.Report"} to follow that report's definition.pbir without changing it:
datasetReference.byPath: core matches the local semantic-model path to an open Desktop session, even when another model is open. With Desktop closed it reads the local TMDL or BIM definitions and returnsschemaOnly:true. Schema-only connections cannot run DAX or preview live values; open the model and reconnect first.datasetReference.byConnection: a Power BI XMLA URL identifies the workspace and semantic model. Core resolves them through the configured Fabric credentials and uses the existing Fabric query/introspection adapter. It does not try to discover a local Desktop port. The connecting identity needs access to list the workspace and model, execute queries and inspect its definition. Windows-integrated SSAS server bindings use the local ADOMD bridge and Windows identity; cloud credentials are never forwarded to arbitrary servers.
Quoted connection-string values are supported. Passwords and impersonation settings embedded in the report are ignored; configure authentication on the MCP server. Missing or ambiguous targets fail explicitly. commit_visual still writes only the Vilsem visual in the selected local report; it does not change the binding, semantic model, native visuals or report policies.
There is no npm-registry publication. Install the tagged GitHub release:
npm install -g git+https://github.com/bcsnpc/vilsem-mcp.git#v0.8.0
vilsem-mcp
# Or: npx --yes --package=git+https://github.com/bcsnpc/vilsem-mcp.git#v0.8.0 vilsem-mcpThe process serves stdio JSON-RPC; diagnostics go to stderr.
Claude Desktop
Add to claude_desktop_config.json. These examples use the recommended local release installation above; replace the profile path:
{"mcpServers":{"vilsem":{"command":"node","args":["C:/Users/YOUR_NAME/vilsem-mcp/node_modules/vilsem-mcp/dist/index.js"]}}}Use Claude Desktop's developer Edit Config control to open the actual configuration file for your installation. Merge this entry into mcpServers, keeping other servers. Fully quit and reopen Claude, then check that Vilsem tools appear. If node cannot be found, use the full executable path printed during installation. This is manual local-server configuration, not adding a remote connector or installing an extension. See the official local-server walkthrough and Claude's local MCP overview.
Claude Code
claude mcp add --transport stdio vilsem -- node "C:/Users/YOUR_NAME/vilsem-mcp/node_modules/vilsem-mcp/dist/index.js"
claude mcp listThis uses Claude Code's default local configuration scope. Add --scope user before vilsem if you want it available across projects on this machine. In a Claude Code session, /mcp shows connection status. Run the local server in Windows for Desktop model discovery; a WSL/container-only server is not the tested Windows ADOMD setup. See Claude Code's official MCP instructions.
Codex
Add to ~/.codex/config.toml or a trusted project's .codex/config.toml:
[mcp_servers.vilsem]
command = "node"
args = ["C:/Users/YOUR_NAME/vilsem-mcp/node_modules/vilsem-mcp/dist/index.js"]
startup_timeout_sec = 60
tool_timeout_sec = 600
The longer tool timeout accommodates schema profiling and real-data previews on larger models. See the official MCP configuration documentation.
Desktop setup and walkthrough
In Desktop, open File → Options and settings → Options → Preview features. Enable “Detect and reload external PBIP changes” and restart Desktop. Microsoft documents this exact preview feature in external project editing.
Open your semantic model in Desktop, then call
connect_modelwithsource:{kind:"desktop"}; provide a port if more than one engine is open. For Fabric, provide workspaceId and datasetId.Call
get_schemaand choose existing dimensions/measures, or declare query-onlyspec.measures. With scoped measures passconnectionIdto validation, explanation and commit as well as preview. Userun_daxto verify the data.Call
list_templates, readvilsem://docs/spec-format, thenvalidate_spec,explain_visualandpreview_visual. Check the PNG and option before writing.Call
list_pages, choose a position without overlap, thencommit_visualwith the report folder, page folder name, a new visualName, spec, bindings and layout.First renderer registration (
rendererRegistered:true) or newly authored pages: close the report without saving stale Desktop state and reopen the project. Later commits/updates: accept Desktop's external-change apply/reload prompt. Avoid saving stale Desktop state over external changes. Microsoft excludes report-levelreport.jsonchanges from live reload: first-time custom-visual registration can require reopening the project. For visual-only reload, first import the renderer package in Desktop and save the project, then commit a visual.Inspect the rendered result and call
validate_visuals. Save the report from Desktop when satisfied.
Tools and resources
Tools: connect_model, get_schema, run_dax, list_templates, save_template, delete_template, validate_spec, explain_visual, preview_visual, preview_variants, list_pages, list_visuals, read_visual, diff_visual, update_visual, commit_visual, validate_visuals, extract_design_tokens, compare_preview. Prompt: design_visual. Resources: vilsem://templates/, vilsem://docs/spec-format, vilsem://docs/design-guide and vilsem://docs/workflow.
get_schema defaults to summary (no expressions or relationship graph); use full for business calculation and join semantics. Exact cardinality/BLANK share/ranges are cached60seconds with at most10samples. Permission/provider failures are explicit; internal engine row identities are skipped. page/reportDir adds read-only page query bindings without editing or validating native visuals.
Preview critique checks measured SVG text bounds, ellipses, axis rotation, categorical palette size, null/zero series, empty required slots, missing formats, page-background text contrast, legend/plot intersections, pie slice count and dual-axis review. It includes actionable paths/fixes and explicit coverage limits. It is not analytical correctness, accessibility or host-interaction certification. preview_variants makes one identical data query for up to4candidate specs; scoped definitions must match.
read_visual returns the migrated spec, bindings, pane objects, layout, source-version provenance, etag and live PNG. diff_visual is read-only. update_visual accepts RFC6902operations, defaults to dry run, protects identity/prototype/version paths and checks intervening file changes. It preserves field queries for styling-only edits and refuses implicit rebinding. A legacy inline measure with no stored owning-table metadata returns table:null; the temporary preview namespace is disclosed, not invented as original provenance.
list_pages reads all visual positions to help avoid overlap. validate_visuals examines only the stable Vilsem Renderer GUID; it does not report native visual validation results. commit_visual adds one new visual, rejects collisions and updates only missing renderer resources/registration. It does not rebuild or serialize other report content.
Interactions
Rendered Vilsem ECharts visuals cross-filter through Power BI selection IDs, accept cross-highlights, support drill-through/context menu requests, native tooltips and bookmark selection restoration. Those host interaction contracts have automated harness tests in Vilsem. Availability depends on bound field identities and report configuration; report-page tooltip resolution, drill-through destinations and bookmarks require testing in the actual report. A PNG preview is static and does not verify these interactions. DOM-adapter visuals and every possible template transform have not been certified for interaction parity.
What this does NOT do
Create, edit or validate native Power BI visuals.
Create or edit slicers, filters, bookmarks or themes.
Change semantic models or model metadata.
Persist measures to the model; declare a visual-scoped measure instead, or use Microsoft's Power BI Modeling MCP to add one to the model.
Read or write PBIX files. Existing enhanced PBIR report folders are required.
Desktop connections require Windows and Power BI Desktop. Column sampling can be expensive on large models and permission failures are returned per column.
Headless previews support the core ECharts composition types and declarative templates. DOM-adapter visual types are rejected by this resolver rather than emitted as empty or substituted charts. Previews render the chart marks and option; renderer-owned card chrome/title headers and existing report-level filters are not replayed. Fonts can differ between server PNGs and Desktop if the machines have different installed fonts. Preview queries and arbitrary DAX default to200 rows and accept maxRows up to10000. Choose a complete bounded window for population statistics; Desktop's categorical host reduction is2000 rows.
Current report and visual limitations
This table describes MCP 0.8.0 with core 0.8.0 / renderer 4.43. Earlier version-specific audit sections below are historical. A tool PASS or saved visual.json is not evidence that every report, visual state or Power BI target works.
Area | Current boundary / what to check |
Report files | Requires an existing enhanced PBIR |
Scope | Authors/edits Vilsem Renderer visuals only. It does not create/edit native charts, slicers, report filters, bookmarks, report themes or model objects. |
Model access | Desktop mode requires Windows, an accessible open model and local ADOMD. Offline local bindings can return |
Preview data coverage | Query/preview defaults are 200 rows, configurable to 10,000; existing-visual edit previews use 1,000. Reaching a cap is not proof of complete data. Desktop's categorical reduction is 2,000 rows; preview/host populations can differ. Never infer population totals/statistics from an incomplete window. |
Filter context | A standalone preview does not replay the report's current slicers, page/report filters or selections. Compare numbers only at matching grain and filter context. The model/identity still determines query permissions. |
Calculations | Ratios, distinct counts, time intelligence and totals must be evaluated at the intended grain. Summing displayed ratios/distinct counts is generally incorrect. Use existing model measures or validated query-only |
Formatting and fonts | Supported model-format conversion is bounded, not every dynamic/conditional/scientific format. Manual format-pane values override authored defaults and survive edits unless explicitly reset. Fonts depend on installed fonts; arbitrary report-font inheritance in Desktop remains unverified. DOM-adapter visuals are outside the headless resolver. |
Expressiveness | Closed JSON templates/expression AST only; no arbitrary JavaScript or callback source. Unshipped map/geo assets, 3D and arbitrary exact area-proportional Euler fitting remain unsupported. Venn circles are schematic. Some earlier Marimekko/Voronoi refusals were addressed by the later bounded expression layer; do not treat historical refusal logs as the current capability list. |
Interactions | Native selection/highlight/tooltips/context-menu/bookmark routes exist and have harness coverage, but depend on report configuration and source identities. Aggregated/transformed marks need correct provenance. End-to-end native gestures, bookmarks and all transform combinations are not signed off. A PNG cannot test them. |
Cross-target fidelity | Current commits/previews do not certify Desktop, Service, embedded/Fabric, PDF or subscriptions. Final native resize/clipping, Sankey/currency and export checks remain unverified. There is no guarantee every state is pixel-identical across hosts. |
Performance | The 5,000-point animated frame-rate target FAILS: canvas measurements were roughly 9-12 fps in the recorded actual-bundle run, not 57+ fps; SVG was roughly 4 fps. This is not a Power BI host benchmark. No point dropping or hidden animation disabling is used to claim a pass. Test realistic sizes on your machine. |
Existing renderer/schema | A spec can require a newer renderer; older registered resources are refused rather than silently replaced. Some newer official 2.x container declarations pass the complete known 2.7 field contract with an explicit compatibility warning; full validation against the declared schema is not claimed. Unknown/malformed fields still fail. Do not change GUID/schema tags to bypass guards. |
Reload and recovery | Save Desktop changes before external edits. Accept the external-change prompt; first-time renderer registration can require reopening. Stale Desktop saves can overwrite external work. Existing edits use ETags/locks, but Desktop does not honor MCP's lock. Test on a copy with a recoverable baseline. |
Distribution and acceptance | Evaluation prereleases, not production/certification sign-off. Desktop 4.43 manual upgrade and three real-data layouts were checked, including the SVG calendar mode/context menu. Live Edge checks cover all six Service comparison pages at browser 100%/150%, with leaderboard selection/clear/native tooltip/context menus; full native interactions and Windows scaling remain incomplete. No new signed/branded app installer is included in these MCP/core releases. |
For this release, see skill and renderer verification. For earlier evidence, open the Round 3 QA follow-up and native interaction checklist. When a test cannot run, record Not tested / Blocked, not PASS.
What was verified for 0.8
Evidence below is scoped to the tested builds and QA reports on one Windows laptop, as of November 6, 2026. A browser fixture is not Power BI; browser zoom is not Windows display scaling.
Check | Status | What the evidence establishes |
App/core regression suites | Tested | 1,367 tests passed in each private/public app-core checkout, across 118 files. These suites are not an exhaustive visual/host acceptance matrix. |
MCP regression suite | Tested | 338 tests passed across 17 files against the public core 0.8 archive. The 20 packaged-renderer browser tests are a subset, not an additional 20 on top. |
Native renderer builds | Tested | Both native builds succeeded; their packaged JavaScript/CSS hashes match. The existing GUID and semantica.primitiveSpec property are preserved. |
Fresh public package | Tested | Public archive SHA matched; installation, stdio, three skill resources, opt-in skill CLI, overwrite refusal/force and unrelated-file retention passed. Existing home skill folders were unchanged by npm install; the isolated installed dependency set reported npm audit 0. |
Actual agent client | Tested, limited | A fresh Claude Code session received initialization instructions and read all three skill resources. This does not certify every Claude Desktop/Codex/other-client UI version, operating system or permission setup. |
Desktop renderer upgrade | Tested, limited | Imported 4.43 over 4.42, saved, closed and reopened an owned QA report. Hero, leaderboard and calendar rendered real values. SVG calendar mode/zoom/context menu and a canvas native tooltip were observed. |
Service layouts and browser zoom | Tested, limited | Hero, leaderboard and calendar in both canvas/SVG rendered at Edge browser zoom 100% and 150%: 12 inspections. No blank/error visual or obvious plot/title/legend escape was seen in those layouts. |
Numeric reconciliation | Tested, limited | Hero total and all four leaderboard values matched a separate live DAX query. Calendar displayed 45 values; its cells were not individually reconciled. |
Service interactions | Partially tested | Both leaderboard painters visibly selected/dimmed marks, cleared on blank-area click, showed native tooltips and opened Include/Exclude menus. Applying those menu actions, drill-through and cross-filtering to a native visual were not verified by that check. |
Ordinary chart animation | Tested, limited | Standard bar, yearly line, donut and scatter had browser motion previews. Service page re-entry captured a partially drawn line/entering scatter followed by settled marks. No race or timeline was present. This is not all-series/all-state motion certification. |
Timeline animation | Tested, limited | A separate annual bar/donut/line QA page advanced through real 2020-2026 values with playback controls; 2026 was marked partial. This does not certify long-running playback, every race transform or bookmark/recovery state. |
Model preservation | Tested, limited | No model-write operations were used; all 21 baseline files of the owned Desktop QA model remained byte-identical. That is evidence for this workflow/model, not every possible PBIP project. |
See release evidence and live follow-up and the core QA record. Historical logs retain earlier failures and blockers; later verification only closes the checks it explicitly names.
Known failures and workarounds
Issue | Current result | Practical guidance |
Dense animated charts | FAIL: the 5,000-point smooth-animation target was not met. In one actual-bundle browser run, 4.42 canvas measured 11.84 RAF fps, 4.43 canvas 9.07, and 4.43 SVG 4.11. These are machine/run-specific measurements, not Service frame rates. | Test realistic data sizes and motion on the deployment machine. Use meaningful aggregation or a smaller explicitly disclosed data window when appropriate. Do not silently drop points, disable requested motion or claim 60 fps. |
Canvas text at small Fit-to-page sizes | Partially improved: zoom-aware density is implemented, but tiny canvas labels still looked soft in the Service comparison. Equal-to-native sharpness is not signed off. | For text-heavy layouts, try SVG or increase chart/text size. Browser 150% made the report's Fit-to-page scale smaller (31% in that window), so browser zoom alone does not make chart labels larger. |
Summary Label formatting | Open: reported | Use an explicit supported formatter, a formatted data/axis label, or the hidden-gauge detail workaround in the cookbook. Check displayed units against DAX. |
Existing report keeps old renderer | Intentional compatibility behavior; installing MCP/core does not upgrade registered report resources. | Import bundled renderer.pbiviz in Desktop, accept Update, save, close and reopen. See native rendering and upgrade steps. |
Canvas-only effects requested under SVG | Explicit fallback to canvas with a critique/native warning. | Review the warning; remove unsupported blending/trail effects if SVG is essential. Every effect combination has not been manually checked in every host. |
Checks that remain partial or not tested
These are open acceptance items, not implied passes from the test counts above:
Area | What still needs checking |
Complete visual inventory | Every supported composition, template and expression visual in every state, on every target. The six sharpness pages and four ordinary charts are samples, not full catalog coverage. |
Formatting controls | Every exposed property on every visual: font family/size/weight, title, axes including secondary-axis colors/units, legends, labels, mark colors, backgrounds, borders and manual-pane precedence/reset. |
Data and clipping | Exhaustive empty/null/zero/negative/extreme/duplicate/Unicode/long-label/high-cardinality combinations, very small containers, extreme aspect ratios, large fonts and tooltip screen-edge placement. |
Native/report interactions | Full custom-to-native and native-to-custom filter/highlight matrix, native slicers, physical Ctrl-click multi-selection, deselection/reset and transformed/aggregated mark provenance. Pure-function/browser tests do not close native acceptance. |
Context menus and drill-through | The native menus appeared, but Include/Exclude results and configured drill-through/report-page tooltip destinations were not fully exercised. |
Bookmarks and recovery | Selection restoration exists and has harness coverage; full bookmark data-state behavior, save/reopen, active timeline/pause state, undo/recovery and concurrent Desktop/external editing remain incomplete. |
Scaling and timing | Windows display scaling 100%/150% beside native cards/tables, multiple monitor sizes/DPIs, measured native sub-300 ms zoom recovery and long resize/zoom/no-flicker sessions. Edge browser zoom checks are a separate test. |
Animation | Every series/effect in both painters, reduced-motion/accessibility paths in the actual hosts, hidden-tab pause/resume, long sessions and reliable frame-rate budgets. Ordinary entrance animation settles; it is not continuous autoplay. |
Other output targets | Full embedded/Fabric app runtime, standalone web, PDF/PowerPoint/image export, subscriptions and printing fidelity. Creating a report through the Fabric API is not testing a separately deployed Fabric app. Animations are not promised in static outputs. |
Clients and environments | Fresh end-to-end authoring in every supported Claude/Codex client, another physical laptop/OS, all tenant/authentication policies, proxies and locked-down installations. Agent design quality also varies; validate its fields, calculations and output. |
Distribution/security | Full app dependency remediation, signed/branded Electron installer readiness, Power BI certification/store acceptance and a complete security/accessibility review. The isolated MCP audit result is not a clean bill for the entire application. |
Canvas, SVG and animation: what users choose
Canvas and SVG are drawing modes for the same visual, not two different visualization types. You create one spec and keep the same bindings. Canvas is the default and is generally the better starting point for dense or heavily animated scenes. SVG is optional and can keep text/fine lines sharper under zoom; dense scenes may be slower.
In Power BI, select a Vilsem visual, then Format visual > Appearance > Render mode (renderer 4.43+). This control belongs to Vilsem, not to every built-in Power BI visual:
Setting | Behavior |
Automatic (spec) | Uses |
Canvas | Explicit pane override to use canvas. |
SVG | Requests SVG; canvas-only effects can trigger an explicit fallback. |
A spec can set config.renderer:"svg". Manually saved pane values override authored defaults; inspect/reset that override if a prompt change appears ineffective. Most supported ECharts/expression visuals share both painters, but all visual/effect combinations have not been verified. DOM adapters are outside this headless rendering path.
Ordinary charts can animate their entrance and data updates without a race or changing years. Declarative template.animation requires template.meta.formatVersion:4; use the contracts in vilsem://docs/spec-format rather than inserting executable callbacks. The normal-chart demo uses fixed data, no timeline, and settles after the entrance. Re-entering/reloading the page replays its entrance. Timeline/race animation instead changes the displayed period and has playback controls. An author should request the intended behavior explicitly; animations must respect reduced-motion settings, and static previews/exports do not prove live motion.
Acceptance checklist for your own report
Work on a recoverable copy; preserve its report/model folder structure. Save Desktop work before external writes and follow the first-registration/reload rules.
Discover actual fields; run DAX at the intended grain/filter context. Compare the preview and host values, including totals, ratios and distinct counts.
Validate the spec, inspect the real-data preview and critique, commit to an existing page, then open/reload the actual report.
Check the exact visual in its intended painter, at normal and extreme sizes, with long labels, empty/filter states and your real data volume.
Test it beside a native visual and slicer: filter/highlight in both directions, multi-select/clear, tooltips, context actions and bookmarks.
Save/reopen, test the actual deployment/export target, and check ordinary/timeline animation separately. A successful API upload or PNG is not final acceptance.
Record Tested, Partially tested, Not tested, Blocked or Fail, together with app/renderer versions, platform, data/filter context and evidence. Do not convert an untested item into PASS.
Generic prompts for your own data
The prompt cookbook works with Claude or Codex and contains:
A shared setup message that discovers the actual model, report and page.
A completely new visual from scratch, with real bindings and a checked preview.
A trend with prior-period comparisons and explicit calendar semantics.
A dual-axis bar/line visual with independent units and a real target/reference.
A page of complementary visuals without overlaps or native-object changes.
Detailed formatting edits that preserve bindings and manual overrides.
Hierarchy, Sankey and bounded custom-geometry examples with prerequisite checks.
Reuse of your own design against a different model, plus manual interaction/resize QA.
Replace only the marked placeholders and use fields discovered from get_schema. No prompt relies on QA table names, a fixed Desktop port or embedded business values. These are example requests, not promises that every model contains suitable dates, hierarchies or targets.
Development and verification
Run npm run build and npm test. Tests cover spec resolution, deterministic SVG/PNG rendering, custom-only PBIR insertion/validation and a real stdio client/server round trip. Live Fabric credentials, Desktop query access, reload prompts and host interactions need environment-backed acceptance; passing fixture tests alone does not establish those results.
For an independent test, follow author a visual from scratch.
Stress round2 examples (0.4.0)
111 freshly authored stress examples passed the actual validate/explain/preview/commit workflow and individual Desktop rendering inspection at900x600. Nine capabilities remain explicit refusals, documented with sandbox/asset requirements. This is not exhaustive formatting, resize, cloud-target or interaction certification. See the 120-case results and format additions.
Use core0.6.0 and the bundled renderer4.35. Existing reports keep the same GUID
and primitiveSpec property. New features enforce renderer version floors rather
than silently replacing an existing report resource. list_templates retains
the template contract and includes exampleSpec: use that complete envelope to
preserve query-only measures, theme and instance parameters.
The catalog includes the nine original examples below plus111 stress examples.
Failed authored probes are kept under docs/expressiveness/, never listed as
working templates. Word packing, swarm and partition label bounds require their
declared fixed plot dimensions; density/cohort/statistical assumptions and limits
are documented in vilsem://docs/spec-format.
Original expressiveness examples (0.3.0)
Nine new standalone .vilsem-visual.json specs ship in templates/ and are listed by list_templates. They cover Sankey, Gantt, running-total waterfall, sunburst, bullet, radial progress, dual-axis reference measures, facets and a relationship network. Bind their declared slots to your own schema; no model data is embedded. Use core 0.3.0 / renderer 4.14.2.0+. The expressiveness report records the live workflow, bounds and the deliberately unsupported Marimekko custom callback.
Theme, formatting and preview locale
Visual backgrounds default to transparent and use the report/host foreground and
palette. canvasTheme is an explicit override. preview_visual accepts
theme:"report"|"light"|"dark"|<theme JSON>; a supplied reportDir selects the
referenced registered theme by default. Desktop's Appearance pane can override
the background/transparency or force report-theme inheritance.
Directly bound model and query-scoped measure formats apply to labels, value axes and native tooltips, including heatmap cell labels and bound-field tooltips. Percent, grouping, currency, decimal precision, comma scaling and date patterns use the same bounded converter in core. This is a supported subset of Excel/Power BI formatting, not a claim to implement every conditional, scientific or dynamic model-format expression.
Derived counts, densities, coordinates and ratios can have different units from their input measure. They require an authored formatter when units change; the renderer does not blindly apply the source currency/percent format to them. SSR can read the report JSON's font family. Automatic inheritance of an arbitrary report font in Desktop is not yet verified; the current native default is Segoe UI.
Desktop uses the host viewer locale. SSR defaults to locale:"en-US"; pass the
viewer locale (for example "en-IN" or "de-DE") to preview_visual when matching
regional grouping, decimal separators or month names. The result reports
formattingLocale. A report's model culture alone does not determine each
viewer's regional display settings. Values and calculations are unchanged.
preview_visual.interactions describes supported host routes and known limits;
it is not evidence that SSR exercised native selection, report-page tooltips or
bookmarks. Native acceptance is recorded separately in the QA interaction log.
Deterministic template thumbnails
npm run thumbnails rebuilds all shipped light-theme example PNGs using the same
synthetic fixtures as the rendering regressions. node scripts/render-thumbnails.mjs --dark checks the alternative host background. Each theme directory under
templates/thumbnails/ includes a manifest with source/PNG hashes and failures.
These thumbnails contain synthetic demonstration values, not model/client data.
PNG typography
The isolated PNG worker expands the pixel-font shorthand emitted by ECharts to CSS longhand before rasterizing. This preserves requested font sizes, weight and style in previews (including large KPI callouts). Unknown shorthand is left unchanged; literal chart text is never rewritten. Installed fonts still determine font fallback. The SVG option and native chart typography are unchanged. The adapter workaround addresses resvg-js font shorthand support.
Default plain treemap labels use padded top-left placement and black/white text chosen from the actual mapped opaque node fill, including rgba colours with alpha1. Explicit label colours, authored positions/alignment and existing rich markup retain their authored treatment. Unknown/translucent paints require an explicit readable text style; no automatic contrast guarantee is claimed for them.
Core0.5 native verification limits
Light/dark native rendering, percentage host tooltips, full currency labels and plain treemap headers were checked against the owned AdventureWorks QA report. The complete source suites pass. Physical mouse Ctrl-click and the final stale-selection-to-slicer transition still need manual verification: Windows Computer Use lost its native pipe and could not recover after retry/reset. Keyboard additive selection and the other documented native interactions passed; Ctrl/clear/highlight/stale-identity paths also have host regression coverage. These are explicit verification limits, not claims that every native interaction, report font, Service/Fabric target or historical screenshot was retested.
Editable specifications and governance
New commits carry specVersion0.7; readers migrate specs from0.1 onward, including round2 string measure definitions into {expression,format} objects. version:1 remains the separate wire envelope. Migrations are pure, forward-only and tested; unknown future versions are explicitly rejected. Maintaining readable historical specs is a release requirement, not a guarantee that unknown future formats run in an older renderer.
The0.7 shared formatting contract has71properties: theme/background, animation/reduce motion, title, chart text, series palette, labels, legend, category/primary/secondary axes, lines and border. Author spec.formatting or patch individual properties; separate Desktop pane objects override only the corresponding properties. Changing secondary-axis percentage formatting preserves a primary currency axis. Common controls apply to ECharts compositions/templates; legacy DOM adapters currently expose only Appearance, Title and Border. Native pane controls do not yet cover every specialized ECharts property. Series palette input currently accepts comma-separated hex colours.
Visual-scoped measures: yes. Persistent model measures/changes: via Microsoft's Power BI Modeling MCP. Queries and committed bindings use their respective connecting/viewing identities; Power BI owns RLS, workspace access, sensitivity labels, report filters and refresh. A preview query does not replay report-level filters or certify policies.
The write flow stores bindings/specifications, not returned model rows. Author literals/annotations are possible in JSON, so review specs before sharing. The plain spec lives in PBIR and can be versioned with the report in git; ownership belongs to the report, rather than a lost chat or developer's compiled project. The0.7 template library uses OS user data, or an approved shared VILSEM_TEMPLATES_DIR folder. The MCP does not add a second manifest or list_recent tool.
Core0.6 and MCP0.6 verification is recorded in the Round3 GroupB log. Source/host and real-data SSR editing pass; final native Sankey/manual-pane acceptance is UNVERIFIED because ComputerUse cannot connect and Desktop snapshots are blank/time out. Automatic common-axis bounds can be reset with autoMin/autoMax. Native aggregate-column bindings outside the supported Measure/NativeMeasure shapes are reported as unsupported rather than guessed.
Contrast feedback uses4.5for normal text and3for text estimated at24px or larger, informed by W3C contrast guidance. It deliberately does not relax the threshold for smaller bold text, and it compares against the preview page rather than proving the paint behind every label. This is review assistance, not a WCAG compliance result.
GroupC0.7 prerelease status and limits
This prerelease implements the bounded expression series language, declarative race/timeline motion, reusable user/shared template memory, and image-statistics reference workflows. Published0.6 releases retain their documented0.6 behavior.
Install the tagged prerelease with its matching core dependency. Source, host, real-data previews and installed-package checks are separate from native interaction, export and performance acceptance. See the verification ledger.
Expression renderItem is a closed JSON AST, not arbitrary JavaScript. It shares one bounded interpreter between renderer and previews. The11 former(c) visual families have real-model tool passes, including weighted Voronoi. Venn circles are schematic; arbitrary exact area-proportional Euler fitting is still absent. Native Desktop acceptance is separate from SSR and successful commits.
preview_visual motion:auto can capture actual enter/stagger/timeline canvas animation in a fresh headless Chrome/Edge/Chromium profile. It uses the same shipped core resolver, a controlled clock and blocked page HTTP/WebSocket requests/service workers. No model credentials/Node bridge enter the page. Install no browser through this package: use an installed browser, or set VILSEM_PREVIEW_BROWSER_PATH to its executable. It never attaches to user tabs. motion:states avoids browser launch; motion:browser requires it. Auto fallback is explicit. APNG <=3seconds/2MiB; contact sheets label timeline states, rather than claiming they are captured interpolation. Capture is not an FPS benchmark. See docs/motion-capture.md. No app checkout or VILSEM_APP_PATH is required.
The separate real-clock5000-point animated-canvas probes missed60fps on this laptop (about25RAFfps in normal headless Chromium; also failed Electron offscreen). This target remains OPEN. The owned Desktop report has been reopened with clean state. Native static captures were inspected for all11 expression examples and the reference examples; this does not verify physical interactions. Sankey motion captures remain partial or blank despite visible charts reported by the user. Window automation is unavailable (native pipe, os error2), so native gestures, motion/export acceptance and the final currency-axis native recheck remain UNVERIFIED. Renderer4.40 completes hidden Sankey entry clips through the engine's completion callbacks; a real-browser regression compares the result pixel-for-pixel with a settled static graph. It preserves permanent clips and includes exact-group context-menu fixes; those tests are distinct from native acceptance. Physical click/Ctrl-click, native slicer/highlight, drill-through, report-page tooltips, bookmarks and Edit Interactions None still need the Desktop checklist. Do not interpret this prerelease as certification or production-readiness completion.
To reproduce the synthetic motion benchmark from a source checkout:
npm run build
node scripts/benchmark-motion.mjsIt launches only an owned sandboxed headless browser, queries no model, keeps
5000points and animation enabled, and records idle/canvas/dirty-rectangle/SVG
measurements in test-results/benchmarks/motion-options.json. Exit code1 means
the57RAFfps/20ms-p95 tolerance was not met. This is not a Power BI host benchmark.
Responsive reference panels in0.7.1
Two bounded expression operations, viewportWidth and viewportHeight, let an agent draw resize-aware panels using the same interpreter in preview and renderer4.41. The shipped Figma reference example includes its inset rounded white card. A real browser test checks resize/tiny bounds and confirms that the decoration cannot intercept bar clicks. This does not resolve the native-automation or5000-point animation limits above.
Verification for0.7.1:300/300 MCP tests pass against the downloaded public core0.7.1 package; private/public app-core each1355tests pass. The complete app/native/UI/Fabric/Electron/NSIS build passes. Fresh standalone archive install has audit0 and passes the SDK handshake,19tools/1prompt, viewport-spec validation and documentation-resource checks without an app path or development link. The repeated real-clock benchmark still fails: canvas11.22RAFfps, dirty-rectangle12.52fps, SVG8.62fps versus idle60.42; all5000points and animation remain enabled. These are browser measurements, not native-host acceptance.
MCP0.7.2 corrects axis-label/name contrast when the explicitly light reference card is previewed in a dark report. It uses core0.7.2 / renderer4.42, which also preserves authored opacity for explicitly silent annotation leaves during selection/highlight. Ordinary marks still dim; no native interaction claim changes.
Final0.7.2 validation:303/303 MCP tests pass against the published core0.7.2 archive with unchanged30second test deadlines. Both app/core checkouts pass1357tests. Static viewport decorations no longer produce phantom zero-measure/extra-series feedback; genuine zero data and data-driven annotations remain checked. Explicit opaque chart backgrounds are used for global contrast. Native physical acceptance remains blocked and the5000-point60fps target still fails; this remains an evaluation prerelease.
Desktop container declarations in0.7.3
Desktop can save an existing visual with a newer2.x schema declaration before that schema is published. Read/edit/validation preserve the declaration. Existing payloads are accepted only when their complete field structure passes the bundled2.7 contract; an explicit known-2.7-contract diagnostic discloses that full validation against the declared schema was not performed. Unknown fields, malformed structures, other hosts/major versions and non-Vilsem visuals are refused. No remote schema is fetched and no fields are stripped. New commits continue using the vendored2.7 schema. Core0.7.2 / renderer4.42 remain the matching runtime.
Native canvas and SVG rendering (0.8)
Native renderer 4.43 accounts for Power BI page zoom in the canvas backing store, clamps the effective pixel ratio to 1-4, and debounces surface recreation. config.renderer accepts canvas (default) or svg. The Desktop Appearance > Render mode dropdown overrides the spec; Automatic follows it. SVG is useful for text-heavy layouts; thousands of marks and animation may be slower. Canvas-only trail/blend effects fall back to canvas with an explicit critique/native warning. Preview SSR behavior is unchanged.
Upgrade an existing report explicitly: save existing Desktop work before external edits. With no pending external changes, use Home > More visuals > From my files; select <install>/node_modules/@vilsem/core/assets/renderer.pbiviz, accept Update, then save, close and reopen the report. The GUID and objects.semantica.primitiveSpec remain unchanged. commit_visual intentionally preserves a registered renderer; installing a new MCP/core package alone does not upgrade old reports.
For a one-shot native skill installation from the prebuilt GitHub package:
npx.cmd --yes --package=https://github.com/bcsnpc/vilsem-mcp/releases/download/v0.8.0/vilsem-mcp-0.8.0.tgz vilsem-mcp install-skill --target claudeUse --target codex or an explicit skills-root directory as needed. There is no unversioned npm-registry distribution; use the pinned release URL.
Available Tools
15 toolscommit_visualA
Add one Vilsem Renderer visual to one existing PBIR page using @vilsem/core. Existing visual names are refused; the only additional changes are missing renderer resources and registration. Native visuals, slicers, bookmarks, filters, themes and model objects are not edited. If Desktop is open, accept its external-change reload prompt after this call.
Inputs: spec (required), layout (required), bindings (required), pageName (required), +3 more.
connect_modelA
Connect read-only to an existing model. Prefer source.kind="report" with reportDir to follow definition.pbir: byPath matches the open Desktop model or returns offline schema-only TMDL; byConnection resolves the configured Fabric model or Windows-integrated SSAS endpoint. source.kind="desktop" auto-detects a local port; source.kind="fabric" accepts workspaceId/datasetId. Keep connectionId for schema, DAX and previews. A schemaOnly connection cannot execute queries or live previews. No model objects are created or changed.
Inputs: source (required).
diff_visualB
Read-only comparison against one saved vilsem visual: JSON Patch diff and before/after live PNGs with critique. This writes no files. Run before replacing an existing design.
Inputs: spec (required), pageName (required), reportDir (required), visualName (required), +1 more.
explain_visualB
Explain a Vilsem custom visual spec, its field bindings, resolved empty-data ECharts option and exact DAX query before preview or commit. Does not inspect or modify native visuals or model objects.
Inputs: spec (required), bindings (required), maxRows, connectionId.
get_schemaA
Read model context without writes. Default detail=summary omits measure DAX and relationship graph; ask for full to understand calculations and join paths. Columns include exact DAX cardinality, BLANK share and numeric/date min/max, plus up to10 distinct samples and hidden/key flags. Unavailable fields carry explicit errors. Profiling is cached60s; use refresh after model/data changes. Optional page uses an internal/display page name plus reportDir (or a report-kind connection) to add read-only existing page bindings.
Inputs: connectionId (required), page, detail, refresh, +1 more.
list_pagesA
Read existing PBIR pages and visual names, types and positions so you can choose a page and avoid overlap. This tool does not edit or validate native visuals, slicers, bookmarks, filters or report themes.
Inputs: reportDir (required).
list_templatesA
List the shared Vilsem declarative visual templates with their slot and parameter contracts. Use these templates as starting points and read vilsem://docs/spec-format before changing token expressions or formatter templates.
Inputs: no named parameters.
list_visualsB
Read every vilsem Renderer visual across report pages from PBIR, with summary, bindings, version, layout and optional live thumbnail. Native visuals are skipped. Defaults to live thumbnails; pass thumbnails:false for metadata-only discovery. No separate manifest is used.
Inputs: reportDir (required), thumbnails, connectionId.
preview_variantsB
Compare1..4 candidate specs using ONE identical bound-data query; returns one labelled2x2 PNG and per-candidate critique. Bindings and visual-scoped measures must be shared, so design differences cannot silently change the numbers. Use this to choose between approaches before committing.
Inputs: specs (required), labels (required), bindings (required), connectionId (required), +6 more.
preview_visualA
Validate a Vilsem spec, query actual bound fields and return PNG plus option and actionable critique (default true). Critique uses rendered text bounds and option checks; inspect its limitations and iterate before committing. Theme defaults to the report theme when reportDir is supplied, light otherwise. Explicit spec.canvasTheme overrides unless a stored pane override requests report theme. maxRows is 1..10000 (default 200); bounded queries do not prove population coverage. This does not write a report.
Inputs: spec (required), bindings (required), connectionId (required), theme, +6 more.
read_visualB
Read a saved vilsem visual: migrated full spec, original-version provenance, field bindings, layout, scoped measures, separate format-pane overrides and current live PNG. Uses connectionId or connects through definition.pbir. Never reads native visuals.
Inputs: pageName (required), reportDir (required), visualName (required), connectionId.
run_daxA
Execute a read-only DAX EVALUATE table query against a connected model. Returns at most maxRows rows, default 200. Use it to inspect data and verify visual bindings; this tool does not expose XMLA commands or persistent model changes.
Inputs: dax (required), connectionId (required), maxRows.
update_visualA
Apply RFC6902 JSON Patch to the stored vilsem spec. Validates and previews before writing; returns diff and before/after PNGs. Defaults dryRun:true. Preserves manual format-pane objects unless resetFormatting:true; renderer identity/prototype/version paths are refused. Optional etag protects a reviewed dry run from intervening saves. Native/model/report objects are never edited.
Inputs: patch (required), pageName (required), reportDir (required), visualName (required), +4 more.
validate_specB
Resolve a Vilsem spec without data. With spec.measures, connectionId is required: validates schema references, cycles and scalar DAX using the connected engine. Run before preview_visual.
Inputs: spec (required), connectionId.
validate_visualsB
Validate only PBIR visual containers whose visualType is the stable Vilsem Renderer GUID. Reports schema errors, unreadable spec literals and unsupported current-renderer specs. Native visuals and all report-level objects are neither validated nor reported.
Inputs: reportDir (required).
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 15 tools
Most tools have clearly distinct roles: list_pages/list_visuals/read_visual separate discovery vs full read, update_visual vs commit_visual separate modify vs add. However, several near-pairs require careful reading: validate_visuals (report-level PBIR scan) vs validate_spec (spec without data), and explain_visual vs preview_visual (both resolve a spec, one without render). Descriptions do disambiguate these, but the surface is dense enough that misselection is plausible.
Every tool follows a strict verb_noun snake_case pattern (list_templates, run_dax, validate_visuals, connect_model, get_schema, preview_visual, diff_visual, update_visual, commit_visual). No mixing of styles or vague verbs; the verb choice meaningfully signals the operation type (list/get/read vs validate vs preview vs update/commit).
15 tools is at the top of the well-scoped range and each earns its place in a genuine authoring workflow: connection, schema, DAX, discovery, validation, explanation, preview, variant comparison, read, diff, update, and commit. No filler tools are visible and the count reflects a coherent multi-stage pipeline rather than sprawl.
The lifecycle is nearly full: connect, inspect, validate, explain, preview, compare, list, read, diff, patch, and commit are all present. Gaps remain around destructive/report-structuring operations — there is no delete_visual to remove a committed visual and no page-creation tool, only add-to-existing-page via commit_visual — which agents may need to work around.
Maintenance
Related MCP Connectors
Forge designed Power BI projects (.pbip) from your agent, bound to your own semantic model.
Find SmartVisuals Power BI custom visuals and get GUIDs, data roles and PBIR binding snippets.
Charts and dashboards as images for AI agents. No browser, same data same bytes. Local and free.
Agent-Native design tool - create and edit visual designs with agent assistance
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables AI assistants to discover and interact with local Power BI Desktop instances, including inspecting table/column schema and executing DAX queries.2-
- AlicenseBqualityAmaintenanceEnables AI agents to author and edit Power BI files locally (.pbix/PBIP), covering semantic models, reports, and Power Query M with 490 tools.10023 npm3Cryptographic Autonomy 1.0 (Combined Work Exception)
- AlicenseNot gradedqualityCmaintenanceEnables AI agents to securely connect to your own Power BI or Fabric tenant using your Azure identity, with tools to inspect workspaces and models, run read-only DAX, validate and deploy your own reports, take page screenshots, and enforce guardrails that protect shared resources.1MIT
- FlicenseNot gradedqualityCmaintenanceEnables AI applications to discover and connect to Power BI Desktop semantic models, inspect tables, columns, and measures, and validate or execute DAX queries through MCP.-