From fabric-dataflow-migration-toolkit
Deploy multiple .ipynb notebook files to a Microsoft Fabric workspace in batch. Wraps the Fabric REST API (via `fab api`) for createOrUpdate notebook operations with optional folder placement. Supports dry-run, glob patterns, retry on rate-limit, and structured JSON output. Use when migrating multiple notebooks at once or as part of an orchestrated deployment pipeline.
How this skill is triggered — by the user, by Claude, or both
Slash command
/fabric-dataflow-migration-toolkit:fabric-notebook-deployerThis skill is limited to the following tools:
The summary Claude sees in its skill listing — used to decide when to auto-load this skill
Batch-deploy `.ipynb` notebooks to a Microsoft Fabric workspace via REST API. Designed for orchestrator-driven migrations where many notebooks need to land in one workspace with consistent configuration.
Batch-deploy .ipynb notebooks to a Microsoft Fabric workspace via REST API. Designed for orchestrator-driven migrations where many notebooks need to land in one workspace with consistent configuration.
fabric-cli-runner)?The fabric-cli-runner skill executes one fab command per call. For a 20-notebook migration, that's 20 separate orchestrator tool calls. This skill bundles the loop with retry/log/dry-run behavior so the orchestrator delegates one batch operation.
fab CLI installed and authenticated (fab auth login interactively, or service-principal env vars set)python "${CLAUDE_PLUGIN_ROOT}/skills/fabric-notebook-deployer/scripts/deploy_notebooks.py" \
--workspace "Analytics Dev" \
--pattern "3 - Notebooks/**/*.ipynb"
python "${CLAUDE_PLUGIN_ROOT}/skills/fabric-notebook-deployer/scripts/deploy_notebooks.py" \
--workspace "Analytics Dev" \
--pattern "3 - Notebooks/**/*.ipynb" \
--dry-run
In dry-run, the script enumerates the files that WOULD be deployed and validates each is parseable JSON, but does not call the Fabric API. Useful for validating notebook generation before incurring deployment cost.
python "${CLAUDE_PLUGIN_ROOT}/skills/fabric-notebook-deployer/scripts/deploy_notebooks.py" \
--workspace "Analytics Dev" \
--pattern "3 - Notebooks/bronze/*.ipynb" \
--folder-id "<folder_GUID>"
If --folder-id is set, each deployed notebook is moved to that folder after creation.
Generated notebooks carry the name of their lakehouse (e.g. lh_bronze) but a
placeholder GUID — the builders have no workspace access, so they cannot fill
in a real default_lakehouse id. Deploying as-is leaves the notebook pointing at
a non-existent lakehouse. --resolve-lakehouse fixes this: for each notebook it
looks up the lakehouse named in metadata.dependencies.lakehouse.default_lakehouse_name
within the target workspace, then stamps in the real lakehouse GUID and the
workspace GUID before deploying.
python "${CLAUDE_PLUGIN_ROOT}/skills/fabric-notebook-deployer/scripts/deploy_notebooks.py" \
--workspace "Analytics Dev" \
--pattern "3 - Notebooks/**/*.ipynb" \
--resolve-lakehouse
If the notebooks still carry placeholder names (e.g. <bronze-lakehouse-name>),
force a specific lakehouse with --lakehouse-name "lh_bronze" (resolved in the
target workspace) or --lakehouse-id "<GUID>" (used verbatim, no lookup). Either
flag implies --resolve-lakehouse. A notebook whose lakehouse cannot be resolved
is recorded as failed and skipped (never deployed with a broken binding).
python "${CLAUDE_PLUGIN_ROOT}/skills/fabric-notebook-deployer/scripts/deploy_notebooks.py" \
--workspace "Analytics Dev" \
--pattern "3 - Notebooks/**/*.ipynb" \
--json
Outputs a single JSON object summarizing the run:
{
"status": "success|partial|failed",
"mode": "deploy|dry-run",
"workspace": "...",
"deployed": [{"path": "...", "name": "...", "notebook_id": "..."}],
"skipped": [{"path": "...", "reason": "..."}],
"failed": [{"path": "...", "error": "..."}],
"summary": {"total": N, "deployed_count": N, "skipped_count": N, "failed_count": N}
}
| Parameter | Required | Description |
|---|---|---|
--workspace | yes | Fabric workspace display name |
--pattern | yes | Glob pattern for .ipynb files (relative to cwd) |
--folder-id | no | If set, move each deployed notebook to this folder GUID |
--dry-run | no | Validate JSON only, do not deploy |
--json | no | Emit a single JSON envelope to stdout (otherwise human-readable progress) |
--retry-count | no | Retries on rate-limit errors (default 3) |
--retry-wait | no | Seconds between retries (default 5) |
--name-from | no | filename (default — strip .ipynb) or metadata-title (read from notebook metadata) |
--resolve-lakehouse | no | Resolve each notebook's lakehouse name to a real GUID in the target workspace and stamp in the workspace id (fixes placeholder/zero GUIDs) |
--lakehouse-name | no | Override lakehouse display name to bind for every notebook (implies --resolve-lakehouse) |
--lakehouse-id | no | Bind this exact lakehouse GUID for every notebook, skipping lookup (implies --resolve-lakehouse) |
The skill inherits authentication from the fab CLI. Either:
fab auth login once before invoking the skill.FABRIC_TENANT_ID, FABRIC_CLIENT_ID, FABRIC_CLIENT_SECRET. The plugin's userConfig values (azure_*) auto-map to these via the helper in the script.failed and skipped.{ "displayName": ..., "definition": { "parts": [...] } })fab api to workspaces/<workspace>/notebooks (fab >= 1.6 prepends the base+version URL itself — no /v1/ prefix, lowercase method)--retry-count times--folder-id set, PATCH each notebook to assign it to the folder.The script never raises. Every error is captured in the failed[] list. The final exit code:
0 if all notebooks deployed successfully1 if any deployment failed2 if input validation failed (e.g., workspace not found, pattern matched zero files)The orchestrator should read the JSON envelope to decide next steps.
npx claudepluginhub kavasimihaly/ai-plugins --plugin fabric-dataflow-migration-toolkitProvides 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.