vilsem-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| VILSEM_APP_PATH | No | Path to a Vilsem source checkout. Required for model connections (reuses its Desktop bridge, Fabric introspection and authentication); templates, spec validation and local report tools work without a model connection. |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| prompts | {
"listChanged": true
} |
| resources | {
"listChanged": true
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| 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. |
| 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. |
| 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. |
| 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. |
| 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. |
| 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. |
| 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. |
| 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. |
| 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. |
| 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. |
| 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. |
| 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. |
| 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. |
| 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. |
| 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. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| design_visual | Get model context and a structured brief for the CALLING AGENT to design a new Vilsem visual or edit an existing one. No LLM/model/API key inside the MCP. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
| kpi_sparkline | |
| bullet | |
| lollipop | |
| radial_bar | |
| rose | |
| donut | |
| heat_strip | |
| diverging_bar | |
| dumbbell | |
| range_bar | |
| pictogram | |
| calendar_heatmap | |
| heatmap_2d | |
| kpi_delta | |
| expressiveness_bullet | |
| expressiveness_dual_axis | |
| expressiveness_gantt | |
| expressiveness_network | |
| expressiveness_radial_progress | |
| expressiveness_sankey | |
| expressiveness_small_multiples | |
| stress2_001_step-line | |
| stress2_002_spline-gradient | |
| stress2_003_rolling-line | |
| stress2_004_confidence-band | |
| stress2_005_fan-chart | |
| stress2_006_horizon | |
| stress2_007_sparkline-grid | |
| stress2_008_100-percent-column | |
| stress2_009_diverging-stack | |
| stress2_010_population-pyramid | |
| stress2_011_grouped-stacked | |
| stress2_012_lollipop-target | |
| stress2_013_cleveland-dots | |
| stress2_014_range-delta | |
| stress2_015_wrapped-bar | |
| stress2_016_revenue-strip | |
| stress2_017_polar-column | |
| stress2_018_nightingale-rose | |
| stress2_019_semi-donut-kpi | |
| stress2_020_nested-donut | |
| stress2_021_pie-top-other | |
| stress2_022_pictogram-icons | |
| stress2_023_waffle-share | |
| stress2_024_hemicycle | |
| stress2_025_bullet-bands-delta | |
| stress2_026_linear-gauge | |
| stress2_027_multi-ring-progress | |
| stress2_028_gauge-target-bands | |
| stress2_029_dual-axis-reference | |
| stress2_030_pareto | |
| stress2_031_waterfall-subtotals | |
| stress2_032_double-waterfall | |
| stress2_033_profit-bridge | |
| stress2_034_revenue-ohlc | |
| stress2_035_heikin-ashi | |
| stress2_036_diverging-heatmap | |
| stress2_037_calendar-margin | |
| stress2_038_daily-heat-strip | |
| stress2_039_country-lasagna | |
| stress2_040_treemap-secondary-colour | |
| stress2_041_treemap-drill | |
| stress2_042_sunburst-products | |
| stress2_043_icicle-partition | |
| stress2_044_circle-packing | |
| stress2_045_orthogonal-tree | |
| stress2_046_radial-tree | |
| stress2_047_taxonomy-org-chart | |
| stress2_048_dendrogram-values | |
| stress2_049_sankey-two-levels | |
| stress2_050_sankey-three-levels | |
| stress2_051_parallel-sets | |
| stress2_052_chord-ribbons | |
| stress2_053_chord-arcs | |
| stress2_054_arc-diagram | |
| stress2_055_relationship-force | |
| stress2_056_network-circular | |
| stress2_057_adjacency-matrix | |
| stress2_058_bipartite | |
| stress2_059_radar-benchmark | |
| stress2_060_radar-small-multiples | |
| stress2_061_parallel-six-measures | |
| stress2_062_median-quadrants | |
| stress2_063_connected-scatter | |
| stress2_064_scatter-matrix | |
| stress2_065_categorical-bubbles | |
| stress2_066_bump-rank | |
| stress2_067_slope-movers | |
| stress2_068_wiggle-streamgraph | |
| stress2_069_normalized-area | |
| stress2_070_cumulative-flow | |
| stress2_071_gantt-country | |
| stress2_072_event-timeline | |
| stress2_073_funnel-conversion | |
| stress2_074_mirrored-funnel | |
| stress2_075_labelled-quadrants | |
| stress2_076_independent-axis-zoom | |
| stress2_077_weekend-bands | |
| stress2_078_columns-error-bars | |
| stress2_079_control-chart | |
| stress2_080_ewma | |
| stress2_081_forest-range | |
| stress2_082_dot-whisker | |
| stress2_083_bar-shared-axis | |
| stress2_084_line-free-axis | |
| stress2_085_kpi-sparkline | |
| stress2_086_ranked-inline-bars | |
| stress2_089_histogram-auto | |
| stress2_090_histogram-width | |
| stress2_091_box-detail-prices | |
| stress2_092_violin-density | |
| stress2_093_beeswarm | |
| stress2_094_strip-mean | |
| stress2_095_ecdf | |
| stress2_096_ridgeline | |
| stress2_097_normal-qq | |
| stress2_098_hexbin-price-cost | |
| stress2_099_density2d-price-cost | |
| stress2_100_parameter-top-other | |
| stress2_101_group-percent-subtotals | |
| stress2_102_yoy-variance | |
| stress2_103_rebase-index | |
| stress2_104_ytd-prior-year | |
| stress2_105_cohort-retention | |
| stress2_106_pivot-heatmap | |
| stress2_107_pearson-six | |
| stress2_108_pareto-count | |
| stress2_109_date-spikes | |
| stress2_110_radial-histogram | |
| stress2_115_country-tile-grid | |
| stress2_116_word-cloud | |
| stress2_118_hierarchy-flame | |
| expressiveness_sunburst | |
| expressiveness_waterfall | |
| spec-format | |
| design-guide | |
| workflow |
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.