C Sharp ScriptingSAFE
Power BI AI skills and Power BI agents for Claude Code and GitHub Copilot: a plugin marketplace of Power BI skills, subagents, and hooks for semantic models, DAX, TMDL, reports, and AI dashboards. Includes Microsoft Fabric skills and Fabric agents. Weekly updates.
Overview
From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.
Non-interactive C# scripts for automating Power BI semantic model operations.
Usage
All scripts in this directory are non-interactive and can be run from the CLI without user input.
From Claude Code Plugin
te script -s "workspace" -d "model" -S samples/measures/create_sum_measures.csx --save
From Command Line
te script -s "workspace" -d "model" -S samples/columns/hide_key_columns.csx --save
Script Categories
Measures (measures/)
- create_sum_measures.csx - Create SUM measures from selected columns
- create_countrows_measures.csx - Create COUNTROWS measures from selected tables
- create_time_intelligence.csx - Create YTD, MTD, QTD, PY, YoY, YoY% measures
Columns (columns/)
- hide_key_columns.csx - Hide all Key/ID columns and disable summarization
- disable_summarization.csx - Disable automatic summarization on all columns
Display Folders (display-folders/)
- clear_all_display_folders.csx - Remove all display folders from the model
- organize_measures_by_type.csx - Organize measures into folders by naming pattern
Format Strings (format-strings/)
- apply_format_by_name.csx - Apply format strings based on measure naming patterns
Bulk Operations (bulk-operations/)
- add_expression_to_descriptions.csx - Add DAX expressions to measure descriptions
- clean_object_names.csx - Convert CamelCase names to Proper Case Names
UI (ui/)
- set-ui-font-size.csx - Set the TE3 desktop UI font size for the session (TE3 only, not CLI)
Script Headers
All scripts include:
- Title - Brief description
- Author - Original author/source
- Description - What the script does
- Usage - How to run it
- Non-interactive - Whether it requires user input
Customization
Most scripts can be customized by editing variables at the top:
- Date column names for time intelligence
- Naming patterns for organiza
b8d9b0f3c97aOBSERVED · 2026-10-13Host compatibility
What the documentation claims. We have not run a compatibility test.
| Host | Status | Notes |
|---|---|---|
| claude-code | mentioned |
What it tells the agent
The instruction file, verbatim from the audited commit — this is the text the model reads, and the surface the audit's instruction layer examines. Quoted here so you can judge it without cloning anything.
---
name: c-sharp-scripting
description: Writing and executing C# scripts and macros against Power BI semantic models using Tabular Editor 2/3. Automatically invoke when the user mentions "C# script", "Tabular Editor script", "TOM scripting", "MacroActions.json", "XMLA", or asks to "automate model changes", "bulk update measures", "create calculation groups", "write a macro", "format DAX expressions", "manage model metadata".
---
# C# Scripting for Tabular Editor
Expert guidance for writing and executing C# scripts to manipulate Power BI semantic model metadata using Tabular Editor 2/3 CLI or the Tabular Editor IDE.
## When to Use This Skill
Activate automatically when tasks involve:
- Writing C# scripts for Tabular Editor
- Bulk operations on model objects (measures, columns, tables)
- Creating or modifying calculation groups
- Managing model security (roles, RLS, OLS)
- Formatting DAX expressions
- Automating repetitive model changes
- Querying model metadata via TOM API
- Building interactive scripts with user input dialogs
## Critical
- Every statement must end with `;` (semicolon required by C#)
- Use double quotes `"` for strings and escape with `\` when needed
- Use forward slashes `/` in DisplayFolder paths (auto-converted to `\`)
- Always add `Info()` statements for debugging - script stops at error point
- Test scripts on non-production models first
- Changes are undoable with Ctrl+Z in the Tabular Editor UI
## C# Version Support
| Environment | C# Version | Notes |
|-------------|------------|-------|
| **Tabular Editor 2** | Default compiler | Older C# syntax |
| **Tabular Editor 3** | Roslyn | Supports up to C# 12 with VS2022 |
| **TE2 with Roslyn** | Configurable | Set in File > Preferences > General |
To use newer C# features in TE2, configure Roslyn compiler path in preferences.
## Default Imports and Assemblies
### Auto-Imported Namespaces
Scripts automatically have these `using` statements applied:
```csharp
using System;
using System.Linq;
using System.Collections.Generic;
using Newtonsoft.Json;
using TabularEditor.TOMWrapper;
using TabularEditor.TOMWrapper.Utils;
using TabularEditor.UI;
```
### Pre-Loaded Assemblies
These .NET assemblies are loaded by default:
- `System.Dll`
- `System.Core.Dll`
- `System.Data.Dll`
- `System.Windows.Forms.Dll` (for UI dialogs)
- `Microsoft.Csharp.Dll`
- `Newtonsoft.Json.Dll`
- `TomWrapper.Dll`
- `TabularEditor.Exe`
- `Microsoft.AnalysisServices.Tabular.Dll`
### Adding External Assemblies
```csharp
// Assembly references must be at the very top of the file:
#r "System.IO.Compression"
#r "System.Drawing"
// Using statements come after assembly references:
using System.IO.Compression;
using System.Drawing;
```
## Prerequisites
### For Tabular Editor CLI
| Requirement | Description |
|-------------|-------------|
| **Tabular Editor 2 CLI** | Download from [GitHub releases](https://github.com/TabularEditor/TabularEditor/releases) |
| **XMLA Read/Write** | Enabled on Fabric capacity or Power BI Premium |
| **Azure Service Principal** | For XMLA connections (see authentication.md) |
### Environment Variables (for XMLA)
```
AZURE_CLIENT_ID=<app-id>
AZURE_TENANT_ID=<tenant-id>
AZURE_CLIENT_SECRET=<secret>
```
## Execution Methods
### 1. Tabular Editor CLI
```bash
# Inline script
TabularEditor.exe "WorkspaceName/ModelName" -S "Info(Model.Database.Name);"
# Script file
TabularEditor.exe "WorkspaceName/ModelName" -S "script.csx"
```
### 2. Connection Types
| Type | Format | Example |
|------|--------|---------|
| **XMLA** | `workspace/model` | `"Sales WS/Sales Model"` |
| **Local BIM** | `path/to/model.bim` | `"./model.bim"` |
| **Local TMDL** | `path/to/definition/` | `"./MyModel.SemanticModel/definition/"` |
| **PBI Desktop** | `localhost:PORT` | `"localhost:52123"` |
## Core Objects
### The `Model` Object
Access any object in the loaded Tabular Model:
```csharp
Model // Root model object
Model.Tables // All tables
Model.Tables["Sales"] // Specific table
Model.AllMeasures // All measures across all tables
Model.AllColumns // All columns across all tables
Model.Relationships // All relationships
Model.Roles // All security roles
Model.CalculationGroups // All calculation groups
Model.Perspectives // All perspectives
Model.Cultures // All translations/cultures
Model.Expressions // All M expressions (shared queries)
Model.DataSources // All data sources
```
### The `Selected` Object
Access objects currently selected in the TOM Explorer (IDE only):
```csharp
// Plural form - collections (safe even when empty)
Selected.Tables // Selected tables
Selected.Measures // Selected measures
Selected.Columns // Selected columns
Selected.Hierarchies // Selected hierarchies
// Singular form - single object (error if not exactly one selected)
Selected.Table // The single selected table
Selected.Measure // The single selected measure
Selected.Column // The single selected column
// Set properties on multiple objects at once
Selected.Measures.DisplayFolder = "Test";
Selected.Columns.IsHidden = true;
// Bulk rename with pattern
Selected.Measures.Rename("Amount", "Value");
```
When a Display Folder is selected, all child items are included in the selection.
## LINQ Fundamentals
LINQ is essential for filtering and transforming TOM collections. See **`references/linq-reference.md`** for the full method table, lambda syntax, and examples.
Key methods: `Where()`, `First()`, `FirstOrDefault()`, `Any()`, `All()`, `Count()`, `Select()`, `OrderBy()`, `ForEach()`, `ToList()`.
```csharp
// Common pattern: filter, chain, act
Model.AllMeasures
.Where(m => m.Name.Contains("Revenue"))
.Where(m => string.IsNullOrEmpty(m.FormatString))
Trust audit
SAFEgrade B · trust 89/100 Nothing in the source contradicts what it says it does. Grade A is reserved for packages that have also passed the behavioural sandbox.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | PASS |
| L1 | Static analysis of the code | PASS |
| L2 | Instruction surface (what it tells the agent) | PASS |
| L3 | Class-specific surface | PASS |
| L4 | Behavioural (sandbox) | SKIPPED |
What the source does
- Filesystem
- none-observed
- Network
- none-observed
- Shell
- none-observed
- Dependencies
- pinned
- Secrets in source
- none-found
Findings (1)
| `Administrator` | Full access |
Gates applied: no_behavioural_pass.
b8d9b0f3c97afull audit observations/trust-audit/skill/data-goblin__c-sharp-scripting.json · Report an issue / request a re-scanAudit history
Every audit this skill has had.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-13 | b8d9b0f3c97a | SAFE | B | 89 | first audit |
Questions
What does the C Sharp Scripting skill do?
Power BI AI skills and Power BI agents for Claude Code and GitHub Copilot: a plugin marketplace of Power BI skills, subagents, and hooks for semantic models, DAX, TMDL, reports, and AI dashboards. Includes Microsoft Fabric skills and Fabric agents. Weekly updates.
Is C Sharp Scripting safe to install?
The audit found nothing in the source that contradicts what it says it does, and graded it B (89/100). Grade A is held back for packages that have also passed a sandboxed behavioural run, which is why a clean skill reads B.
What can C Sharp Scripting access on my machine?
The audit observed no filesystem, network or shell use at all in its source.
Which assistants does C Sharp Scripting work with?
Its documentation mentions claude-code. That is what the text claims, not a compatibility test we ran.
How current is this page?
The grade is for one exact copy of the source (b8d9b0f3c97a), read on 2026-10-13. The repository is watched, and a new audit runs when it changes — this is the first audit.