From fabric-dataflow-migration-toolkit
Execute Fabric CLI (fab) commands for notebook deployment, execution, and workspace management. Use when deploying notebooks to Fabric, running notebooks, listing workspace items, or managing Fabric resources. Supports authentication, import/export, synchronous job execution, and JSON output.
How this skill is triggered — by the user, by Claude, or both
Slash command
/fabric-dataflow-migration-toolkit:fabric-cli-runnerThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Execute Fabric CLI (`fab`) commands to deploy, run, and manage notebooks and workspace items in Microsoft Fabric.
Execute Fabric CLI (fab) commands to deploy, run, and manage notebooks and workspace items in Microsoft Fabric.
This skill provides a wrapper for the official Microsoft Fabric CLI (fab), enabling agents to:
This is the Fabric equivalent of the dbt-runner skill - it closes the execution loop so agents can deploy and validate their generated notebooks.
pip install ms-fabric-cli
az login or service principal)fab --version
# Login with browser flow
python "${CLAUDE_PLUGIN_ROOT}/skills/fabric-cli-runner/scripts/run_fabric_cli.py" auth login
Set environment variables:
FABRIC_TENANT_ID=your-tenant-id
FABRIC_CLIENT_ID=your-client-id
FABRIC_CLIENT_SECRET=your-client-secret
Then authenticate:
python "${CLAUDE_PLUGIN_ROOT}/skills/fabric-cli-runner/scripts/run_fabric_cli.py" auth login --tenant FABRIC_TENANT_ID --service-principal --client-id FABRIC_CLIENT_ID --client-secret FABRIC_CLIENT_SECRET
The skill is invoked through the Python script located in scripts/run_fabric_cli.py.
python "${CLAUDE_PLUGIN_ROOT}/skills/fabric-cli-runner/scripts/run_fabric_cli.py" import MyWorkspace/nb_bronze_customers.Notebook -i "3 - Notebooks/bronze/nb_bronze_customers.py"
python "${CLAUDE_PLUGIN_ROOT}/skills/fabric-cli-runner/scripts/run_fabric_cli.py" job run MyWorkspace/nb_bronze_customers.Notebook
python "${CLAUDE_PLUGIN_ROOT}/skills/fabric-cli-runner/scripts/run_fabric_cli.py" job run MyWorkspace/nb_bronze_customers.Notebook -P source_path:string=Files/raw/customers.csv
python "${CLAUDE_PLUGIN_ROOT}/skills/fabric-cli-runner/scripts/run_fabric_cli.py" job run-status MyWorkspace/nb_bronze_customers.Notebook --run-id <run-id>
python "${CLAUDE_PLUGIN_ROOT}/skills/fabric-cli-runner/scripts/run_fabric_cli.py" job run-list MyWorkspace/nb_bronze_customers.Notebook
# List all items
python "${CLAUDE_PLUGIN_ROOT}/skills/fabric-cli-runner/scripts/run_fabric_cli.py" ls MyWorkspace
# List only notebooks
python "${CLAUDE_PLUGIN_ROOT}/skills/fabric-cli-runner/scripts/run_fabric_cli.py" ls MyWorkspace --type Notebook
# List only lakehouses
python "${CLAUDE_PLUGIN_ROOT}/skills/fabric-cli-runner/scripts/run_fabric_cli.py" ls MyWorkspace --type Lakehouse
python "${CLAUDE_PLUGIN_ROOT}/skills/fabric-cli-runner/scripts/run_fabric_cli.py" get MyWorkspace/nb_bronze_customers.Notebook
python "${CLAUDE_PLUGIN_ROOT}/skills/fabric-cli-runner/scripts/run_fabric_cli.py" rm MyWorkspace/nb_bronze_customers.Notebook -f
# Upload CSV to lakehouse Files area
python "${CLAUDE_PLUGIN_ROOT}/skills/fabric-cli-runner/scripts/run_fabric_cli.py" cp "2 - Source Files/customers.csv" MyWorkspace/lh_bronze.Lakehouse/Files/raw/
# Upload entire folder
python "${CLAUDE_PLUGIN_ROOT}/skills/fabric-cli-runner/scripts/run_fabric_cli.py" cp "2 - Source Files/" MyWorkspace/lh_bronze.Lakehouse/Files/raw/ --recursive
# fab >= 1.6: lowercase method, and NO /v1/ prefix (fab prepends the base+version URL)
python "${CLAUDE_PLUGIN_ROOT}/skills/fabric-cli-runner/scripts/run_fabric_cli.py" api get workspaces
python "${CLAUDE_PLUGIN_ROOT}/skills/fabric-cli-runner/scripts/run_fabric_cli.py" ls
# 1. Upload source data to OneLake
python "${CLAUDE_PLUGIN_ROOT}/skills/fabric-cli-runner/scripts/run_fabric_cli.py" cp "2 - Source Files/customers.csv" MyWorkspace/lh_bronze.Lakehouse/Files/raw/
# 2. Deploy notebook
python "${CLAUDE_PLUGIN_ROOT}/skills/fabric-cli-runner/scripts/run_fabric_cli.py" import MyWorkspace/nb_bronze_customers.Notebook -i "3 - Notebooks/bronze/nb_bronze_customers.py"
# 3. Execute notebook (synchronous - waits for completion)
python "${CLAUDE_PLUGIN_ROOT}/skills/fabric-cli-runner/scripts/run_fabric_cli.py" job run MyWorkspace/nb_bronze_customers.Notebook
# 4. Validate with fabric-lakehouse-reader skill
python "${CLAUDE_PLUGIN_ROOT}/skills/fabric-lakehouse-reader/scripts/query_fabric_lakehouse.py" --query "SELECT COUNT(*) FROM bronze_customers"
For bulk deployment, use the dedicated fabric-notebook-deployer skill. It bundles the loop with retry/log/dry-run behavior and produces a structured JSON envelope:
python "${CLAUDE_PLUGIN_ROOT}/skills/fabric-notebook-deployer/scripts/deploy_notebooks.py" --workspace "MyWorkspace" --pattern "3 - Notebooks/**/*.ipynb"
This is preferred over a shell loop because (a) it follows the plugin's atomic-Bash policy (one tool call instead of a for loop with $(...) substitution), and (b) it provides retry on rate-limit, dry-run mode, and error capture per file.
# See all items in workspace
python "${CLAUDE_PLUGIN_ROOT}/skills/fabric-cli-runner/scripts/run_fabric_cli.py" ls MyWorkspace
# Get details of specific notebook
python "${CLAUDE_PLUGIN_ROOT}/skills/fabric-cli-runner/scripts/run_fabric_cli.py" get MyWorkspace/nb_bronze_customers.Notebook
For machine-parseable output, the script automatically adds --output_format json to job subcommands. For other commands, add it explicitly:
python "${CLAUDE_PLUGIN_ROOT}/skills/fabric-cli-runner/scripts/run_fabric_cli.py" ls MyWorkspace --output_format json
| Code | Meaning |
|---|---|
| 0 | Success |
| 1 | Error (general) |
| 2 | Authentication error |
| 4 | Timeout |
ERROR: fab command failed - authentication required
Run: python run_fabric_cli.py auth login
Or set FABRIC_TENANT_ID, FABRIC_CLIENT_ID, FABRIC_CLIENT_SECRET environment variables
ERROR: Item 'MyWorkspace/nb_missing.Notebook' not found
Run: python run_fabric_cli.py ls MyWorkspace --type Notebook
ERROR: Job execution timed out after 600 seconds
Check status: python run_fabric_cli.py job run-status MyWorkspace/nb_name.Notebook --run-id <id>
Deploy and execute generated bronze notebooks:
# After generating nb_bronze_customers.py
python "${CLAUDE_PLUGIN_ROOT}/skills/fabric-cli-runner/scripts/run_fabric_cli.py" import MyWorkspace/nb_bronze_customers.Notebook -i "3 - Notebooks/bronze/nb_bronze_customers.py"
python "${CLAUDE_PLUGIN_ROOT}/skills/fabric-cli-runner/scripts/run_fabric_cli.py" job run MyWorkspace/nb_bronze_customers.Notebook
Verify notebooks are deployed and check run history:
python "${CLAUDE_PLUGIN_ROOT}/skills/fabric-cli-runner/scripts/run_fabric_cli.py" ls MyWorkspace --type Notebook
python "${CLAUDE_PLUGIN_ROOT}/skills/fabric-cli-runner/scripts/run_fabric_cli.py" job run-list MyWorkspace/nb_bronze_customers.Notebook
Explore workspace contents during discovery:
python "${CLAUDE_PLUGIN_ROOT}/skills/fabric-cli-runner/scripts/run_fabric_cli.py" ls MyWorkspace
python "${CLAUDE_PLUGIN_ROOT}/skills/fabric-cli-runner/scripts/run_fabric_cli.py" ls MyWorkspace --type Lakehouse
ms-fabric-cli - Official Microsoft Fabric CLIpip install ms-fabric-cli
# Interactive login
az login
# Or install Azure CLI: https://learn.microsoft.com/en-us/cli/azure/install-azure-cli
The script automatically searches for project-config.yml in the current directory and parent directories. If found, it prints the configured workspace name as context (but does not auto-inject it into commands).
FABRIC_TENANT_ID=your-tenant-id
FABRIC_CLIENT_ID=your-client-id
FABRIC_CLIENT_SECRET=your-client-secret
# Install Fabric CLI
pip install ms-fabric-cli
# Verify installation
fab --version
# Interactive login
python "${CLAUDE_PLUGIN_ROOT}/skills/fabric-cli-runner/scripts/run_fabric_cli.py" auth login
# Check current auth status
python "${CLAUDE_PLUGIN_ROOT}/skills/fabric-cli-runner/scripts/run_fabric_cli.py" auth status
# List all workspaces you have access to
python "${CLAUDE_PLUGIN_ROOT}/skills/fabric-cli-runner/scripts/run_fabric_cli.py" ls
# Check workspace name spelling (case-sensitive)
# Verify source file exists
ls "3 - Notebooks/bronze/nb_bronze_customers.py"
# Verify item type suffix (.Notebook, .Lakehouse, etc.)
# Common types: .Notebook, .Lakehouse, .Warehouse, .SemanticModel
.Notebook suffix for notebook itemsfab ls after importjob run (default) for pipeline workflowsaz login for development, service principal for CI/CD.gitignore already excludes .env files--type filter with ls to reduce output--output_format json for machine parsing in scriptsProvides UI/UX resources: 50+ styles, color palettes, font pairings, guidelines, charts for web/mobile across React, Next.js, Vue, Svelte, Tailwind, React Native, Flutter. Aids planning, building, reviewing interfaces.
Searches MemPalace before answering questions about past work, people, projects, or prior decisions. Returns verbatim stored content instead of guessing from model memory.
npx claudepluginhub kavasimihaly/ai-plugins --plugin fabric-dataflow-migration-toolkit