Skip to main content
Glama

powerbi-orchestrator-mcp

Un servidor MCP orquestrador que unifica modelado semántico, autoría de reportes, nube Fabric, validación y visualización/UX para Power BI / Fabric en 31 herramientas de alto nivel (no 500 primitivas).

El orquestrador delega a motores especializados (subprocess) y presenta al LLM una superficie coherente y de alto nivel.

Tests Coverage Python License MCP

Status: v1.23.0 — Beta. 31 tools, 89% cobertura, enterprise hardening (per-tool scopes, read- and write-path containment, plan ownership, full audit trail). Every state-changing tool is safe by default: dry_run=True on deploy_to_workspace and run_refresh, per-step confirmation on apply_plan, and Tools.Write required for mutating tools over HTTP. Every tool also reports what it actually did: a check that could not run says so instead of returning a green result, a rollback that only partly succeeded is reported as partial, and a step says which engine served it. See release notes · changelog.


Quickstart (60 segundos)

# 1. Install from PyPI.
pip install powerbi-orchestrator-mcp

# 2. Configure your MCP client (Claude Desktop shown).
#    Edit claude_desktop_config.json:
{
  "mcpServers": {
    "powerbi-orchestrator-mcp": {
      "command": "powerbi-orchestrator-mcp",
      "args": ["--start"],
      "env": {"PBI_AUTH_MODE": "interactive"}
    }
}
# 3. Verify the orchestrator itself works.
powerbi-orchestrator-mcp --start  # runs over stdio
# Or in another terminal, run the smoke test:
python scripts/verify_mcp_server.py

That's it — your LLM now sees 31 tools for Power BI / Fabric. See the examples/ directory for 3 reproducible workflows.

Antes de usarlo con datos de clientes, la suite de tests no cubre nada contra una API real. Sigue docs/pilot-validation.md y ejecuta el preflight de solo lectura:

python scripts/pilot_check.py --workspace-id <ws-id> --dataset-id <ds-id>

Related MCP server: Microsoft Fabric RTI MCP Server

Defaults de seguridad (léelo antes de tocar producción)

Todas las tools que modifican estado son safe-by-default. Nada escribe en un workspace real ni en disco sin una acción explícita.

Tool

Default

Cómo se ejecuta de verdad

deploy_to_workspace

dry_run=True

dry_run=False

run_refresh

dry_run=True

dry_run=False

apply_plan

dry_run=True

dry_run=False (+ confirm_each_step)

promote_in_pipeline

dry_run=True

dry_run=False

run_dax_regression

no ejecuta sin dataset

pasar workspace_id + dataset_id

Además:

  • Sin secretos en el contexto del LLM. Ninguna tool acepta un client_secret. Las credenciales se leen del entorno (PBI_CLIENT_ID / PBI_TENANT_ID / PBI_CLIENT_SECRET, o los equivalentes AZURE_*) o de una workload identity.

  • Las escrituras están contenidas. Las tools que escriben en disco rechazan rutas fuera de PBI_WORKSPACE_ROOT, que por defecto es el directorio de trabajo del proceso.

  • Las lecturas también. Leer es cómo el contenido llega al contexto del modelo, así que el path de lectura sigue la misma regla que el de escritura. La precedencia es deliberada: un PBI_WORKSPACE_ROOT configurado es la frontera y nada lo ensancha; PBI_ALLOW_OUTSIDE_WORKSPACE_READ=1 la quita solo cuando no hay ninguna configurada (en ese caso la frontera es el directorio de trabajo del proceso). Los directorios del sistema y de credenciales (/etc, /run, ~/.ssh, ~/.config…) se rechazan siempre.

  • Auditoría de todo lo que muta. Las 20 tools con efecto sobre el workspace dejan registro (success / failed / dry_run / partial / rolled_back) en un log encadenado con HMAC. Los valores guardados bajo una clave que nombra un secreto se redactan enteros.

  • La auditoría dice quién. Cada entrada lleva el actor en una columna propia: el principal ligado sobre HTTP, el usuario del sistema operativo que corre el proceso sobre stdio (marcado local:). La columna está dentro de la cadena, así que el actor no se puede retocar después sin romperla. No se redacta a propósito: un principal suele ser una UPN, y el redactor convierte los emails en hashes — que no es una atribución.

  • Un servidor en solo-lectura. PBI_READONLY=1 (o --readonly en la línea de comandos) rechaza toda tool que modifique estado, sea quien sea el que llame: es una propiedad del despliegue, no del llamador. Un principal con Tools.Admin tampoco puede saltárselo.

  • El despliegue se reporta a sí mismo. Al arrancar, y en powerbi_health, el servidor dice si la frontera de lectura está activa, dónde está el root del workspace, si el transporte hace que los scopes signifiquen algo, si el audit log es fail-closed y si el home del orquestador se puede escribir. Un despliegue que apagó la frontera de lectura lo dice.

  • DAX acotado. execute_dax_query devuelve como máximo 1000 filas por defecto (techo 10 000) y marca el truncamiento.

  • Scopes por tool sobre transporte HTTP: cada una de las 31 tools declara el scope que necesita. Las que modifican el workspace o la nube requieren Tools.Write; liberar entre etapas de un pipeline y aplicar sensitivity labels requieren Tools.Admin; Tools.Admin concede todos los inferiores. Las que solo producen ficheros dentro del workspace (el diccionario de datos, las capturas) siguen siendo de lectura, pero su ruta de salida se valida como escritura y queda dentro del workspace. Cada sesión HTTP queda ligada a la credencial que la abrió: otra credencial recibe 404.

  • Los planes tienen dueño. Cada plan registra la identidad que lo creó y solo su dueño puede leerlo, listarlo o borrarlo; conocer el plan_id no alcanza.

  • Plugins desactivados por defecto. Cargar un plugin ejecuta Python arbitrario, así que requiere PBI_ENABLE_PLUGINS=1 y un directorio escribible solo por el propietario.

Lo que una tool te dice es lo que ocurrió

Este proyecto no reporta éxito por trabajo que no hizo:

  • Una validación que no pudo ejecutarse (por ejemplo, BPA sin Tabular Editor) devuelve un score parcial con la lista de checks omitidos, no un 100.

  • Un paso de plan sin ejecutor falla con el nombre de la acción, en vez de devolverse como aplicado.

  • run_dax_regression falla si no encuentra el baseline: sin baseline no hay nada contra qué comparar.

  • apply_plan distingue rolled_back de rollback_partial y de rollback_incomplete, y cada entrada del rollback lleva su estado real.

Detalle completo del modelo de amenazas en SECURITY.md, incluidos los controles que no existen.


Arquitectura de 3 capas (importante)

El proyecto NO es un wrapper sobre los MCP servers existentes. Es un servidor MCP propio que consume otros MCP servers como subprocess. Esto es lo que permite presentar al LLM 31 tools coherentes en lugar de 500 primitivas dispersas.

┌─────────────────────────────────────────────────────────────────┐
│ Capa 1: MCP Client (Claude Desktop, VS Code, Copilot, Cursor)    │
│         Habla JSON-RPC sobre stdio con el orquestrador.          │
│         El LLM ve 31 tools de alto nivel.                        │
└────────────────────────────┬────────────────────────────────────┘
                             │ stdio + JSON-RPC
┌────────────────────────────▼────────────────────────────────────┐
│ Capa 2: powerbi-orchestrator-mcp (ESTE PAQUETE — Python)        │
│         Distribuido via PyPI: pip install powerbi-orchestrator-mcp│
│         Console script: powerbi-orchestrator-mcp                 │
└────────────────────────────┬────────────────────────────────────┘
                             │ subprocess + JSON-RPC sobre stdio
┌────────────────────────────▼────────────────────────────────────┐
│ Capa 3: Engines individuales (heterogéneos)                       │
│         powerbi-modeling-mcp → npm: npx @microsoft/...          │
│         te (Tabular Editor)    → .NET binary                     │
│         superbi-mcp             → npm: npx superbi-mcp            │
│         python_report           → built-in (parte del orquestrador)│
└─────────────────────────────────────────────────────────────────┘

La capa 3 son los motores a los que el orquestrador despacha, y son todos los que el health check reporta: si aparece ahí, alguna tool lo usa.

Por qué npm NO es necesario para instalar el orquestrador (sí para correr operaciones reales): npm es una dependencia RUNTIME de los engines, no del orquestrador. El paquete powerbi-orchestrator-mcp se publica solo en PyPI.


Qué es

Un servidor Model Context Protocol (stdio) que expone 26 herramientas de alto nivel para que un agente IA pueda trabajar end-to-end con Power BI:

  • Diseñar y validar modelos semánticos (TMDL/TOM).

  • Crear, editar y auditar reportes (.pbix, PBIP/PBIR).

  • Operar en la nube (Fabric / Power BI Service): workspaces, datasets, refresh, deployment pipelines, RLS, Git integration.

  • Auditar calidad (BPA, lint DAX, accesibilidad WCAG, star-schema).

  • Diseñar visualizaciones con razonamiento de UX/storytelling.

Qué problema resuelve

Los MCPs existentes cubren partes:

  • powerbi-modeling-mcp (oficial MS): solo modelo semántico, no toca reportes.

  • superbi-mcp (cyphonica, 490 tools): local, Windows-only, FSL.

  • powerbi-mcp (sulaiman013, 82 tools): cloud paths mock-tested, no live.

  • fabric-rti-mcp, Fabric Core MCP: solo nube, no autoría local.

Nadie entrega orquestación cross-engine + nube maduro + UX verificable. powerbi-orchestrator-mcp sí.

Instalación

1. Instalar el orquestrador (Python)

pip install powerbi-orchestrator-mcp

El paquete está publicado en PyPI: https://pypi.org/project/powerbi-orchestrator-mcp/

Para desarrollo local (con tests y dev dependencies):

git clone https://github.com/berriosb/powerbi-orchestrator-mcp.git
cd powerbi-orchestrator-mcp
pip install -e ".[dev]"

El comando powerbi-orchestrator-mcp queda disponible en el PATH.

2. Instalar engines opcionales (solo si vas a usar operaciones reales)

Los engines son dependencias runtime del orquestrador. Si solo vas a probar con python_report (built-in), no necesitas instalar nada más.

# Node.js + npm (para powerbi-modeling-mcp, superbi-mcp)
# macOS:   brew install node
# Linux:   apt install nodejs npm
# Windows: https://nodejs.org/

# Tabular Editor CLI (BPA)
# Windows/macOS: https://github.com/TabularEditor/TabularEditor/releases
# Linux: dotnet tool install --global TabularEditor

Los engines que el orquestrador despacha son esos tres, y son los únicos que el health check reporta: si aparece ahí, alguna tool lo usa. La validación PBIP que el orquestrador ejecuta es su propio validador estructural, que no necesita binario externo.

Ver docs/engines-setup.md para detalles de instalación por engine y troubleshooting.

3. Configurar el MCP client

Edita la config de tu MCP client (ej. claude_desktop_config.json):

{
  "mcpServers": {
    "powerbi-orchestrator-mcp": {
      "command": "powerbi-orchestrator-mcp",
      "args": ["--start"],
      "env": {
        "PBI_AUTH_MODE": "interactive",
        "PBI_WORKSPACE_ROOT": "/ruta/a/tus/pbip"
      }
    }
  }
}

PBI_WORKSPACE_ROOT acota las lecturas y las escrituras del orquestador a ese directorio. Si no lo pones, se usa el directorio de trabajo del proceso. Apunta ahí donde tengas tus .pbip: es la raíz del workspace desde el punto de vista del agente.

Compatible con VS Code + Copilot, Claude Desktop, OpenClaw, Hermes, Claude Code, Cursor y cualquier cliente MCP stdio.

4. Probar

En tu cliente MCP, el LLM ve 31 tools de alto nivel, agrupadas por capa:

Sesión y planificación

  • connect_target — abrir sesión contra un PBIP / Fabric workspace / PBI Desktop

  • plan_change — crear un plan versionable

  • apply_plan — ejecutar el plan con rollback

Modelado semántico

  • create_semantic_model_from_schema, add_measure_with_validation, refactor_to_calculation_groups, diff_models, generate_data_dictionary

Refactoring del modelo

  • simplify_dax_measure — reescribir una medida DAX en su forma corta equivalente

  • abstract_measures — la lógica que está escrita más de una vez

  • abbreviate_names — nombres de medidas y columnas que se han hecho demasiado largos

Autoría de reportes

  • create_report_from_dataset, edit_report_visual, design_report_page_from_requirements, select_visuals_for_kpis, screenshot_report_pages, optimize_report_performance

Nube Fabric / Power BI Service

  • deploy_to_workspace, run_refresh, promote_in_pipeline, setup_rls_and_roles, set_sensitivity_labels, commit_workspace_to_git, sync_git_to_workspace, pre_deploy_check, execute_dax_query

Auditoría y calidad

  • audit_model_and_report, audit_report_ux_and_storytelling, apply_theme_and_accessibility_rules, run_dax_regression

Diagnóstico

  • powerbi_health

Con connect_target + plan_change + apply_plan solos, el LLM ya puede hacer safe_rename, audit, deploy y regression sobre cualquier PBIP local (sin engines externos) o cualquier Fabric workspace (con powerbi-modeling-mcp instalado).

Tres flujos completos, de principio a fin

Los tres están en examples/, con los JSON de respuesta esperados. Aquí va el esqueleto de cada uno.

1. Renombrar una columna sin romper nada

El flujo más importante para un analista: cambiar el nombre de una columna y que las referencias del modelo y del reporte se muevan juntas.

connect_target(
    target_type="pbip_folder",
    target_ref="/ruta/a/tus/sales.pbip"
)

plan_change(
    intent="safe_rename",
    options={
        "old_path": "FactSales[UnitPrice]",
        "new_path": "FactSales[Price]",
        "scope": "full"
    }
)

apply_plan(
    plan_id="<el que devolvió plan_change>",
    dry_run=false,
    confirm_each_step=false
)

plan_change devuelve un plan versionable (YAML) que puedes commitear a Git antes de aplicarlo. apply_plan ejecuta los pasos con rollback entre motores, y devuelve partial si el rollback no lo revirtió todo. Después del rename, el paso de reporte dice cuántas referencias reescribió — un rename que no encuentra nada en un PBIR real es un dato, no un éxito.

→ examples/01-safe-rename/

2. Publicar en Fabric con el gate delante

El gate evalúa findings, no ficheros: primero auditas, y le pasas el resultado a pre_deploy_check y a deploy_to_workspace.

audit_model_and_report(
    pbip_path="/ruta/a/tus/sales.pbip"
)

pre_deploy_check(
    findings_json="<los findings de la auditoría>",
    profile="strict"
)

deploy_to_workspace(
    pbip_path="/ruta/a/tus/sales.pbip",
    workspace_id="<workspace>",
    findings_json="<los mismos findings>",
    gate_profile="strict",
    dry_run=true          # ← empieza siempre por aquí
)

run_refresh(
    workspace_id="<workspace>",
    dataset_id="<dataset>",
    dry_run=true
)

pre_deploy_check falla cerrado: sin findings no pasa, y una severidad que el perfil no conoce bloquea. Un despliegue bloqueado igual lista las operaciones que habría hecho, para que el dry run siga siendo informativo. dry_run viene en true por defecto en las dos tools que escriben en la nube, así que hay que desactivarlo a propósito.

→ examples/02-deploy-pbip/

3. Auditar, arreglar, volver a auditar

audit_model_and_report(
    pbip_path="/ruta/a/tus/sales.pbip"
)

apply_theme_and_accessibility_rules(
    pbip_path="/ruta/a/tus/sales.pbip",
    palette="okabe_ito",
    auto_backfill_alt_text=true
)

add_measure_with_validation(
    target="/ruta/a/tus/sales.pbip",
    table="FactSales",
    measure_name="Revenue",
    expression="SUM(FactSales[Price])"
)

audit_model_and_report(
    pbip_path="/ruta/a/tus/sales.pbip"
)   # segunda pasada

El bucle es el punto: auditar, corregir, auditar otra vez. La segunda pasada es la que dice si el arreglo funcionó.

→ examples/03-audit-then-fix/

Estado actual (v1.22.0)

  • ✅ 31 tools implementadas (modelado, refactoring, reportes, nube, auditoría, UX, DAX)

  • ✅ Cross-engine rollback

  • ✅ Audit log encadenado con HMAC, con anchor firmado

  • ✅ PlanBuilder con templates versionables

  • ✅ Motores registrados: python_report y python_modeling (built-in), powerbi-modeling-mcp, superbi-mcp, te (Tabular Editor, para BPA). Cada paso dice qué motor lo sirvió

  • ✅ Scopes por tool (las 31 declaran el suyo) y Tools.Admin para las operaciones de gobernanza

  • ✅ Lecturas y escrituras acotadas al workspace (PBI_WORKSPACE_ROOT)

  • ✅ Planes con dueño: conocer el plan_id no alcanza para leerlos ni borrarlos

  • ✅ Story variance analysis (detección de regresiones visuales)

  • ✅ mypy --strict clean, ruff clean, CI matrix Linux/macOS/Windows

  • ✅ Publicado en PyPI: https://pypi.org/project/powerbi-orchestrator-mcp/

Pendiente, y es deliberado:

  • ⏳ Los E2E contra un tenant real siguen siendo manuales (pilot-validation.yml, workflow_dispatch). Los secrets no existen todavía en el repo, así que automatizarlo sin tenant es teatro.

  • ⏳ La propiedad de planes vive en un SQLite local, no en un IdP.

  • ⏳ El audit log es fail-open por defecto: una escritura fallida no detiene la mutación, se reporta como aviso en el resultado. Con PBI_AUDIT_FAIL_CLOSED=1 deja de serlo.

Ver RELEASE-NOTES-v1.20.0.md para el detalle de la línea 1.2x y CHANGELOG.md para los cambios de la 1.22.0.

Licencia

MIT.

Atribución

Available Tools

31 tools
abbreviate_namesA

Propose shorter names for the measures and columns that need them.

Use this tool when the user asks to:

  • Shorten, abbreviate or tidy up measure and column names.

  • Find the names that have grown too long to read.

  • Prepare a batch of renames before applying them.

Args: pbip_path: Path to the root .pbip directory. kind: "measures", "columns" or "both". max_length: Above this length, a name is a candidate. abbreviate_words: Shorten the words that have a standard abbreviation ("Amount" to "Amt", "Quantity" to "Qty"). drop_filler_words: Drop the words that carry no meaning ("of", "the", "in").

Returns: Dict with the proposals and a rename map ready for plan_change(intent="safe_rename").

It does not rename anything. A name that cannot be shortened
without changing what it says is reported as needing a name by
hand, and a proposal that would collide with an existing name
is adjusted.
NameRequiredDescriptionDefault
kindNoboth
pbip_pathYes
max_lengthNo
abbreviate_wordsNo
drop_filler_wordsNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well: it discloses that the tool is non-mutating, that unshortenable names are reported instead of forced, and that colliding proposals are auto-adjusted. It does not mention scope of scanning, permissions on the .pbip directory, or limits on proposal volume.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in one sentence, and the Args/Returns structure is scannable. Some duplication exists between the trigger list and the Args block, but given 0% schema coverage the repetition earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a five-parameter, read-only proposal tool this covers what an agent needs: what it does, when to call it, each parameter's meaning, the non-mutating guarantee, and the handoff path to plan_change. An output schema exists, and the Returns note adds the useful downstream pointer rather than restating the shape.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does: every one of the five parameters is explained, including the valid values for 'kind' ("measures", "columns", or "both") which the schema leaves as a bare string with no enum, plus the semantics of the length threshold and the two word-shortening flags.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb and resource: 'Propose shorter names for the measures and columns that need them.' It also explicitly distinguishes itself from the mutating siblings by stating 'It does not rename anything', so an agent can tell it apart from plan_change/apply_plan without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Use this tool when the user asks to' list gives three concrete trigger scenarios, including the preparatory case ('Prepare a batch of renames before applying them'). The handoff to plan_change(intent="safe_rename") names the downstream alternative explicitly, and the no-rename boundary rules out misuse.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

abstract_measuresA

Find the logic that is written more than once in a semantic model.

Use this tool when the user asks to:

  • Find duplicated or copy-pasted logic across measures.

  • Know which measures compute the same thing and could share one.

  • Find the measures that differ only in a number or a column, which is what a calculation group is for.

Args: pbip_path: Path to the root .pbip directory. table: Only look at the measures of this table. min_group_size: How many measures have to share a shape before it is reported. Two is the minimum.

Returns: Dict with the groups found and, for each, what the duplication looks like: which measures share it and where exactly they differ.

It does not write anything and does not apply the abstraction. A
Tabular measure cannot take a parameter, so the answer is a
calculation group, a helper table or a rewrite in place — and
which one is right depends on the model.
NameRequiredDescriptionDefault
tableNo
pbip_pathYes
min_group_sizeNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and does reasonably well: it explicitly states 'It does not write anything and does not apply the abstraction', and warns that the fix is context-dependent (calculation group vs helper table vs rewrite). It omits cost/performance characteristics on large models and any permission requirements for reading a .pbip directory.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, then a scannable bulleted usage block, then Args/Returns. The closing paragraph on why the answer must be a calculation group/helper table/rewrite is slightly discursive but earns its place by managing expectations about output.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Even though an output schema exists (so return values needn't be spelled out), the description still summarizes the returned grouping structure usefully. Combined with coverage of all three args and the read-only caveat, an agent has what it needs; the only shortfall is no guidance on model size limits or failure modes.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate and largely does: pbip_path is defined as the root .pbip directory, table as a scoping filter, and min_group_size as the sharing threshold with 'two is the minimum' clarifying the floor. Minor gap: pbip_path doesn't clarify whether relative or absolute paths are accepted.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb (find duplicated logic) plus a precisely scoped resource (measures in a semantic model), with concrete examples of what 'duplication' means (copy-pasted, same computation, differ only by a number/column). It doesn't explicitly name the neighboring tools it should be distinguished from (e.g. refactor_to_calculation_groups, simplify_dax_measure), so sibling separation is inferential rather than stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

A bulleted 'use this tool when the user asks to' block gives three concrete triggering intents, which is well above implied usage. It also implicitly separates itself from the applier by stating 'does not apply the abstraction', but never names the alternative tool or states when NOT to use this one.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

add_measure_with_validationA

Add a DAX measure to a semantic model with automated linting and validation.

Use this tool when the user asks to:

  • Create or add a new DAX measure to a Power BI model.

  • Validate DAX syntax and best practices (preventing division by zero, unformatted measures, etc.).

  • Dry-run a measure to check for lint issues before committing to TMDL.

Args: target: Target PBIP directory or TMDL path. measure_name: Name of the measure to create. table: Target table where the measure will reside. expression: DAX formula for the measure (e.g. "DIVIDE([Total Sales], [Units], 0)"). format_string: Format string (e.g. "$#,##0.00", "0.0%"). description: Measure documentation or business description. is_hidden: Whether the measure should be hidden in report view. fail_on_severity: Minimum lint severity that blocks creation ("error", "warning", "info"). dry_run: If True (DEFAULT), validate lint rules without writing to disk. Pass dry_run=False explicitly to persist the measure. runtime_check: Whether to execute the measure against an active engine if connected. measure_writer: Optional custom measure writer callable. Not reachable from an MCP client — the server wires the modeling engine instead.

Returns: Dict with success status, lint findings, and modified file paths.

NameRequiredDescriptionDefault
tableYes
targetYes
dry_runNo
is_hiddenNo
expressionYes
descriptionNo
measure_nameYes
format_stringNo
runtime_checkNo
measure_writerNo
fail_on_severityNowarning

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and mostly succeeds: it discloses that dry_run defaults to True and only dry_run=False persists, that fail_on_severity gates creation, that runtime_check needs an active engine, that lint findings are returned, and that measure_writer is not reachable from an MCP client. It does not state required permissions or whether an existing measure is overwritten.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose, then usage, then args, then returns – a clean hierarchy. The Args block is long but earns its place given 0% schema coverage; the only mild redundancy is restating parameter names alongside the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 11 parameters, a default-on dry-run safety gate, and a mutation target, the description covers usage, all arguments, and the return payload (success status, lint findings, modified file paths). It omits error/failure modes and permission prerequisites, which are the only remaining gaps for a write tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, yet the description documents every meaningful parameter with type-appropriate examples ('$#,##0.00', 'DIVIDE([Total Sales], [Units], 0)') and clarifies the enum values for fail_on_severity. It fully compensates for the schema gap, including flagging the one parameter an agent cannot use.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Add a DAX measure to a semantic model') plus the differentiator ('with automated linting and validation'). No sibling tool in the list adds measures, so the resource boundary is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit 'Use this tool when the user asks to:' section gives three concrete trigger conditions, including dry-running before committing. It stops short of naming when NOT to use it or which sibling to prefer (e.g. execute_dax_query for querying, run_dax_regression for testing), so it is clear context without exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

apply_planA

Execute an approved plan with automatic rollback on step failure.

Use this tool when the user asks to:

  • Execute or apply an approved plan created by plan_change.

  • Run plan steps in dry-run mode before modifying actual files.

  • Approve each step individually before it runs.

Args: plan_id: ID of the plan previously created by plan_change. dry_run: If True (DEFAULT), simulate execution without modifying files or cloud resources. Pass dry_run=False explicitly to apply for real. confirm_each_step: If True, ask the user to approve every step before it runs. Declining (or having no interactive client) stops execution and reports the remaining steps as not run.

Returns: ApplyResult with execution status, executed steps, and rollback details if needed.

NameRequiredDescriptionDefault
dry_runNo
plan_idYes
confirm_each_stepNo

Output Schema

NameRequiredDescription
resultNo
failed_stepNo
executed_stepsNo
rollback_handleNo
artifacts_changedNo
rollback_steps_executedNo

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well: it discloses automatic rollback on step failure, that dry_run defaults to True (safe-by-default), and that declining a step or lacking an interactive client halts execution and reports remaining steps as not run. It omits auth/permission requirements and what state rollback restores.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well front-loaded: purpose first, then usage, then Args and Returns. The Returns section is largely redundant given an output schema exists, which is the only wasted content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 3-parameter execution tool with no annotations, the definition covers purpose, every parameter's semantics and defaults, failure/rollback behavior, and interactive-client edge cases. An agent has everything needed to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does: plan_id is tied to plan_change, dry_run is documented with its default and the instruction to pass False explicitly for real application, and confirm_each_step's interactive and no-client behavior is spelled out.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ('Execute an approved plan') and adds a distinctive behavioral trait ('automatic rollback on step failure'). It implicitly and correctly positions itself downstream of plan_change, letting an agent distinguish it from the plan-creation sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use bullets (execute an approved plan, run dry-run, approve each step) and names plan_change as the origin of the required plan_id. It never states when NOT to use it or what alternative to pick if no approved plan exists, so it stops short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

apply_theme_and_accessibility_rulesA

Apply a colorblind-safe theme, backfill visual alt text, and re-audit WCAG.

Use this tool when the user asks to:

  • Make a report accessible and WCAG 2.1 compliant.

  • Apply a colorblind-safe palette (e.g. Okabe-Ito, ColorBrewer).

  • Automatically generate informative alt text for visuals lacking descriptions.

Args: pbip_path: Path to the .pbip directory. palette: Colorblind-safe palette name ("okabe_ito", "colorbrewer"). auto_backfill_alt_text: Whether to generate missing alt text on visuals. alt_text_template: Format template for generated alt text.

Returns: Dict with updated WCAG score, modified visual count, and theme update details.

NameRequiredDescriptionDefault
paletteNookabe_ito
pbip_pathYes
alt_text_templateNo{visual_type} visualizing measure {first_measure}
auto_backfill_alt_textNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It discloses that visuals are modified (a 'modified visual count' is returned) and that a WCAG re-audit occurs, which signals mutation. However, it says nothing about permissions required, whether changes to the .pbip directory are reversible, idempotency, or rate/scope limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action, then clearly sectioned into usage triggers, args, and returns. Slightly padded by the repeated 'Use this tool when the user asks to' phrasing, but every line carries usable information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a multi-action mutation tool, the description covers purpose, triggers, all four parameters, and (redundantly, since an output schema exists) return shape. The remaining gap is behavioral: side effects on the .pbip directory and whether the operation is safe to re-run are not addressed, which matters more here because no annotations are supplied.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it largely does: it documents all four parameters (pbip_path, palette with example values, auto_backfill_alt_text, alt_text_template). It gives the meaning and intent of each, though it omits the exact enum constraint for palette and the default values that the schema supplies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names three concrete actions (apply a colorblind-safe theme, backfill alt text, re-audit WCAG) on a specific artifact type, so the agent knows exactly what it does. It is clear but never explicitly differentiates itself from sibling audit tools like audit_report_ux_and_storytelling or audit_model_and_report, which is what a 5 would require.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Use this tool when the user asks to:' block gives three explicit trigger scenarios (WCAG compliance, colorblind-safe palette, alt-text generation), which is strong positive guidance. It stops short of naming when-not to use it or pointing to an alternative sibling, so it does not reach a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

audit_model_and_reportA

Composite quality and compliance audit on a Power BI project (PBIP).

Use this tool when the user asks to:

  • Audit, inspect, or validate a Power BI project (.pbip) or semantic model.

  • Check Best Practice Analyzer (BPA) rules, DAX code quality, or naming conventions.

  • Validate WCAG 2.1 accessibility (contrast, missing alt text, chart readability).

Args: pbip_path: Path to the root .pbip directory or folder. bpa_ruleset: Best practice ruleset to run ("default", "strict", "lenient"). dax_measures_json: Optional JSON string or dictionary mapping measure names to DAX expressions. bpa: Whether to execute Tabular BPA checks. dax_lint: Whether to execute static DAX linting checks. accessibility: Whether to audit WCAG 2.1 accessibility on report pages. naming: Whether to validate column, measure, and table naming conventions.

Returns: Dict with overall score (0-100), pass/fail status, and categorized findings.

NameRequiredDescriptionDefault
bpaNo
namingNo
dax_lintNo
pbip_pathYes
bpa_rulesetNodefault
accessibilityNo
dax_measures_jsonNo{}

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It usefully discloses that the audit is composite and that bpa/dax_lint/accessibility/naming are individually switchable, and that it returns a score/pass-fail with categorized findings. It does not state whether the operation is read-only, what permissions or runtime cost it incurs, or how the sub-checks interact.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, then structured Usage/Args/Returns sections with no filler. The Returns block is partly redundant given an output schema exists, but the overall structure is efficient and scannable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 7-parameter, no-annotation tool with an output schema, it covers purpose, triggers, and every argument. The gaps are minor: no read-only/side-effect note and no interaction guidance among the boolean toggles.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does: all seven parameters are named and explained, including the bpa_ruleset enum values (default/strict/lenient) and the optional dax_measures_json. It omits declared defaults and how dax_lint interacts with dax_measures_json, so not a full 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (audit) and resource (Power BI PBIP project / semantic model / report) and enumerates the concrete dimensions checked: BPA rules, DAX quality, naming, WCAG accessibility. It does not explicitly differentiate itself from close siblings like audit_report_ux_and_storytelling or powerbi_health, so it stops short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides a clear 'Use this tool when the user asks to:' trigger list covering audit, BPA/DAX/naming, and WCAG validation, which gives an agent solid routing signal. However, it names no alternatives or when-not-to-use conditions against the many overlapping siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

audit_report_ux_and_storytellingA

Evaluate report storytelling, visual hierarchy, cognitive load, and UX design.

Use this tool when the user asks to:

  • Audit report design quality, narrative flow, or visual hierarchy.

  • Check if a report follows dashboard best practices for a specific audience.

Args: pbip_path: Path to the .pbip directory. page_name: Optional specific page name to audit; audits all pages if omitted. audience_assumed: Target audience ("executive", "analytical", "operational"). strictness: Scoring strictness ("lenient", "standard", "strict").

Returns: Dict with UX score (0-100), category breakdowns (hierarchy, density, narrative), and suggestions.

NameRequiredDescriptionDefault
page_nameNo
pbip_pathYes
strictnessNostandard
audience_assumedNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are supplied, so the description carries the full behavioral burden. It usefully discloses scope behavior ('audits all pages if omitted') and the return shape (0-100 score, category breakdowns, suggestions), but never states that this is a read-only, non-destructive local analysis with no writes to the .pbip, nor any permission or performance notes. Adequate but with a clear gap given zero annotation coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in one line, followed by purpose-built trigger bullets and an Args/Returns block. Every section earns its place, though the Args and Returns lists restate information the schema/output schema already carry, adding some redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 4-parameter, single-required read/analysis tool with an output schema, the description covers what it does, when to use it, the meaning of each parameter, and the shape of the result. Given the output schema exists, the Returns summary is a bonus rather than a necessity; the only real gap is the absence of any behavioral/safety note.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does: all four parameters are documented in the Args block, including that page_name is optional and defaults to auditing all pages and that strictness/audience_assumed take named categorical values. It stops short of enumerating the allowed values as a closed set (schema declares no enums) or giving syntax examples for pbip_path.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence names a specific verb (Evaluate/Audit) and concrete resources (report storytelling, visual hierarchy, cognitive load, UX design), which is far more informative than the tool name alone. The 'when the user asks to' bullets further scope it to design-quality and dashboard-best-practice auditing, distinguishing it from siblings such as audit_model_and_report (model+report) and design_report_page_from_requirements (generation).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit trigger conditions ('Audit report design quality, narrative flow, or visual hierarchy' and 'Check if a report follows dashboard best practices for a specific audience'), so an agent knows when to reach for it. It does not name an alternative or exclusion (e.g., when to prefer audit_model_and_report or optimize_report_performance instead), which keeps it short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

commit_workspace_to_gitA

Export and commit a Fabric workspace into a local Git repository.

Use this tool when the user asks to:

  • Back up or version-control a Fabric workspace into Git.

  • Snapshot reports and semantic models into local PBIP files with Git commits.

Args: workspace_id: Source Fabric workspace ID (UUID). output_repo_path: Local path to destination Git repository. branch: Git branch to commit into. commit_message: Commit message describing the snapshot. exclude_items: Optional list of item IDs to exclude. dry_run: If True, inspect items without creating git commits.

Returns: Dict with committed items, commit SHA, and repository status.

NameRequiredDescriptionDefault
branchNo
dry_runNo
workspace_idYes
exclude_itemsNo
commit_messageNo
output_repo_pathYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It usefully discloses that dry_run defaults to True and returns committed items, commit SHA, and repo status, but says nothing about Git authentication/credentials, whether existing files in the target repo are overwritten or staged, or whether the operation is reversible.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well front-loaded: purpose sentence first, then trigger bullets, then Args, then Returns. The trigger bullets partially restate the opening sentence, which is slight redundancy, but nothing is padded or wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a six-parameter mutation tool with an output schema already present, the description covers purpose, triggers, parameters, and a return summary. The main remaining gap is operational prerequisites (Git auth/permissions and repo state preconditions), which an agent would want before committing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the Args block is the only parameter documentation and it covers all six parameters, including the important dry_run semantic ('inspect items without creating git commits'). It remains thin on defaults (branch, commit_message) and on what 'item IDs' in exclude_items actually refer to.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb pair (export and commit), the resource (Fabric workspace), and the destination (local Git repository). The 'into a local Git repository' direction cleanly separates it from the sibling sync_git_to_workspace, which flows the other way.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit 'Use this tool when the user asks to' block with two concrete trigger scenarios (backup/version-control a workspace, snapshot reports and semantic models into PBIP). It stops short of naming when NOT to use it or pointing to the reverse-direction sibling, so it is clear context without exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

connect_targetA

Connect to a Power BI target and initialize an orchestrator session.

Use this tool when the user asks to:

  • Connect to a Power BI Desktop session, Fabric workspace, PBIP folder, or PBIX file.

  • Start an interactive session to inspect or modify Power BI assets.

Args: target_type: One of "pbi_desktop", "fabric_workspace", "pbip_folder", "pbix_file". target_ref: Reference path (for PBIP/PBIX) or workspace UUID (for Fabric). auth_mode: "interactive" (browser login) or "service_principal". When omitted, PBI_AUTH_MODE is used, falling back to "interactive". tenant_id: Azure AD tenant ID (required when auth_mode is service_principal).

Returns: ConnectResult with session_id, engines_available status, and any diagnostic warnings.

NameRequiredDescriptionDefault
auth_modeNo
tenant_idNo
target_refYes
target_typeYes

Output Schema

NameRequiredDescription
warningsNo
session_idYes
engines_availableYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden well: it discloses that authentication mode falls back to the PBI_AUTH_MODE env var and then to "interactive", that tenant_id is mandatory for service-principal auth, and that the call establishes a session that returns engines_available and diagnostic warnings. It does not address session lifetime, idempotency of repeated connects, or whether the operation mutates any remote state, which keeps it below 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose sentence followed by tight trigger bullets, Args, and Returns sections — easy to scan. The Returns block duplicates information already available in the output schema, so it doesn't fully earn its space, but overall there is little waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 4-parameter session-bootstrap tool with an output schema present, nearly everything an agent needs is stated: target types, auth paths, required env fallbacks, and conditional requirements. The single unresolved point is how target_ref should be supplied for pbi_desktop, a gap that could cause a malformed first call.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate, and it largely does: it enumerates the allowed target_type values, explains target_ref differs by type (path for PBIP/PBIX, workspace UUID for Fabric), and gives auth_mode options plus default precedence. The only gap is that target_ref is left unexplained for pbi_desktop, which is precisely the kind of ambiguity an agent would hit at call time.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource pair ("Connect to a Power BI target and initialize an orchestrator session") and then enumerates the four target kinds it accepts. No sibling in the list performs connection/session setup, so the tool is unambiguously distinguishable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

An explicit "Use this tool when the user asks to" block lists concrete trigger scenarios (Desktop session, Fabric workspace, PBIP folder, PBIX file, interactive inspect/modify). It stops short of naming exclusions or pointing to a follow-on sibling, but the positive context is clear and actionable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_report_from_datasetA

Scaffold a PBIR report folder and layout from an existing semantic model.

Use this tool when the user asks to:

  • Create a new report (.Report folder) for an existing dataset.

  • Generate starter report pages with cards, charts, and an accessible theme.

Args: pbip_path: Path to the .pbip directory containing the dataset. page_name: Name of the initial report page (default: "Overview"). visual_count: Number of starter visuals to generate. theme: Theme name to apply (default: "okabe_ito"). include_card: Whether to generate a top-line KPI card visual. inspector: Optional model inspector.

Returns: Dict with created page path, visual IDs, and scaffolded report files.

NameRequiredDescriptionDefault
themeNookabe_ito
inspectorNo
page_nameNoOverview
pbip_pathYes
include_cardNo
visual_countNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It discloses what gets generated (pages, cards, charts, theme) and the return shape, but says nothing about whether an existing .Report folder is overwritten, whether the operation is idempotent, or what permissions/paths are required for a filesystem-writing tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose sentence followed by a scannable use-case list and Args/Returns blocks. Slightly verbose in restating defaults that already live in the schema, but nothing is wasted or buried.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the Returns block is a bonus rather than a necessity, and the generation behavior and parameters are well covered. The remaining gap is mutation semantics (overwrite/idempotency) for a tool that writes report scaffolding with no annotations to fall back on.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it largely does: all six parameters (pbip_path, page_name, visual_count, theme, include_card, inspector) are explained with intent and stated defaults. The one weak spot is 'inspector', described only as 'Optional model inspector' with no indication of what object or behavior is expected.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (scaffold) and artifact (.Report folder plus layout) derived from an existing semantic model, which clearly separates it from model-creation siblings like create_semantic_model_from_schema. It does not explicitly distinguish itself from the arguably overlapping design_report_page_from_requirements, so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Use this tool when the user asks to' list gives concrete trigger conditions (create a new .Report folder for an existing dataset, generate starter pages). However, it names no alternatives and gives no when-not guidance, e.g. versus design_report_page_from_requirements or edit_report_visual.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_semantic_model_from_schemaA

Generate a TMDL semantic model and PBIP project from a declarative schema spec.

Use this tool when the user asks to:

  • Create, scaffold, or generate a new Power BI semantic model from scratch.

  • Define tables, columns, data types, relationships, and hierarchies declaratively.

Args: spec_yaml: YAML specification of tables, columns, types, and relationships. spec_json: JSON specification (either as a string or a structured object/dict). output_pbip_path: Target directory to write the generated .pbip project. dry_run: If True, validate specification without writing files to disk.

Returns: Dict with tables created, relationships created, hierarchies created, and validation status.

NameRequiredDescriptionDefault
dry_runNo
spec_jsonNo
spec_yamlNo
output_pbip_pathNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It does disclose that dry_run validates without writing files and that output lands as a .pbip project on disk, but it says nothing about overwrite behavior when output_pbip_path already contains a project, required permissions, or the odd empty-string default of output_pbip_path (where does it write then?).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose sentence, then a bulleted trigger list, then Args/Returns. Given 0% schema coverage the Args block earns its space; nothing is redundant filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the Returns text is a redundant but harmless convenience. The description is nearly complete for a file-writing generator: params are fully explained. The residual gap is mutation safety semantics (overwrite/merge behavior) which is material for a tool that writes a project directory.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description compensates by documenting all four parameters: spec_yaml, spec_json (string or structured object), output_pbip_path, and dry_run semantics. It omits the key relationship between spec_yaml and spec_json (mutual exclusivity / precedence) and does not flag that dry_run defaults to true, leaving the agent to infer it from the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Generate a TMDL semantic model and PBIP project') plus the input modality ('from a declarative schema spec'). The 'from scratch' framing distinguishes it from sibling mutation tools like refactor_to_calculation_groups or create_report_from_dataset, which operate on existing artifacts.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear when-to-use triggers ('Create, scaffold, or generate a new Power BI semantic model from scratch') and enumerates the declarative constructs it handles. It never names an alternative tool or states when NOT to use it (e.g., modifying an existing model), so it stops short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

deploy_to_workspaceA

Deploy a PBIP project to a Fabric/Power BI workspace with pre-deploy gates.

Use this tool when the user asks to:

  • Deploy, publish, or release a Power BI project (.pbip) to Microsoft Fabric or Power BI Service.

  • Run pre-deployment quality gates before publishing.

  • Schedule automatic daily dataset refreshes upon publication.

Args: pbip_path: Local filesystem path to the root .pbip directory. workspace_id: Target Fabric / Power BI workspace ID (UUID). refresh_daily_hour: Daily UTC hour (0-23) for scheduled refresh (default: 6 AM UTC). findings_json: Optional list or JSON string of pre-existing audit findings to evaluate. gate_profile: Quality gate profile ("strict", "standard", "lenient"). auth_mode: "interactive" (browser login) or "service_principal". When omitted, PBI_AUTH_MODE is used, falling back to "interactive". tenant_id: Azure AD tenant ID. client_id: Azure AD client ID. dry_run: When True (default) evaluates the gate and reports the planned operations WITHOUT calling any Fabric API. Pass dry_run=False to actually publish. mock: If True, simulate deployment without calling external APIs.

Returns: Dict with deployment status, gate evaluation results, published item IDs, and refresh configuration.

NameRequiredDescriptionDefault
mockNo
dry_runNo
auth_modeNo
client_idNo
pbip_pathYes
tenant_idNo
gate_profileNostandard
workspace_idYes
findings_jsonNo[]
refresh_daily_hourNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the burden and does well: it explains that dry_run=True evaluates gates and reports planned operations without calling Fabric APIs, dry_run=False actually publishes, and mock=True simulates deployment. It also documents auth fallback to PBI_AUTH_MODE and return contents, though it does not state required permissions or irreversible side effects of publishing.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose and usage triggers, then uses a clean Args list and Returns summary. Every sentence serves a purpose, and the critical dry_run default is called out clearly without excess prose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 10-parameter mutation tool with no annotations and an output schema, the description is complete enough: it covers when to use it, what each parameter means, the safety-relevant dry_run/mock behavior, authentication options, and what the result contains. An agent can invoke this correctly without additional guidance.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does: every parameter is explained in Args, including default behaviors (dry_run=True, refresh_daily_hour=6), accepted gate profiles, auth mode fallback, and the dual list/JSON-string nature of findings_json. This adds substantial meaning beyond bare schema types.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: deploying a PBIP project to a Fabric/Power BI workspace with pre-deploy gates. It clearly distinguishes this from generic publishing or refresh tools and names the artifact type (.pbip), target platform, and gate behavior.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides explicit triggers: deploy/publish/release a .pbip project, run pre-deployment quality gates before publishing, and schedule daily refresh. However, it does not distinguish this from the sibling pre_deploy_check tool or say when to use this versus that or sync_git_to_workspace, leaving a small ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

design_report_page_from_requirementsA

Synthesize a complete PBIR report page layout from a natural language brief.

Use this tool when the user asks to:

  • Design or generate a new Power BI report page based on business requirements.

  • Automatically select, size, position, and format visuals matching an analytical goal.

  • Apply professional color schemes and visual hierarchy to a page.

Args: pbip_path: Path to the target .pbip directory. brief: Natural language description of what the report page should convey. page_name: Display name for the newly created report page (default: "Overview"). audience: Target audience ("executive", "analytical", "operational"). palette: Color palette name (default: "okabe_ito"). inspector: Optional model inspector for schema context.

Returns: Dict containing synthesized visual containers, positions, and page metadata.

NameRequiredDescriptionDefault
briefYes
paletteNookabe_ito
audienceNoexecutive
inspectorNo
page_nameNoOverview
pbip_pathYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden for what is clearly a mutating, file-writing operation. It never states whether an existing page of the same name is overwritten, whether the pbip is modified on disk, what permissions or prerequisites apply, or whether the operation is reversible. The Returns line is the only behavioral disclosure and it duplicates the output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose sentence followed by tight, scannable usage bullets and a compact args block. The Returns section is redundant given an output schema exists and could be dropped, but overall there is little waste.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a six-parameter, zero-coverage-schema, unannotated mutation tool, the parameter documentation is adequate and the output schema covers return values. What is missing is the mutation/side-effect profile (overwrite behavior, disk writes) that the absent annotations leave entirely to the description.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it largely does: all six parameters are named with meaning, including defaults for page_name and palette, the accepted audience values, and that inspector is an optional model inspector for schema context. Remaining gap is format detail for pbip_path and the inspector object.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence gives a precise verb and resource: synthesize a complete PBIR report page layout from a natural-language brief. That is far more specific than sibling names like create_report_from_dataset or select_visuals_for_kpis, but the description never explicitly contrasts itself with those siblings, so an agent must infer the boundary.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Use this tool when the user asks to' block gives three concrete triggering scenarios (new page from business requirements, auto visual selection/sizing, applying color schemes and hierarchy). That is clear usage context, but there is no when-not guidance and no named alternative for cases where an existing page should be edited (e.g. edit_report_visual).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

diff_modelsA

Compare two semantic models and report structural differences.

Use this tool when the user asks to:

  • Compare two versions of a Power BI model or PBIP directory.

  • See what tables, columns, measures, or relationships changed between branches or releases.

Args: before: Path to the baseline PBIP directory. after: Path to the target PBIP directory.

Returns: Dict detailing added, removed, and modified tables, columns, measures, and relationships.

NameRequiredDescriptionDefault
afterYes
beforeYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It does convey that this is a passive read/compare operation and sketches the return shape (added/removed/modified buckets), which is useful. It says nothing about prerequisites such as whether the PBIP paths must exist locally, whether a connection via connect_target is needed, cost on large models, or error behavior for invalid paths.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the one-line purpose, then usage triggers, then args, then returns — an agent can stop reading after line one. The Returns block is somewhat redundant given that an output schema exists, but it is short enough not to be wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter comparison tool with an output schema and no annotations, the description covers purpose, triggers, parameter meanings, and result categories. The main missing piece is prerequisite/setup context relative to siblings like connect_target, which an agent would have to infer.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate — and it does, naming both params and defining role and type ('before: Path to the baseline PBIP directory', 'after: Path to the target PBIP directory'). It does not specify path format expectations (absolute vs. relative) or whether the directories must already be materialized, leaving a small gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Compare two semantic models and report structural differences', then enumerates exactly which artifact classes (tables, columns, measures, relationships) are diffed. No sibling tool does version-to-version comparison, so an agent can route here unambiguously.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit trigger conditions are given: comparing two versions of a Power BI model/PBIP directory, or seeing what changed between branches or releases. It stops short of naming alternatives (e.g., audit_model_and_report or plan_change) or stating when not to use it, so it lands just below the top mark.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

edit_report_visualA

Modify a visualContainer in a PBIR report page (type, fields, formatting, layout).

Use this tool when the user asks to:

  • Edit, reformat, or resize a specific chart/visual on a report page.

  • Change visual fields, bindings, alt text, or visibility.

Args: pbip_path: Path to the root .pbip directory. page_name: Name of the page containing the visual. visual_id: Unique ID of the visualContainer to edit. type: New visual type if changing (e.g. "barChart", "lineChart", "card"). fields_json: Optional dict or JSON string specifying field bindings to update. format_json: Optional dict or JSON string specifying formatting options. position_json: Optional dict or JSON string with x, y, width, height layout. alt_text: New alt text for accessibility. is_hidden: Whether to hide the visualContainer.

Returns: Dict with success status, changes applied, and page path.

NameRequiredDescriptionDefault
typeNo
alt_textNo
is_hiddenNo
page_nameYes
pbip_pathYes
visual_idYes
fields_jsonNo
format_jsonNo
position_jsonNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It discloses the return shape (success status, changes applied, page path), which is useful, but says nothing about permissions required, reversibility of edits, validation/error behavior, or what happens to fields not specified. Adequate but incomplete for a mutation tool with zero annotation coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core purpose, then offers a tight when-to-use block, an Args list, and a Returns line. Given nine undocumented parameters, the length is justified and every line earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need not be spelled out, yet the description still gives a concise summary. Combined with full parameter coverage, an agent has everything needed to call this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description fully compensates by documenting all nine args: root .pbip path, page name, visual ID, new visual type with examples ('barChart', 'lineChart', 'card'), and the fields/format/position JSON blobs including accepted shapes (dict or JSON string; x/y/width/height). This adds substantial meaning the bare schema lacks.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Modify) and resource (a visualContainer in a PBIR report page) and enumerates the scope (type, fields, formatting, layout). An agent can immediately see this is the visual-editing tool, though it doesn't explicitly name which siblings it is not (e.g. design_report_page_from_requirements).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides an explicit 'Use this tool when the user asks to:' block with concrete triggers (edit/reformat/resize a chart, change fields/bindings/alt text/visibility). Clear usage context, but no explicit when-not or named alternative among the many sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

execute_dax_queryA

Execute a DAX query against a published Power BI semantic model / Fabric dataset.

Use this tool when the user asks to:

  • Run, evaluate, or test a DAX query against a live dataset in Power BI or Fabric.

  • Inspect actual business data, measure outputs, KPI calculations, or table rows.

  • Verify Row-Level Security (RLS) filters by simulating a specific user principal name.

Args: workspace_id: Fabric / Power BI workspace ID (UUID). dataset_id: Published semantic model / dataset ID (UUID). dax_query: The DAX query expression (e.g. "EVALUATE TOPN(10, 'Sales')" or "EVALUATE ROW("Total", [Total Sales])"). impersonated_user_name: Optional User Principal Name (UPN) to test RLS rules as that user. auth_mode: "interactive" (default, browser login) or "service_principal". tenant_id: Azure AD tenant ID (required for service_principal). client_id: Azure AD client ID (for service_principal). max_rows: Maximum number of rows returned to the caller (default 1000, hard ceiling 10000). Prevents bulk extraction of business records into the model context. fabric_client: Optional injected FabricClient instance (for testing).

Returns: Dict containing query execution results with tabular rows, columns, and execution metadata.

NameRequiredDescriptionDefault
max_rowsNo
auth_modeNo
client_idNo
dax_queryYes
tenant_idNo
dataset_idYes
workspace_idYes
fabric_clientNo
impersonated_user_nameNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations present, the description carries the full burden and does substantially well: it discloses both auth flows ('interactive' browser login vs 'service_principal'), the tenant/client credentials the latter requires, the impersonation mechanism for RLS testing, and a hard row ceiling of 10000 with an explicit rationale (preventing bulk extraction into model context). It never explicitly states the operation is read-only/non-mutating or what workspace permissions are needed, which is the remaining gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with a one-line purpose, then the when-to-use list, then a param block — logical and scannable. The closing 'Returns' sentence partly restates a shape already conveyed by the output schema, and the Args block is long, though that length is justified given 0% schema coverage.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 9-parameter, auth-sensitive tool with no annotations, this covers purpose, selection criteria, every parameter, credential requirements, and safety limits on row volume. Missing elements are secondary: error/failure behavior, workspace permission prerequisites, and guidance relative to the DAX-related siblings; return values are already covered by the output schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate entirely — and it does, documenting all nine parameters including the easily-missed testing-only fabric_client. It adds meaning the schema lacks: the two valid values for auth_mode (which has no enum in the schema), the dependency of tenant_id on service_principal mode, the default and 10000 ceiling for max_rows, and concrete DAX syntax examples for dax_query.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Execute a DAX query against a published Power BI semantic model / Fabric dataset.' That is unambiguous and far beyond the bare tool name. It does not, however, distinguish itself from the sibling run_dax_regression, which an agent could plausibly confuse with 'run or test a DAX query'.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description supplies an explicit 'Use this tool when the user asks to:' list covering data inspection, measure/KPI verification, and RLS testing via impersonation — clear positive selection criteria. It stops short of stating when NOT to use it or naming which sibling to use instead (e.g. run_dax_regression for suites).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

generate_data_dictionaryA

Generate Markdown documentation and Mermaid ER diagram for a semantic model.

Use this tool when the user asks to:

  • Document a Power BI dataset or semantic model.

  • Generate a data dictionary listing all tables, columns, types, and descriptions.

  • Create a Mermaid entity-relationship (ER) diagram of the model.

Args: pbip_path: Path to the .pbip directory. output_path: Optional file path to save the generated Markdown. inspector: Optional model inspector.

Returns: Dict with data dictionary markdown content, table count, measure count, and output path.

NameRequiredDescriptionDefault
inspectorNo
pbip_pathYes
output_pathNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description must carry the behavioral burden. It discloses that output_path optionally saves the Markdown (a file-write side effect) and describes the return payload, but says nothing about permissions, cost, or whether the operation touches the model. Adequate but thin for a tool with zero annotation coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded one-line purpose followed by scannable trigger bullets and Args/Returns sections. The Returns block slightly duplicates the output schema, but overall it is efficient and well-organized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 3-parameter documentation generator with an output schema present, the description covers purpose, triggers, parameters, and return shape. Nothing essential to a correct invocation is missing, though the inspector parameter's nature remains unspecified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it documents all three parameters: pbip_path as 'Path to the .pbip directory', output_path as an optional save path, and inspector as an optional model inspector. Only 'inspector' is somewhat circular/tautological, so a 4 rather than 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource (generate Markdown documentation and Mermaid ER diagram) for a semantic model, and the trigger bullets make the output artifacts concrete. It is clearly distinguishable from siblings like audit_model_and_report or create_report_from_dataset.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides an explicit 'Use this tool when the user asks to' list with three concrete trigger scenarios (document a dataset, generate a data dictionary, create a Mermaid ER diagram). It gives clear positive context but no when-not conditions or named alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

optimize_report_performanceA

Analyze PBIR report pages for visual performance bottlenecks and anti-patterns.

Use this tool when the user asks to:

  • Diagnose slow-loading report pages or improve visual performance.

  • Identify excessive visual density, expensive custom visuals, or unoptimized filters.

Args: pbip_path: Path to the .pbip directory. target_load_ms: Desired maximum page load latency in milliseconds (default: 5000 ms).

Returns: Dict with performance score (0-100), estimated load time, and actionable recommendations.

NameRequiredDescriptionDefault
pbip_pathYes
target_load_msNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full behavioral burden. 'Analyze' implies a read-only operation and the Returns block discloses a score/load-time/recommendations shape, but it never states prerequisites (e.g. that the .pbip must exist/be connected), that nothing is mutated, or any cost/latency characteristics of the analysis.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, then a scannable when-to-use list and short Args/Returns blocks. Minor redundancy in the Returns section given an output schema already exists, but nothing is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 2-parameter read-only analysis tool, the description covers purpose, triggers, both arguments, and the return shape. The Returns block partially duplicates the output schema, and no sibling routing is offered, but an agent has enough to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate, and it does: pbip_path is explained as the .pbip directory path and target_load_ms as desired max page load latency with a 5000 ms default. Both parameters gain meaning beyond the bare schema titles.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Analyze) plus resource (PBIR report pages) and scope (visual performance bottlenecks and anti-patterns). This is distinct from UX-focused siblings like audit_report_ux_and_storytelling, though the description never names a sibling to reinforce the boundary.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

An explicit 'Use this tool when the user asks to...' block with two concrete triggers (slow-loading pages, excessive visual density/expensive custom visuals). It gives clear positive context but no exclusions or named alternatives against siblings such as audit_model_and_report.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

plan_changeA

Create a versionable, multi-step execution plan from an intent template.

Use this tool when the user asks to:

  • Plan a complex or risky operation requiring atomic execution or rollback capability.

  • Safely rename a table or column across both model and visual bindings (intent="safe_rename").

  • Plan an audit, deployment, or DAX regression run.

Args: intent: One of the supported templates ("safe_rename", "audit", "deploy", "dax_regression"). options: Template-specific arguments (e.g. for safe_rename: old_path, new_path, scope). May also contain PlanOptions fields (auto_rollback, max_impact_threshold, dry_run_first).

Returns: PlanResult with plan_id, plan_yaml, steps, risk_score, estimated_changes.

NameRequiredDescriptionDefault
intentYes
optionsNo

Output Schema

NameRequiredDescription
stepsNo
plan_idYes
plan_yamlYes
risk_scoreNo
estimated_changesNo

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are supplied, so the description carries the full disclosure burden. It usefully flags rollback/atomicity intent and points at options like auto_rollback and dry_run_first, but never states the critical fact that this only produces a plan and does not mutate the model (unlike apply_plan), nor any auth/prerequisite requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded one-line summary, then a scannable usage list and short Args/Returns blocks. Slightly verbose in the Returns section (an output schema already exists), but every other sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 2-parameter tool with an output schema, the description covers intent templates, option shapes, and the return fields the agent needs to chain into apply_plan. The main omission is the non-mutating/side-effect guarantee and any connectivity prerequisite.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% and the schema declares intent as a bare string with no enum, so the description is the only source of the four valid template values and the per-template options shape (old_path, new_path, scope). It adds substantial meaning beyond the schema, though options remains loosely specified.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and artifact ('Create a versionable, multi-step execution plan') plus its source ('from an intent template'). This clearly separates it from the sibling apply_plan, which presumably executes what this produces, without needing to open either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives an explicit 'Use this tool when the user asks to' list covering complex/risky operations, safe_rename, and audit/deploy/DAX runs. It provides clear positive context but names no alternatives (e.g. apply_plan for execution) or when-not-to-use conditions, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

powerbi_healthA

Diagnose orchestrator health, detected modeling engines, and storage readiness.

Use this tool when the user asks to:

  • Check if the Power BI MCP orchestrator is running properly.

  • See which external tools/engines are installed (Tabular Editor, DAX optimizer, etc.).

  • Get installation or setup instructions for missing components.

Args: include_engine_details: Whether to return full diagnostic info and remediation tips for each engine.

Returns: Dict with system status, engine availability matrix, active store counts, and remediation advice.

NameRequiredDescriptionDefault
include_engine_detailsNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. 'Diagnose' plus the enumerated returns (system status, engine availability matrix, active store counts, remediation advice) implies a read-only operation, but the description never explicitly states that it has no side effects or what permissions it needs. The Returns section is largely redundant with the declared output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Well front-loaded: purpose first, then use-when bullets, then args, then returns. The Args and Returns blocks are cleanly separated, but the Returns block duplicates the output schema and dilutes the otherwise tight structure.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter read-only diagnostic with an output schema, the description covers purpose, triggers, parameter meaning, and return shape. The remaining gap is an explicit statement of read-only/non-mutating behavior and any auth or environment prerequisites for the engines it inspects.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the brief 'Whether to return full diagnostic info and remediation tips for each engine' is the only semantic explanation of the sole parameter, and it usefully clarifies the true/false tradeoff. It adequately compensates for the schema gap, though it could say more about verbosity/cost implications.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb+resource: 'Diagnose orchestrator health, detected modeling engines, and storage readiness.' This is a unique diagnostic function among the siblings (all of which are model/report operations), so an agent can immediately distinguish it without inspecting any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit trigger conditions ('Use this tool when the user asks to: check if the orchestrator is running, see which engines are installed, get setup instructions'), which is unusually clear for context selection. It stops short of a 5 only because it names no exclusions, though no sibling offers an overlapping capability that would need routing away from.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

pre_deploy_checkA

Evaluate audit findings against a pre-deployment quality gate profile.

Use this tool when the user asks to:

  • Check whether audit findings block deployment or meet quality criteria.

  • Validate findings against 'strict', 'standard', or 'lenient' governance gates.

Args: findings_json: List or JSON string of audit findings to evaluate. profile: Gate profile to evaluate against ("strict", "standard", "lenient").

Returns: Dict with gate decision (passed=True/False), blocking findings, and warnings.

NameRequiredDescriptionDefault
profileNostandard
findings_jsonNo[]

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden. It discloses the return payload (gate decision, blocking findings, warnings), which is useful, but says nothing about side effects, permissions, or whether the check is purely read-only or has any deployment impact.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, then uses clean labeled sections (usage bullets, Args, Returns) that make it easy to scan. It is slightly longer than strictly necessary given the output schema, but nothing is wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-parameter, zero-required, non-destructive evaluation tool, both parameters are described and the return shape is sketched (even though a real output schema exists). The only gap is the absence of any behavioral/permission context, which is minor for this kind of gate-check tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate, and it does: it documents both parameters, clarifying that findings_json accepts a list or JSON string, and enumerating the 'strict'/'standard'/'lenient' profile values that the schema leaves unspecified.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource ('Evaluate audit findings against a pre-deployment quality gate profile'), which is clear and actionable. It is reasonably distinguishable from siblings like audit_model_and_report, though it never explicitly contrasts itself with any of them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit 'use this tool when the user asks to' guidance with two concrete scenarios, which is stronger than most. However, it names no alternatives and gives no when-not-to-use conditions, so it falls short of full routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

promote_in_pipelineA

Promote artifacts across Microsoft Fabric Deployment Pipeline stages.

Use this tool when the user asks to:

  • Promote or move items between Fabric deployment stages (e.g. dev to test, test to prod).

  • Run pre-promotion quality gates before moving items.

Args: pipeline_id: Fabric deployment pipeline ID (UUID). source_stage: Source stage ("dev", "test", "prod"). target_stage: Target stage ("test", "prod"). items: Optional list of specific item IDs to promote. Promotes all if omitted. dry_run: If True (DEFAULT), validate stages and gate checks without triggering actual promotion. Pass dry_run=False explicitly to promote for real — this moves live artifacts between stages.

Returns: Dict with promotion status, gate outcomes, and affected items.

NameRequiredDescriptionDefault
itemsNo
dry_runNo
pipeline_idYes
source_stageNodev
target_stageNotest

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does so: it discloses that dry_run defaults to True, that gates/stage validation run without promoting in that mode, and explicitly warns that dry_run=False 'moves live artifacts between stages.' That is precisely the destructive-path disclosure an agent needs before calling a mutation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose sentence followed by a scannable when-to-use list and an Args block. Every line carries information; there is no filler or repetition of the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so the Returns block is technically redundant, though harmless and mildly useful. For a 5-param mutation tool with no annotations, the definition covers purpose, usage, param semantics and the dangerous default; only auth/permission prerequisites are absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does: every one of the 5 params is explained — UUID format for pipeline_id, allowed stage values for source/target, the omitted=promote-all semantics of items, and the validate-vs-execute semantics of dry_run. This adds real meaning beyond the bare schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Promote') and resource ('artifacts across Microsoft Fabric Deployment Pipeline stages'), which separates it from generic deploy/apply siblings. It does not explicitly name which sibling to prefer (e.g. deploy_to_workspace vs apply_plan), so it stops short of full sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The 'Use this tool when the user asks to' bullets give clear triggering conditions (stage-to-stage promotion, pre-promotion gate checks). It never states when NOT to use it or which sibling handles the adjacent cases, so the routing half of the guidance is missing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

refactor_to_calculation_groupsA

Consolidate repetitive measures (e.g. YTD, QTD, PY) into calculation groups.

Use this tool when the user asks to:

  • Refactor or clean up redundant DAX measures using calculation groups.

  • Reduce model complexity and standardize time intelligence calculations.

Args: target: Target PBIP directory or TMDL path. min_candidates: Minimum measure patterns needed to trigger consolidation. reconcile_strategy: "strict" or "lenient". preserve_originals: Whether to keep original measures alongside the calculation group. auto_apply: If True, write calculation items immediately; if False, return proposed refactoring plan. inspector: Optional model inspector. measure_writer: Optional measure writer callable.

Returns: Dict with proposed or applied calculation items, candidate measures, and impact assessment.

NameRequiredDescriptionDefault
targetYes
inspectorNo
auto_applyNo
measure_writerNo
min_candidatesNo
preserve_originalsNo
reconcile_strategyNostrict

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does disclose the key behavioral split: auto_apply=True writes immediately while False returns a proposed plan, and preserve_originals controls whether source measures survive. It does not state reversibility, permissions, or risk of modifying the model, leaving some mutation-safety gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded one-line purpose followed by scannable trigger list and Args/Returns blocks. The Returns block largely restates what the existing output schema already provides, so it is slightly redundant but not bloated.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no annotations and seven parameters, the definition covers purpose, triggers, every argument, and the plan-vs-apply distinction, and an output schema exists so return shape need not be re-explained. Missing only safety/reversibility context that annotations would normally supply.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate, and it documents all seven parameters. Most add real meaning (auto_apply, preserve_originals, reconcile_strategy), though 'inspector: Optional model inspector' and 'measure_writer: Optional measure writer callable' are near-tautological and reconcile_strategy never explains strict vs lenient.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('consolidate') and resource ('repetitive measures ... into calculation groups') with a concrete example (YTD, QTD, PY), so the agent knows exactly what the tool does. It does not name or distinguish itself from any sibling, which keeps it just short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit when-to-use triggers ('when the user asks to refactor or clean up redundant DAX measures', 'reduce model complexity'). There is no when-not guidance or named alternative (e.g. add_measure_with_validation), so it is clear but not exhaustive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

run_dax_regressionA

Run DAX queries against a baseline and assert regression tolerance.

Use this tool when the user asks to:

  • Verify that measures or models return consistent results across changes.

  • Compare live DAX calculation outputs against a golden baseline file.

  • Check numerical tolerances on calculation outputs during CI/CD.

Args: baseline_path: Path to the JSON baseline file containing expected results. queries_json: Optional list or JSON string of DAX queries to execute. tolerance_pct: Maximum allowed percentage difference between actual and expected numeric values (default: 0.1%). workspace_id: Fabric / Power BI workspace ID holding the dataset. dataset_id: Published semantic model / dataset ID to query. auth_mode: "interactive" or "service_principal". tenant_id: Azure AD tenant ID. client_id: Azure AD client ID. fabric_client: Optional injected FabricClient instance (for testing).

Returns: Dict containing diff summary, passed/failed queries, and variance details. executed=False means no query ran and no verdict is available.

NameRequiredDescriptionDefault
auth_modeNo
client_idNo
tenant_idNo
dataset_idNo
queries_jsonNo[]
workspace_idNo
baseline_pathYes
fabric_clientNo
tolerance_pctNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. It discloses auth modes, a return shape, and the meaning of executed=False, but it does not state whether the operation is read-only, what permissions are required, or whether it has any side effects on the workspace or baseline file.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with a one-sentence purpose, followed by focused usage bullets, grouped Args, and a Returns note. It is appropriately sized for nine parameters and does not waste space on repeated schema information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the purpose, use cases, all nine parameters, auth choices, and return behavior, which is strong for a no-annotation tool. It is slightly incomplete because it does not clarify side-effect/read-only behavior or the baseline file structure expected by the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% across nine parameters, and the description compensates by explaining every one: baseline_path, queries_json, tolerance_pct with default, workspace_id, dataset_id, auth_mode values, tenant_id, client_id, and fabric_client. This adds substantial meaning beyond the bare schema types.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence states a specific verb and resource: run DAX queries against a baseline and assert regression tolerance. The usage bullets clarify that it is for baseline comparison, consistency verification, and CI/CD tolerance checks, which distinguishes it from the generic sibling execute_dax_query.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear when-to-use guidance with three concrete scenarios: consistency verification, comparison against a golden baseline, and CI/CD tolerance checking. It does not explicitly state when not to use it or name execute_dax_query as the alternative for ad hoc DAX execution.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

run_refreshA

Trigger, monitor, and optionally wait for a Power BI dataset refresh.

Use this tool when the user asks to:

  • Refresh data in a published Power BI semantic model.

  • Check the completion status of a refresh operation.

  • Perform full, automatic, or data-only refreshes.

Args: workspace_id: Fabric / Power BI workspace ID (UUID). dataset_id: Dataset / semantic model ID (UUID). refresh_type: "full", "automatic", "data_only", "calculate", or "clearValues". wait: Whether to poll and wait for the refresh to complete before returning. timeout_s: Maximum wait time in seconds (default: 1800). auth_mode: "interactive" or "service_principal". When omitted, PBI_AUTH_MODE is used, falling back to "interactive". tenant_id: Azure AD tenant ID. client_id: Azure AD client ID. dry_run: When True (default) no refresh is triggered and status is "DryRun". Pass dry_run=False to actually refresh.

Returns: Dict with refresh status, duration, error details, and rollback status if applicable.

NameRequiredDescriptionDefault
waitNo
dry_runNo
auth_modeNo
client_idNo
tenant_idNo
timeout_sNo
dataset_idYes
refresh_typeNofull
workspace_idYes

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries the full burden and does so well: it discloses that dry_run defaults to True and no refresh happens unless explicitly set False, that wait polls until completion with a timeout_s default of 1800, and that auth_mode resolves through PBI_AUTH_MODE to 'interactive'. That is exactly the safety and long-running-operation context an agent needs before invoking a mutation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose sentence and the 'use when' list are front-loaded, and each Args entry earns its place given zero schema coverage. It is slightly long due to docstring-style formatting, and the Returns block is partly redundant with the existing output schema, but nothing is padded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 9-parameter mutation tool with no annotations, the description covers trigger semantics, polling behavior, auth resolution, the safe dry-run default, and return contents. Nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, and the description compensates for all nine parameters: UUID formats for workspace_id/dataset_id, the enumerated refresh_type values, the semantics of wait and timeout_s, the auth_mode fallback chain, and the critical dry_run default behavior. This adds substantial meaning the schema alone cannot convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence names a specific verb set (trigger, monitor, wait) and a specific resource (Power BI dataset refresh), which maps directly to a distinct capability none of the siblings (deploy_to_workspace, execute_dax_query, pre_deploy_check) cover. An agent can identify this tool's job without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives an explicit 'Use this tool when the user asks to:' list covering refresh, status checks, and refresh type selection, which is clear positive routing. It does not state when NOT to use it or name an alternative for adjacent needs (e.g., health checks vs. actual refresh), so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

screenshot_report_pagesA

Capture screenshots or structural wireframes of Power BI report pages.

Use this tool when the user asks to:

  • Visually inspect or capture report pages for reviews or regression diffs.

  • Generate SVG wireframes or image snapshots of PBIR layouts.

Args: pbip_path: Path to the .pbip directory. pages: Optional list of specific page names to capture. format: Output format ("png", "svg", "pdf"). resolution: Target resolution ("desktop", "mobile", "tablet"). output_dir: Directory where captured images are written. wait_ms: Time in ms to wait for visual rendering.

Returns: Dict with output image paths, warnings, and rendering metadata.

NameRequiredDescriptionDefault
pagesNo
formatNopng
wait_msNo
pbip_pathYes
output_dirNo./screenshots
resolutionNodesktop

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations exist, so the description carries the full burden. It does disclose that images are written to output_dir (a filesystem side effect), that wait_ms controls visual rendering, and that results include warnings and rendering metadata. However it says nothing about required permissions, whether a live connection (connect_target) must precede it, or how failures are surfaced.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded purpose sentence, then scannable use-case bullets, Args, and Returns. Given 0% schema coverage, the Args block earns its space rather than duplicating structured data.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a rendering tool with a large sibling set, the description covers purpose, invocation context, args, and return shape (even though an output schema also exists). The one real gap is prerequisite state — whether the report must be connected/open first — which the sibling connect_target implies but the description never states.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does: all six parameters are named with meaning, and it supplies value sets the schema lacks (format: png/svg/pdf; resolution: desktop/mobile/tablet; pages as an optional page-name list). It stops short of 5 only because units/defaults and interactions (e.g. format vs resolution) are not clarified.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (capture screenshots or structural wireframes) against a specific resource (Power BI report pages). No sibling tool does capture/snapshot work, so an agent can select it without ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use triggers ('visually inspect or capture report pages for reviews or regression diffs', 'generate SVG wireframes or image snapshots of PBIR layouts'). No when-not conditions or named alternatives (e.g. audit_report_ux_and_storytelling), so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

select_visuals_for_kpisA

Recommend optimal visual types and chart configurations for given KPIs.

Use this tool when the user asks to:

  • Choose the best charts or visual types for a specific set of KPIs or metrics.

  • Tailor visual recommendations to an audience ('executive', 'analytical', 'operational').

  • Get primary and alternative chart suggestions with rationale based on data types.

Args: kpis_json: List of KPIs or JSON string (each with name, semantic_type, fields, etc.). audience: Target persona ("executive", "analytical", "operational"). max_results: Maximum number of alternative visual recommendations per KPI. inspector: Optional model inspector providing column cardinality and schema info.

Returns: Dict with recommended primary visual, alternatives, and rationale for each KPI.

NameRequiredDescriptionDefault
audienceNoexecutive
inspectorNo
kpis_jsonYes
max_resultsNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full behavioral burden. 'Recommend' implies a non-mutating helper, and the Returns section sketches the output shape, but it never states side-effect freedom, cost, or whether it requires a live model connection. Adequate but with clear gaps for a zero-annotation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Structurally front-loaded with the purpose sentence followed by usage bullets and args. The Returns section partly duplicates the existing output schema, which is mild redundancy, but overall the text is tight and skimmable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a four-parameter, zero-coverage, zero-annotation tool, the description covers purpose, triggers, and every argument. Since an output schema exists, the Returns prose is a bonus rather than a requirement, and only the absence of behavioral caveats keeps it from a 5.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does: it documents all four parameters, enumerates the audience personas ('executive', 'analytical', 'operational'), and explains inspector as supplying column cardinality/schema info. This is well beyond what the bare schema conveys.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Recommend optimal visual types and chart configurations for given KPIs.' An agent can tell this is a recommendation/design aid rather than a mutation. It does not explicitly differentiate itself from siblings like edit_report_visual or design_report_page_from_requirements, which keeps it from a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It provides explicit trigger conditions via three 'Use this tool when the user asks to:' bullets covering chart selection, audience tailoring, and primary/alternative suggestions. There is no statement of when NOT to use it or which sibling to prefer instead, so it falls short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

set_sensitivity_labelsA

Apply Microsoft Purview information protection sensitivity labels to items.

Use this tool when the user asks to:

  • Classify or protect Power BI items (reports, semantic models, dashboards).

  • Set Purview sensitivity labels (Confidential, General, Highly Confidential).

Args: items: List of dicts specifying item IDs and types (e.g. [{"id": "...", "type": "Report"}]). label_id: Microsoft Purview label GUID. label_name: Display name of the sensitivity label. admin_scopes: Optional list of administrative authorization scopes. redact_names: Whether to redact item names in returned logs for security. dry_run: If True, validate permissions without applying labels.

Returns: Dict with updated items, failed items, and compliance status.

NameRequiredDescriptionDefault
itemsYes
dry_runNo
label_idYes
label_nameYes
admin_scopesNo
redact_namesNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden, and it does add real value: dry_run is explained as 'validate permissions without applying labels' and redact_names as log redaction. However, it omits whether labels are reversible, what permissions are actually required (admin_scopes is mentioned only as an arg), and whether dry_run defaults to True — schema shows default true, meaning an agent could believe labels were applied when nothing happened.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and trigger conditions are front-loaded, then Args/Returns blocks; nothing is wasted. The Args section inherently restates parameter names, and the Returns block is partly redundant given an output schema exists, but the utility description itself is tight.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return-value detail is not required, and the description still summarizes the shape (updated items, failed items, compliance status). For a 6-parameter mutation tool with zero annotations, it covers intent, params, dry-run safety, and error surface adequately; the remaining gap is permission/irreversibility context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0% (only titles like 'Label Id'), so the description must compensate, and it documents all six parameters with meaning beyond the schema: item dict shape with a concrete example, label_id as a Purview GUID, label_name as display name, admin_scopes as optional authorization scopes, and the semantics of redact_names and dry_run. It does not list valid label_name values or item type enumerations, which keeps it at 4.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence states a specific verb and resource ('Apply Microsoft Purview information protection sensitivity labels to items'), which is unambiguous and actionable. It does not name or contrast with any sibling tool, but no sibling in the list performs label application, so differentiation is implicit rather than stated.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Use this tool when the user asks to: classify or protect Power BI items... / set Purview sensitivity labels' gives explicit trigger conditions tied to user intent. It stops short of stating when NOT to use it or pointing to an alternative for adjacent tasks (e.g. RLS/roles via setup_rls_and_roles), so it earns 4 rather than 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

setup_rls_and_rolesA

Configure Row-Level Security (RLS) roles and validation rules in a TMDL model.

Use this tool when the user asks to:

  • Set up, add, or configure RLS roles and DAX table filter expressions.

  • Test and validate security rules against sample queries.

Args: target: Target PBIP directory or TMDL path. spec_yaml: YAML specification of security roles, members, and DAX filters. spec_json: JSON specification (either as a string or a structured object/dict). dry_run: If True, validate role specification without writing to disk. rollback_on_test_failure: Whether to revert modifications if test queries fail.

Returns: Dict with roles created, test query outcomes, and rollback status if applicable.

NameRequiredDescriptionDefault
targetYes
dry_runNo
spec_jsonNo
spec_yamlNo
rollback_on_test_failureNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It usefully discloses that dry_run validates without writing to disk and that rollback_on_test_failure can revert changes, which are important safety semantics for a mutating setup tool. It still omits permissions, overwrite behavior, and broader side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with purpose, then usage, args, and returns in a clear structure. The Returns section is somewhat redundant because an output schema exists, but the overall text remains efficient and easy to scan.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a five-parameter RLS setup tool with no annotations and an output schema, the description covers purpose, usage, arguments, and return shape. It is nearly complete, though it does not explain the expected schema of spec_yaml/spec_json beyond high-level contents, which would help an agent construct the call.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, but the description documents all five parameters: target, spec_yaml, spec_json, dry_run, and rollback_on_test_failure. It adds substantive meaning beyond the bare schema titles, including the YAML/JSON spec contents and the write/validation behavior of the boolean flags.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Configure Row-Level Security (RLS) roles and validation rules in a TMDL model.' That is distinguishable from siblings such as set_sensitivity_labels or apply_theme_and_accessibility_rules, which address different Power BI concerns.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives explicit when-to-use guidance via bulleted user intents: setting up/adding/configuring RLS roles and DAX table filter expressions, plus testing and validating security rules. It does not name alternatives or exclusion conditions, so it stops short of the top score.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

simplify_dax_measureA

Rewrite a DAX expression in its shorter, equivalent form.

Use this tool when the user asks to:

  • Simplify, tidy or shorten a DAX measure.

  • Find the measures in a model that are written the long way.

  • Replace a hand-rolled blank check, error check or IF chain with the function that already does it.

Args: expression: The DAX expression to simplify. Mutually exclusive with pbip_path. pbip_path: A PBIP project to read the measures from. measure: The measure to simplify. Requires pbip_path. all_measures: Simplify every measure in the project and report which ones could be written shorter. Requires pbip_path. apply_lint: Include the linter verdict before and after, so a rewrite that silences a finding — or creates one — is visible.

Returns: Dict with the simplified expression and the rewrites that produced it. The equivalence is structural: the expression is never evaluated against data, so the rewrite changes the shape and not the meaning, and a reader can check it. An expression that could not be parsed comes back unchanged, with the reason.

This tool writes nothing. To apply the result, pass the
simplified expression to add_measure_with_validation.
NameRequiredDescriptionDefault
measureNo
pbip_pathNo
apply_lintNo
expressionNo
all_measuresNo

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations available, the description carries the full burden and does so well: it states the tool writes nothing, that equivalence is structural rather than data-evaluated, that unparseable input returns unchanged with a reason, and what apply_lint adds. These are exactly the safety and behavior traits an agent needs before calling.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with a one-line purpose followed by scannable intent bullets, and the Args section is tight. The Returns paragraph is somewhat long and partly restates what an output schema would show, which costs a point but not much.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given five optional parameters, no annotations, and a moderately complex behavior (structural rewriting, lint comparison), the description covers selection, exclusivity, behavior, and the write-nothing guarantee. Nothing an agent needs to call this correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, and it does for all five parameters: expression vs. pbip_path exclusivity, measure/all_measures requiring pbip_path, and apply_lint's before/after lint verdict semantics. This is meaning the schema alone does not convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb (rewrite/simplify) applied to a specific resource (a DAX expression/measure), and the bullet list of user intents ('shorten a DAX measure', 'find measures written the long way', 'replace a hand-rolled blank check') makes it distinguishable from near-siblings like abstract_measures or abbreviate_names.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly enumerates when to use the tool (three concrete user asks), states the mutual-exclusion rule between expression and pbip_path, states the prerequisite that measure/all_measures require pbip_path, and names add_measure_with_validation as the follow-up path for actually applying a result.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

sync_git_to_workspaceA

Deploy a local Git repository with PBIP projects to a Fabric workspace.

Use this tool when the user asks to:

  • Synchronize or publish a local Git repository or branch to a Fabric workspace.

  • Update workspace items based on version-controlled PBIP files.

Args: repo_path: Path to the local Git repository. workspace_id: Target Fabric workspace ID (UUID). branch_or_commit: Git ref to sync (default: "HEAD"). conflict_resolution: Conflict handling strategy ("manual", etc.). dry_run: If True, calculate changes without publishing.

Returns: Dict with synchronized items, skipped items, and deployment results.

NameRequiredDescriptionDefault
dry_runNo
repo_pathYes
workspace_idYes
branch_or_commitNoHEAD
conflict_resolutionNomanual

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden; it does disclose that dry_run calculates changes without publishing and that conflict_resolution governs conflict handling, and it outlines the return shape. However, it never states that publishing overwrites existing workspace items, what permissions are required, or whether the operation is reversible, which are the key behavioral facts for a mutating deploy tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with a one-line purpose, then scannable 'when to use', Args, and Returns sections. Well organized and mostly earning its space, though the Returns block is largely redundant given that an output schema exists.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutating deploy tool with no annotations, the description covers the action, the trigger conditions, every parameter, and the dry-run safety path. Missing pieces are secondary details like overwrite semantics and auth prerequisites, and the return-values block is unnecessary since an output schema is present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate, and it documents all five parameters: repo_path, workspace_id (as a UUID), branch_or_commit (default HEAD), conflict_resolution (e.g. 'manual'), and dry_run (compute without publishing). It does not enumerate the allowed conflict_resolution values beyond 'manual', which is the only real gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: deploying a local Git repo with PBIP projects into a Fabric workspace. This clearly distinguishes it from the reverse-direction sibling commit_workspace_to_git and from deploy_to_workspace. An agent can identify the operation without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit 'Use this tool when the user asks to' bullets covering synchronization/publishing and updating items from version-controlled PBIP files. It gives clear positive triggers but never names alternatives (e.g. commit_workspace_to_git for the opposite direction) or states when NOT to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 9 tool updatesv1.23.0
    • Addedabbreviate_names
    • Addedabstract_measures
    • Changedconnect_target3 fields changed
      • addedInput schema / properties / auth_mode / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / auth_mode / default
        Previous value: -"interactive"New value: +null
      • removedInput schema / properties / auth_mode / type
        Removed value: -"string"
    • Changeddeploy_to_workspace3 fields changed
      • addedInput schema / properties / auth_mode / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / auth_mode / default
        Previous value: -"interactive"New value: +null
      • removedInput schema / properties / auth_mode / type
        Removed value: -"string"
    • Changeddiff_models1 field changed
      • removedInput schema / properties / inspector
        Removed value: -{
        -  "default": null,
        -  "title": "Inspector"
        -}
    • Changedexecute_dax_query3 fields changed
      • addedInput schema / properties / auth_mode / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / auth_mode / default
        Previous value: -"interactive"New value: +null
      • removedInput schema / properties / auth_mode / type
        Removed value: -"string"
    • Changedrun_dax_regression3 fields changed
      • addedInput schema / properties / auth_mode / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / auth_mode / default
        Previous value: -"interactive"New value: +null
      • removedInput schema / properties / auth_mode / type
        Removed value: -"string"
    • Changedrun_refresh3 fields changed
      • addedInput schema / properties / auth_mode / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / auth_mode / default
        Previous value: -"interactive"New value: +null
      • removedInput schema / properties / auth_mode / type
        Removed value: -"string"
    • Addedsimplify_dax_measure
  2. 7 tool updatesv1.18.0
    • Changedadd_measure_with_validation1 field changed
      • changedInput schema / properties / dry_run / default
        Previous value: -falseNew value: +true
    • Changedapply_plan1 field changed
      • changedInput schema / properties / dry_run / default
        Previous value: -falseNew value: +true
    • Changeddeploy_to_workspace2 fields changed
      • removedInput schema / properties / client_secret
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "title": "Client Secret"
        -}
      • addedInput schema / properties / dry_run
        Added value: +{
        +  "default": true,
        +  "title": "Dry Run",
        +  "type": "boolean"
        +}
    • Changedexecute_dax_query2 fields changed
      • removedInput schema / properties / client_secret
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "title": "Client Secret"
        -}
      • addedInput schema / properties / max_rows
        Added value: +{
        +  "default": 1000,
        +  "title": "Max Rows",
        +  "type": "integer"
        +}
    • Changedpromote_in_pipeline1 field changed
      • changedInput schema / properties / dry_run / default
        Previous value: -falseNew value: +true
    • Changedrun_dax_regression7 fields changed
      • addedInput schema / properties / auth_mode
        Added value: +{
        +  "default": "interactive",
        +  "title": "Auth Mode",
        +  "type": "string"
        +}
      • addedInput schema / properties / client_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Client Id"
        +}
      • addedInput schema / properties / dataset_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Dataset Id"
        +}
      • addedInput schema / properties / fabric_client
        Added value: +{
        +  "default": null,
        +  "title": "Fabric Client"
        +}
      • removedInput schema / properties / query_executor
        Removed value: -{
        -  "default": null,
        -  "title": "Query Executor"
        -}
      • addedInput schema / properties / tenant_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Tenant Id"
        +}
      • addedInput schema / properties / workspace_id
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Workspace Id"
        +}
    • Changedrun_refresh2 fields changed
      • removedInput schema / properties / client_secret
        Removed value: -{
        -  "anyOf": [
        -    {
        -      "type": "string"
        -    },
        -    {
        -      "type": "null"
        -    }
        -  ],
        -  "default": null,
        -  "title": "Client Secret"
        -}
      • addedInput schema / properties / dry_run
        Added value: +{
        +  "default": true,
        +  "title": "Dry Run",
        +  "type": "boolean"
        +}
  3. 9 tool updatesv1.11.0
    • Changedaudit_model_and_report1 field changed
      • removedInput schema / properties / dax_measures_json / type
        Removed value: -"string"
    • Changedcreate_semantic_model_from_schema1 field changed
      • removedInput schema / properties / spec_json / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
    • Changeddeploy_to_workspace1 field changed
      • removedInput schema / properties / findings_json / type
        Removed value: -"string"
    • Changededit_report_visual3 fields changed
      • removedInput schema / properties / fields_json / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / format_json / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
      • removedInput schema / properties / position_json / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
    • Addedexecute_dax_query
    • Changedpre_deploy_check1 field changed
      • removedInput schema / properties / findings_json / type
        Removed value: -"string"
    • Changedrun_dax_regression1 field changed
      • removedInput schema / properties / queries_json / type
        Removed value: -"string"
    • Changedselect_visuals_for_kpis1 field changed
      • removedInput schema / properties / kpis_json / type
        Removed value: -"string"
    • Changedsetup_rls_and_roles1 field changed
      • removedInput schema / properties / spec_json / anyOf
        Removed value: -[
        -  {
        -    "type": "string"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]
  4. 1 tool updatev1.9.0
    • Addedpowerbi_health
  5. 26 tool updatesv0.1.0
    • First observedadd_measure_with_validation
    • First observedapply_plan
    • First observedapply_theme_and_accessibility_rules
    • First observedaudit_model_and_report
    • First observedaudit_report_ux_and_storytelling
    • First observedcommit_workspace_to_git
    • First observedconnect_target
    • First observedcreate_report_from_dataset
    • First observedcreate_semantic_model_from_schema
    • First observeddeploy_to_workspace
    • First observeddesign_report_page_from_requirements
    • First observeddiff_models
    • First observededit_report_visual
    • First observedgenerate_data_dictionary
    • First observedoptimize_report_performance
    • First observedplan_change
    • First observedpre_deploy_check
    • First observedpromote_in_pipeline
    • First observedrefactor_to_calculation_groups
    • First observedrun_dax_regression
    • First observedrun_refresh
    • First observedscreenshot_report_pages
    • First observedselect_visuals_for_kpis
    • First observedset_sensitivity_labels
    • First observedsetup_rls_and_roles
    • First observedsync_git_to_workspace

TDQS

A3.7/5.0

Scored across 31 tools

Disambiguation4/5

Most tools target clearly distinct operations across modeling, reporting, deployment, security, and governance. A few boundaries are softer, such as create_report_from_dataset versus design_report_page_from_requirements, and audit_report_ux_and_storytelling versus optimize_report_performance, but their descriptions generally disambiguate them.

Naming Consistency4/5

The set is consistently snake_case and mostly follows a verb_noun pattern (e.g., execute_dax_query, create_report_from_dataset, set_sensitivity_labels). Minor deviations exist, such as powerbi_health and pre_deploy_check being noun-first, and inconsistent use of to/in connectors (deploy_to_workspace vs promote_in_pipeline).

Tool Count2/5

With 31 tools, the surface is heavy for an agent to navigate and likely exceeds what is practical for reliable tool selection. Although the server's scope is broad, many advanced modeling and report-design operations could be grouped or layered behind fewer entry points.

Completeness3/5

The surface covers many lifecycle stages including connection, modeling, reporting, deployment, Git sync, security, and governance. However, there are notable gaps: no delete/remove operations for measures, visuals, roles, or workspace items, and no list/browse/discovery tools for workspaces, datasets, or reports, creating dead ends for common workflows.

Maintenance

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    B
    quality
    D
    maintenance
    Enables AI assistants to interact with Microsoft Fabric and Power BI services through the Model Context Protocol. Users can manage workspaces, execute DAX queries, refresh datasets, and create Fabric notebooks using natural language.
    6
    10 npm
    2
    MIT
  • A
    license
    B
    quality
    B
    maintenance
    Enables AI agents to interact with Microsoft Fabric Real-Time Intelligence services, allowing for seamless data querying, analysis, and streaming capabilities.
    39
    5,630 PyPI
    133
    MIT
  • A
    license
    B
    quality
    A
    maintenance
    Enables AI agents to author and edit Power BI files locally (.pbix/PBIP), covering semantic models, reports, and Power Query M with 490 tools.
    100
    23 npm
    3
    Cryptographic Autonomy 1.0 (Combined Work Exception)