Skip to content

Repository files navigation

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.

CubeScope in action

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
Script and dependencies 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.

To build from source, additionally:

  • .NET 10 SDK (currently preview) — target framework net10.0-windows.
  • Node.js LTS — builds the Vue SPA that gets embedded into the executable.

Run

Download cubescope.exe from the latest release, then:

.\cubescope.exe

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

Publish the single executable

dotnet publish CubeScope.Server -c Release -r win-x64 --self-contained true `
  -p:PublishSingleFile=true -o publish

This builds the Vue SPA, embeds it into wwwroot, and produces a single self-contained publish/cubescope.exe (~180 MB — it bundles the .NET runtime).


Architecture

A single executable, cubescope.exe: ASP.NET Core 10 (Kestrel on a free localhost port) serving a Vue 3 SPA.

Project Role
CubeScope.Core Business services — SSAS connectivity, DMV/metadata, cell-set mapping, profiler aggregation, MDX tokenizer, AI service. No web dependency.
CubeScope.Server Minimal API + SignalR hubs + SPA hosting. Produces the executable.
CubeScope.Web Vue 3 + TypeScript (strict) + Vite. Monaco editor, dockview layout, PrimeVue components.
CubeScope.Spike 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.)

License

MIT © 2026 David Simon — Financière de la Cité.

About

A modern workbench for SSAS Multidimensional developers: write, understand, measure and maintain MDX, with a built-in AI expert.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages