Power Query M para agentes: powerquery-m-for-agents

csalcedodatabi Power Query Power BI Herramientas
Tres tarjetas unidas por flechas: #shared de Power BI Desktop 2.157.879.0, el catálogo que se exporta de él con 659 funciones, 273 conectores y 201 constantes, y una sola ficha, la de Text.Split, que devuelve una lista y tiene ejemplos ejecutados

En resumen — powerquery-m-for-agents es la referencia del lenguaje Power Query M para agentes de IA: cada función de la librería con su firma, sus tipos y el host que la tiene. El catálogo no se raspa de la documentación: se exporta del propio motor. Es hermano de dax-for-agents, es MIT y se instala como plugin de Claude Code.

El hueco: funciones que suenan bien

Pídele a un agente que espere entre dos llamadas web o que lea un archivo binario en big-endian, y es probable que escriba algo así: Thread.Sleep, BinaryFormat.BigEndian, DateTime.Now. Las tres suenan a M. Ninguna existe.

No es un problema de inteligencia. Es que M tiene esquinas poco escritas — BinaryFormat, Diagnostics, Type, Uri, Cube — y ahí el modelo tiene pocos ejemplos de los que tirar. Cuando le falta el dato, lo rellena con algo verosímil.

La diferencia con DAX: la fuente es el motor

La librería de DAX salió de MicrosoftDocs/query-docs, el repositorio que desapareció en agosto. M no necesita un repositorio de documentación: #shared lista todas las funciones que el motor tiene cargadas, y cada una lleva su documentación como metadatos de su tipo — descripción, categoría, ejemplos, tipos de parámetros y tipo de retorno.

Así que el catálogo se exporta, no se raspa. Eso tiene tres consecuencias:

  • Si una función está en el catálogo, existe en el host del que se exportó.
  • Exportar varios hosts (Desktop, Excel, Dataflows Gen2) y unirlos le da a cada ficha un campo hosts. Ningún documento público lo trae.
  • Regenerar el catálogo es correr una consulta en una versión nueva de Desktop.

Hoy el catálogo sale de un export, Power BI Desktop 2.157.879.0, y su cabecera cuenta lo que trae:

QuéCuántas
Funciones de la librería659
Puntos de entrada de conectores (en su propio archivo)273
Constantes y valores de tipo (en su propio archivo)201

El agente lee ese índice plano una vez, encuentra la función y abre una ficha. Las demás no entran al contexto.

¿Evita las funciones inventadas? Medido

Cada pregunta del banco se le hace dos veces al mismo modelo: sola, y con las filas del catálogo de su categoría — nombres y resumen de una línea, nunca la ficha que contiene la respuesta. Luego cada nombre de la librería M que aparece en el código de la respuesta se busca en el catálogo. Un nombre que el motor no tiene es un invento. Ningún modelo juzga a otro.

ModeloPreguntas comparadasInventadas sin la referenciaInventadas con ella
Claude Haiku 4.535106
Claude Sonnet 5.53001
DeepSeek V4-Pro3352
DeepSeek V4-Flash3591

La lectura honesta: el modelo más fuerte casi no inventa, con o sin referencia. La referencia se gana el sueldo con los modelos más pequeños y baratos, y en las esquinas menos escritas de la librería.

Y la columna «con ella» se queda corta a propósito: en esa prueba el modelo recibe las funciones de la categoría, no las constantes, que viven en su propio archivo. Varios de los inventos son constantes mal escritas — BinaryFormat.BigEndian en lugar de ByteOrder.BigEndian, Diagnostics.TraceLevel.Information en lugar de TraceLevel.Information —, así que la referencia completa ayuda más de lo que dice la tabla.

Recontar cualquier corrida sin llamar a ninguna API
python evals/hallucination/run_ab.py --replay <archivo>

Todas las respuestas están guardadas en el repositorio, y un script de CI (check_eval_claims.py) comprueba que esta tabla coincide con esos archivos.

Ejemplos que corrieron de verdad

Los ejemplos ejecutados cubren las funciones de texto, listas y tablas — y ya hay páginas de binarios, fechas, números y registros —, y el lenguaje tiene páginas de conceptos escritas a mano: let … in, each y el guion bajo, errores con try … otherwise, evaluación perezosa, registros, listas y tablas, y tipos con metadatos. En el catálogo, cada función con ejemplos ejecutados lleva su marca.

Textos con licencia clara

Las descripciones de una línea son de Microsoft, de la librería estándar de microsoft/vscode-powerquery, que es MIT. Las descripciones largas y los ejemplos que devuelve el motor no tienen una licencia declarada, así que las fichas no los citan: cada una enlaza su página de Microsoft Learn cuando existe.

Cómo se instala

Son dos comandos dentro de Claude Code:

Instalación
/plugin marketplace add CSalcedoDataBI/powerquery-m-for-agents
/plugin install powerquery-m-for-agents@powerquery-m-for-agents

Necesitas Claude Code 2.1.142 o superior

Las versiones anteriores instalan el plugin y no cargan ninguna de sus skills, sin error. Es la misma trampa que documenté en dax-for-agents, y el repositorio tiene un check para que no vuelva.

El plugin es solo la carpeta plugins/powerquery-m-for-agents/, y es lo único que se instala. Trae dos skills, m-reference y m-feedback, y nada más: sin hooks, sin agentes, sin servidores MCP. Las dos son Markdown que Claude lee; usarlas no arranca ningún proceso ni descarga nada. m-feedback solo actúa cuando pides reportar un hueco: Claude redacta el issue, te enseña el texto y solo lo crea con tu gh después de que lo apruebes.

En el directorio de plugins de Anthropic: está enviado y esperando la revisión. Mientras tanto, los dos comandos de arriba instalan la misma versión desde el marketplace del repositorio.

Lo que no es

  • No es modelado, TMDL ni particiones. Para eso está la skill power-query de data-goblin/power-bi-agentic-development.
  • No es DAX. Eso es dax-for-agents.
  • Todavía no tiene un segundo host. El campo hosts está pensado para Excel y Dataflows Gen2, pero hoy el export es solo de Desktop.

Y ahora

Hay tres skills planeadas que aún no se cargan porque no tienen contenido: m-folding, m-custom-functions y m-iteration. Lo siguiente es eso y el segundo host.

→ github.com/CSalcedoDataBI/powerquery-m-for-agents · Todos los plugins: Plugins para agentes

¿Te resultó útil este artículo?

Tu apoyo me permite seguir creando contenido de calidad.

¡Contáctame!