About
Force Fabric — Model Context Protocol server
README
Force Fabric MCP Server
Detect issues. Auto-fix problems. Optimize your Fabric tenant.
An MCP server that scans Lakehouses, Warehouses, Eventhouses, Semantic Models, and Gateways with 158+ diagnostic rules — and can auto-fix 67 of them.
Quick Start • Detect • Auto-Fix • Rules • Architecture
Key Features
Detect — 158+ Rules Across 5 Fabric Item Types
| Item | Rules | What's Scanned |
|---|---|---|
| Lakehouse | 35 | SQL Endpoint + OneLake Delta Log (VACUUM history, file sizes, partitioning, retention, V-Order, CDF, deletion vectors) |
| Warehouse | 44 | Schema, query performance, security (PII, RLS), database config, FK indexes, computed columns |
| Eventhouse | 27/db | Extent fragmentation, caching/retention/merge/encoding/partitioning/sharding/autocompaction policies, ingestion, streaming, materialized views |
| Semantic Model | 41 | DAX anti-patterns, model structure, COLUMNSTATISTICS BPA, relationships, disconnected tables, implicit measures |
| Gateway | 12 | Gateway status, version, unused datasources, connectivity health, excess admins, orphaned connections, duplicates |
| 158+ total |
Fix — 67 Auto-Fixable Issues
| Item | Auto-Fixes | Method |
|---|---|---|
| Warehouse | 16 fixes | SQL DDL executed directly |
| Lakehouse | 20 fixes | Livy Spark SQL + REST API |
| Semantic Model | 19 fixes | XMLA/TMSL atomic commands + BIM/TMDL fallback |
| Eventhouse | 11 fixes | KQL management commands (with dry-run preview) |
| Gateway | 4 fixes | Fabric + Power BI REST API |
| 67 total |
Unified Output
Every scan returns a clean results table — only issues shown, passed rules counted in summary:
29 rules — 18 passed | 1 failed | 10 warning
| Rule | Status | Finding | Recommendation |
|------|--------|---------|----------------|
| LH-007 Key Columns Are NOT NULL | FAIL | 16 key column(s) allow NULL | Add NOT NULL constraints |
| LH-017 Regular VACUUM Executed | WARN | 4 table(s) need VACUUM | Run VACUUM weekly |
Quick Start
Prerequisites
- Node.js 18+
- Azure CLI with
az logincompleted - Fabric capacity with items to scan
Install
git clone https://github.com/tmdaidevs/Force-Fabric-MCP-Server.git
cd Force-Fabric-MCP-Server
npm install
npm run build
Configure VS Code
Add to .vscode/mcp.json in your project:
{
"servers": {
"fabric-optimization": {
"type": "stdio",
"command": "node",
"args": ["dist/index.js"],
"cwd": "/path/to/Force-Fabric-MCP-Server"
}
}
}
Use
1. "Login to Fabric with azure_cli"
2. "List all lakehouses in workspace <id>"
3. "Scan lakehouse <id> in workspace <id>"
4. "Fix warehouse <id> in workspace <id>"
Detect & Scan
Available Scan Tools
| Tool | What It Does |
|---|---|
lakehouse_optimization_recommendations |
Scans SQL Endpoint + reads Delta Log files from OneLake |
warehouse_optimization_recommendations |
Connects via SQL and runs 44 diagnostic queries |
warehouse_analyze_query_patterns |
Focused analysis of slow/frequent/failed queries |
eventhouse_optimization_recommendations |
Runs KQL diagnostics on each KQL database |
semantic_model_optimization_recommendations |
Executes DAX + MDSCHEMA DMVs for BPA analysis |
gateway_optimization_recommendations |
Scans all gateways and connections for health, usage, and security |
Data Sources
┌─────────────────────────────────────┐
│ Fabric REST API │
│ Workspaces, Items, Gateways, │
│ Connections, Metadata │
└──────────────┬──────────────────────┘
│
┌──────────────┬───────────────┼───────────────┬──────────────┬──────────────┐
▼ ▼ ▼ ▼ ▼ ▼
┌─────────────┐ ┌──────────┐ ┌──────────────┐ ┌──────────┐ ┌──────────────┐ ┌──────────────┐
│ SQL Client │ │ KQL REST │ │ OneLake ADLS │ │ DAX API │ │ MDSCHEMA DMV │ │ Power BI API │
│ (tedious) │ │ API │ │ Gen2 API │ │executeQry│ │ via REST │ │ Gateways │
└──────┬──────┘ └────┬─────┘ └──────┬───────┘ └────┬─────┘ └──────┬───────┘ └──────┬───────┘
│ │ │ │ │ │
Lakehouse SQL Eventhouse Delta Log JSON Semantic Semantic Gateway
Warehouse SQL KQL DBs File Metadata Model DAX Model Meta Datasources
Auto-Fix
All fix tools support dry-run mode (dryRun: true) to preview commands before execution.
Warehouse Fixes — warehouse_fix
| Rule ID | What It Fixes | SQL Command |
|---|---|---|
| WH-001 | Missing primary keys | ALTER TABLE ADD CONSTRAINT PK NOT ENFORCED |
| WH-008 | Stale statistics (>30 days) | UPDATE STATISTICS [table] |
| WH-009 | Disabled constraints | ALTER TABLE WITH CHECK CHECK CONSTRAINT ALL |
| WH-016 | Missing audit columns | ALTER TABLE ADD created_at DATETIME2 DEFAULT GETDATE() |
| WH-018 | Unmasked sensitive data | ALTER COLUMN ADD MASKED WITH (FUNCTION='...') |
| WH-026 | Auto-update statistics off | ALTER DATABASE SET AUTO_UPDATE_STATISTICS ON |
| WH-027 | Result set caching off | ALTER DATABASE SET RESULT_SET_CACHING ON |
| WH-028 | Snapshot isolation off | ALTER DATABASE SET ALLOW_SNAPSHOT_ISOLATION ON |
| WH-029 | Page verify not CHECKSUM | ALTER DATABASE SET PAGE_VERIFY CHECKSUM |
| WH-030 | ANSI settings off | ALTER DATABASE SET ANSI_NULLS ON; ... |
| WH-032 | Missing statistics | UPDATE STATISTICS [table] |
| WH-036 | NOT NULL without defaults | ALTER TABLE ADD DEFAULT ... FOR column |
| WH-040 | Auto-create statistics off | ALTER DATABASE SET AUTO_CREATE_STATISTICS ON |
| WH-041 | Query Store off | ALTER DATABASE SET QUERY_STORE = ON |
| WH-044 | FK columns missing indexes | CREATE NONCLUSTERED INDEX ON [table]([col]) |
Eventhouse Fixes — eventhouse_fix
| Rule ID | What It Fixes | KQL Command |
|---|---|---|
| EH-002 | Fragmented extents | .merge table ['name'] |
| EH-004 | Missing caching policy | .alter database policy caching hot = 30d |
| EH-005 | Missing retention policy | .alter database policy retention softdelete = 365d |
| EH-006 | Unhealthy materialized views | .enable materialized-view ['name'] |
| EH-014 | Missing ingestion batching | .alter database policy ingestionbatching ... |
| EH-016 | Large tables without partitioning | .alter table policy partitioning ... |
| EH-017 | Suboptimal merge policy | .alter table policy merge ... |
| EH-021 | Autocompaction disabled | .alter database policy autocompaction ... |
| EH-022 | Extent tags retention missing | .alter database policy extent_tags_retention ... |
| EH-024 | High-volume tables without streaming | .alter table policy streamingingestion enable |
| EH-025 | Stale materialized views | .refresh materialized-view ['name'] |
Lakehouse Fixes — lakehouse_fix / lakehouse_auto_optimize
Executes Spark SQL via Livy API (no notebook needed). Falls back to temporary notebook if Livy is unavailable.
| Fix ID | What It Fixes | Spark SQL |
|---|---|---|
| auto-optimize | Auto-optimize disabled | SET TBLPROPERTIES ('delta.autoOptimize.optimizeWrite'='true') |
| retention | No log retention policy | SET TBLPROPERTIES ('delta.logRetentionDuration'='interval 30 days') |
| data-skipping | Data skipping not configured | SET TBLPROPERTIES ('delta.dataSkippingNumIndexedCols'='32') |
| audit-columns | Missing created_at/updated_at | ADD COLUMNS (created_at TIMESTAMP, updated_at TIMESTAMP) |
| v-order | V-Order compression disabled | SET TBLPROPERTIES ('delta.parquet.vorder.enabled'='true') |
| change-data-feed | Change Data Feed not enabled | SET TBLPROPERTIES ('delta.enableChangeDataFeed'='true') |
| column-mapping | Column mapping disabled | SET TBLPROPERTIES ('delta.columnMapping.mode'='name') |
| checkpoint-interval | Checkpoint interval too high | SET TBLPROPERTIES ('delta.checkpointInterval'='10') |
| deletion-vectors | Deletion vectors not enabled | SET TBLPROPERTIES ('delta.enableDeletionVectors'='true') |
| compute-stats | Statistics missing or stale | ANALYZE TABLE ... COMPUTE STATISTICS |
Semantic Model Fixes — semantic_model_fix
Uses XMLA/TMSL for atomic per-object changes. Falls back to BIM/TMDL download-modify-upload if XMLA is unavailable.
| Fix ID | What It Fixes |
|---|---|
| SM-FIX-FORMAT | Add format strings to unformatted measures |
| SM-FIX-DESC | Add descriptions to visible tables |
| SM-FIX-HIDDEN | Set IsAvailableInMDX=false on hidden columns |
| SM-FIX-DATE | Mark date/calendar tables as Date table |
| SM-FIX-KEY | Set IsKey=true on PK columns in relationships |
| SM-FIX-AUTODATE | Remove auto-date tables |
| SM-FIX-IFERROR | Replace IFERROR with IF(ISERROR()) |
| SM-FIX-EVALLOG | Strip EVALUATEANDLOG debug wrappers |
| SM-FIX-ADDZERO | Remove +0 anti-pattern from measures |
| SM-FIX-DIRECTREF | Remove duplicate direct-reference measures |
| SM-FIX-SUMX | Replace SUMX(T, T[Col]) with SUM(T[Col]) |
| SM-FIX-MEASUREDESC | Auto-generate measure descriptions |
| SM-FIX-MEASURENAME | Clean whitespace/tabs from measure names |
| SM-FIX-HIDEDESC | Hide description/comment columns |
| SM-FIX-HIDEGUID | Hide GUID/UUID columns |
| SM-FIX-CONSTCOL | Remove constant columns (1 distinct value) |
| SM-FIX-REMOVEFILTERS | Replace ALL() with REMOVEFILTERS() |
| SM-FIX-BIDI | Switch bidirectional cross-filters to single direction |
| SM-FIX-SUMMARIZE | Set SummarizeBy=None on implicit measure columns |
Gateway Fixes — gateway_fix
| Rule ID | What It Fixes | API Action |
|---|---|---|
| GW-004 | Unused datasources (no bindings) | DELETE /gateways/{id}/datasources/{id} |
| GW-006 | Excessive admins (>5 per datasource) | DELETE /gateways/{id}/datasources/{id}/users/{email} |
| GW-008 | Orphaned cloud connections | DELETE /v1/connections/{id} |
| GW-010 | Duplicate datasources on same gateway | DELETE duplicate datasource |
Rule Reference
Summary
| Category | Rules | Auto-Fixable | Scan Method |
|---|---|---|---|
| Lakehouse | 35 | 20 | SQL + Delta Log + Livy |
| Warehouse | 44 | 16 | SQL DDL |
| Eventhouse | 27/db | 11 | KQL management commands |
| Semantic Model | 41 | 19 | DAX + DMV + XMLA/TMSL |
| Gateway | 12 | 4 | Fabric + Power BI REST |
| Total | 158+ | 67 |
Lakehouse — 35 Rules (click to expand)
| # | Rule | Category | Severity | Fixable |
|---|---|---|---|---|
| LH-001 | SQL Endpoint Active | Availability | HIGH | — |
| LH-002 | Medallion Architecture Naming | Maintainability | LOW | — |
| LH-003 | All Tables Use Delta Format | Performance | HIGH | Spark |
| LH-004 | Table Maintenance Recommended | Performance | MEDIUM | REST |
| LH-005 | No Empty Tables | Data Quality | MEDIUM | Spark |
| LH-006 | No Over-Provisioned String Columns | Performance | MEDIUM | — |
| LH-007 | Key Columns Are NOT NULL | Data Quality | HIGH | — |
| LH-008 | No Float/Real Precision Issues | Data Quality | MEDIUM | — |
| LH-009 | Column Naming Convention | Maintainability | LOW | Spark |
| LH-010 | Date Columns Use Proper Types | Data Quality | MEDIUM | — |
| LH-011 | Numeric Columns Use Proper Types | Data Quality | MEDIUM | — |
| LH-012 | No Excessively Wide Tables | Maintainability | LOW | — |
| LH-013 | Schema Has NOT NULL Constraints | Data Quality | MEDIUM | — |
| LH-014 | Tables Have Audit Columns | Maintainability | LOW | Livy |
| LH-015 | Consistent Date Types Per Table | Data Quality | LOW | — |
| LH-016 | Large Tables Are Partitioned | Performance | MEDIUM | — |
| LH-017 | Regular VACUUM Executed | Maintenance | MEDIUM | REST |
| LH-018 | Regular OPTIMIZE Executed | Performance | MEDIUM | REST |
| LH-019 | No Small File Problem | Performance | HIGH | REST |
| LH-020 | Auto-Optimize Enabled | Performance | MEDIUM | Livy |
| LH-021 | Retention Policy Configured | Maintenance | LOW | Livy |
| LH-022 | Delta Log Version Count Reasonable | Performance | LOW | REST |
| LH-023 | Low Write Amplification | Performance | MEDIUM | — |
| LH-024 | Data Skipping Configured | Performance | LOW | Livy |
| LH-025 | Z-Order on Large Tables | Performance | MEDIUM | REST |
| LH-026 | V-Order Enabled | Performance | MEDIUM | Livy |
| LH-027 | Change Data Feed on Large Tables | Data Management | LOW | Livy |
| LH-028 | Column Mapping Enabled | Maintainability | LOW | Livy |
| LH-029 | Deletion Vectors Enabled | Performance | LOW | Livy |
| LH-030 | Checkpoint Interval Appropriate | Performance | LOW | Livy |
| LH-031 | No Deeply Nested Types | Performance | LOW | — |
| LH-S01 | No Unprotected Sensitive Data | Security | HIGH | — |
| LH-S02 | Large Tables Identified | Performance | INFO | — |
| LH-S03 | No Deprecated Data Types | Maintainability | HIGH | — |
| LH-S04 | All Tables Have Key Columns | Data Quality | MEDIUM | Spark |
Warehouse — 44 Rules (click to expand)
| # | Rule | Category | Severity | Fixable |
|---|---|---|---|---|
| WH-001 | Primary Keys Defined | Data Quality | HIGH | SQL |
| WH-002 | No Deprecated Data Types | Maintainability | HIGH | — |
| WH-003 | No Float/Real Precision Issues | Data Quality | MEDIUM | — |
| WH-004 | No Over-Provisioned Columns | Performance | MEDIUM | — |
| WH-005 | Column Naming Convention | Maintainability | LOW | — |
| WH-006 | Table Naming Convention | Maintainability | LOW | — |
| WH-007 | No SELECT * in Views | Maintainability | LOW | — |
| WH-008 | Statistics Are Fresh | Performance | MEDIUM | SQL |
| WH-009 | No Disabled Constraints | Data Quality | MEDIUM | SQL |
| WH-010 | Key Columns Are NOT NULL | Data Quality | HIGH | — |
| WH-011 | No Empty Tables | Maintainability | MEDIUM | — |
| WH-012 | No Excessively Wide Tables | Maintainability | MEDIUM | — |
| WH-013 | Consistent Date Types | Data Quality | LOW | — |
| WH-014 | Foreign Keys Defined | Maintainability | MEDIUM | — |
| WH-015 | No Large BLOB Columns | Performance | MEDIUM | — |
| WH-016 | Tables Have Audit Columns | Maintainability | LOW | SQL |
| WH-017 | No Circular Foreign Keys | Data Quality | HIGH | — |
| WH-018 | Sensitive Data Protected | Security | HIGH | SQL |
| WH-019 | Row-Level Security | Security | MEDIUM | — |
| WH-020 | Minimal db_owner Privileges | Security | MEDIUM | — |
| WH-021 | No Over-Complex Views | Maintainability | LOW | — |
| WH-022 | Minimal Cross-Schema Dependencies | Maintainability | LOW | — |
| WH-023 | No Very Slow Queries | Performance | HIGH | — |
| WH-024 | No Frequently Slow Queries | Performance | HIGH | — |
| WH-025 | No Recent Query Failures | Reliability | MEDIUM | — |
| WH-026 | AUTO_UPDATE_STATISTICS Enabled | Performance | HIGH | SQL |
| WH-027 | Result Set Caching Enabled | Performance | MEDIUM | SQL |
| WH-028 | Snapshot Isolation Enabled | Concurrency | MEDIUM | SQL |
| WH-029 | Page Verify CHECKSUM | Reliability | MEDIUM | SQL |
| WH-030 | ANSI Settings Correct | Standards | LOW | SQL |
| WH-031 | Database ONLINE | Availability | HIGH | — |
| WH-032 | All Tables Have Statistics | Performance | MEDIUM | SQL |
| WH-033 | Optimal Data Types | Performance | MEDIUM | — |
| WH-034 | No Near-Empty Tables | Maintainability | LOW | — |
| WH-035 | Stored Procedures Documented | Maintainability | LOW | — |
| WH-036 | NOT NULL Columns Have Defaults | Data Quality | MEDIUM | SQL |
| WH-037 | Consistent String Types | Maintainability | LOW | — |
| WH-038 | Schemas Are Documented | Maintainability | LOW | — |
| WH-039 | Query Performance Healthy | Performance | MEDIUM | — |
| WH-040 | AUTO_CREATE_STATISTICS Enabled | Performance | HIGH | SQL |
| WH-041 | Query Store Enabled | Performance | MEDIUM | SQL |
| WH-042 | No Excessive Computed Columns | Maintainability | LOW | — |
| WH-043 | No Forced Query Hints | Performance | LOW | — |
| WH-044 | FK Columns Have Indexes | Performance | MEDIUM | SQL |
Eventhouse — 27 Rules per KQL Database (click to expand)
| # | Rule | Category | Severity | Fixable |
|---|---|---|---|---|
| EH-001 | Query Endpoint Available | Availability | HIGH | — |
| EH-002 | No Extent Fragmentation | Performance | HIGH | KQL |
| EH-003 | Good Compression Ratio | Performance | MEDIUM | — |
| EH-004 | Caching Policy Configured | Performance | MEDIUM | KQL |
| EH-005 | Retention Policy Configured | Data Management | MEDIUM | KQL |
| EH-006 | Materialized Views Healthy | Reliability | HIGH | KQL |
| EH-007 | Data Is Fresh | Data Quality | MEDIUM | — |
| EH-008 | No Slow Query Patterns | Performance | HIGH | — |
| EH-009 | No Recent Failed Commands | Reliability | MEDIUM | — |
| EH-010 | No Ingestion Failures | Reliability | HIGH | — |
| EH-011 | Streaming Ingestion Config | Performance | INFO | — |
| EH-012 | Continuous Exports Healthy | Reliability | MEDIUM | — |
| EH-013 | Hot Cache Coverage | Performance | MEDIUM | — |
| EH-014 | Ingestion Batching Configured | Performance | LOW | KQL |
| EH-015 | Update Policies Configured | Data Management | INFO | — |
| EH-016 | Partitioning on Large Tables | Performance | MEDIUM | KQL |
| EH-017 | Merge Policy Configured | Performance | LOW | KQL |
| EH-018 | Encoding Policy for Poorly Compressed | Performance | MEDIUM | — |
| EH-019 | Row Order Policy | Performance | LOW | — |
| EH-020 | Stored Functions Inventory | Data Management | INFO | — |
| EH-021 | Autocompaction Policy Enabled | Performance | MEDIUM | KQL |
| EH-022 | Extent Tags Retention Configured | Data Management | LOW | KQL |
| EH-023 | Sharding Policy Configured | Performance | INFO | — |
| EH-024 | Streaming on High-Volume Tables | Performance | LOW | KQL |
| EH-025 | Materialized Views Fresh | Data Quality | MEDIUM | KQL |
| EH-026 | Query Volume Health | Performance | INFO | — |
| EH-027 | Ingestion Latency Within SLA | Data Quality | MEDIUM | — |
Semantic Model — 41 Rules (click to expand)
| # | Rule | Category | Severity | Fixable |
|---|---|---|---|---|
| SM-001 | Avoid IFERROR Function | DAX | MEDIUM | XMLA |
| SM-002 | Use DIVIDE Function | DAX | MEDIUM | — |
| SM-003 | No EVALUATEANDLOG in Production | DAX | HIGH | XMLA |
| SM-004 | Use TREATAS not INTERSECT | DAX | MEDIUM | — |
| SM-005 | No Duplicate Measure Definitions | DAX | LOW | — |
| SM-006 | Filter by Columns Not Tables | DAX | MEDIUM | — |
| SM-007 | Avoid Adding 0 to Measures | DAX | LOW | XMLA |
| SM-008 | Measures Have Documentation | Maintenance | LOW | XMLA |
| SM-009 | Model Has Tables | Maintenance | HIGH | — |
| SM-010 | Model Has Date Table | Performance | MEDIUM | XMLA |
| SM-011 | Avoid 1-(x/y) Syntax | DAX | MEDIUM | — |
| SM-012 | No Direct Measure References | DAX | LOW | XMLA |
| SM-013 | Avoid Nested CALCULATE | DAX | MEDIUM | — |
| SM-014 | Use SUM Instead of SUMX | DAX | LOW | XMLA |
| SM-015 | Measures Have Format String | Formatting | LOW | XMLA |
| SM-016 | Avoid FILTER(ALL(...)) | DAX | MEDIUM | — |
| SM-017 | Measure Naming Convention | Formatting | LOW | XMLA |
| SM-018 | Reasonable Table Count | Performance | LOW | — |
| SM-021 | Bidirectional Cross-Filter Overuse | Performance | MEDIUM | XMLA |
| SM-022 | No Implicit Measures | DAX | MEDIUM | XMLA |
| SM-023 | No Disconnected Tables | Data Modeling | MEDIUM | — |
| SM-024 | Use REMOVEFILTERS() not ALL() | DAX | LOW | XMLA |
| SM-025 | No Excessive USERELATIONSHIP | DAX | LOW | — |
| SM-026 | No Complex Relationship Webs | Data Modeling | LOW | — |
| SM-027 | Inactive Relationships Documented | Data Modeling | LOW | — |
| SM-028 | All Measures Have Format Strings | Usability | LOW | XMLA |
| SM-029 | No Pseudo-Hierarchies | Usability | INFO | — |
| SM-B01 | No High Cardinality Text Columns | BPA | HIGH | — |
| SM-B02 | No Description/Comment Columns | BPA | HIGH | XMLA |
| SM-B03 | No GUID/UUID Columns | BPA | HIGH | XMLA |
| SM-B04 | No Constant Columns | BPA | MEDIUM | XMLA |
| SM-B05 | No Booleans Stored as Text | BPA | MEDIUM | — |
| SM-B06 | No Dates Stored as Text | BPA | MEDIUM | — |
| SM-B07 | No Numbers Stored as Text | BPA | MEDIUM | — |
| SM-B08 | Integer Keys Not String Keys | BPA | MEDIUM | — |
| SM-B09 | No Excessively Wide Tables | BPA | MEDIUM | — |
| SM-B10 | No Extremely Wide Tables | BPA | HIGH | — |
| SM-B11 | No Multiple High-Cardinality Columns | BPA | HIGH | — |
| SM-B12 | No Single Column Tables | BPA | LOW | — |
| SM-B13 | No High-Precision Timestamps | BPA | MEDIUM | — |
| SM-B14 | No Low Cardinality in Fact Tables | BPA | LOW | — |
Gateway — 12 Rules (click to expand)
| # | Rule | Category | Severity | Fixable |
|---|---|---|---|---|
| GW-001 | Gateway Online | Availability | HIGH | — |
| GW-002 | Gateway Version Current | Maintenance | MEDIUM | — |
| GW-003 | No Unused Gateways | Hygiene | MEDIUM | — |
| GW-004 | No Unused Datasources | Hygiene | MEDIUM | REST |
| GW-005 | Datasource Connectivity Healthy | Availability | HIGH | — |
| GW-006 | No Excessive Admins | Security | MEDIUM | REST |
| GW-007 | Credentials Not Expired | Security | HIGH | — |
| GW-008 | No Orphaned Cloud Connections | Hygiene | MEDIUM | REST |
| GW-009 | VNet Gateway Configured | Configuration | MEDIUM | — |
| GW-010 | No Duplicate Datasources | Hygiene | LOW | REST |
| GW-011 | Privacy Level Configured | Security | LOW | — |
| GW-012 | Connections Have Display Names | Maintainability | LOW | — |
Architecture
src/
├── index.ts MCP server entry point (stdio transport)
├── auth/
│ └── fabricAuth.ts Azure AD auth (6 methods, token caching)
├── clients/
│ ├── fabricClient.ts Fabric REST API + Power BI API + DAX + model CRUD
│ ├── sqlClient.ts SQL via tedious (Lakehouse + Warehouse)
│ ├── kqlClient.ts KQL/Kusto REST API (Eventhouse)
│ ├── livyClient.ts Livy Spark API (Lakehouse fixes)
│ ├── onelakeClient.ts OneLake ADLS Gen2 + Delta Log parser
│ └── xmlaClient.ts XMLA/TMSL SOAP client (Semantic Model fixes)
└── tools/
├── ruleEngine.ts Shared RuleResult type + unified report renderer
├── auth.ts auth_login, auth_status, auth_logout
├── workspace.ts workspace_list, capacity_info, optimization_report
├── lakehouse.ts 35 rules + 10 Livy fixes + table maintenance
├── warehouse.ts 44 rules + 16 SQL fixes
├── eventhouse.ts 27 rules + 11 KQL fixes + materialized view repair
├── semanticModel.ts 41 rules + 19 XMLA/TMSL fixes
└── gateway.ts 12 rules + 4 REST API fixes
Authentication
| Method | Use Case |
|---|---|
azure_cli |
Recommended — uses your existing az login session |
interactive_browser |
Opens browser for interactive login |
device_code |
Headless or remote environments |
vscode |
Uses VS Code Azure account |
service_principal |
CI/CD pipelines (requires tenantId, clientId, clientSecret) |
default |
Auto-detect best available method |
License
MIT
Installing Force Fabric
This server has no published package — it is built from source. Open the repository and follow its README.
▸ github.com/tmdaidevs/Force-Fabric-MCP-ServerFAQ
Is Force Fabric MCP free?
Yes, Force Fabric MCP is free — one-click install via Unyly at no cost.
Does Force Fabric need an API key?
No, Force Fabric runs without API keys or environment variables.
Is Force Fabric hosted or self-hosted?
Self-hosted: the server runs locally on your machine via the install command above.
How do I install Force Fabric in Claude Desktop, Claude Code or Cursor?
Open Force Fabric on unyly.org, pick your client tab (Claude Desktop, Claude Code, Cursor) and press Install — the config is generated automatically, no JSON editing.
Related MCPs
GitHub
PRs, issues, code search, CI status
by GitHubFilesystem
Secure file operations with configurable access controls.
Memory
Knowledge graph-based persistent memory system.
Template MCP Server
A CLI tool to create a new Model Context Protocol server project with TypeScript support, dual transport options, and an extensible structure
by mcpdotdirectCompare Force Fabric with
Not sure what to pick?
Find your stack in 60 seconds
Author?
Embed badge for your README
Browse similar
All development MCPs
