Use this command to install CubeScope with WinGet:
winget install --id=dasimon.CubeScope -e
CubeScope is a modern workbench for SSAS Multidimensional developers: write, understand, measure and maintain MDX against existing cubes, with a built-in AI expert. A single self-contained executable (ASP.NET Core 10 + Vue 3) that opens a local web app in your browser — no install, no server, no cloud. Features: Monaco MDX editor with autocompletion, virtualized results grid, DMV metadata explorer, a query profiler that splits Formula Engine vs Storage Engine from SSAS traces, perfmon stats, MDX Script + dependency graph, cache management, query history, and an AI assistant — explain / optimize / detect anti-patterns / format, profile-grounded optimization, and natural-language → MDX generation. Powered by Anthropic by default, or any OpenAI-compatible endpoint (local Ollama/LM Studio included) for on-prem confidentiality. Windows only, Integrated Security. Scope is SSAS Multidimensional only — no Tabular, Power BI or DAX.
README
CubeScope
A modern workbench for SSAS Multidimensional developers. Write, understand,
measure and maintain MDX against existing cubes — with a built-in AI expert.
CubeScope is the spiritual successor to MDX Studio: a single self-contained
executable that launches a local web app in your browser. No install, no server
component to deploy, no cloud.
> Scope. CubeScope targets SSAS Multidimensional only. Tabular, Power BI
> and DAX are permanently out of scope by design — there is no multi-engine
> abstraction and none is planned.
Features
MDX editor — Monaco with a hand-written MDX grammar (syntax highlighting,
reference detection), autocompletion of measures, hierarchies and members
(lazy-loaded after .), structural folding of { } / ( ) / SCOPE blocks
and // #region sections (with fold-all / unfold-all), function signatures and
measure/member captions on hover, execute with F5 / Ctrl+Enter (the whole
editor or just the selected text), cancel in flight.
Results grid — virtualized grid handling wide crossjoins; export to CSV
or copy to the clipboard (Excel-friendly); recent results kept in closeable
tabs, and DRILLTHROUGH a query to view its source rows.
Productivity helpers — a reusable MDX snippets library (save / insert /
delete) and a calculated-member scaffold (WITH MEMBER / CREATE MEMBER).
Regression harness — capture queries with their current results as a
baseline, then re-run them after a script change and flag any changed value
(per-cell diff) — "did my calculation change silently break a value?".
Metadata explorer — filterable tree of measures and dimensions (DMV-backed);
double-click inserts at the cursor. Measure descriptions surface as hover
tooltips and in the MDX autocomplete documentation.
Query profiler — per-query Formula Engine vs Storage Engine split from
SSAS traces, Query Subcube breakdown (readable text), cache and aggregation
hits, plus a persisted run history with before/after comparison of two runs.
(Requires SSAS admin rights — see Prerequisites.)
Perfmon stats — per-query perfmon counter deltas (MDX / cache / storage
engine), streamed live over SignalR.
MDX Script & dependencies — read the cube's MDX Script, browse calculated
members / named sets / SCOPEs and their dependency graph, full-text search and
find-references across the script, and an AI "explain this calculation" tracer
that walks a member's dependency chain; export a Markdown doc of the cube.
SSDT project mode — open the .cube file of an SSDT Multidimensional project
(type a path or use the built-in file browser), edit the MDX Script with
// #region grouping and folding, save round-trips into the .cube (plus a
plain-text .mdxscript.mdx export for readable Git diffs), and deploy the script
alone to a dev cube (BIDS Helper style, with a divergence guard and dev-catalog
warning) without a full project deploy. On divergence a side-by-side Monaco diff
shows server vs project before you overwrite, with a change-impact analysis
listing which downstream members a change affects; you can also edit a calculated
member's properties (format string, display folder, description) with round-trip
writeback into the .cube, safely rename a calculated member across the whole
script (definition + references), and every deploy is kept in an audit log.
AI assistant — Explain / Optimize / Detect anti-patterns / Format, a
profiler-grounded optimization action that feeds the AI the real execution
profile (Formula/Storage Engine split, subcubes, cache/aggregation hits) for
concrete, numbers-justified advice, and natural-language → MDX (describe what
you want, the AI writes the query from the cube's metadata). Powered by the
Anthropic API (claude-opus-4-8) by default, with the relevant cube metadata
injected into the context. Can also target any OpenAI-compatible endpoint
(local Ollama / LM Studio for on-prem confidentiality, OpenAI, Mistral,
OpenRouter, Groq…) — see Prerequisites. (Requires an API key — see Prerequisites.)
Cache management — clear the SSAS cache of a catalog (explicit confirmation).
History — every query stored locally (SQLite), filterable, reloadable.
Bilingual UI — French (default) and English, switchable at runtime.
Metadata explorer & MDX Script
Query profiler
Prerequisites
To run the published executable:
Windows (x64). CubeScope uses Windows-only perfmon APIs and Integrated
Security — it is a Windows tool by design.
Network access to an SSAS Multidimensional instance. All connections
use Windows Integrated Security — no credentials are stored anywhere.
SSAS administrator rights on the target instance are required for the
Query Profiler (it creates a server-side trace). The rest of the app works
without them.
"Performance Monitor Users" group membership on the SSAS server, plus the
Remote Registry service running, are required for the Perfmon stats
panel when profiling a remote server.
ANTHROPIC_API_KEY environment variable for the AI assistant. If it
is absent, the AI panel degrades gracefully with a clear message; everything
else keeps working. The key is read from the environment only — it is never
stored locally. The Anthropic model defaults to claude-opus-4-8; set
CUBESCOPE_ANTHROPIC_MODEL to use a different Claude model.
Alternative LLM providers (optional). To use any OpenAI-compatible
endpoint instead of Anthropic — a local model (Ollama, LM Studio) so no
data leaves your network, or OpenAI / Mistral / OpenRouter / Groq — set
CUBESCOPE_LLM_BASEURL (e.g. http://localhost:11434/v1) and
CUBESCOPE_LLM_MODEL (e.g. qwen2.5-coder), plus CUBESCOPE_LLM_KEY if the
endpoint needs a bearer token. When both base URL and model are set they take
precedence over Anthropic. The active model name is shown in the AI panel.
(Azure OpenAI's non-standard deployment URL and api-key header are not
covered.)Ollama users: CubeScope doesn't send a context-length
parameter, so your model runs at whatever context size it was loaded with
(often 2048–4096 by default) — too small for the natural-language → MDX
metadata dump on a cube with hundreds of measures. Create a variant with a
larger context first: ollama create mymodel-32k -f Modelfile with
PARAMETER num_ctx 32768 in the Modelfile, and point
CUBESCOPE_LLM_MODEL at that. Expect noticeably lower MDX quality than
Claude for this — MDX is a niche language most local models barely saw
in training.
It starts Kestrel on a free localhost port and opens your default browser.
Connect to your SSAS server (a hostname, or host:port for a named instance on
a fixed port), pick a catalog, and start writing MDX.
Build from source
# Restore + build + run the .NET unit tests (excludes live-SSAS integration tests)
dotnet build CubeScope.slnx -c Release
dotnet test CubeScope.Core.Tests -c Release --filter "Category!=Integration"
# Front-end (optional in dev — the publish step does this automatically)
cd CubeScope.Web
npm ci
npm run build
Development loop
Run the server and the Vite dev server side by side (Vite proxies /api and
/hubs to Kestrel):
# Terminal 1 — API on a fixed port, no auto-open
dotnet run --project CubeScope.Server -- --port 5199 --no-browser
# Terminal 2 — Vue dev server with HMR
cd CubeScope.Web
npm run dev
Read-only SSAS server-behaviour harness kept as a non-regression tool (--discover).
Key technical choices:
SSAS connectivity via Microsoft.AnalysisServices.AdomdClient.NetCore
(ADOMD.NET Core) for queries and DMVs, and AMO (.NetCore variant) only to
read the MDX Script and resolve object IDs.
Metadata from $SYSTEM.MDSCHEMA_* DMVs, members lazy-loaded and cached.
Profiler built on SSAS traces (QueryEnd, QuerySubcube /
QuerySubcubeVerbose, cache/aggregation events), streamed to the UI over
SignalR.
Local state in a single SQLite file (history, recent connections, layouts).
MDX parsing is a pragmatic tokenizer (no full AST) — it powers highlighting,
reference detection and the dependency graph.
Security notes
All SSAS connections use Windows Integrated Security. No credentials are
read from, or written to, disk or config.
The AI API key is read from the environment only (ANTHROPIC_API_KEY, or
CUBESCOPE_LLM_KEY for an OpenAI-compatible provider) — never from, or written
to, disk or config.
Transitive advisories (resolved): the ADOMD.NET Core client used to pull in
Microsoft.Identity.Client 4.56.0, flagged by NU1901/NU1902 (low/moderate).
CubeScope now pins Microsoft.Identity.Client 4.86.1 directly, forcing the
transitive up to a patched version — dotnet list --vulnerable is clean.
(CubeScope does not use Entra ID authentication — Integrated Security only — so
the affected code path was never exercised anyway.)