Skip to main content
Glama
vilsem-mcp
by bcsnpc

vilsem-mcp

Any visual, from a chat, into your existing Power BI report, with real data, with no executable code in the report.

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.

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.

Related MCP server: superbi-mcp

Three authoring layers

  1. Composition: a supported chart type and configuration; the smallest spec and maintenance cost.

  2. Template: ECharts structure, declared slots, parameters and bounded transforms; more control, with explicit layout and unit responsibilities.

  3. Expression series: the Round3 GroupC bounded-geometry language is planned, not available in0.6 yet. Arbitrary renderItem/JavaScript remains refused; see the expressiveness gaps.

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 dependency is the immutable public core-v0.6.0 release tarball. For local core development only, install a locally packed core tarball; restore the public release URL before distributing.

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_TOKEN for 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 returns schemaOnly: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.6.0
vilsem-mcp
# Or: npx --yes --package=git+https://github.com/bcsnpc/vilsem-mcp.git#v0.6.0 vilsem-mcp

The process serves stdio JSON-RPC; diagnostics go to stderr.

Claude Desktop

Add to claude_desktop_config.json, replacing the paths:

{"mcpServers":{"vilsem":{"command":"node","args":["D:/vilsem-mcp/dist/index.js"]}}}

Claude Code

claude mcp add --transport stdio vilsem -- node D:/vilsem-mcp/dist/index.js

Codex

Add to ~/.codex/config.toml or a trusted project's .codex/config.toml:

[mcp_servers.vilsem]
command = "node"
args = ["D:/vilsem-mcp/dist/index.js"]

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.

  1. Open your semantic model in Desktop, then call connect_model with source:{kind:"desktop"}; provide a port if more than one engine is open. For Fabric, provide workspaceId and datasetId.

  2. Call get_schema and choose existing dimensions/measures, or declare query-only spec.measures. With scoped measures pass connectionId to validation, explanation and commit as well as preview. Use run_dax to verify the data.

  3. Call list_templates, read vilsem://docs/spec-format, then validate_spec, explain_visual and preview_visual. Check the PNG and option before writing.

  4. Call list_pages, choose a position without overlap, then commit_visual with the report folder, page folder name, a new visualName, spec, bindings and layout.

  5. Accept Desktop's external-change reload prompt. Avoid saving stale Desktop state over external changes. Microsoft excludes report-level report.json changes 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.

  6. 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, validate_spec, explain_visual, preview_visual, preview_variants, list_pages, list_visuals, read_visual, diff_visual, update_visual, commit_visual, validate_visuals. 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.

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

The shared formatting contract has69properties: theme/background, 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. An approved shared VILSEM_TEMPLATES_DIR library is a GroupC feature, not shipped in0.6. 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.

Available Tools

15 tools
commit_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.

NameRequiredDescriptionDefault
specYes
layoutYes
bindingsYes
pageNameYes
reportDirYes
visualNameYes
connectionIdNo

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well: it discloses the refusal of duplicate visual names, limits collateral changes to missing renderer resources and registration, and enumerates what is left untouched (native visuals, slicers, bookmarks, filters, themes, model objects). It also warns about the Desktop external-change reload prompt. It does not cover failure/rollback behavior if the write partially fails.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four dense sentences, front-loaded with the action and followed by constraints and side effects in a logical order. The '@vilsem/core' package reference adds little for an agent but costs only a few words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutating tool with no annotations and no output schema, the side-effect and safety disclosure is strong, but the description leaves the most complex inputs (spec, bindings with its 1-6 measure limit, layout) entirely unexplained. An agent knows what the tool will and won't change but not how to construct the payload.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across 7 parameters including nested spec, bindings, and layout structures. The description only obliquely hints at pageName and visualName ('one existing PBIR page', 'existing visual names are refused') and says nothing about spec, bindings, layout, reportDir, or the optional connectionId. This leaves the agent dependent on bare schema property names for the hardest inputs.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Add one Vilsem Renderer visual to one existing PBIR page using @vilsem/core') with explicit cardinality and target scope. This clearly separates it from siblings like update_visual, preview_visual, and validate_visuals.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage context by constraining to one existing page and refusing existing visual names, which tells the agent this is a create-only path. However it never names alternatives such as preview_visual or validate_visuals, and does not say whether validation should precede the commit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

NameRequiredDescriptionDefault
sourceYes

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well: it declares read-only behavior, that no model objects are created or changed, and that schemaOnly connections cannot execute queries or live previews. Gaps remain around the lifecycle of a connection (whether it persists, how it is closed) and error behavior when no model is open or the reportDir cannot be resolved.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The lead sentence is well front-loaded and the mode guidance is compact, but the byPath/byConnection clause is dense jargon (definition.pbir, TMDL, SSAS) that does not correspond to any schema field and reads as internal documentation leaking into the tool description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single nested oneOf parameter with no annotations or output schema, the description covers modes, read-only semantics, the connectionId handoff and the schemaOnly limitation. It could go further on what a successful connection returns and on failure modes, but nothing essential to invoking it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it mostly does: it explains what the report, desktop and fabric variants each need (reportDir, port, workspaceId/datasetId). However it references 'byPath' and 'byConnection' modes that do not appear anywhere in the input schema, which leaves a dangling concept the agent cannot map to a parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence gives a specific verb, resource and scope: 'Connect read-only to an existing model'. It also implicitly positions the tool as the prerequisite for the schema/DAX/preview siblings, so an agent can tell what it is for without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states an explicit preference order ('Prefer source.kind="report" with reportDir') and then explains when each alternative applies: desktop auto-detects a port, fabric takes workspaceId/datasetId. It also states the downstream usage rule ('Keep connectionId for schema, DAX and previews') and a hard constraint for schemaOnly connections.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

NameRequiredDescriptionDefault
specYes
pageNameYes
reportDirYes
visualNameYes
connectionIdNo

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does disclose the safety-relevant facts: it is read-only and writes no files. It also lists the return artifacts (patch diff, PNGs, critique). However, it omits what happens if the visual doesn't exist, that live rendering costs time/side effects, and any permission requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with purpose and output artifacts, then the safety and usage cues. 'This writes no files' mildly repeats 'Read-only' but serves as deliberate emphasis rather than padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers outputs and the non-destructive behavior well, which matters since there is no output schema. But for a five-parameter tool with a nested spec object, zero schema description coverage and no annotations, the total absence of parameter guidance leaves the definition materially incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across five parameters (reportDir, pageName, visualName, spec, connectionId), and the description explains none of them. Notably the required 'spec' object and optional 'connectionId' are entirely opaque to the caller, so the description does not compensate for the coverage gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Read-only comparison against one saved vilsem visual') and names concrete outputs (JSON Patch diff, before/after live PNGs with critique). It doesn't explicitly name a sibling tool, but the phrasing clearly separates it from validate_/preview_/update_ tools by emphasizing comparison against an already-saved visual.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Run before replacing an existing design' gives a clear usage context that implicitly routes the agent away from update_visual/commit_visual until a diff has been inspected. It stops short of naming alternatives or stating when not to use it (e.g., when the visual does not yet exist).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

NameRequiredDescriptionDefault
specYes
maxRowsNo
bindingsYes
connectionIdNo

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden alone; it does establish non-mutating intent via 'Explain' and the explicit non-modification clause. However, it never says whether the 'exact DAX query' is actually executed against the model (and thus has cost/latency/side effects), what happens when the spec is invalid, or what authorization the connection requires.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with the primary output content front-loaded and the scope caveat second; nothing reads as filler. Density is high but each element (spec, bindings, ECharts option, DAX query) earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, and the description partly compensates by listing what the explanation contains. But for a tool with nested objects, a UUID connection reference, and a row cap, it omits the meaning of two parameters and says nothing about failure modes or response structure.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% with four parameters, two nested, so the description must compensate and largely does not. It covers only 'spec' and 'bindings' at a name level; 'connectionId' (which model the DAX targets) and 'maxRows' (a sampling bound up to 10000) are never mentioned, leaving half the input surface unexplained anywhere.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Explain') and enumerates exactly what gets explained: the spec, field bindings, resolved empty-data ECharts option, and exact DAX query. The closing negative clause ('Does not inspect or modify native visuals or model objects') carves out scope against read_visual/update_visual, though it never names the sibling that should be used for those cases.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'before preview or commit' gives concrete ordering guidance that ties this tool to specific siblings in the workflow. The exclusion of native visuals and model objects provides when-not guidance, but no alternative tool is named for those scenarios.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

NameRequiredDescriptionDefault
pageNo
detailNosummary
refreshNo
reportDirNo
connectionIdYes

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations supplied, the description carries the whole load and does well on several axes: read-only framing ('without writes'), a 60s profiling cache with an explicit invalidation path, and 'unavailable fields carry explicit errors' signalling graceful degradation. It still omits permission requirements, response envelope, and how large a payload 'full' produces, which matters for a verbose model dump.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the read-only framing and tightly packed, but sentences run together into a near-run-on with typographic slips ('up to10 distinct samples', 'cached60s'). Information density is high and little is wasted, though bullet-style separation of the detail/refresh/page rules would improve scanability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 5-parameter tool with no annotations, no output schema and zero schema description coverage, the description supplies most of what an agent needs: return content, cache behaviour, default behaviour and the page/reportDir coupling. The residual gaps are connectionId semantics and the shape of the returned object.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate and largely does: it defines the summary/full trade-off, the refresh/cache relationship, and explains that page requires an internal or display page name plus reportDir or a report-kind connection, adding meaning well beyond the bare schema types. connectionId is the one required parameter left unexplained, likely a deliberate assumption.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb and resource: 'Read model context without writes', then enumerates what the read returns (DAX cardinality, BLANK share, min/max, distinct samples, hidden/key flags). The agent can tell this is a model-introspection tool, though it never names a sibling (list_pages, run_dax, connect_model) to sharpen the boundary.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit conditional guidance for two parameters: 'Default detail=summary omits measure DAX and relationship graph; ask for full to understand calculations and join paths' and 'use refresh after model/data changes.' No when-not guidance or comparisons to sibling tools, so the agent must infer the division of labour with list_pages/run_dax on its own.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

NameRequiredDescriptionDefault
reportDirYes

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and does state that the tool is read-only and does not edit or validate native visuals, slicers, bookmarks, filters or themes. It also sketches the returned content (page and visual names, types, positions), though it omits behavior on invalid paths or empty reports.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the capability and followed by tightly scoped exclusions; no filler. The second sentence's list of out-of-scope artifacts is dense but earns its place as scope fencing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter read tool with no output schema, the description covers purpose and scope but leaves the sole input unexplained and gives no notion of output shape or error conditions. Adequate but with clear gaps given zero schema description coverage.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is one required parameter, reportDir, with 0% schema description coverage, and the description never mentions it or explains the expected directory structure. The only parameter's semantics are left entirely to inference from its name.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a concrete verb and resource ('Read existing PBIR pages and visual names, types and positions') and adds a stated purpose. The exclusion sentence implicitly separates it from validate_visuals/commit_visual, though no sibling is named directly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'so you can choose a page and avoid overlap' gives a clear usage context (inspect before placing new visuals). The second sentence supplies when-not-to-use guidance by ruling out editing and validation tasks, but no alternative tool is named explicitly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must carry behavioral disclosure. 'List' implies read-only access, but the description does not explicitly state side effects, permissions, return format, or pagination behavior. It does add useful context that these are shared templates with contracts and a prerequisite doc to read before modifying them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with no waste. The core purpose is front-loaded, followed by a concise usage prerequisite.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple zero-parameter list tool with no output schema, the description covers what is listed and a key usage prerequisite. Minor gaps remain because it does not describe the return shape or explicitly state read-only behavior, but overall it is sufficient.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so parameter semantics are not a burden. The description appropriately does not invent parameter details, and the empty schema is fully consistent.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific verb and resource: list shared Vilsem declarative visual templates with slot and parameter contracts. It distinguishes the resource from siblings like list_pages and get_schema implicitly, but does not explicitly name an alternative tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear usage context: use these templates as starting points and read vilsem://docs/spec-format before changing token expressions or formatter templates. It does not state when not to use the tool or name an alternative sibling.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

NameRequiredDescriptionDefault
reportDirYes
thumbnailsNo
connectionIdNo

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses meaningful behavior: native visuals are skipped, thumbnails are live by default (implying a heavier call), and no manifest file is required. It does not state read-only safety, authorization needs, cost of live thumbnail rendering, or failure behavior for missing/invalid reportDir.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences, front-loaded with what is returned, then the default behavior and the opt-out flag. The closing sentence 'No separate manifest is used' is cryptic and adds little without context on what would otherwise be needed.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a three-parameter read tool with no annotations and no output schema, the description covers the main payload and the thumbnail mode well. It falls short on connectionId, on the reportDir path expectations, and on any indication of how results are structured or bounded across multiple pages.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It explains 'thumbnails' well, and 'reportDir' is loosely implied by 'from PBIR', but 'connectionId' is never mentioned and its role (live thumbnail source?) is left entirely undocumented.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Read') and resource ('vilsem Renderer visual across report pages from PBIR') and enumerates the returned payload (summary, bindings, version, layout, thumbnail). The exclusion of native visuals further scopes it. It does not explicitly distinguish itself from siblings like read_visual or list_pages, and the term 'vilsem Renderer' is unexplained jargon.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear usage rule for the thumbnails flag (defaults to live, pass false for metadata-only discovery), which is genuinely helpful for a discovery tool. However, there is no guidance on when to choose this over read_visual, explain_visual, or list_pages, so the agent must infer sibling selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

NameRequiredDescriptionDefault
specsYes
themeNo
widthNo
heightNo
labelsYes
localeNoen-US
maxRowsNo
bindingsYes
reportDirNo
connectionIdYes

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It usefully discloses that all candidates are rendered from ONE identical bound-data query and that bindings/measures must be shared so numbers cannot drift, which is real behavioral value. However it does not say what happens when the shared-binding constraint is violated (hard error vs. advisory), nor anything about cost, permissions, or how many queries are actually executed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences, front-loaded with the core action and output, with the invariant rationale attached to the rule it explains. Minor formatting defects ('Compare1..4', 'labelled2x2') mar an otherwise tight structure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description does cover the return value, which matters since no output schema exists, and it explains the core invariant. But for a 10-parameter tool with nested binding objects and zero schema descriptions, essential call-shaping details (labels alignment, reportDir purpose, row limits) are missing, leaving an agent to guess.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across 10 parameters, so the description must compensate and largely does not. It references specs, labels and bindings conceptually but gives no meaning for connectionId, theme, width/height, locale, maxRows, or reportDir, and does not explain the labels-to-specs correspondence that the 2x2 layout depends on.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Compare 1..4 candidate specs'), the shared-data mechanism, and the return artifact (labelled 2x2 PNG plus per-candidate critique). It implies the distinction from single-visual preview tools via the 1..4 candidate framing, but never names preview_visual or diff_visual, so the sibling separation is inferred rather than stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Use this to choose between approaches before committing' gives a clear decision-point context for invocation. It lacks explicit exclusions (e.g. use preview_visual for a single spec, validate_spec to check correctness) and says nothing about prerequisites such as requiring a live connection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

NameRequiredDescriptionDefault
specYes
themeNo
widthNo
heightNo
localeNoen-US
maxRowsNo
bindingsYes
critiqueNo
reportDirNo
connectionIdYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the load and does so well: it declares critique defaults to true, explains the theme resolution precedence chain (report theme when reportDir supplied, explicit spec.canvasTheme overrides, stored pane override wins), and warns that bounded queries do not prove population coverage. Gaps remain around render cost/latency and permissions, but the mutability and defaulting behaviour are unusually well disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and output, and no sentence is filler — each one adds either a default, a precedence rule, or a caveat. Some sentences pack multiple clauses (theme resolution) and read as terse internal shorthand, costing a bit of scannability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 10-parameter tool with nested objects, no annotations and no output schema, the description covers the render/critique outcome and the tricky defaulting behaviour, but leaves the shape of the returned PNG payload and the era/critique result unexplained, and says nothing about bindings semantics. Adequate to call it, not quite enough to call it confidently the first time.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate and it partly does: theme, reportDir, critique and maxRows (1..10000, default 200) all get meaning and precedence rules beyond the bare schema. However width, height, locale, connectionId and especially the nested bindings.measures/dimensions structure are left entirely to the schema, and "bindings" is the most complex parameter present.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States specific verbs and outputs: validate a spec, query bound fields, return a PNG plus critique, and explicitly negates a neighbouring capability ("This does not write a report"). It is distinguishable from commit_visual/validate_spec by the rendering-plus-critique output, though it never names a sibling, and the phrase "plus option and actionable critique" is awkward enough to blur what exactly is returned.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives real workflow direction: "inspect its limitations and iterate before committing," which tells the agent to loop on previews before persisting. It also signals the tool is non-writing. It stops short of routing to alternatives such as preview_variants or validate_spec, so the agent must infer which preview/validation tool to pick.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

NameRequiredDescriptionDefault
pageNameYes
reportDirYes
visualNameYes
connectionIdNo

TDQS

B3.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations supplied, the description carries the full burden and does fairly well: 'Read' signals a non-destructive operation, and it discloses the exact return payload including the current live PNG, which is behavior an agent cannot get from the schema. It omits failure modes (missing visual, bad connectionId, missing definition.pbir) and any cost/time expectations, keeping it short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences with the payload enumeration front-loaded and the connection rule second. The long comma-separated list of return fields is dense jargon but each item is informative rather than filler; no sentence is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Because there is no output schema, the description's enumeration of returned artifacts is the main compensating strength. Against that, three required identifiers are undocumented in both schema and description, and no error behavior is described, so completeness is adequate but has clear gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across four parameters, so the description must compensate and largely does not. Only connectionId receives added meaning (an alternative to resolving the model through definition.pbir); reportDir, pageName, and visualName are never explained, so an agent must guess how they compose to identify a visual.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Uses a specific verb (Read) plus a named resource (saved vilsem visual) and enumerates exactly what the read yields: migrated spec, provenance, bindings, layout, scoped measures, format-pane overrides, and PNG. It also carves out a scope boundary ('Never reads native visuals'), which separates it from preview_visual/explain_visual implicitly, though those siblings are not named.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states the connection requirement ('Uses connectionId or connects through definition.pbir') and one hard exclusion (native visuals), which is real usage guidance. However, it never says when an agent should choose this over explain_visual, preview_visual, or diff_visual, so the routing decision is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

NameRequiredDescriptionDefault
daxYes
maxRowsNo
connectionIdYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations supplied, the description carries the full burden and does disclose the key traits: the operation is read-only, cannot make persistent model changes, does not expose XMLA, and caps output at maxRows (default 200). It omits secondary behavior an agent might want, such as error handling for malformed DAX, timeouts, or how a connectionId is obtained/kept alive.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the action and resource, then the return-size constraint, then usage and scope exclusions. No filler and nothing repeated verbatim from the schema beyond a useful default restatement.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a three-parameter, read-only query tool with no output schema, the description covers what is executed, what comes back (bounded rows), and what it will not do. The remaining gap is the connectionId lifecycle and result shape (columns vs. rows), which an agent would have to infer from sibling tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate. It does constrain 'dax' to an EVALUATE table query (a real semantic requirement beyond the schema's string type) and restates the maxRows default, but it says nothing about 'connectionId' — its uuid format, whether it comes from connect_model, or what happens if it is stale.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource ('Execute a read-only DAX EVALUATE table query against a connected model') and scopes it to table queries only. It implicitly separates itself from schema/model-management siblings (get_schema, connect_model) by framing this as data inspection, but it never names an alternative sibling explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Use it to inspect data and verify visual bindings' gives a concrete use context, and the closing clause rules out two adjacent use cases (XMLA commands, persistent model changes). It stops short of naming which sibling to use instead when the agent actually wants schema or connection setup.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

NameRequiredDescriptionDefault
etagNo
patchYes
dryRunNo
pageNameYes
reportDirYes
visualNameYes
connectionIdNo
resetFormattingNo

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so well: it discloses validation/preview behavior, the returned diff and before/after PNGs, the dryRun:true default, preservation of manual format-pane objects unless resetFormatting is set, refusal of renderer identity/prototype/version paths, etag-based optimistic concurrency, and that native/model/report objects are never edited.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Dense and front-loaded, leading with the core operation and following with safety-relevant constraints. Every sentence adds information, though the run-on semicolon chaining makes it slightly harder to scan than a cleanly bulleted set of constraints.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no annotations and no output schema, the description covers the critical behavioral surface: safety defaults, protected paths, concurrency, and return values. The remaining gap is the four unexplained path/identity parameters, which an agent must infer from naming alone.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across 8 parameters, so the description must compensate. It meaningfully explains patch (RFC6902), dryRun, resetFormatting, and etag, but leaves reportDir, pageName, visualName, and connectionId entirely undocumented in both schema and description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Apply RFC6902 JSON Patch to the stored vilsem spec') and implicitly separates itself from siblings like diff_visual, preview_visual, and commit_visual by describing patch-application with built-in preview. An agent can identify the operation without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied rather than stated: the dryRun default and 'validates and previews before writing' tell the agent this is the safe path to mutate a spec, and the etag note hints at a review-then-commit flow. However, it never explicitly says when to prefer this over commit_visual or diff_visual, nor when to set dryRun:false.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

NameRequiredDescriptionDefault
specYes
connectionIdNo

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does disclose that validation runs against 'the connected engine' and covers references, cycles, and scalar DAX. It does not say whether the call is non-mutating, nor what happens on failure (thrown error vs. returned diagnostics), and there is no output schema to cover that. Adequate but leaves real behavioral gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with the core action, then the prerequisite and sequencing. No filler. The 'Resolve a Vilsem spec without data' opener carries domain jargon but is dense with information rather than redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool taking a nested, free-form spec object with zero schema coverage, no annotations, and no output schema, the description covers when and how to invoke it but not what a valid spec looks like or what the result contains. An agent knows when to call it, but not how to interpret the outcome.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the spec parameter is an unconstrained object with additionalProperties {}, so the schema conveys nothing about its structure. The description compensates for connectionId by stating its conditional requirement, but says nothing about the shape of spec or what 'measures' contains. The most complex parameter remains entirely opaque.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource (resolve/validate a Vilsem spec) and qualifies it with 'without data', which separates it from the rendering path. It also enumerates what is checked: schema references, cycles, and scalar DAX. It stops short of distinguishing itself from the sibling validate_visuals, leaving some ambiguity about scope.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit lifecycle guidance is given: 'Run before preview_visual', which tells the agent where this fits in the workflow. The conditional prerequisite 'With spec.measures, connectionId is required' is also actionable. However, it never states when to use validate_visuals instead, nor what to do if validation fails.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

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.

NameRequiredDescriptionDefault
reportDirYes

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It usefully discloses what the result contains (schema errors, unreadable spec literals, unsupported current-renderer specs) and what is silently skipped, but says nothing about permissions, whether it is purely read-only, or whether it fails fast versus collecting all errors.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight sentences with the scope constraint front-loaded and the exclusions last. No filler, though the GUID phrasing is more opaque than it needs to be for a reader without domain context.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema and no annotations, so the description must explain returns — which it partly does by enumerating the reported error categories. The gap is the sole input parameter and any indication of result shape or granularity (per-visual vs aggregate), which leaves it short of complete for a validation tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the single parameter reportDir has no description in the schema. The description never mentions reportDir, its expected layout, or whether it points at a report root or a PBIR subfolder, so the agent gets no help on the one input it must supply.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb (validate) and a narrowly scoped resource (PBIR visual containers whose visualType is the stable Vilsem Renderer GUID), which lets an agent distinguish this from a general validation tool. The term 'Vilsem Renderer GUID' is domain jargon not resolvable from the definition itself, so the boundary is clear in shape but not fully in content.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states a negative scope ('Native visuals and all report-level objects are neither validated nor reported'), which is genuine when-not guidance. However, it never names the alternative for those excluded cases (e.g. validate_spec, which exists as a sibling), leaving the agent to infer the routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 11 tool updates
    • Changedcommit_visual2 fields changed
      • changedInput schema / properties / bindings / properties / measures / maxItems
        Previous value: -3New value: +6
      • addedInput schema / properties / connectionId
        Added value: +{
        +  "format": "uuid",
        +  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
        +  "type": "string"
        +}
    • Changedconnect_model1 field changed
      • changedInput schema / properties / source / oneOf
        Previous value: -[
        -  {
        -    "properties": {
        -      "kind": {
        -        "const": "desktop",
        -        "type": "string"
        -      },
        -      "port": {
        -        "maximum": 65535,
        -        "minimum": 1,
        -        "type": "integer"
        -      }
        -    },
        -    "required": [
        -      "kind"
        -    ],
        -    "type": "object"
        -  },
        -  {
        -    "properties": {
        -      "datasetId": {
        -        "format": "uuid",
        -        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
        -        "type": "string"
        -      },
        -      "kind": {
        -        "const": "fabric",
        -        "type": "string"
        -      },
        -      "workspaceId": {
        -        "format": "uuid",
        -        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "kind",
        -      "workspaceId",
        -      "datasetId"
        -    ],
        -    "type": "object"
        -  }
        -]New value: +[
        +  {
        +    "properties": {
        +      "kind": {
        +        "const": "report",
        +        "type": "string"
        +      },
        +      "reportDir": {
        +        "minLength": 1,
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "kind",
        +      "reportDir"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "kind": {
        +        "const": "desktop",
        +        "type": "string"
        +      },
        +      "port": {
        +        "maximum": 65535,
        +        "minimum": 1,
        +        "type": "integer"
        +      }
        +    },
        +    "required": [
        +      "kind"
        +    ],
        +    "type": "object"
        +  },
        +  {
        +    "properties": {
        +      "datasetId": {
        +        "format": "uuid",
        +        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
        +        "type": "string"
        +      },
        +      "kind": {
        +        "const": "fabric",
        +        "type": "string"
        +      },
        +      "workspaceId": {
        +        "format": "uuid",
        +        "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
        +        "type": "string"
        +      }
        +    },
        +    "required": [
        +      "kind",
        +      "workspaceId",
        +      "datasetId"
        +    ],
        +    "type": "object"
        +  }
        +]
    • Addeddiff_visual
    • Addedexplain_visual
    • Changedget_schema4 fields changed
      • addedInput schema / properties / detail
        Added value: +{
        +  "default": "summary",
        +  "enum": [
        +    "summary",
        +    "full"
        +  ],
        +  "type": "string"
        +}
      • addedInput schema / properties / page
        Added value: +{
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / refresh
        Added value: +{
        +  "default": false,
        +  "type": "boolean"
        +}
      • addedInput schema / properties / reportDir
        Added value: +{
        +  "minLength": 1,
        +  "type": "string"
        +}
    • Addedlist_visuals
    • Addedpreview_variants
    • Changedpreview_visual6 fields changed
      • changedInput schema / properties / bindings / properties / measures / maxItems
        Previous value: -3New value: +6
      • addedInput schema / properties / critique
        Added value: +{
        +  "default": true,
        +  "type": "boolean"
        +}
      • addedInput schema / properties / locale
        Added value: +{
        +  "default": "en-US",
        +  "maxLength": 64,
        +  "minLength": 2,
        +  "type": "string"
        +}
      • addedInput schema / properties / maxRows
        Added value: +{
        +  "default": 200,
        +  "maximum": 10000,
        +  "minimum": 1,
        +  "type": "integer"
        +}
      • addedInput schema / properties / reportDir
        Added value: +{
        +  "minLength": 1,
        +  "type": "string"
        +}
      • addedInput schema / properties / theme
        Added value: +{
        +  "anyOf": [
        +    {
        +      "enum": [
        +        "report",
        +        "light",
        +        "dark"
        +      ],
        +      "type": "string"
        +    },
        +    {
        +      "additionalProperties": {},
        +      "propertyNames": {
        +        "type": "string"
        +      },
        +      "type": "object"
        +    }
        +  ]
        +}
    • Addedread_visual
    • Addedupdate_visual
    • Changedvalidate_spec1 field changed
      • addedInput schema / properties / connectionId
        Added value: +{
        +  "format": "uuid",
        +  "pattern": "^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$",
        +  "type": "string"
        +}
  2. 9 tool updatesv0.6.0
    • First observedcommit_visual
    • First observedconnect_model
    • First observedget_schema
    • First observedlist_pages
    • First observedlist_templates
    • First observedpreview_visual
    • First observedrun_dax
    • First observedvalidate_spec
    • First observedvalidate_visuals

TDQS

A3.7/5.0

Scored across 15 tools

Disambiguation4/5

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.

Naming Consistency5/5

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

Tool Count5/5

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.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo recent community issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    A
    maintenance
    Enables AI agents to author and edit Power BI files locally (.pbix/PBIP), covering semantic models, reports, and Power Query M with 490 tools.
    100
    23 npm
    3
    Cryptographic Autonomy 1.0 (Combined Work Exception)
  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables 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.
    1
    MIT