Table of Contents

Tabular Editor 3.27.0.0

Tabular Editor 3.27.0.0 downloads:

On .NET 10 (recommended for most users):

On .NET 8 (for machines that cannot yet run the .NET 10 desktop runtime):

If you haven't used Tabular Editor 3 before, you are eligible for a 30-day trial, which can be activated after installation. You can also purchase a license.

New in 3.27.0.0

For an overview, see the release blog.

MCP server

Tabular Editor 3 can now act as an MCP (Model Context Protocol) server. Agent harnesses such as Claude Code, GitHub Copilot, VS Code agent mode, Codex and Cursor connect to it and use the same features as the AI Assistant on the model you have open, without an AI provider or API key configured in Tabular Editor.

The agent works on the model through the same object model, scripting engine and safety checks as the AI Assistant, and its changes appear in your Tabular Editor session, where you can inspect, undo and save them. Choose Tools > MCP Server..., click Start server and paste the generated configuration into your agent tool once to connect an agent. A status bar indicator shows whether the server is running.

The AI permissions Model metadata, Model data, Best Practice Analyzer, Documents and Macros control what a connected agent can do. You set them in the server dialog before you start the server. Tools that your grants don't cover aren't offered to the agent, and no consent prompts appear while you work. The AI Assistant chat uses the same permissions, which you can edit from either place. Changes take effect the next time the server starts, and an agent that's already connected must reconnect to see them.

With Model metadata > Write, an agent changes your model through C# scripts, which Tabular Editor compiles, safety-checks and runs atomically. Each script is one undo step, named C# script (MCP). A script that accesses files, the network or external assemblies doesn't run on its own. If Documents > Write is granted, such a script opens as a C# script document for review, and without that grant, it doesn't run at all.

For details, see the new MCP server article. The permission model is described in Permissions and consent.

AI Assistant is generally available

The AI Assistant is now generally available. The AI features installer component is now selected by default. A standard installation includes the Assistant and the MCP server. You can still clear the component in the installer, and if your IT administrator has disabled AI features, they stay unavailable. Supported providers are OpenAI, Anthropic, Azure OpenAI and OpenAI-compatible endpoints, including local models. See AI Assistant.

The Assistant can now run the C# scripts it writes to make the model changes you ask for. Previously, you had to run its scripts yourself. Turn this on by selecting Allow AI assistant to run C# scripts directly under Tools > Preferences > AI Features > AI Assistant > Preferences, with Model metadata set to Read/Write under Tools > Preferences > AI Features > Permissions. Only scripts that change the model itself run this way, and scripts that access files, the network or external assemblies still open in a script document to review. Each run is a single undo step, and a script that fails part-way leaves the model unchanged. Preview changes still applies: you see what changed before it's kept, and you can click Cancel to revert.

The AI model name dropdown and the model picker in the panel are now filled from an online list, which makes new models selectable without a Tabular Editor update. The context usage bar, the point at which a conversation is compacted and the maximum length of a reply now use the limits of the selected model. Previously, they used one fixed value. For Azure OpenAI, the model field is now labeled Deployment, matching Azure's term. Thank you to edhans for suggesting the model picker on our GitHub ideas forum.

The Assistant now chooses Custom Instructions by each instruction's description, and an instruction it has loaded stays in effect for the rest of the conversation. If you maintain your own instruction files, keep each file's description accurate and specific. The triggers section is ignored and can be removed. Typing /instruction-id still loads an instruction explicitly.

On Enterprise licenses, Tabular Editor 3 also keeps an audit log of what the Assistant and the MCP server did. The log records permissions requested and answered, tools used and their outcome, and the full text of any script an agent ran or handed to you, but not prompts, replies or data values. It's written locally unless an administrator redirects it. Open audit folder, under Tools > Preferences > AI Features and in the Tools > MCP Server... dialog, opens its location. The policies an administrator can set are described in Enterprise policies for the AI Assistant and MCP server.

For details, see AI Assistant and Letting the Assistant change your model.

Unsaved change indicators

The TOM Explorer and the Properties view now mark objects with unsaved changes, whether the change was made by hand, by a script or by an AI agent. In the TOM Explorer, an added object is tinted green with a + badge, a deleted object red with a − badge and an edited object orange with a dot badge, and the Properties view marks changed rows the same way. Both views have a Show changes toolbar toggle that shows only what changed. The indicators clear when you save or reload the model, or undo back to its saved state.

Right-click a marked object in the TOM Explorer and choose Revert to return the object and everything beneath it to their state at the last save. For a single property, right-click its row in the Properties view and choose Revert.

Deleted objects no longer disappear from the TOM Explorer right away. Until you save the model, they stay in place, struck through, and you can right-click one and choose Restore to bring it back in the state it had before it was deleted. In the Unsaved changes section under Tools > Preferences > Tabular Editor > TOM Explorer, you can turn off the markers, group a container's deleted objects under a single Deleted objects node and set how long deleted objects stay visible. C# scripts can use the new members Revert(), HasUnsavedChanges, DeletedObjects and Selected.Deleted, with a matching Restore(). For details, see the new Unsaved change indicators article.

Auto-reload from disk

When the model metadata files it loaded change outside the application, for example through an AI agent, a script or another editor, Tabular Editor now reloads the open model. You don't need to use File > Reload from disk for these changes. For a model loaded from a .bim file, changes to that file trigger a reload, and for a model loaded from a folder, changes to any .json or .tmdl file below the model root trigger a reload.

If you have no unsaved changes, the model reloads without a prompt. If you have unsaved changes, an External changes detected prompt appears. Reload discards your local changes, and Ignore keeps them.

Auto-reload is enabled by default. To turn it off, clear the new Automatically reload from disk (hot reload) checkbox under Tools > Preferences > Tabular Editor > Miscellaneous. For details, see the new Auto-reload from disk article.

Snowflake key pair authentication

Snowflake connections now support key pair authentication, the sign-in method for Snowflake service users, which can't sign in with a password. In the Snowflake connection dialog, choose Key pair as the authenticator, enter your username and browse to your RSA private key file. If the key is encrypted, enter its passphrase. Supported keys are unencrypted PKCS#1 and PKCS#8 keys and passphrase-encrypted PKCS#8 keys, which is the format Snowflake's documented key-generation steps produce. For details, see Key pair authentication.

Enterprise policies for the AI Assistant and MCP server

Administrators can now set a policy for each of the five AI permissions to control what the AI Assistant and the MCP server can access and do on a user's machine. Where a limit applies, the options under Tools > Preferences > AI Features > Permissions and in the Tools > MCP Server... dialog include only the permitted levels, and the AI Assistant no longer requests permissions the policy blocks. If Model metadata is blocked, no information about the open model is shared.

Administrators can lock the AI provider, the endpoint, the model or deployment name and the OpenAI organization and project the same way, and they can restrict these settings to an allowlist of providers and endpoint hosts. Other policies publish a folder of Custom Instructions for the whole organization, block the Custom Instructions that users keep for themselves, choose which tools the MCP server offers to connected agents and fix the server's port.

These policies require Tabular Editor 3 Enterprise Edition and are honored on Enterprise, Consultancy and Trial licenses. Without an Enterprise license, the AI Assistant and the MCP server don't start while these policies are set, and a message names the policy values that require Enterprise Edition. For details, see Enterprise policies.

Administrator policy for unsafe scripts

Administrators can also now restrict C# scripts and macros to operations on the semantic model itself. With the restriction in place, a script is blocked before it runs if it reads or writes files, accesses the network, starts another program, loads external code or sends commands directly to the server. The policy applies to every place that runs scripts:

  • The script editor
  • The Best Practice Analyzer's Apply fix
  • The AI Assistant
  • The MCP server
  • The te command line (on Windows)

A macro that does any of these things no longer appears in any menu and is marked in View > Macros, where you can still open and edit it.

This restriction requires Tabular Editor 3 Enterprise Edition and is honored on Enterprise, Consultancy and Trial licenses. Without an Enterprise license, all script and macro execution is blocked while the policy is set. For details, see Scripts and macros in the policies reference.

Per-file serialization for DAX UDFs

When you save a model in the JSON folder format, DAX User-Defined Functions (UDFs) can now be serialized as individual files, with each UDF written to its own .json file in a functions/ subfolder at the model root. Parallel edits to different UDFs then no longer cause Git merge conflicts in the shared database.json. The new User Defined Functions (UDFs) toggle is in Tools > Preferences > File Formats > Save-to-folder and in Model > Serialization options..., and it's enabled by default for new folder saves. Existing folder-serialized models keep their inline layout until you turn on the toggle and save. For details, see User Defined Functions (UDFs).

Semantic Analyzer flags user-context calculated column limitations

The Semantic Analyzer now reports an error when a user-context calculated column is referenced where Power BI doesn't allow it. A user-context calculated column is a calculated column whose ExpressionContext property is set to User Context (Expression Context in the Properties view). Direct references are reported in the DAX editor, the Messages view and the te validate CLI command, and indirect references and relationship-endpoint violations are reported in the Messages view. For details, see User-context calculated columns.

Show actual DAX query in Table Preview

The Table Preview grid has a new Show actual DAX query option on its right-click menu, which opens a new, editable DAX query document with a query that reflects the preview's current filter and sort. For details, see Show actual DAX query.

Breaking change: C# scripts use the script query helpers instead of Model.Database

C# scripts can no longer call the query and command members ExecuteCommand, ExecuteReader, ExecuteDax and EvaluateDax directly on Model.Database. To run queries and commands, use the built-in script helpers EvaluateDax(...), ExecuteDax(...), ExecuteReader(...) and ExecuteCommand(...), which are unchanged. Other Model.Database members, such as Name, ID and CompatibilityLevel, are also unchanged. For details, see C# Script Helper Methods.

Improvements in 3.27.0.0

  • Policies can now be set under Software\Policies\Tabular Editor ApS, with the product-specific subkeys TE3 and TECLI for a policy that applies to one product only. Policies are now also read from the machine-wide hive, so Computer Configuration group policies apply and users can't override them. The previous Software\Policies\Kapacity\Tabular Editor key still works, and the te command-line tool honors these policies on Windows. Tabular Editor 3 also installs a Group Policy administrative template pair, which lets you set every policy from the Group Policy editor without editing the registry. See Policies and Using the administrative templates.
  • A new Color blindness mode, in the Accessibility group under Tools > Preferences > Tabular Editor > User Interface, marks objects added since the last save in teal where they'd otherwise be green. With it, added, deleted and changed objects stay distinct for the most common forms of color blindness. The mode applies to the TOM Explorer change indicators and the colors of the model comparison view. See Accessibility.
  • Added Power BI / Fabric compatibility level 1706 to the New Model dialog, where it replaces 1702 as the latest level. 1706 is now treated as the latest level throughout the application, including the "Power BI models should use latest compatibility level" Best Practice Analyzer rule and new Power BI models created with te init.
  • The Table Preview values filter lists up to 5,000 distinct values. For large tables, raise the limit with Max. values in filter dropdown under Tools > Preferences > Data Browsing > Table Preview. A higher limit can increase loading times.
  • Added a Sort table preview columns alphabetically preference, off by default, under Tools > Preferences > Data Browsing > Table Preview. When it's selected, Table Preview columns are sorted by name, in the same order as the TOM Explorer, and when it's cleared, columns appear in the order the engine returns. See Column order.
  • By default, selecting a column in the TOM Explorer now scrolls the Table Preview to that column and highlights it. The Track selected column toolbar button turns tracking off for one preview, and Tools > Preferences > Data Browsing > Table Preview > Behavior turns it off globally. See Finding a column in a wide table.
  • Selecting Track TOM Explorer in the DAX dependency view now shows the dependencies of the currently selected object immediately. Previously, the view waited for the next selection change.
  • The TOM Explorer no longer flickers or jumps after you edit a DAX expression. Previously, the tree could briefly redraw and lose its scroll position.
  • Model diagrams now follow programmatic navigation in the TOM Explorer. When you jump to a table or column through Go to actions or search results, every open diagram highlights that object, the same as when you click it in the tree.
  • File > Revert is now File > Reload from disk or File > Reload from server, depending on where the open model came from. The confirmation prompt, the status bar messages during and after the reload and the error message on failure use the same wording.
  • The DAX editor now recognizes the optional AssociatedColumnsBehavior parameter of the LOOKUP function. Previously, the parameter was underlined as an unresolved reference. It now appears in the calltip as an optional trailing argument, and auto-complete suggests its two values, EXPLICIT and INFERRED, cased according to your Preferred keyword casing preference.
  • Menu and toolbar actions no longer cause screen readers and other accessibility or automation tools to hang while a dialog is open.
  • You can now rename Metric View objects directly. Previously, you had to create a new object and delete the old one. Importing metric view YAML with duplicate object names now fails with a Duplicate <kind> name '<name>' error, and problems in join, field and measure expressions are reported separately, each naming the kind of object involved.
  • The What's New page has been replaced by a new Get Started page, which is available from the Help menu and appears on first launch and after an update.
  • Tabular Editor 3 is now available as a .NET 10 build alongside the existing .NET 8 build, for both x64 and ARM64. The .NET 10 download is the recommended one and requires the .NET 10 Desktop Runtime, which the installer offers to download and install. The .NET 8 installers, MSI packages and portable archives are still published for machines that can't move to the newer runtime yet. Both builds are functionally identical and can be installed side by side. The Tabular Editor CLI now ships on .NET 10 only, as a self-contained build that needs no separate runtime. See System requirements.
  • Updated the third-party components Tabular Editor is built on to their latest compatible releases, including Microsoft.AnalysisServices (Tabular Object Model/AMO) 19.117.0, DevExpress WinForms 25.2.9, Roslyn 5.9.0 for C# scripting, WebView2 1.0.4129.50, Microsoft.Extensions.AI 10.9.0 and Anthropic 12.40.0 for the AI Assistant, Microsoft.Fabric.Api 2.20.0, Microsoft.PowerBI.Api 5.1.0, Microsoft.Identity.Client 4.87.0, Microsoft.Data.SqlClient 6.1.5 and Spectre.Console 0.57.2 for the command-line interface. The code editing component behind the DAX and M editors (Scintilla) was updated to 7.0.0, which ships digitally signed native components for ARM64 as well as x64. The signed components are relevant on Windows on Arm devices and in environments that enforce code integrity policies. With the Analysis Services update, the String Indexing Behavior property of a column is now shown for models at compatibility level 1706 or above.
  • Updated NuGet package dependencies to address known security vulnerabilities: System.Security.Cryptography.Xml to 10.0.11 (GHSA-g8r8-53c2-pm3f, GHSA-cvvh-rhrc-wg4q) and SQLitePCLRaw to 2.1.13 (GHSA-2m69-gcr7-jv3q).

Bugfixes in 3.27.0.0

  • Fixed an issue where saving a model in Tabular Model Definition Language (TMDL) format could destroy a table, role, perspective or culture whose file name differed from the object's name only by letter case, a state that renaming an object can leave behind, for example a table named Sales stored in tables/sales.tmdl. Previously, the save reported success, but the object's file was deleted along with its contents, and the object was missing the next time the model was opened. Such a model now saves correctly: the object is kept, its file is saved under the object's name and the edit that triggered the save is applied.
  • Fixed an issue where columns could be created in an arbitrary order when importing or updating a table from a SQL Server, Fabric Lakehouse or Fabric Warehouse source through Model > Import tables..., Model > Update table schema... or the CLI. Columns now follow the column order of the source table.
  • Fixed an issue where importing a table from a Fabric Lakehouse or Warehouse through a data source that already carried its SQL analytics endpoint could create a table with no columns and no error. The columns are now read through that endpoint, and if no endpoint can be determined, an error states that the SQL analytics endpoint for the OneLake source can't be determined.
  • Fixed an issue where importing a table whose server, database, schema or object name contains a double quote produced a Power Query expression that wouldn't parse. Such names are now escaped correctly, and when importing from Databricks or Snowflake, the query itself is also escaped correctly.
  • Fixed an issue where a Snowflake connection using External browser authentication couldn't recover after its cached sign-in expired or was revoked by the identity provider. Previously, every later Snowflake operation failed without reopening the browser: the Table Import Wizard showed empty tables and columns with no error, and you had to restart Tabular Editor to recover. The browser sign-in now reopens when Snowflake rejects the cached sign-in, and a sign-in that times out or is abandoned now counts as a cancellation that no longer blocks later operations. See External browser sign-ins.
  • Fixed an issue where saving a model to a folder or a .bim file on macOS or Linux produced different files than on Windows, including object names that couldn't be checked out on Windows, platform-dependent line endings and a varying table order. Models saved on any platform now produce identical output. This also fixes a long-standing issue where two objects whose names map to the same escaped file name overwrote each other's file.
  • Fixed an issue where moving a measure or calculated column to another table, or duplicating it, removed its error indicator even though the expression was still invalid. Previously, the indicator only came back after the expression was edited again.
  • Fixed an issue where the TOM Explorer collapsed and lost the current selection when a model with a connected workspace database was reloaded, either with File > Reload from disk or by an automatic reload after the files changed on disk. The expanded nodes, focused object, selection and scroll position are now kept, and reloading a model opened from a file also keeps the selection.
  • Fixed an issue where pasting an object in the TOM Explorer could leave both the original and the pasted copy selected, with the tree scrolled away from the pasted object. The pasted object is now selected, focused and kept in view.
  • Fixed an issue where selecting an object in the TOM Explorer while working in another view could switch the active document to an open model diagram.
  • Fixed an issue where selecting a Direct Lake partition, or a partition generated by an incremental refresh policy, in the TOM Explorer raised an error and opened the crash report dialog. The Expression Editor now shows the partition's data coverage definition expression if it has one, and stays empty if it doesn't.
  • Fixed an issue where opening a model containing calculated tables whose columns are inferred from the DAX expression could intermittently fail with a "Collection was modified; enumeration operation may not execute" error.
  • Opening a model no longer fails with an error when the model's user options file (.tmuo) holds no readable content. The file is now also written atomically, so an interrupted write can't damage it.
  • Fixed an issue where saving a PBIP semantic model authored by Power BI Desktop renamed the item and cleared any description set in Fabric, and the change then propagated to the workspace on the next Fabric Git sync. Saving such a model to a new location now also names the folder after the item.
  • Fixed an issue where File > Save As... could suggest a file name that Windows can't save, most commonly for a document whose tab caption contains a colon. Invalid characters are now percent-encoded in the suggested name, which you can still edit.
  • Fixed an issue where the status bar text could be unreadable when a custom Status bar color was picked for a connection. The status bar text and link colors are now derived from the chosen color. Previously, they were derived from the active theme.
  • Fixed an issue where the Best Practice Analyzer's "Rules for the local user" collection could appear read-only on a machine where Tabular Editor hadn't yet created its local application data folder, such as on first run.
  • Fixed an issue where DAX auto-complete suggested user-defined functions that aren't valid in the current argument context and omitted valid ones. UDFs are now filtered by their inferred return type, and UDFs whose definition contains a semantic error are no longer suggested. Filter arguments, which previously omitted UDFs entirely, now suggest them.
  • Fixed an issue where Inline measure in the DAX editor could change the result of a calculation without warning when the reference was inside a row context, for example inside SUMX or FILTER. Where it can affect the result, the inlined expression is now wrapped in CALCULATE( ... ) to preserve the context transition that a measure reference performs.
  • Fixed an issue where Inline measure could comment out part of the surrounding expression when the expanded measure's expression ends with a comment line. Any code after the measure reference on that line now moves to a new line, indented to match.
  • Fixed an issue where the AI Assistant in the portable (zip) edition was sometimes unavailable after launch even though an AI provider was already configured. Previously, sending a message reported "AI client not initialized", and confirming the unchanged settings then failed with a "Method not found" error until the application was restarted. The Assistant now initializes on every launch, and if initialization fails, the chat reports the reason.
  • Fixed an issue where the AI Assistant failed to initialize when the provider was set to Anthropic or OpenAI with the model name left blank. A blank model name now works, and initialization failures, which previously produced no feedback, are now reported in the chat.
  • Fixed an issue where the AI Assistant could fail with the error "The requested operation requires an element of type 'Number', but the target element has type 'String'" when asked to revise a script or query it had written earlier in the conversation. The reply now completes, and the existing script or query is updated in place.
  • Fixed an issue where the Stop button in the AI Assistant did nothing while a Permission Required card was waiting for an answer, leaving the conversation stuck. Pressing Stop now ends the turn, and you can continue the same conversation with a new message.
  • Fixed an issue where code blocks in the AI Assistant were unreadable under a light theme, appearing as near-black text on a near-black block. Code blocks, their language label, Copy button and syntax coloring now follow the theme, and the block's header strip has also been cleaned up.
  • Fixed an issue where the Delete conversation button on the AI Assistant toolbar deleted the current conversation immediately, with no way to get it back. A confirmation prompt now appears, and the button has moved away from the panel's close button, which it was easily mistaken for.
  • Fixed an issue where the text directly following a script or query card in an AI Assistant reply could appear unformatted, showing raw characters such as ** or backticks.
  • Fixed an issue where the AI Assistant could create a duplicate object when asked to update an existing one that had been renamed, moved or edited after the Assistant first created it.
  • Fixed an issue where the AI Assistant showed an error and failed to respond when connected to a custom (OpenAI-compatible) provider using certain thinking or reasoning models. Requests that use tools, such as listing measures or running a DAX query, now work with these models.

Coming from Tabular Editor 2.x?

For a tour of the main features in Tabular Editor 3, watch this video. To get started, see the onboarding guide.

Main features of Tabular Editor 3:

  • Customizable IDE with multi-monitor and Hi-DPI support and themes
  • DAX code editor with auto-complete, syntax checking, code folding and formatting
  • *Workspace mode, which saves your changes to disk and synchronizes model metadata to Analysis Services at the same time
  • *Preview table data with infinite scrolling, create PivotGrids or write DAX queries to browse the model or test calculation logic
  • *Schedule data refreshes
  • Update table schema on both provider and structured data sources, including M queries
  • Create data model diagrams
  • Create DAX scripts to edit multiple measures or other calculated objects in a single document
  • Record C# scripts and save them as macros (formerly "Custom Actions")
  • VertiPaq Analyzer integration
  • DAX debugger
  • DAX Optimizer integration
  • Code Actions to refactor your DAX

*=Only while connected to an instance of Analysis Services or Power BI