github TabularEditor/TabularEditor3 3.27.0.0
Tabular Editor 3.27.0.0

3 hours ago

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

Check out our release blog to get a brief overview of the most important updates in this release.

MCP Server

Tabular Editor 3 can now act as an MCP (Model Context Protocol) server, so the agent harness you already use (Claude Code, GitHub Copilot, VS Code agent mode, Codex, Cursor and others) can drive the same features as the AI Assistant against the model you have open, with no AI provider or API key configured in Tabular Editor. If you have been curious about agentic semantic model development but did not want another AI subscription, or you simply prefer working in your own agent, this is the way in.

The agent works on the model as you see it in Tabular Editor 3 through the MCP server through the same object model, scripting engine and safety checks as the AI Assistant. Everything it does lands in your Tabular Editor session, where you can inspect it, undo it and save it when you are happy with it. Choose Tools > MCP Server..., click Start server, and paste the ready-made configuration for your agent tool once; a status bar indicator shows whether the server is running.

You decide up front what an agent connected through the MCP can do by setting the five AI permissions (Model metadata, Model data, Best Practice Analyzer, Documents and Macros) in the server dialog before it starts, and any tool your grants do not cover is never offered to the agent, so there are no consent pop-ups while you work. The same permissions govern the AI Assistant chat and can be edited from either place. Changes take effect when the server is next started, and an already-connected agent must reconnect to see them.

With Model metadata > Write, an agent changes your model through C# scripts that Tabular Editor compiles, safety-checks and runs atomically. You can always use a single Ctrl+Z to revert everything an agent did. An agent attempting to use Tabular Editor to make changes outside the model (files, network, external assemblies) is never allowed but opened as a C# script for you to review instead.

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

AI Assistant Generally Available

The AI Assistant is now generally available. The AI features component is selected by default in the installer, so the Assistant and the MCP server are ready straight after a standard installation (you can still untick it, and where your IT administrator has disabled AI features it stays unavailable). You can bring your own API key from OpenAI, Anthropic or Azure OpenAI or point it at any OpenAI-compatible endpoint including local mdoels, or skip the key altogether and use the MCP server with the agent you already have.

The Assistant can now carry out the model changes you ask for, instead of only writing a script for you to run. Tick Allow AI Assistant to run C# scripts directly under Tools > Preferences > AI Features > AI Assistant to switch this on. This requires Model metadata to be set to Write under Tools > Preferences > AI Features > Permissions. Only scripts that change the model itself is run this way; anything reaching for files, the network or external assemblies is still handed to you for review in a script document. Each run lands as a single undo step, a script that fails part-way leaves the model untouched, and Preview changes is still honored, so you can see what changed before it stands and Cancel to revert.

We have also made it easier to choose a model in the AI Assistant. The AI model name dropdown and the model picker in the panel are filled from an online list, so new models become selectable without waiting for a Tabular Editor update. The context usage bar, the point at which a conversation is compacted and the maximum length of a reply now follow the real limits of the model in use rather than one fixed figure, and with Azure OpenAI the model field is labeled Deployment, as Azure does. Thank you to edhans for suggesting the model picker on our GitHub ideas forum.

Custom Instructions are now chosen from each instruction's description, and an instruction the Assistant has picked up 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.

Tabular Editor 3 Enterprise Edition additionally keeps a local record of what the Assistant and the MCP server did (permissions asked and answered, tools used and their outcome, and the full text of any script an agent ran or handed you). It never records prompts, replies or data values and stays fully local to the user. Find it by opening the audit folder under Tools > Preferences > AI Features. The policies an administrator can set are described in the Enterprise policies section below.

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

Unsaved change indicators

The TOM Explorer and Properties pane has a new feature which marks objects with unsaved changes throughout the editor, so you can see at a glance what you have touched since the last save. In the TOM Explorer, an added object is tinted green with a + badge, a deleted one red with a badge, and an edited one orange with a dot badge. The Properties pane marks changed rows the same way, and both panes gain a toolbar toggle that shows only what changed. The indicators cover any unsaved change, whether made by hand, by a script or by an AI agent, and clear the moment the model is saved, reloaded or undone back to its saved state.

Changes can be put back selectively by Right-click a marked property and chooseing Revert to return it and everything beneath it to the way it was at the last save or choose a single property to revert.

This feature also means that deleted objects no longer simply vanish from your model. Until the model is saved they stay where they were, struck through, and a right-click Restore brings one back exactly as it was the moment before it was deleted. Under Tools > Preferences > TOM Explorer > Unsaved changes you can switch the markers off, gather a container's deleted objects under a single Deleted objects node, and choose how long deleted objects stay visible. C# scripts can also use new functions for this feature to get Revert(), HasUnsavedChanges, DeletedObjects and Selected.Deleted with a matching Restore().

For details, see the new Unsaved change indicators article.

Auto-reload from disk

Tabular Editor now notices when the model metadata files it loaded are changed outside the application (by an AI agent, a script, another editor) and brings those changes into the open model without you having to use File > Reload from disk. A model loaded from a .bim file watches that file; a model loaded from a folder watches every .json or .tmdl file below the model root.

When you have no unsaved changes, the model is simply reloaded in the background. If you do have unsaved changes, an External changes detected prompt asks whether to Reload (discarding your local changes) or Ignore (keeping them).

The behavior is enabled by default and can be turned off with the new Automatically reload from disk (hot reload) checkbox under Tools > Preferences > Miscellaneous. For details, see the new Auto-reload from disk article.

Snowflake key pair authentication

Snowflake connections now support key pair authentication, in line with Snowflake's MFA enforcement roadmap for service accounts. In the Snowflake connection dialog, choose Key pair as the authenticator, enter your username, browse to your RSA private key file and, if the key is encrypted, enter its passphrase. Unencrypted PKCS#1/PKCS#8 keys and passphrase-encrypted PKCS#8 keys (the format produced by Snowflake's documented key-generation steps) are supported.For details, see Key pair authentication.

Enterprise policies for the AI Assistant and MCP server

Administrators can now choose what the AI Assistant and the MCP server are allowed to reach and do on any users machine by setting policies for each of the five AI permissions. Where a limit applies, the options under Tools > Preferences > AI Features > Permissions and in the Tools > MCP Server... dialog only offer what is permitted, the Assistant stops asking for permission it cannot be given, and nothing about the open model is shared when model metadata is off limits.

The AI provider, endpoint, model or deployment name and the OpenAI organization and project can be locked the same way, or restricted to an allowlist of providers and endpoint hosts. Administrators can also publish a folder of Custom Instructions for the whole organization (and rule out the ones a user keeps for themselves), decide which tools the MCP server offers to connected agents, and fix the server's port.

These policies require Tabular Editor 3 Enterprise Edition. Other editions refuse to start the AI Assistant and the MCP server while these policies are set, and name the values that need the Enterprise Edition. For details, see Enterprise policies.

Administrator policy for unsafe scripts

Administrators can also now allow C# scripts and macros only where they stay within the semantic model. With the restriction in place, a script that reads or writes files, reaches the network, starts another program, pulls in outside code, or sends commands directly to the server is refused before it runs. This policy applies to all surfaces that can run scripts: the script editor, the Best Practice Analyzer's Apply fix, the AI Assistant, the MCP server and the te command line (on Windows). A macro that does any of those things no longer appears in any menu and is marked in View > Macros, where it can still be opened and edited.

This restriction requires Tabular Editor 3 Enterprise Edition: while the policy is set, any other edition will not allow script or macro execution at all. For details, see Scripts and macros in the policies reference.

Per-file serialization for DAX UDFs

DAX User Defined Functions (UDFs) can now be serialized as individual files when saving a model with the JSON folder format. Each UDF is written to its own .json file under a functions/ subfolder at the model root, so parallel edits to different UDFs no longer produce Git merge conflicts on the shared database.json. The new User Defined Functions (UDFs) toggle appears in Tools > Preferences > Save-to-folder and in Model > Serialization Options, and is enabled by default for new folder saves; existing folder-serialized models keep their inline layout until you opt in and save.

For details, see User Defined Functions (UDFs).

Semantic Analyzer flags user-context-aware calculated column limitations

The semantic analyzer now reports an error when a user-context-aware calculated column (a calculated column whose Expression Context is set to User Context) is referenced where Power BI does not allow it. Direct references are reported in the DAX editor, the Messages view and the te validate CLI command; indirect references and relationship-endpoint violations are reported in the Messages view.

For details, see User-context calculated columns.

Show actual DAX query in Data Preview

The Data Preview grid has a new Show actual DAX query right-click option. It opens a new, editable DAX Query document pre-populated with a query that reflects the preview's current filter and sort, so you can take the preview you are looking at and carry on working with it as a query. 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 query/command members directly on Model.Database. The script-facing way to query the connected model is (and always was) the built-in script helpers EvaluateDax(...), ExecuteDax(...), ExecuteReader(...) and ExecuteCommand(...), which are unchanged. Scripts that used the documented helpers are unaffected. 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 should reach one product only, and they are now read from the machine-wide hive as well, so Computer Configuration group policies apply and cannot be overridden by the user. The previous Software\Policies\Kapacity\Tabular Editor key keeps working unchanged, and the te command-line tool honors these policies on Windows. Tabular Editor 3 also installs a Group Policy administrative template pair, so every policy can be set from the Group Policy editor instead of by editing the registry. See Policies and Using the administrative templates.
  • A new Color blindness mode under Tools > Preferences > User Interface > Accessibility marks objects added since the last save in teal rather than green, so that added, deleted and changed objects stay distinct for the most common forms of color blindness. It covers 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, replacing 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 Data Preview values filter is limited to 5,000 distinct rows. A new preference lets you raise that limit if you work with large tables, but bear in mind that raising it can increase loading times.
  • Added a Sort table preview columns alphabetically preference under Tools > Preferences > Data Browsing > Table Preview. When enabled, Data Preview columns are sorted by name, matching the order the TOM Explorer lists them in rather than the order the engine returns. Off by default. See Column order.
  • Selecting a column in the TOM Explorer now scrolls the Data Preview to that column and highlights it, so you no longer have to scroll across a wide table to find it. Tracking is on by default and can be turned off for an individual preview via the Track selected column toolbar button, or globally under Tools > Preferences > Data Browsing > Table Preview > Behavior. See Finding a column in a wide table.
  • Ticking Track TOM Explorer in the DAX dependency view now immediately shows the dependencies of the currently selected object, instead of waiting for the next selection change.
  • Improved the TOM Explorer so that it no longer flickers or jumps after editing a DAX expression. Previously, the tree could briefly redraw and lose its scroll position.
  • Model diagrams now follow programmatic navigation in the TOM Explorer: jumping to a table or column via Go to actions or search results highlights that object in every open diagram, exactly as clicking it in the tree does.
  • File > Revert is now File > Reload from disk or File > Reload from server, naming the place the open model came from, and everything the command shows uses that same wording: the confirmation it asks for, the status bar while it runs and once it is done, and the error if it fails.
  • The DAX editor now recognizes the optional AssociatedColumnsBehavior parameter of the LOOKUP function, which was previously underlined as an unresolved reference. It appears in the calltip as an optional trailing argument, and auto-complete offers 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.
  • Metric View objects can now be renamed directly, without having to create a new object and delete the old one. Importing metric view YAML with duplicate object names now fails with a clear diagnostic, 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, available from the Help menu and shown 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 for you. The .NET 8 installers, MSI packages and portable archives continue to be published unchanged for machines that cannot move to the newer runtime yet. Both builds are functionally identical and can be installed side by side, and the Tabular Editor CLI now ships on .NET 10 only; it is self-contained, so no runtime needs to be installed for it. See System requirements.
  • Updated the third-party components Tabular Editor is built on to their latest compatible releases, including Microsoft.AnalysisServices (TOM/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, which is relevant on Windows on Arm devices and in environments that enforce code integrity policies. As a result of 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 TMDL format could destroy a table, role, perspective or culture whose file name differed from the object's own name only by letter case, for example a table named Sales held in tables/sales.tmdl, which is what renaming an object leaves behind. Previously the save reported success, but the object's file was deleted along with everything in it, and the object was simply missing the next time the model was opened. Such a model now saves correctly: the object survives, its file is kept under the object's own name, and the edit that prompted 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, in both Model > Import Tables and Model > Update Table Schema as well as in 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 silently create a table with no columns. A clear error is now shown when no columns are available.
  • Fixed an issue where importing a table whose server, database, schema or object name contains a double quote produced a Power Query expression that would not parse. Such names, and the query itself when importing from Databricks or Snowflake, are now escaped correctly.
  • Fixed an issue where a Snowflake connection using External browser authentication could not recover once its cached sign-in expired or was revoked by the identity provider. Previously, every subsequent Snowflake operation failed without reopening the browser, the Import Table wizard silently showed empty tables and columns instead of an error, and the only way to recover was to restart Tabular Editor. The browser sign-in now reopens as soon as Snowflake rejects the cached one, and a sign-in that times out or is abandoned is treated as a cancellation rather than an error that 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 could not 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 would overwrite each other's file.
  • Fixed an issue where moving a measure or calculated column to another table, or duplicating it, made its error indicator disappear 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 workspace database connected was reloaded, either through File > Reload from disk or through 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 keeps the selection as well.
  • 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 otherwise.
  • 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 cannot damage it in the first place.
  • Fixed an issue where saving a PBIP semantic model authored by Power BI Desktop renamed the item and cleared any description set in Fabric, which 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 refuses to save, most commonly for a document whose tab caption contains a colon. Invalid characters are now percent-encoded in the suggested name, which remains fully editable.
  • Fixed an issue where the text in the status bar 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 rather than 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 had not yet created its local application data folder, such as on first run.
  • Fixed DAX auto-complete suggesting user-defined functions that are not valid in the current argument context and omitting valid ones. UDFs are now filtered by their inferred return type, filter arguments suggest UDFs (they were previously omitted entirely), and UDFs whose definition contains a semantic error are no longer offered.
  • Fixed an issue where Inline measure in the DAX editor could silently change the result of a calculation when the reference was inside a row context, for example inside SUMX or FILTER. The inlined expression is now wrapped in CALCULATE( ... ) to preserve the context transition a measure reference performs, but only where that wrap can make a difference.
  • 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. Whatever followed the measure reference on that line is now moved 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 that persisted until the application was restarted. The assistant now initializes consistently on every launch, and whenever initialization does fail, the chat reports the actual 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 as intended, and initialization failures are reported in the chat instead of nothing happening.
  • 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 is now completed 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 the same conversation can be continued 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 been tidied 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. It now asks for confirmation, and has moved away from the panel's close button, where it was easily mistaken for it.
  • 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 instead of formatted text.
  • Fixed an issue where the AI Assistant could create a duplicate object instead of updating an existing one, when that object had been renamed, moved or edited after the assistant first created it.
  • Fixed the AI Assistant showing an error and failing to respond when connected to a custom (OpenAI-compatible) provider using certain thinking/reasoning models. Requests that rely on tools, such as listing measures or running a DAX query, now work with these models.

Coming from Tabular Editor 2.x?

Watch this video to get a quick tour of the main features in Tabular Editor 3. Also, make sure to check our onboarding guide.

Tabular Editor 3 major features overview:

  • Fully customizable IDE, with multi-monitor, Hi-DPI support and themes
  • New powerful DAX code editor with auto-complete, syntax checking, code folding and much, much more
  • *Workspace mode, allowing you to save your changes to disk and synchronize model metadata to Analysis Services simultaneously
  • *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 Schemas on both Provider and Structured Data Sources (yes, even for M queries!)
  • Create data model diagrams
  • Create DAX scripts that allow you to edit multiple measures or other calculated objects in a single document
  • Record C# scripts and save as macros (formerly known as "Custom Actions")
  • VertiPaq Analyzer integration
  • DAX debugger
  • DAX Optimizer integration
  • Code Actions to easily refactor your DAX.

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


Don't miss a new TabularEditor3 release

NewReleases is sending notifications on new releases.