A common ask from teams evaluating Sigma is migrating their MicroStrategy (Strategy One) footprint — usually to take advantage of all the amazing things Sigma offers. The conversion itself can be a blocker — and the part this QuickStart automates.
The usual MicroStrategy-to-Sigma migration loop is rebuild-the-schema-by-hand, re-author every attribute / fact / metric as a Sigma formula, recreate each dossier chapter and visualization, line the layout up against the source, then eyeball the numbers and hope nothing drifted in the translation. Done on a single dossier it's tedious. Across a project with dozens of dossiers reading from a shared classic schema, it's the reason migration projects slip.
This QuickStart walks through a Claude Code skill called microstrategy-to-sigma that automates the loop.
Point it at a MicroStrategy dossier; it extracts the dossier definition and the full semantic model (attributes, facts, metrics, logical tables, hierarchy relationships) via the MicroStrategy REST API into a single bundle.json, translates each metric's MicroStrategy expression into a Sigma formula, builds a Sigma data model from the logical tables and joins the converter discovers in the schema, mirrors each chapter's tables and selectors as a Sigma workbook page, and runs a row-level parity pass that compares Sigma's output to MicroStrategy's own report results. It surfaces a punch list of anything it couldn't auto-translate — instead of silently producing a broken workbook.
For the demonstration, we'll convert a MicroStrategy dossier called Retail Insights — a merchandising dashboard that tracks inventory health, sell-through, and YTD revenue across a product catalog. The dossier surfaces overstock-vs-capacity, per-product ranking within product line, and store-level sales performance, all driven from a single denormalized warehouse table (3,592 rows at product-day grain, 27 columns covering brand / product / store attributes plus inventory and sales metrics):

A pure lift-and-shift is the floor, not the ceiling. The same skill family supports three follow-on moves that turn a migration into an upgrade:
Sigma SEs, technical CSMs, and migration partners running MicroStrategy-to-Sigma conversions — or scoping a batch migration with the companion microstrategy-assessment skill.
Claude Code installed (CLI or desktop).https:///MicroStrategyLibrary ), a username, and a password. The credential's user needs at least: read access to the target project, the dossier you'll convert, and the underlying schema objects.Python 3.10 or newer. macOS's stock system Python is typically 3.9 — older than the skill needs. If python3 --version reports anything below 3.10, install a newer interpreter via Homebrew (brew install python@3.12) or python.org.Ruby (any recent system Ruby is fine) for the shared finalize/gate stack (assert-phase6-ran.rb, put-layout.rb, probe-controls.rb, etc.).Node.js (any recent LTS) for building the converter MCP. The conversion uses a separate MCP server, sigma-data-model-mcp, cloned + built (npm install && npm run build) into ~/Desktop/sigma-data-model-mcp. The skill prompts you to install it mid-conversion — no upfront work needed — but pre-build it if you'd rather skip the gate.
microstrategy-to-sigma is one of two skills that ship together as a single repo (cloned in the next section). Most of this QuickStart focuses on the converter — but knowing where the assessment skill fits saves dead ends later when scoping a batch migration.
Skill | Role | When to reach for it |
| Scoping | Auditing a MicroStrategy environment before committing to a conversion plan. Emits a per-dossier complexity readout (visualization-type histogram, metric convertibility, AE row-collapse flags, schema size), datasource inventory, and a value/cost-ranked migration shortlist that |
| Conversion | The subject of this QuickStart. Converts a single MicroStrategy dossier (or a batch via shortlist) to a Sigma data model and matching workbook with verified row-level parity. |
Here's how the two skills connect in a full migration — microstrategy-assessment hands the converter a ranked shortlist, and microstrategy-to-sigma produces the Sigma workbooks with a verified parity report:

Not every migration needs both skills. Use the table below to map your scenario to the smallest set that fits.
In this QuickStart we're in the first row — one MicroStrategy dossier whose classic schema reads from warehouse tables that we'll land in Snowflake — then run microstrategy-to-sigma.
Your situation | Skill(s) to use |
1 dossier, classic schema reads from your warehouse |
|
1 dossier, schema reads from a warehouse Sigma can't connect to | Land the data in your warehouse first (covered in |
10+ dossiers (any data source) |
|
Auditing MicroStrategy sprawl without converting yet |
|

First we need to clone the skill's GitHub repository, configure MicroStrategy REST credentials, and capture your Sigma credentials.
The two skills live in sigmacomputing/quickstarts-public under microstrategy-migration-skills/.
From a terminal, run each command below one at a time so you can confirm each step before moving on.
Step 1: Create a local folder for the clone
mkdir -p ~/quickstarts-public
Step 2: Move into the new folder
cd ~/quickstarts-public
Step 3: Clone the repo without pulling any files yet
git clone --filter=blob:none --sparse https://github.com/sigmacomputing/quickstarts-public.git .
Step 4: Fill in only the microstrategy-migration-skills folder
git sparse-checkout set microstrategy-migration-skills
Step 5: Symlink microstrategy-to-sigma into the Claude skills folder
ln -s ~/quickstarts-public/microstrategy-migration-skills/microstrategy-to-sigma ~/.claude/skills/microstrategy-to-sigma
Step 6: Symlink microstrategy-assessment
ln -s ~/quickstarts-public/microstrategy-migration-skills/microstrategy-assessment ~/.claude/skills/microstrategy-assessment
Steps 5 and 6 should return with no error.

Step 7: Install the Python dependencies the skill uses.
The skill reads MSTR's YAML spec responses with PyYAML. Everything else is in Python's standard library.
python3 -m pip install pyyaml

Step 8: Capture your Sigma API credentials.
This script prompts for SIGMA_BASE_URL, SIGMA_CLIENT_ID, and SIGMA_CLIENT_SECRET and writes them into Claude's settings + the neutral ~/.sigma-migration/env file that the skill family uses to mint Sigma API tokens at runtime.
Run once per machine.
ruby ~/.claude/skills/microstrategy-to-sigma/scripts/setup.rb

Step 9: Capture your MicroStrategy credentials.
This script prompts for the Library URL, username, password, and optional project ID, then writes them into Claude's settings + the same neutral ~/.sigma-migration/env file.
Run once per machine.
ruby ~/.claude/skills/microstrategy-to-sigma/scripts/setup-microstrategy.rb
When the script asks for the Library URL, use the form below as a template. Replace the host with your own tenant's hostname (visible in your browser's address bar when you're logged into MicroStrategy Cloud). The /MicroStrategyLibrary suffix is required for both Cloud and on-prem deployments — the REST API lives under that path, and dropping it returns 404 on every call:
https://env-aBc12345xYz67890.cloud.strategy.com/MicroStrategyLibrary
The final prompt asks for a Project ID and is optional. Press Enter to skip.
The skill will default to the first project visible to your user, which is what you want for this QuickStart. If your tenant has multiple projects and the target dossier lives in a non-default one, paste that project's ID here (visible in MicroStrategy's URL when you have the project open).
MicroStrategy uses session-based auth — there's no API key concept; the skill calls POST /api/auth/login with loginMode 1.
Verify auth works:
source ~/.sigma-migration/env && python3 ~/.claude/skills/microstrategy-to-sigma/scripts/mstr.py
You should see a successful login probe and a list of projects visible to your user.

Step 10: Verify Claude Code can invoke the skill.
Type claude in your terminal to start Claude Code, then invoke the skill:
claude
/microstrategy-to-sigma
Claude should start reading the reference files and ask what dossier you want to convert.
Pause at that prompt — we'll hand it everything in one shot via the kickoff prompt in Run the Conversion:


The MicroStrategy dossier we're migrating reads from a single denormalized retail-insights table — 27 columns covering brand / product / store dimensions plus inventory and sales metrics. For the migration to land in Sigma cleanly, the same table needs to exist in a connection your Sigma org can reach.
Data prep has two halves:
COPY INTO statement below reads from S3 directly — no local download needed.USE ROLE ACCOUNTADMIN;
USE WAREHOUSE COMPUTE_WH;
CREATE DATABASE IF NOT EXISTS QUICKSTARTS;
CREATE SCHEMA IF NOT EXISTS QUICKSTARTS.MSTR_RETAIL_INSIGHTS;
USE SCHEMA QUICKSTARTS.MSTR_RETAIL_INSIGHTS;
CREATE OR REPLACE FILE FORMAT csv_format
TYPE = CSV
FIELD_DELIMITER = ','
SKIP_HEADER = 1
FIELD_OPTIONALLY_ENCLOSED_BY = '"'
NULL_IF = ('', 'NULL')
EMPTY_FIELD_AS_NULL = TRUE;
CREATE OR REPLACE STAGE mstr_retail_stage
URL = 's3://sigma-quickstarts-main/Microstrategy/'
FILE_FORMAT = csv_format;
CREATE OR REPLACE TABLE RETAIL_INSIGHTS (
"Brand" VARCHAR,
"Date" DATE,
"Date First Available" DATE,
"Product Color" VARCHAR,
"Product Description" VARCHAR,
"Product Image" VARCHAR,
"Product Line" VARCHAR,
"Product Link" VARCHAR,
"Product Name" VARCHAR,
"Product Size" VARCHAR,
"Product SKU" VARCHAR,
"Product Type" VARCHAR,
"Ranking in Product Line" NUMBER(38,0),
"Store Location" VARCHAR,
"Avg Unit Sold" NUMBER(38,4),
"Inventory" NUMBER(38,4),
"Inventory Capacity" NUMBER(38,0),
"Order Quantity" NUMBER(38,0),
"Overstock Percentage" NUMBER(38,10),
"Product Cost" NUMBER(38,2),
"Product Inventory" NUMBER(38,4),
"Product List Price" NUMBER(38,2),
"Product Rating" NUMBER(38,4),
"Product YTD Revenue" NUMBER(38,2),
"Product YTD Sales" NUMBER(38,2),
"Row Count" NUMBER(38,0),
"Total Sales" NUMBER(38,2)
);
COPY INTO RETAIL_INSIGHTS FROM @mstr_retail_stage/retail_insights.csv ON_ERROR = ABORT_STATEMENT;
GRANT USAGE ON DATABASE QUICKSTARTS TO ROLE SIGMA_SERVICE_ROLE;
GRANT USAGE ON SCHEMA QUICKSTARTS.MSTR_RETAIL_INSIGHTS TO ROLE SIGMA_SERVICE_ROLE;
GRANT SELECT ON ALL TABLES IN SCHEMA QUICKSTARTS.MSTR_RETAIL_INSIGHTS TO ROLE SIGMA_SERVICE_ROLE;
GRANT SELECT ON FUTURE TABLES IN SCHEMA QUICKSTARTS.MSTR_RETAIL_INSIGHTS TO ROLE SIGMA_SERVICE_ROLE;
-- Sanity-check row count. Expected: 3592.
SELECT COUNT(*) AS ROW_COUNT FROM RETAIL_INSIGHTS;
-- Total Sales baseline (~$3,169,933.01 for the warehouse snapshot).
SELECT TO_CHAR(SUM("Total Sales"), '$999,999,999.99') AS TOTAL_SALES_BASELINE
FROM RETAIL_INSIGHTS;
If the load completes cleanly, the Total Sales check returns roughly $3,169,933.01. Any mismatch means either a COPY partial-load error (check Snowflake's load history) or a different S3 file than expected.


The converter needs a Sigma folder to land the new data model and workbook in. The skill will ask for the folder's UUID — it will be easier to have it ready before you return to the Claude prompt that's still paused after the skill loaded.
To keep this simple, we will use a plain folder and not a workspace.
Step 1: Create (or pick) a folder in Sigma.
Open your Sigma org, navigate to where you want the migrated workbook to live, and create a folder for it. Something like:
MicroStrategy Migration Demo
Step 2: Grab the folder ID.
Open the folder. The ID is the last segment of the URL — a short alphanumeric string, 21 characters. Copy it from the address bar and keep it on the clipboard for the next section.


The skill can run interactively, asking for the dossier, warehouse, and Sigma destination one at a time. For a known target — like ours — it's faster to give Claude the entire job in one message. The skill recognizes a structured kickoff prompt and walks the pipeline directly, going straight from "go" through extract → convert → data model → workbook build → layout → parity.
If Claude is still running and paused at the skill's first prompt from Install and Configure the Skill, return to that terminal. If you closed Claude after that step, restart it now:
claude
/microstrategy-to-sigma
When Claude finishes loading the skill and asks what to migrate, choose Chat about this:

Paste the block below. Substitute your own values where the placeholders are:
Dossier ID — the dossier's object ID, visible in MicroStrategy Library's URL when you have the dossier open.The URL follows the shape /MicroStrategyLibrary/app/{projectId}/{dossierId}/{state}.
For example:

Copy the 32-character dossier ID — the second hex segment after /app/. Ignore the project ID (the skill defaults to your user's first project) and the trailing state token.
SIGMA_CONNECTION_ID — your Snowflake connection ID (the one where you landed the sample data) from Sigma's Administration > ConnectionsSIGMA_FOLDER_ID — the folder ID you copied at the end of the previous sectionRun /microstrategy-to-sigma on the following. Walk every phase in SKILL.md end-to-end and stop only if a hard gate fails.
MicroStrategy
- Credentials sourced from ~/.sigma-migration/env (MSTR_BASE_URL, MSTR_USERNAME, MSTR_PASSWORD, optional MSTR_PROJECT_ID)
- Dossier ID: <your-dossier-object-id>
Warehouse (Snowflake)
- Database: QUICKSTARTS
- Schema: MSTR_RETAIL_INSIGHTS
Sigma
- SIGMA_API_TOKEN = mint from ~/.sigma-migration/env
- SIGMA_CONNECTION_ID: <your-snowflake-connection-id>
- SIGMA_FOLDER_ID: <your-folder-id>
Options
- Name prefix: MicroStrategy Retail Insights
- Auto-approve mid-pipeline questions: yes
- Parity: tolerate row-count drift between MicroStrategy (live) and the warehouse snapshot — this QuickStart uses a frozen CSV copy of the source. Report the delta with a row-level diff, but treat warehouse-snapshot staleness as a soft fail (not a gate-red).
Don't declare GREEN until the parity gate passes (or the tolerance above applies) and the visual-QA loop passes.
Claude reads the block, mints a fresh Sigma token from ~/.sigma-migration/env, sources the MSTR variables, and walks the phases end-to-end. The rest of the run is hands-off until a gate or decision point.

When the migration completes, Claude prints a final summary covering the whole pipeline — every phase's result, the visual-QA outcome, the hard-gate verdict, and the URLs of the new Sigma data model and workbook:

The summary walks through six phases plus a visual-QA pass:
showExpressionAs=tokens) → referenced attributes, metrics (compound bases included via a second pass), facts, logical tables, and hierarchy relationships into a single bundle.json. That bundle is the converter's contract.scout-gate-readback step that mechanically checks for any type=error columns the converter passed through. Applies the banded layout the converter emitted.POST /api/v2/reports/{id}/instances, exports each Sigma element via the Sigma export API, and compares row-by-row (money/counts exact; ratio metrics within rel 1e-6). The gate is GREEN only when every report PASSes — never on a 200 POST alone.Open the new workbook in Sigma to see the migrated dossier:

Open the data model too:

Hand-polish items the skill flags rather than silently working around:
refs/viz-type-mapping.md for the full lookup.control-scope.json as unbound MANUAL items — hand-wire them to the right Sigma element.Count(Customer)) trigger cartesian-governance aborts in Sigma — the skill flags them and suggests counting a fact/key column instead.securityFilters) is on the converter's roadmap — until that lands, ask the customer about security filters explicitly. Don't assume an estate has none just because the classic extract doesn't carry them.
A single dossier is the easy case. Real migrations involve MicroStrategy projects with dozens or hundreds of dossiers reading from a shared classic schema — and migrating them one-by-one through the converter loses the leverage of doing the planning work once. That's where the companion microstrategy-assessment skill comes in.
Point microstrategy-assessment at a MicroStrategy environment and it inventories every project, report, dossier, and datasource, scoring each on:
microstrategy-to-sigma actually applies, so the readout reflects what the tool will really do — not a generic guessmigrate-first, easy-win, needs-review, retire based on combined complexity + coverage scoresThe output is a Sigma-branded readout.md you can share with stakeholders, plus a ranked migration shortlist sorted by value / (1 + cost) — the cheapest, highest-value dossiers to convert first.
The shortlist becomes input to a batch conversion plan — microstrategy-assessment groups dossiers that share the same logical tables so one Sigma data model can serve a whole family of workbooks instead of producing N near-duplicate DMs. microstrategy-to-sigma consumes that plan in batch mode and runs the conversions concurrently.
Typical flow for a real migration engagement:
microstrategy-assessment against the target environment; review the shortlist with stakeholders.microstrategy-to-sigma and let it work through them.
The following is a "grab bag" of things that might come up during real conversions, with the fix for each.
python3 --version reports 3.9.x and the skill refuses to run:brew install python@3.12) or python.org, then use python3.12 -m pip install explicitly for any helpers. Avoid pip3 as a shorthand — it can quietly resolve back to the old interpreter.mstr.py returns 401 or Could not authenticate to MicroStrategy:MSTR_BASE_URL, MSTR_USERNAME, or MSTR_PASSWORD in ~/.sigma-migration/env is wrong or stale. The base URL must be the Library root — e.g., https:///MicroStrategyLibrary — not the Web URL. Confirm by hitting /api/auth/login in a REST client with the same credentials.mstr.py fails with SSL: CERTIFICATE_VERIFY_FAILED — self-signed certificate in certificate chain:/Applications/Python\ 3.14/Install\ Certificates.commandPython binary in /Applications/Python / .) After it completes, the auth probe should succeed.mstr.py still fails with self-signed certificate in certificate chain after the cert-install script ran:curl works), but Python's certifi bundle does not. Confirm by running curl -v 2>&1 | grep issuer — if the issuer is something like ca..goskope.com (Netskope) or Zscaler Root CA rather than a public CA, you've found it. Pull the proxy's root certificate out of Keychain and combine it with the macOS roots into a PEM Python can read, then point Python at it via SSL_CERT_FILE:security find-certificate -a -c "" -p > /tmp/proxy-ca.pem security find-certificate -a -p /System/Library/Keychains/SystemRootCertificates.keychain > /tmp/macos-roots.pemcat /tmp/macos-roots.pem /tmp/proxy-ca.pem > /tmp/full-trust.pemecho ‘export SSL_CERT_FILE=/tmp/full-trust.pem' >> ~/.sigma-migration/envSSL_CERT_FILE for free.mstr.py returns a different SSL certificate verification error:VERIFY_X509_STRICT) and rejects some MicroStrategy cloud / trial certificates that older Python versions accepted. mstr.py includes the standard handling for this — if it surfaces anyway, your tenant's cert chain has an issue worth reporting to the MSTR admin.DELETE /api/model/schema/lock. The skill's mstr.py handles this on the next run, but if you're poking the REST API by hand, that's the unblock.sigma-data-model-mcp). If it isn't installed locally, the skill stops at the gate. Pick option 6. Chat about this and tell Claude:Clone twells89/sigma-data-model-mcp into ~/Desktop/sigma-data-model-mcp for me, then run
npm install && npm run build in that directory. Once the build is done, come back to the gate and pick option 1.(Recommended) option.COPY INTO:Prepare the Demo Data includes the GRANT USAGE and GRANT SELECT statements — if you skipped or modified them, run them now with the role name your Sigma connection actually uses (find it in Sigma under Administration > Connections).refs/ae-row-collapse.md — read it once and the gate stops feeling like magic.scout-gate-readback.py exits 11 with an UNSCOUTED error column:--gap-id (see scripts/gap-scout.md), translate or escalate, then re-run the gate. The script only exits 0 when no unscouted error columns remain.Bash command — Contains shell syntax that cannot be statically analyzed — Do you want to proceed? prompts during the run:eval "$(...)" patterns to inject tokens dynamically. Claude Code's safety analyzer can't pattern-match these for blanket approval even in accept-edits mode. Click 1. Yes on each — it's expected behavior, not a misconfiguration. After the run, you can use the /fewer-permission-prompts skill to scan the transcript and add those patterns to your .claude/settings.local.json so subsequent runs are silent.
What you built is less a single conversion and more a repeatable migration path. The skill took a MicroStrategy dossier — classic schema, attributes, facts, metrics, chapter layout, selectors — and produced a Sigma data model, a workbook, and a row-level parity report against the live warehouse, all from a single structured prompt. No one rebuilt the dossier by hand, and the parity numbers are evidence rather than hope.
The patterns worth carrying into your next migration:
microstrategy-assessment scopes and prioritizes the environment; microstrategy-to-sigma converts and verifies. The same shape applies whether you're migrating one dossier or every dossier reading from a shared classic schema.setup.rb has captured your Sigma credentials, the entire migration is one paste. The kickoff prompt reads the dossier ID + warehouse coordinates + options in one shot, and the skill walks through every phase end-to-end without further interaction unless a gate genuinely needs your call.Prepare the Demo Data transfers to any warehouse Sigma can reach. For dossiers backed by Intelligent Cubes or MSTR-internal data, materialize those upstream and the same pattern applies.A first-pass conversion produces a working starting point and a documented punch list, not a hand-polished workbook. The polish loop is short, and you know exactly what to look at. That's the migration approach you can scale across an entire MicroStrategy project.
Additional Resource Links
Blog
Community
Help Center
QuickStarts
Be sure to check out all the latest developments at Sigma's First Friday Feature page!
