fabric-dw
Python CLI and MCP server for Microsoft Fabric Data Warehouses and SQL Analytics Endpoints: administer, query, optimize, and secure them from your terminal or your AI agent.
Full documentation: fdw.debruyn.dev
📣 Just announced! Read the story behind fabric-dw in the announcement blog post.
Description
fabric-dw provides two interfaces for managing Microsoft Fabric Data Warehouses and SQL Analytics Endpoints:
- CLI: a command-line tool for common DW administration tasks.
- MCP server: a Model Context Protocol server that exposes DW operations as tools for AI assistants.
Authentication is configured via the FABRIC_AUTH environment variable. The default (FABRIC_AUTH=default) uses azure-identity DefaultAzureCredential, which walks environment variables, Workload/Managed Identity, Azure CLI, Azure Developer CLI, Azure PowerShell, and interactive browser in order. Any of these will satisfy it. See the Authentication docs for the full chain, all supported sources, and debugging tips.
Installation
pip install fabric-dw
uvx fabric-dw --help
uv tool install fabric-dw
After installation, the fdw command is a short alias for fabric-dw; both invoke the same entry point. See the Install docs for MCP server setup, upgrading, and prerelease builds.
Quick Start
CLI
The workspace is a global root option -w / --workspace placed before the command group. Set a default once with fdw config set workspace <NAME> and omit -w on every subsequent call. Workspace resolution order: (1) -w flag, (2) FABRIC_DW_DEFAULT_WORKSPACE env var, (3) configured default.
uvx fabric-dw --help
fdw config set workspace SalesWS
fdw sql exec SalesWH -q "SELECT TOP 10 * FROM dbo.orders ORDER BY order_date DESC"
fdw sql plan SalesWH -f query.sql --format svg -o plan.svg
fdw queries running SalesWH
fdw queries long-running SalesWH --ago 1h
fdw queries kill SalesWH 55
fdw queries frequent SalesWH --ago 24h
fdw statistics show SalesWH dbo.orders st_order_date --histogram
fdw tables cluster-by SalesWH dbo.orders --cluster-by customer_id
fdw tables read SalesWH dbo.orders --ago 2h
fdw tables export SalesWH dbo.orders --output snapshot.parquet --ago 2h
fdw permissions sql grant SalesWH SELECT --to analyst@company.com --object dbo.orders
fdw permissions cls deny SalesWH SELECT --to contractor@company.com \
--object dbo.orders --columns salary,bonus
fdw permissions rls create SalesWH rls.SalesFilter \
--filter "rls.fn_sales_filter(SalesRep)" --on dbo.orders
fdw tables load SalesWH dbo.orders --file orders.parquet --create
fdw dbt init SalesWH ./my-dbt-project --project-name sales_dw --with-sources
MCP Server
Add to your MCP client configuration (e.g. Claude Desktop, VS Code):
{
"mcpServers": {
"fabric-dw": {
"command": "uvx",
"args": ["--from", "fabric-dw", "fabric-dw-mcp"]
}
}
}
The MCP server exposes all CLI operations as MCP tools (workspaces, warehouses, SQL endpoints, schemas, tables, views, queries, snapshots, restore points, audit, statistics, permissions, sql-pools). Bundled Claude Code agent skills (query-optimizer, warehouse-performance, dbt-setup) are included for deeper AI-assisted analysis. Set FABRIC_AUTH in the environment if you need a non-default auth mode.
Both the skills and the MCP server install in one command via the fabric-dw plugin marketplace, for Claude Code and GitHub Copilot CLI alike: /plugin marketplace add sdebruyn/fabric-dw-mcp-cli then /plugin install fabric-dw@fabric-dw. See the Agent Skills docs for details.
Run in Docker
The Docker image's default ENTRYPOINT is the MCP server (fabric-dw-mcp). Use it as-is with your MCP client, or override the entrypoint to run the CLI instead.
docker pull ghcr.io/sdebruyn/fabric-dw:latest
docker run --rm -i \
-e AZURE_CLIENT_ID=… \
-e AZURE_TENANT_ID=… \
-e AZURE_CLIENT_SECRET=… \
-e FABRIC_AUTH=sp \
ghcr.io/sdebruyn/fabric-dw
docker run --rm \
--entrypoint fabric-dw \
-e AZURE_CLIENT_ID=… \
-e AZURE_TENANT_ID=… \
-e AZURE_CLIENT_SECRET=… \
-e FABRIC_AUTH=sp \
ghcr.io/sdebruyn/fabric-dw --help
Dev images (built from every main merge): ghcr.io/sdebruyn/fabric-dw:main or :<version>.dev<N>.
Package page: ghcr.io/sdebruyn/fabric-dw
Security environment variables
| Variable | Default | Description |
|---|
FABRIC_MCP_READONLY | unset | Set to 1 to restrict execute_sql to SELECT/WITH and block all mutating tools. |
FABRIC_MCP_ALLOW_DESTRUCTIVE | unset | Set to 1 to enable permanently-destructive tools (delete_*, clear_table, restore_warehouse_in_place). Disabled by default. |
FABRIC_MCP_WORKSPACES | unset | Comma-separated workspace names or GUIDs the server may touch. Unset = all workspaces allowed. |
FABRIC_MCP_ALLOW_REMOTE | unset | Set to 1 to allow the HTTP transport (--transport http) to bind on a non-loopback address. A warning is logged; ensure an authenticating reverse proxy with TLS fronts the endpoint, and pass --allowed-host so Host validation stays on. See Hosting the MCP server. |
HTTP transport
The MCP server can be started in HTTP mode for remote clients:
fabric-dw-mcp --transport http [--host 127.0.0.1] [--port 8000]
It binds to loopback by default, where Host and Origin validation is handled for you. Binding anywhere else requires FABRIC_MCP_ALLOW_REMOTE=1 and --allowed-host, and the endpoint has no built-in authentication or TLS, so always front it with an authenticating reverse proxy. See Hosting the MCP server for that setup.
Develop in a container
Open the repo in GitHub Codespaces or VS Code's Remote-Containers extension. The devcontainer pre-installs Python 3.14, uv, Azure CLI, and the GitHub CLI.

Contributing
See CONTRIBUTING.md for dev setup, branch flow, and how to run tests locally.
📖 Docs: fdw.debruyn.dev (or run uv run --only-group docs zensical serve locally).
Security
Please report vulnerabilities privately. See SECURITY.md.
Code of Conduct
This project follows the Contributor Covenant 2.1.
License
MIT. Copyright (c) 2026 Sam Debruyn