¡Hoy es jueves de post! Seguimos con la serie post relacionados con la extensión para Visual Studio Code “Power BI Modeling MCP Server”. Si no sabes qué es y te suena a ciencia ficción, te recomiendo que leas los post que he escrito anteriormente (Post 1 y Post 2)

Por hacer un breve resumen, esta extensión oficial de Microsoft, actualmente en versión preliminar (public preview), permite llevar las capacidades de modelado de datos de Power BI a un entorno de desarrollo como VS Code, acercando estas funciones tanto a usuarios principiantes como a desarrolladores avanzados. En términos sencillos, el Power BI Modeling MCP Server actúa como un puente entre los modelos de datos de Power BI y herramientas externas (incluyendo asistentes de IA), habilitando la edición del modelo con lenguaje natural o código y facilitando la integración con flujos de trabajo de desarrollo profesionales.

Una de las grandes ventajas de esta extensión es que habilita capacidades completas de modelado de datos de Power BI fuera del entorno tradicional de Power BI Desktop. Con Power BI Modeling MCP Server, podemos conectarnos a un modelo semántico de Power BI (el conjunto de datos con sus tablas, columnas, medidas y relaciones) y editarlo directamente desde VS Code como ya hemos visto en los post anteriores… Pero, ¿qué pasa con los modelos semánticos que están el servicio? ¿Podemos hacer algo con ellos? La respuesta es clara y rotunda, SÍ. Para ello los descargamos al ordenador, y …

Para para para, un momento, ¿cómo que los descargamos? Esa es una manera de trabajar obsoleta.. 😊

Vamos con la versión moderna, como dice mi generación, con la versión “canelita en rama”. Supongamos que tenemos el siguiente modelo semántico en el servicio:

 

El cual sólo tiene una única tabla a modo de sábana como bien dice su nombre:

 

 

Voz en off: ¿Cómo puede haber un modelo con una tabla plana en el servicio?

Bien, nos han llamado al rescate y hay que solucionar el problema. Lo primero que tenemos que hacer es abrir Visual Studio Code:

 

 

Y en el chat, elegimos la IA que queramos usar, le escribimos el siguiente prompt:

Conectate al modelo semántico llamado "Sabana" que se encuentra en el workspace llamado "MCP_Server" que está alojado en el servicio de Power BI.

Y acto seguido se nos abre en nuestro navegador una ventana con la información para logearte en el servicio de Power BI:

 

  

 

Una vez seleccionada la cuenta, nos aparece el siguiente mensaje:

 

 

Y podemos volver a Visual Studio Code que nos ha devuelto el siguiente mensaje:

 

 

Ahora ya nos dice que estamos conectados al modelo y que podemos hacer lo que queramos casi casi. Lo primero que le vamos a indicar es que nos genere un modelado correcto. Para ello, le indicamos el siguiente prompt por ejemplo:

Actúa como experto en modelado dimensional para Power BI (Kimball) y como experto en Power Query (lenguaje M).

Partiendo del modelo actual, modela en estrella siguiendo buenas prácticas: 1 tabla de hechos + dimensiones conformadas, con claves sustitutas, jerarquías útiles y atributos limpios.

TODAS las tablas del modelo final (Hechos y Dimensiones) deben generarse en Power Query mediante M (no usar columnas calculadas DAX para construir el modelo).

Y dejamos que empiece la magia… Mientras estamos atentos ya que nos irá solicitando ciertas confirmaciones como la siguiente:

 

Y automáticamente, empieza a devolvernos mensajes como:

  

 

Y vemos que van apareciendo dimensiones:

 

 

 

Y una vez creadas las tablas vemos que la magia se detiene… ¡que no! Sigue con el objetivo propuesto y tocan las relaciones:

 

 

 

Y finalmente nos devuelve el siguiente mensaje que copio literal:

 MODELO DIMENSIONAL EN ESTRELLA COMPLETADO

He transformado exitosamente el modelo tabular plano en un modelo dimensional estrella de Kimball siguiendo todas las mejores prácticas. A continuación el resumen completo:

📊 ARQUITECTURA DEL MODELO

1 Tabla de Hechos:

  • FactSales (21 columnas)
    • Granularidad: Transacción de venta individual
    • Métricas aditivas: SalesQuantity, SalesAmount, GrossProfit, NetSales, TotalCost, etc.
    • 6 claves foráneas a dimensiones
    • Métricas calculadas en M: GrossProfit, NetSales

6 Dimensiones Conformadas:

  1. DimDate (16 columnas, 2 jerarquías)
    • Clave sustituta: DateSK
    • Jerarquía Calendar: Year → Quarter → Month → Date
    • Jerarquía Weekly: Year → Week → Date
    • Atributos: MonthName, QuarterName, DayName, IsWeekend, YearMonth, etc.
    • Sort By configurado para nombres de mes/día/trimestre
  2. DimChannel (4 columnas)
    • Clave sustituta: ChannelSK
    • Clave natural: ChannelNK
    • Atributos: ChannelName, ChannelDescription
  3. DimStore (7 columnas)
    • Clave sustituta: StoreSK
    • Clave natural: StoreNK
    • Atributos: StoreName, StoreType, StoreManager, StoreManagerName
  4. DimProduct (4 columnas)
    • Clave sustituta: ProductSK
    • Clave natural: ProductNK
    • Atributos: ProductName, ProductDescription
  5. DimPromotion (6 columnas)
    • Clave sustituta: PromotionSK
    • Clave natural: PromotionNK
    • Atributos: PromotionName, DiscountPercent, DiscountDescription
    • Manejo de nulos: "Sin Promoción"
  6. DimCurrency (4 columnas)
    • Clave sustituta: CurrencySK
    • Clave natural: CurrencyNK
    • Atributos: CurrencyName, CurrencyDescription

🔗 RELACIONES (6 activas)

Todas las relaciones siguen el patrón Many-to-One (FactSales → Dimensiones):

  • FactSales[DateSK] → DimDate[DateSK]
  • FactSales[ChannelSK] → DimChannel[ChannelSK]
  • FactSales[StoreSK] → DimStore[StoreSK]
  • FactSales[ProductSK] → DimProduct[ProductSK]
  • FactSales[PromotionSK] → DimPromotion[PromotionSK]
  • FactSales[CurrencySK] → DimCurrency[CurrencySK]

Configuración: OneDirection, Active

⚙️ TRANSFORMACIONES EN POWER QUERY (M)

Todas las tablas generadas 100% en M:

  1. Extracción de dimensiones: Uso de Table.SelectColumns + Table.Distinct
  2. Limpieza de datos: Text.Trim en todos los campos de texto
  3. Claves sustitutas: Renombrado de Keys originales a SK (Surrogate Key)
  4. Claves naturales: Agregadas como NK (Natural Key)
  5. Columnas calculadas en M:
    • DimDate: Quarter, MonthName, DayName, IsWeekend, YearMonth, etc.
    • DimStore: StoreManagerName
    • DimPromotion: DiscountDescription
    • FactSales: GrossProfit, NetSales
  6. Ordenamiento: Todas las tablas ordenadas por clave sustituta

🎯 BUENAS PRÁCTICAS IMPLEMENTADAS

 Modelo Kimball clásico: 1 hecho + dimensiones conformadas
 Claves sustitutas (SK) en todas las dimensiones
 Claves naturales (NK) preservadas para trazabilidad
 Jerarquías en DimDate (Calendar y Weekly)
 Sort By configurado para ordenamiento correcto
 Atributos descriptivos enriquecidos
 Granularidad clara: Transacción de venta
 Métricas derivadas calculadas en M (no DAX)
 Tabla origen (Sabana) oculta en el modelo
 Nomenclatura consistente: Dim* / Fact*
 Todo generado en Power Query (M), no columnas calculadas DAX

📝 PRÓXIMOS PASOS RECOMENDADOS

  1. Crear medidas DAX básicas:
    • Total Sales = SUM(FactSales[SalesAmount])
    • Total Quantity = SUM(FactSales[SalesQuantity])
    • Avg Unit Price = AVERAGE(FactSales[UnitPrice])
    • Gross Margin % = DIVIDE(SUM(FactSales[GrossProfit]), SUM(FactSales[SalesAmount]))
  2. Configurar formatos (moneda, porcentajes, etc.)
  3. Validar cardinalidad de las relaciones con datos reales
  4. Crear Role-Playing Dimensions si se requiere (ej: OrderDate, ShipDate)

 

Y si vamos al servicio y miramos el modelado que ha realizado es simplemente… espectacular:

 

  

Pero esto no se queda ahí, el modelo no tiene medidas que aporte valor por lo que le vamos a indicar que nos genere esas medidas ¿qué os parece? Por lo que le escribimos el siguiente prompt:

Genera una batería de 10 medidas DAX que aporten valor a negocio. Alójalas en carpetas por temática en la tabla de hechos

Y nos devuelve lo siguiente (copio literal):

 

¡Perfecto! He creado exitosamente 10 medidas DAX estratégicas organizadas en 4 carpetas temáticas dentro de la tabla FactSales.

📊 MEDIDAS DAX CREADAS

📈 Carpeta: "📊 Ventas" (3 medidas)

Total Sales

·       SUM ( FactSales[SalesAmount] )

·       Formato: #,##0.00

·       Métrica fundamental del negocio

Total Quantity

·       SUM ( FactSales[SalesQuantity] )

·       Formato: #,##0

·       Unidades vendidas totales

Average Transaction Value

·       DIVIDE ( SUM ( FactSales[SalesAmount] ), DISTINCTCOUNT ( FactSales[SalesTransactionID] ), 0 )

·       Formato: #,##0.00

·       Ticket promedio por venta - KPI clave para estrategia de pricing

 

💰 Carpeta: "💰 Rentabilidad" (3 medidas)

Gross Profit

·       SUM ( FactSales[GrossProfit] )

·       Formato: #,##0.00

·       Beneficio bruto total

Gross Margin %

·       DIVIDE ( SUM ( FactSales[GrossProfit] ), SUM ( FactSales[SalesAmount] ), 0 )

·       Formato: 0.00%

·       KPI crítico de rentabilidad - muestra eficiencia operativa

Discount Impact

·       SUM ( FactSales[DiscountAmount] )

·       Formato: #,##0.00

·       Impacto monetario de descuentos - útil para evaluar estrategias promocionales

 

 

📅 Carpeta: "📅 Análisis Temporal" (3 medidas)

Sales YTD

·       TOTALYTD ( SUM ( FactSales[SalesAmount] ), DimDate[Date] )

·       Formato: #,##0.00

·       Acumulado del año - esencial para seguimiento de objetivos

Sales vs PY

·       Variables: CurrentSales, PriorYearSales

·       CurrentSales - PriorYearSales

·       Formato: #,##0.00

·       Diferencia absoluta vs año anterior

Sales Growth %

·       Variables: CurrentSales, PriorYearSales

·       DIVIDE ( CurrentSales - PriorYearSales, PriorYearSales, 0 )

·       Formato: 0.00%

·       Crecimiento porcentual YoY - KPI ejecutivo clave

⚠️ Carpeta: "⚠️ Calidad" (1 medida)

Return Rate %

·       DIVIDE ( SUM ( FactSales[ReturnQuantity] ), SUM ( FactSales[SalesQuantity] ) + SUM ( FactSales[ReturnQuantity] ), 0 )

·       Formato: 0.00%

·       Tasa de devoluciones - indicador de calidad de producto/satisfacción

🎯 VALOR DE NEGOCIO

Análisis de Rendimiento: Total Sales, Sales YTD, Sales Growth %

Gestión de Rentabilidad: Gross Profit, Gross Margin %, Discount Impact

Comportamiento del Cliente: Average Transaction Value

Calidad y Satisfacción: Return Rate %

Comparativas Temporales: Sales vs PY, Sales YTD

Las medidas están listas para usar en cualquier visual de Power BI y se calcularán correctamente gracias al modelo dimensional en estrella implementado.

 

Y si vamos al modelo en el servicio, a la tabla FactSales, vemos… ¡Boom! Canelita en rama ¿eh?

 

¿Qué os parece? A mi algo espectacular. Como siempre digo (Mónica Mesa, va por ti) con la introducción de la IA, nos han ascendido, hemos pasado de hacedores a supervisores (el aumento salarial no está incluido 😊 )

En definitiva, la extensión Power BI Modeling MCP Server para Visual Studio Code representa un salto significativo en la forma de desarrollar y mantener modelos de datos de Power BI. Reúne lo mejor de dos mundos: por un lado, la facilidad de uso que brinda poder describir cambios en lenguaje natural (reduciendo la barrera de entrada para quienes no son expertos en DAX o modelado); por otro, la robustez y eficiencia de un entorno de desarrollo profesional,

Todo ello sin salir del ecosistema de Power BI, ya que la extensión se conecta de forma segura tanto a Power BI Desktop como al servicio en la nube, respetando las directrices y permisos establecidos.

En definitiva, Power BI Modeling MCP Server abre la puerta a nuevas formas de trabajar con Power BI: más colaborativas, más automatizadas y potenciadas con inteligencia artificial.

Aunque la herramienta aún se encuentra en desarrollo (y pueden esperarse cambios antes de su versión definitiva), ya se vislumbra como una pieza clave para llevar la productividad y calidad en el modelado de datos de Power BI al siguiente nivel. ¡Vale la pena experimentarla y descubrir cómo puede transformar tus proyectos de inteligencia de negocios!

 

¡Nos vemos en los datos!