Docs menu

MCP operation reference

Find the current operation, its parameters and its action limits.

Free and Pro actions · Checked against this release

The catalogue has 313 declared operations. Descriptions and C# parameter contracts come from the same release. The running server supplies its JSON schema to your client. Permission and entitlement can depend on the selected action and target. Read the full description before a write.

313 operations

Primer and learning

accept_primer_suggestionApply one already-reviewed suggestion to its fixed Primer section and preserve its source provenance in the Markdown.

Human approval is required before this call, and a suggestion with needsReview=true (a lesson you wrote that no person has approved) is refused here: the person accepts it in Model notes. The accepted source id is recorded so it cannot resurface. To write directly without suggestion automation, use set_model_primer.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
idstringYesNoneThe suggestion id from list_primer_suggestions, after the user approved its exact proposed Markdown.
add_insightRecord one actionable lesson, a distilled insight or a root cause.

Insights are the user'S own data: plain append-only JSONL (.semanticus/knowledge/insights.jsonl for project scope, ~/.semanticus/knowledge/ for global), readable without us, never rewritten. Give deterministic match keys (rule ids, gate signatures, error types, op names, domain tokens) so recall can find it. Write-gated (ssgm): it lands 'pending' (held out of recall) until approve_insight, unless the auto-approve setting is on, which defaults to true for single-user local mode (set knowledge-settings.json {"autoApprove": false} to force review). Whatever you record is never 'approved': it lands 'unreviewed' (or 'pending'), untrusted and needsReview=true, until a person approves it in Model notes. Recall returns it marked untrusted, as data not instruction, and it reaches the Primer only when the person accepts it. Text that looks like an instruction to skip checks or swap models is never auto-approved: it stays pending, lists under status=pending, and keeps its untrusted marker even once a person approves it. fingerprintScoped=true pins it to the current model's shape (needs an open model); false = a user-level lesson that travels across all models.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
textstringYesNoneThe insight: one actionable sentence to a short paragraph
keysstringNonullDeterministic match keys: rule ids, gate signatures, error types, op names, domain tokens
kindstringNo"insight"'insight' (default) or 'post-mortem' (a failure's root cause)
scopestringNo"project"'project' (default, beside this model) or 'global' (travels across all your models)
fingerprintScopedboolNofalseTrue = scope to the current model's fingerprint (surfaces only on matching shapes); false = applies everywhere
approve_insightRelease a pending insight so it can be recalled.

From you it never makes an insight 'approved' or trusted: the result is status 'unreviewed', untrusted, recalled only as data, until a person approves it in Model notes. No-op-safe on an insight that is already released.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
idstringYesNoneThe insight id (ki-xxxxxxxx) from list_insights
delete_insightMark an insight as deleted. The log keeps it.

It vanishes from the live set and recall. Prefer downvote for a lesson that merely lost relevance.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
idstringYesNoneThe insight id (ki-xxxxxxxx)
downvote_insightReduce an insight's importance counter by one.

When the score falls to 0 the insight is materialized out of the live set (the delta trail is kept, nothing is erased). Use it to retire a lesson that stopped applying.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
idstringYesNoneThe insight id (ki-xxxxxxxx)
edit_insightRefine an insight's text and/or match keys, a delta append (the store is never rewritten; constraint against context collapse).

Provide new text and/or keys; omit one to leave it unchanged.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
idstringYesNoneThe insight id (ki-xxxxxxxx)
textstringNonullNew text (omit to keep the current text)
keysstringNonullNew match keys (omit to keep the current keys)
get_model_primerRead the open model's single project orientation document.

It is plain Markdown in a .semanticus/primers sidecar, beside the model (travels in source control) for a disk model, or in the workspace for a live/local connection, and always uses six fixed sections: Overview, Business context, Gotchas, Patterns, Known issues, History. Read this before model work for the declared business context and known traps. Read-only.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

list_insightsList the live insight set with counters (score/uses/retrievals) and provenance (who/when/session/source-runs).

Filter by scope ('project'|'global'; omit for both) and/or status ('pending' = held out of recall, 'unreviewed' = recalled as untrusted data, 'approved' = a person approved it). Reports the count of any corrupt JSONL lines it skipped. The store never bricks. Read-only.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
scopestringNonull'project' | 'global'; omit for both
statusstringNonull'pending' | 'unreviewed' | 'approved'; omit for all
list_primer_suggestionsList approved, model-scoped learning as proposed edits to the open model's fixed Primer sections.

Free on any tier. Each proposal carries the source lesson id, capture time and source-run provenance, and needsReview=true when you wrote the lesson and no person has approved it yet (only the person can accept those, in Model notes). This never changes the Primer. Show the proposal to the user, then call accept_primer_suggestion only after explicit approval or reject_primer_suggestion to dismiss it.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

purge_knowledgeRemove all saved insights in the selected scope.

Dry run by default: confirm=false returns how many live insights would be erased and changes nothing; confirm=true appends a purge marker so everything before it in that scope becomes invisible on replay (the file is not rewritten).

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
scopestringNo"project"'project' (default) or 'global'
confirmboolNofalseFalse (default) = dry-run count; true = actually purge
recall_experienceBefore starting work on the open model, recall prior experience for this model shape.

The engine computes the model's fingerprint, reads both scopes' released insights (status approved, or unreviewed and marked untrusted), and returns a deterministically-ranked candidate set (key-term overlap with your query + same-shape fingerprint bonus + importance score + temporal decay), each with why it matched (matchedKeys). This is retrieval, not judgment: you do the semantic ranking over the candidates and decide what applies. Returns the fingerprint too, and says so plainly when there is no prior experience for this shape. Needs an open model.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
querystringNonullOptional query: what you are about to do (e.g. 'optimize a time-intelligence measure'); its terms drive the lexical key-overlap ranking. Omit to rank by fingerprint + score + recency alone.
maxResultsintNo12Max candidates to return (default 12)
reject_primer_suggestionDismiss one suggested update for this model without changing the Primer.

The source learning remains in the hidden learning store, while this model records the rejection so the same suggestion does not keep resurfacing.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
idstringYesNoneThe suggestion id from list_primer_suggestions.
set_model_primerReplace the open model's declared orientation document with reviewed Markdown.

The document must keep exactly six second-level sections in this order: Overview, Business context, Gotchas, Patterns, Known issues, History. Stored beside the model in .semanticus/primers so it travels in source control without changing the model definition. Show the user the proposed edit before writing.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
markdownstringYesNoneThe complete Primer Markdown, including the six required ## section headings in their fixed order.
upvote_insight+1 an insight's importance counter (ExpeL: the engine counts, you judge).

An insight that keeps proving useful ranks higher and resists decay.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
idstringYesNoneThe insight id (ki-xxxxxxxx)

Tests and evidence

add_interview_questionSave a question to the model's interview pack so it replays as a regression check on every future edit (and as the 'interview_replay' workflow verify kind).

Run_interview grades an inline question without saving, and both are free. Fields by tier: 'value': query (a full evaluate, e.g. evaluate row("v", calculate([Total Sales], 'Date'[Year]=2024))) + expectedValue (the trusted number, confirmed by the user or a verified answer) or expectedMatrixJson (rows, order-insensitive); 'paraphrase': scalarExpr + paraphraseExpr (the same question answered two ways as scalar expressions, not evaluate queries) with optional groupBy/filters for a per-context proof; 'refusal': just the question. It asserts the model cannot answer it, so an assistant that produces a number is confidently wrong. fixRuleId maps a failure to the AI-readiness rule that prevents it (a data-table fallback applies when omitted). seedSource records where the question came from ('user' | 'claude' | 'verified-answer'). Validation is fail-loud so a saved question is always runnable.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
questionstringYesNoneThe natural-language question, verbatim (e.g. "What were total sales in 2024?")
tierstringNo"value"'value' (default) | 'paraphrase' | 'refusal'
querystringNonullValue tier: the full evaluate query that answers the question
scalarExprstringNonullParaphrase tier: the first phrasing's scalar DAX
paraphraseExprstringNonullParaphrase tier: the second phrasing's scalar DAX
groupBystringNonullParaphrase tier: group-by columns for the equivalence matrix (e.g. ['Date'[Year]])
filtersstringNonullParaphrase tier: optional filter args applied to the whole comparison
expectedValuestringNonullValue tier: the trusted scalar answer (a number or text; the literal blank records 'the right answer is no value': blank never equals 0). Numbers compare under the house tolerance max(1e-6 abs, 1e-9 relative)
expectedMatrixJsonstringNonullValue tier: the trusted row set as JSON, e.g. [["2023","1200.5"],["2024","1310.0"]] (order-insensitive)
expectRefusalboolNofalseRefusal tier: true = the model cannot answer this (implied by tier 'refusal')
fixRuleIdstringNonullThe AI-readiness rule id that prevents this failure (optional: a {tier,outcome} data table is the fallback)
seedSourcestringNonullWhere the question came from: 'user' (default) | 'claude' | 'verified-answer' | 'hard-pack' (the latter two are what list_interview_seeds proposes)
scopestringNo"project"'project' (default, beside this model) or 'global'
idstringNonullOptional id of an existing question to replace in one step. Omit to create.
clear_table_source_mappingForget one model table's SQL source mapping.

The row-count check then goes back to reading the table's own partition, which is where it was before anyone mapped it. Returns false when that table had no mapping. Changes no model object and needs no deploy.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
tablestringYesNoneThe model table to unmap (a name or 'table:Name')
delete_interview_questionRemove a saved question from the pack (a delta-append tombstone: the JSONL is never rewritten, the history stays).

Use it to retire a question whose business definition changed. Free.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
idstringYesNoneThe question id (iq-xxxxxxxx) from list_interview_questions
delete_testDelete a saved test definition by id (list_tests shows ids).

Returns false when the id wasn't present. Ambient checks cannot be deleted: they derive from the model; to clear a failing integrity check, fix the data it measured.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
idstringYesNoneThe definition id to remove.
export_test_reportExport the latest successful run as portable Markdown plus one sealed evidence artifact in canonical JSON and self-contained html.

Returns {markdown, json, html, contentHash, note, error}; JSON is the record of truth, html is its deterministic human view, and contentHash detects any later change. The report includes model and environment context, grade with coverage, hard gates, root causes before detailed evidence, measure reconciliation rows only for failing measures, time-intelligence variant evidence, and relationship counts and rates. It never exports a run from a different model: if no current-model run exists, call run_tests and retry. Read-only.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

get_evidenceOpen one current-model record from list_evidence as canonical JSON plus its deterministic self-contained html view.

The engine re-verifies the signature and html pairing before returning it; invalid evidence is refused with the exact reason. Read-only.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
idstringYesNoneEvidence id from list_evidence
get_test_runOpen one recorded run in full (list_test_runs gives the ids).

Returns the run's health plus every check it decided: each saved definition, each relationship check and each table row count, with its verdict, the answer it was agreed against, what it actually got, the difference, its own words, the settings it ran with (the query it asked, the filter it applied, the tolerance it allowed and the SQL source it resolved to, all as they were at execution time, never re-read from today's definition), and its filter-context rows capped at the number the report shows with the uncapped count beside them. This is how a run from weeks ago can still be read: list_test_runs is a summary and deliberately carries none of it. A run recorded before outcome recording was added comes back with its totals and a note saying outcomes were not recorded then. Read-only.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
runIdstringYesNoneThe recorded run's id, as shown by list_test_runs.
get_unmatched_rowsThe unmatched key values behind a relationship's orphan count.

A relationship check reports how many fact rows point at a missing lookup key; this answers which ones. Returns one row per distinct many-side key value the one-side table does not have, with how many many-side rows carry it, biggest first, capped at 200 (the cap is disclosed when it hides more). The question asked is character-for-character the one the check counts, so the list and the count can never disagree. It reads current data through the live model, so run after a recorded check and the data may have moved since that check was measured; the note says so. Needs a live connection. Agent calls pass the standard QueryData permission gate, because this is the same row-returning query path. Read-only.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
relationshipstringYesNoneThe relationship's name exactly as a run reported it, e.g. 'Sales[CustomerKey] -> Customer[CustomerKey]'.
limitintNo200How many key values to return, capped at 200 (default 200).
list_evidenceList the sealed Test and Workflow evidence saved with the open model under .semanticus/evidence/<model-identity>.

Each item includes type, producer, verdict with coverage, content signature, paths, and verification state. A changed or conflicted record remains listed as invalid and is never trusted or hidden. Read-only. Next: get_evidence(id) to review one; save_evidence(source) to explicitly retain the latest Test report or a terminal Workflow run.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

list_interview_questionsList the open model's saved interview question pack: each question with its tier ('value' = answer vs a trusted number; 'paraphrase' = the same question asked two ways must agree; 'refusal' = the model cannot answer it and the honest outcome is declining), its recorded oracle, and the last graded outcome (Correct | Refused | SilentlyWrong | Unverified).

Packs are bound to the model they were authored against, so questions is this model's pack only; otherModelQuestions and unattributedQuestions (legacy, saved before binding, in a shared store) are surfaced separately and are not run against the open model. The pack lives in plain JSONL (.semanticus/interview/questions.jsonl beside the model; '~/.semanticus/interview/' for scope 'global'): the user's own data. Reports the count of any corrupt lines it skipped (the store never bricks). Free, read-only.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
scopestringNonull'project' | 'global'; omit for both
list_interview_seedsReady-made question candidates from two deterministic sources: (1) the model's own verified answers (the definition files beside an on-disk model, parsed read-only + fail-soft since the format is observed-not-documented: each usable one yields its trigger question, alternative phrasings, and the fields it references; unusable ones are counted as skipped with the reason) and (2) the built-in hard-question pack (~a dozen model-agnostic templates from the trap families AI most often answers confidently wrong: rank with ties, year-to-date under a text date attribute, rolling 12-month distinct counts, prior full period, share of total, semi-additive closing balances, same-period-last-year, retention cohorts, weighted averages, inactive-relationship totals, blank-vs-zero, grand-total additivity).

Pack templates bind only to objects that exist (a marked date table, a measure to target, related dimensions...); every unbindable template is listed as skipped with the exact missing shape. no candidate carries a trusted answer and none is fabricated: run the candidate's query, have the user confirm the number, then save it with add_interview_question (expectedValue = the confirmed number; the literal blank records a no-value answer; seedSource 'verified-answer' | 'hard-pack'). Free, read-only.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
sourcestringNonull'verified-answers' | 'hard-pack'; omit for both
measurestringNonullHard pack only: the measure name to bind templates to (default: the first visible measure, disclosed in each candidate's targets)
list_table_mappingsEvery table in the model, where its row count is read from, and how the last count went.

This row is the table-count check: there is no saved-test kind for a table count, and mapping a table with set_table_source_mapping is the same action as adding one. 'source' says where the coordinates came from: 'mapping' (a person chose a saved SQL source for this table), 'endpoint' (the model's SQL endpoint, with the schema and table read from the table's own partition), 'detected' (read from the table's own partition, when the model has no endpoint) or 'none'. 'canCount' false means 'reason' says in plain words what is missing, for example a table that is not mapped yet, a mapping that does not name a schema and table, an ambiguous source, or a source that has been removed. 'editable' is true for every table that could be counted, so a table with no source at all still has a row to point at a source. The last outcome (lastVerdict, lastMessage, lastModelCount, lastSourceCount, lastRunUtc) comes from the last run in this session and is absent when nothing has been counted yet, which is its own state and never a pass or a failure. Counts that differ without proven matching snapshots stay 'couldn't check'. Read-only. Next: set_table_source_mapping to point a table at a saved source, run_tests to count.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

list_test_runsThe persisted run history for this model (chronological, fingerprint-filtered): each run's health only (grade + coverage together, verdict tallies, root-failure count), never the per-check detail, which get_test_run returns for one run at a time.

The drift-trend substrate: compare health across runs to see a suite degrade before a user does. Read-only.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
lastintNo20How many most-recent runs to return (default 20).
list_testsThe saved test definitions (.semanticus/tests/suite.jsonl beside the model): id, kind ('measureReconcile', 'measureValue', or 'rowLevelAssertion', which is stored but not run yet), title, target binding and enabled state.

Definitions bind by LineageTag when present, or by a stable tests-sidecar identity for a valid tagless object. A vanished or ambiguous target reports missing on the next run, never a silent pass. Ambient checks are not listed here because they derive from the model on every run_tests. Unreadable lines are counted, never thrown. Read-only. list_sql_source_usage shows which checks use each SQL source.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

record_test_runRecord a run that has already finished, exactly as it finished.

Nothing is executed: this writes the snapshot of the run named by runId (its health, every check's outcome with expected/actual/difference, its model, environment, scope and duration) to the run history, and get_test_run opens it later. This is the operation to use for "save the run I am looking at": run_tests(persist=true) also records, but it records the run it just executed, which is a different run against data that may have moved. Only a full run can be recorded, so the stored history compares like with like; a partial run is refused with a plain note. Recording the same run twice keeps one snapshot. Runs are remembered for the last few of this session, so record the one you just ran. Read-only with respect to the model.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
runIdstringYesNoneThe id of a run this session already finished, as returned by run_tests.
review_reconcile_mappingInspect how a saved SQL-vs-DAX reconciliation maps its measure to Fabric SQL.

Returns the detected endpoint/database plus every candidate model table with schema/entity, and echoes the effective endpoint after optional overrides. Detection follows the measure's dependency tables; multiple reachable SQL sources are reported ambiguous and never guessed. testConnection=true performs only select 1 against the effective endpoint/database (it does not run or change the human-accepted SQL); agent calls use the standard QueryData approval gate. Suggested next action is returned on refusal/failure. Read-only.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
requestReconcileMappingRequestYesNoneThe measure plus optional connection override: {measureRef, server?, database?, authMode?, tenantId?, testConnection?}.
run_interviewGrade one question deterministically: the engine executes the recorded DAX live, compares against the recorded oracle, and returns Correct | Refused | SilentlyWrong | Unverified with plain evidence.

High precision by design: offline, an erroring query, a truncated comparison, or a missing oracle all come back Unverified: never a fabricated pass, never a fabricated 'wrong'. Pass questionId (from list_interview_questions; the outcome is also recorded on the saved question) or inlineJson (the same fields add_interview_question takes: a one-off, nothing persisted). An inline value-tier question may omit the oracle: it executes and comes back Unverified with the computed number in the detail: the confirm-and-record flow for seed candidates (confirm the number with the user, then add_interview_question with expectedValue; persistence still requires the oracle). Refusal tier: pass abstained=true if you (honestly) declined to answer, or attemptDax with the DAX you produced: producing any answer to an unanswerable question is the failure being caught. On SilentlyWrong the result carries fixRuleId + a plain fixHint naming the readiness fix that prevents it. Needs a live connection for the value/paraphrase tiers (open_live/open_local). A saved questionId that belongs to a different model (or is unattributed) is refused: its oracle was authored against another schema, so grading it here would be misleading.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
questionIdstringNonullA saved question's id (iq-xxxxxxxx) from list_interview_questions
inlineJsonstringNonullA one-off inline question as JSON (same fields as add_interview_question), e.g. {"question":"…","tier":"value","query":"evaluate row(…)","expectedValue":"123.45"}
abstainedboolNofalseRefusal tier: true = the assistant declined to answer (the honest outcome)
attemptDaxstringNonullThe DAX the assistant produced for this attempt: overrides the stored query (value tier), or proves an attempt was made (refusal tier)
run_testsRun the model's whole test suite and get graded health.

Zero-setup ambient checks run on every model: per-relationship integrity (live: six data probes: orphaned foreign keys, duplicate/blank keys, row counts; an invalid relationship reparents orphans onto the hidden blank row so totals still tie while every per-member breakdown is silently wrong: any integrity Fail caps the grade at D) plus SQL-backed table row counts. Role filters and interview questions are not checked here, because reading a role's saved filter text cannot prove which rows a user sees; run_interview grades interview questions. Saved definitions (list_tests) run too: measureReconcile defs execute the full SQL-vs-DAX reconciliation. Verdicts: Pass | Fail | Suspect (downstream of a sibling failure, its root cause named, not a second failure) | NotVerifiable (couldn't check: offline, refused, insufficient coverage. never counted as a pass and never graded). read Health.Grade with Health.CoveragePct: the grade scores only what was decided; coverage says how much that was; RootFailures is the number that matters. Offline runs the checks it can decide without data and reports the rest NotVerifiable: connect_xmla/connect_local for the full run. scope: omit only and sections to run everything. The sections you can run are 'measures' (the saved checks), 'relationships' and 'tableCounts', and each one runs only itself: asking for relationships does not open a SQL connection, and asking for table counts does not probe relationships. An empty only or sections list is refused (it asks for nothing), and so is a section with no evaluator behind it. Agent-origin data probes are governed by the standard QueryData permission gate. persist=true also appends the run to history. Read-only.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
persistboolNofalseAlso append this run's health to .semanticus/tests/runs.jsonl: the drift-trend history. A partial scope cannot be recorded.
onlystringNonullOptional saved-test ids to run. Omit to run every saved test. A partial list never mints a grade and cannot be recorded.
sectionsstringNonullOptional section names to run: measures, relationships, tableCounts. Omit for every section. Any other name, and an empty list, is refused with a plain note rather than quietly ignored. A partial list never mints a grade and cannot be recorded.
save_evidenceExplicitly save an engine-owned artifact with the open model for source control and team review.

Source='tests' saves the latest current-model Test report; source='workflow' saves a terminal Workflow run (sourceId may be omitted for the latest). The engine regenerates and verifies the artifact itself, then atomically writes canonical JSON plus matching html under .semanticus/evidence/<model-identity>. Re-saving the same source is idempotent. Nothing is written by export alone.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
sourcestringYesNone'tests' for the latest Test run, or 'workflow' for a terminal Workflow run
sourceIdstringNonullTerminal workflow run id; omit for tests or the latest workflow run
save_testCreate or update a saved test definition (upsert by id; omit id to create).

Kind='measureReconcile': paramsJson carries the ReconcileRequest (sql, groupBy, required blankPolicy, tolerances; see reconcile_measure, which is the same runner one-off), and filterDax narrows the DAX side the way the visual that produced it was narrowed (the SQL is never rewritten: narrow it yourself). kind='measureValue': paramsJson carries the MeasureValueRequest, where filterDax narrows the measure and expressionDax tests DAX the model does not hold yet (a scalar expression, or a complete evaluate query run verbatim) instead of the bound measure's own formula. Pass targetRef; the engine binds by LineageTag when present and otherwise creates a stable tests-sidecar identity so valid tagless measures follow renames. The returned bindingWarning is non-null if a name fallback was unavoidable. ground truth is ai-drafted, human-accepted: show the user the SQL and get acceptance before saving. A saved test is the user's suite, not the assistant's guess.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
defTestDefinitionYesNoneThe definition: {id?, kind, title, targetTag?, targetIdentity?, targetRef?, paramsJson?, enabled?, authoredAgainst?, authoredAgainstLabel?}. Prefer targetRef and let the engine choose the durable binding. authoredAgainst/authoredAgainstLabel record which Tests-and-queries connection the check was agreed against and are stamped from the live connection when you omit them; they never pin where the test runs.
set_table_source_mappingPoint one model table at a named SQL source and the table inside it, so the ambient row-count check knows where to count.

Without a mapping the check reads whatever the table's own partition reveals, and a table whose partition does not say enough reports 'not mapped to a SQL source yet' with nothing to fix it. Pass the model table, a sqlSourceId from list_sql_sources, and the schema and table name in the source. The mapping wins over anything detected from the model, replaces any mapping that table already had, and is stored with the model's test data (.semanticus/tests/) so it travels with the model. It supplies where to count, never a verdict: counts that differ without proven snapshot alignment stay 'couldn't check', not a failure. Next: run_tests to count, clear_table_source_mapping to undo it.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
tablestringYesNoneThe model table to map (a name or 'table:Name')
sqlSourceIdstringYesNoneSource id from list_sql_sources
schemastringNonullThe schema in the source, e.g. 'dbo'
entitystringNonullThe table name in the source, e.g. 'fact_sales'
try_testRun one unsaved test definition once and return its outcome.

Writes nothing to the suite. kind='measureValue' checks a measure against a trusted number; kind='measureReconcile' is the SQL-vs-DAX reconciliation. Offline the outcome is NotVerifiable. To see one measure's values across many contexts without a pass or fail, use probe_measure.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
defTestDefinitionYesNoneThe unsaved definition: {kind, title, targetRef?, paramsJson?}.

Change plan and verified edits

add_plan_itemAdd a custom change to the plan (an incremental edit, or a DAX rewrite you want verified before applying).

Kind is the operation: set_dax | set_description | set_measure_format | set_summarize_by | set_column_hidden | set_data_category | rename | set_synonyms | set_relationship_crossfilter | mark_date_table | set_ai_instructions (model-level: objRef is the model, after = the instructions text) | set_ai_data_schema (objRef a measure/column/table, after = 'Excluded' or 'Included') | delete (remove the object) | delete_if_unused (remove only if unused_objects' safe verdict still holds at apply time, recomputed server-side, else the item is skipped with the reason). An identical pending item (same ref+kind+target+after) is deduped: the existing item is returned, not re-added. For a set_dax rewrite, pass verifyGroupBy so apply_plan proves equivalence (and skips the item if results change). A set_dax item without verifyGroupBy is added as 'proposed' (opt-in, like a rename). It will not be applied unless you explicitly approve it via set_plan_item, and if applied it goes in unverified. Nothing is mutated until apply_plan. The change also appears on the Model Plan (get_model_plan) as a line on the item it serves, or on a new item owned by the assistant when no item serves it, so a person reads it in one list with everything else.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
objRefstringYesNoneObject ref, e.g. 'measure:Sales/Total Sales'
kindstringYesNoneOperation kind, e.g. 'set_dax', 'set_description', 'rename'
afterstringNonullThe proposed value (DAX/description/new name/etc.)
titlestringNonullShort human title for the change (optional)
verifyGroupBystringNonullFor set_dax: summarizecolumns group-by matrix to verify equivalence over, e.g. ["'Date'[Year]"]
verifyFiltersstringNonullFor set_dax: optional table filters for the verify matrix
apply_planExecute the approved subset of the change plan as one undoable transaction.

Only approved items are applied. Passing approvedIds narrows the approved set (it never applies rejected/proposed/needs_content items). DAX rewrites carrying a verify matrix are proven equivalent first and skipped if they'd change results or can't be proven; renames apply last. Returns a report: applied/skipped/failed counts + before→after BPA violations and AI-readiness grade. A single undo reverts everything; re-run propose_plan to iterate the tail. This is approve-all over the changes the Model Plan groups under its items: it applies every change you have approved, wherever it sits, in one step. It is the batch tool, so it applies what it can and reports what it could not; to approve one item's changes all-or-nothing instead, quoting the digest of exactly what you read, use model_plan_action(id, 'approve', digest).

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: critical.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
approvedIdsstringNonullItem ids to apply (e.g. ['ci-0001','ci-0002']); null/empty = all approved items
overrideIdsstringNonullPlan item ids to apply even though their equivalence verdict is failed/unprovable: requires overrideReason; each shipped override is recorded
overrideReasonstringNonullWhy you are shipping items past a failed/unprovable equivalence verdict: required to override; recorded in the model's append-only audit trail
apply_plan_itemsRun the plan, or apply several reviewed items of the model plan at once, as one undoable step.

To run the plan, pass no items and the plan's readyDigest from get_model_plan: every row whose doer is semanticus and whose stateWord is ready is applied in plan order, renames last, and a row with no changes worked out yet has them worked out and applied in the same step. It is refused with 'The plan moved since you read it. Read it again.' when the ready rows changed after your read, including a hold, a doer switch or a skip that did not move the model. A row that waits for another row is never in the batch; it turns ready on your next read. The cleanup row is the person's, so it is never in the ready set, and a cleanup line that is ticked only as a suggestion (its changeSet line says suggested: true) is never applied here until the person ticks, unticks or edits it. A row it cannot take (changes out of date, every change dropped) and a removal whose object is in use by the time the batch reaches it are left out and named in 'skipped'; the rest applies. Otherwise pass every item you want applied with the changeSet.digest the plan showed for it. Every kept line of every listed item goes in one batch: one undo puts all of them back. It is all or nothing across the whole list: if any item's digest is not the one on the plan, if any item is out of date, or if any kept line cannot be made, nothing is changed and the reply names the item and the line that stopped it. The one exception is a removal whose object is in use by the time the batch reaches it: it is left out and named in 'skipped', and the rest applies. An item whose changes are already in is not applied a second time. Lines you dropped are left out, as with model_plan_action('approve'), and an item with every line dropped adds nothing. Semanticus Pro: applying several items at once is running the plan, so a free session is refused and nothing is changed. On free, approve each item on its own with model_plan_action('approve'), which is free for a row that is yours or your assistant's to do and is the same check on one item. The answer is short and comes first: 'sentence' (what changed, and what was left out and why), then 'skipped' (what it left out, each with its reason; when that list is too long for the answer, 'skippedNote' counts the rest and says where they are), 'rows' (the new state of the rows it touched), 'readyDigest' (quote it to run the plan again) and 'counts' (rows in each state). It is not the plan: get_model_plan reads that.

Entitlement: Pro. The operation map admits the entry point, but its automatic Plan run refuses Free sessions. Release class: supported. Risk class: critical.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
itemsPlanItemDigestNonullThe items to apply: each is { id, digest }, the item id from get_model_plan and the changeSet.digest it showed. Leave empty to run the plan with readyDigest.
readyDigeststringNonullThe readyDigest get_model_plan showed. With no items, runs every row that is ready for Semanticus, and is refused if the ready rows moved since that read.
capture_baselineValue-capture at edit-start (run this before a risky structural edit: rename, retype, relationship change, delete, M rewrite).

Freezes the measured values of the object's blast radius (the lineage-downstream measures, evaluated by reference over the summarizecolumns(groupBy) grid you supply) into a session-held baseline, and returns a captureId. After the edit, compare_baseline re-evaluates the same grid and reports exactly which numbers moved. Pass representative groupBy columns: a grand-total-only baseline is thin evidence (disclosed in the result). Over-cap measures are listed in Skipped, never silently dropped. certified totals (month-end close): pass a label (the period, e.g. "close fy26 · July") to also persist this capture beside the model as a certified baseline: one control total per call (objRef = the measure, filters = its stated context, includeDependents:false), all under the same label. That certified set survives the session, so a later refresh or edit that moves a signed-off number is caught by compare_baseline(label:…). needs a live connection (a baseline is measured values, not metadata).

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
objRefstringYesNoneThe object you are about to change, e.g. 'column:Sales/Amount', 'measure:Sales/Total Sales', 'table:Sales'
groupBystringNonullGroup-by columns forming the evidence grid, e.g. ["'Date'[Year]", "'Product'[Category]"]. Representative coverage is what makes the later compare meaningful. For a certified total, leave empty (a single number at a stated context).
filtersstringNonullTable filters applied to the whole grid. For a certified total, these are the stated context, e.g. ["'Date'[Fiscal Year]=\"fy26\"", "'Date'[Month]=\"July\""].
includeDependentsboolNotrueAlso capture every lineage-downstream measure (the blast radius). false = only the ref itself (must be a measure). Use false for a certified control total.
maxMeasuresintNo25Cap on captured measures (overflow reported in Skipped)
labelstringNonullCertified-totals label (month-end close): the period, e.g. "close fy26 · July". When set, the capture is also persisted beside the model under this label so it outlives the session (merge-by-ref across calls). Omit for an ordinary session-only baseline.
clear_planDrop every proposed change.

Nothing in the model changes: a proposal never wrote anything. This is cancel-all over the changes the Model Plan groups under its items, so every item goes back to having nothing worked out for it. To drop one item's changes instead, use model_plan_action(id, 'cancel').

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

compare_baselineThe edit-end half of capture_baseline: re-evaluates a captured baseline's grid on the live model and reports per measure whether its numbers are unchanged, moved (with the exact contexts and before→after values), or missing (the measure no longer resolves.

That is an impact, not a skip). Safe=true only when everything is unchanged, nothing is missing/errored, and coverage wasn't truncated, honesty first. important: it reads the live model, so run it after the edit is deployed (deploy_live). An undeployed local edit is not validated (the result discloses session edits since capture). certified totals (month-end close): pass a label instead of a captureId to re-check that period's persisted certified figures. Each is re-evaluated at its stated context and reported held / moved (old→new) / missing / not-checkable, so drift from what was signed off is named. Detection, not prevention: it cannot stop a refresh or an out-of-tool edit, only report what moved. The verdict is recorded in the Verified Edits audit trail. needs the live connection.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
captureIdstringNonullThe captureId from capture_baseline (omit for the most recent session capture)
labelstringNonullCertified-totals label (month-end close): re-check the persisted certified figures signed off under this period, e.g. "close fy26 · July". Takes precedence over captureId.
export_verified_editsExport the model's audit trail as a shareable report: 'md' (default) for a human-readable markdown summary (boss/auditor) or 'json' for the raw serialized chain (ci/tooling).

Free, read-only.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: critical.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
formatstringNo"md"Output format: 'md' (human markdown, default) or 'json' (the serialized chain for ci)
get_planGet the current change plan: every proposed item with its before→after, source (deterministic/bpa/ai), risk, status, and a summary.

Use it to see what still needs content (status 'needs_content') and what is approved/ready to apply. These are the same changes the Model Plan groups under its items (get_model_plan), as one flat list: this is the change-by-change view, that is the by-goal view, and there is one set of changes behind both.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

get_plan_historyThe model's History, newest first: every edit with who made it (By: you, assistant, semanticus, workflow), what it changed with before and after values (secrets and Power Query text hidden), and what it served (Cause: a plan item, workflow run, draft or task, whose edits nest under one parent row); Plan decisions that changed nothing; saved and restored versions; finished workflow runs with their report.

Each row says whether it is Undoable (pass its Id to undo_change toEntry), how many later changes that would also take back (LaterCount), its Verified word, and whether it is from before this session (never undoable). Filters: by, objectRef (one object), before (a row's When, to page back), limit (default 50). Kept=false means the model has nowhere to keep history yet (save it) and it lasts this session. Free. Read-only.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
bystringNonullOptional: only rows by 'you', 'assistant', 'semanticus' or 'workflow'.
objectRefstringNonullOptional: only rows that touched this object, e.g. 'measure:Sales/Total'.
beforestringNonullOptional: only rows older than this When (iso time from an earlier page).
limitintNo50Optional: how many rows, default 50, at most 500.
get_verified_modeIs Record verified edits on?

This tool keeps its older name so existing assistants and scripts still work. The switch only adds an audit record: every DAX write (update_measure, apply_dax_script, and creating a measure, calculated column, calculated table, calculation item or function) is checked offline whether it is on or off, and malformed syntax, arity problems and unknown table, column or measure references are refused before anything is written. When on, each single-object DAX write that passes is also recorded in the Verified Edits audit trail (list_verified_edits). The record states validity only, not an equivalence or drift proof. Session-scoped (resets on reconnect). 'available' is always true: Record verified edits is free.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: critical.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

list_verified_editsRead the append-only, hash-chained audit trail persisted on the model: every verified op (or accountable override) with its verdict, evidence, and any override reason, in chain order.

Each record links the previous by hash, so the trail self-checks: ChainIntact=false (with FirstBrokenSeq) means a record was edited, removed, or reordered after it was written. Read-only, free.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: critical.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

propose_planAnalyse the model and assemble a change plan (a 'pull request for your model') without mutating anything: deterministic safe fixes + BPA auto-fixes are fully specified; AI-content items (descriptions, formats, names, synonyms) come back as a work queue with grounding for you to fill via set_plan_item.

Review with get_plan, then apply_plan applies the approved items as one undoable transaction. scope null = whole model; 'table:Name' = just that table. Everything you propose here also lands on the Model Plan (get_model_plan), filed under the item whose family and objects it serves, and a change no item serves opens an item of its own owned by the assistant. So this is the flat list of the same changes the Model Plan groups by goal, not a second list of different work.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
scopestringNonullScope: null/empty = whole model, or 'table:Name' for one table
includeAiboolNotrueInclude AI-content items (descriptions/names/formats/synonyms) you must fill; default true
maxAiItemsintNo40Max AI-content items to queue (default 40)
set_plan_itemFill an AI-content plan item with your authored value (and/or approve/reject it).

Authoring a value moves the item to 'approved', except the opt-in kinds (rename, set_dax without a non-empty verify matrix, set_m), which land on 'proposed' after any value revision (even one made after an approval: the consent covered the old value) and need an explicit approve. e.g. set_plan_item('ci-0007', after='Total revenue recognised in the period.'). Use get_plan to see item ids + grounding first. this is also how you keep and drop one line of a Model Plan item's change set: approved=true keeps the line, approved=false drops it, and the item's changeSet.digest changes either way, so an approval given before you dropped a line can no longer be honoured. The line's planItemId on get_model_plan is the itemId to pass here. Keeping and dropping change nothing in the model and are free on every tier. Touching a line this way is what makes a cleanup line that arrived ticked as a suggestion (suggested: true) the person's own, and apply_plan from your door does not apply an untouched suggested line.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
itemIdstringYesNonePlan item id from get_plan, e.g. 'ci-0007'
afterstringNonullThe authored value (description text, format string, new name, comma-separated synonyms, or DAX); null to only approve/reject
approvedbool?NonullTrue to approve, false to reject, null to leave as-is
set_verified_modeTurn Record verified edits on or off.

This tool keeps its older name so existing assistants and scripts still work. It does not change what is refused: every DAX write is checked offline either way (malformed syntax, arity problems and unknown table, column or measure references are refused before anything is written). When on, each single-object DAX write that passes (update_measure and creating a measure, calculated column, calculated table, calculation item or function) is also recorded in the Verified Edits audit trail (list_verified_edits). The record states validity only, not an equivalence proof. This is the human's audit switch, free on any tier.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: critical.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
onboolYesNoneTrue = turn Record verified edits on, false = turn it off

Living plan

add_plan_targetRefused to you: aims and tasks are the person's to add, remove and mark done, so this answers with that sentence and changes nothing.

Ask the person to add it in Semanticus. What it does from their side: add one line to what this model should become. The plan already carries an aim per goal read off the rules; this adds the person's own, in their own words, and it is free on every tier because a target is their intent and not work the product did for them. The target appears in 'targets' on get_model_plan marked source 'you', and as one item in the section you file it under, in state 'target', owned by you, with the sub line 'nothing exists yet'. That item's diff is empty on purpose: nothing in the model matches the target yet, so the plan does not know the change and will not invent one. Where the item points is worked out from your own words by the same local word matching route_ask uses, and when the words name no clear place the item carries no link rather than a guessed one. Typing the same target twice is one target, refiled under whichever goal you named last. Changes nothing in the model. Kept beside the model's other settings, so it travels with the project; a model that was never saved and is not live has nowhere to keep it and says so.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
textstringYesNoneWhat this model should become, in your own words, one line, e.g. 'every measure has a description and a check'
sectionstringYesNoneWhich goal it serves: Structure, Meaning, Numbers, Trust or Ship
claim_requestTake one task the person gave you.

Refused, with a sentence, while the person has paused tasks for you, while the task is paused, while it waits for another row on the Plan (the sentence names it), or when someone else holds it; the first claim wins. On success the result carries a 'claimToken' (shown once, keep it for complete_request or decline_request) and the task's packet: the words, the note, the brief, the objects, how done is known, and the grounding for each object. While you hold a claim, your edits count toward the task you claimed most recently; claiming a task you already hold switches back to it. Changes nothing in the model. A restart of Semanticus releases every claim, and the task is offered again.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
requestIdstringYesNoneThe task id from list_assistant_requests, e.g. 'pt-3f9a01c2'
complete_requestSay a task you hold is done, with an optional reply the person sees on the Plan.

A task Semanticus can check (words on named objects, a finding that should be gone) then reads 'Applied, checking' until the model proves it; a task only you can answer reads Done. Needs the claimToken claim_request gave you; an old or wrong token is refused and nothing changes. Completing the task clears it as your working-on task. For an ordinary task, make the edits first, then complete: completing changes nothing in the model. For a part of a draft (its brief says what to write), 'text' is the part: Semanticus checks it against the draft in the same call, and a failure keeps your claim, names each failed check and counts a try (the third hands the part to the person). The model changes only when the last part of an approved draft passes: then the draft's change runs as one undo step. For a step of a draft that you do (its brief says so), 'text' is the step's changes: a JSON list of {"op", "args"} from the change ops (create_measure, set_description and the rest), checked and applied as one undo step; send [] when the step needs no change.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
requestIdstringYesNoneThe task id
claimTokenstringYesNoneThe claimToken from claim_request
textstringNonullOptional. Your reply, in plain words, shown to the person on the Plan. Up to 4000 characters.
decline_requestHand a task you hold back to the person because you could not do it.

The reason is required and is shown to them word for word; the task then reads 'Needs you' and they can give it to you again or set it aside. Needs the claimToken claim_request gave you. Clears it as your working-on task. Changes nothing in the model. For a part of a draft you may add 'choices': the person sees your reason and one button per choice that names a real object.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
requestIdstringYesNoneThe task id
claimTokenstringYesNoneThe claimToken from claim_request
reasonstringYesNoneWhy it could not be done, in one line.
choicesstringNonullOptional, for a part of a draft: 2 to 6 object refs the person can pick from, e.g. ['column:Returns/Quantity', 'column:Returns/RefundAmount']. Only refs that name a real object, or one the draft creates, are kept.
get_model_planThe plan for the open model: everything worth doing to it, in value order, grouped by goal (Structure, Meaning, Numbers, Trust, Ship).

Each item carries the plain reasons it is there, the exact change it would make, what it touches, who does it (runs on its own, needs you, needs your assistant) and where to go to do it by hand. The plan is worked out fresh from the model every time it is asked for, so it can never disagree with the model. Items keep the same id as long as they are about the same thing. With no suggestion service, or on a free session, the same plan comes back in the order the rules found it, with no scores on it; 'orderedBy' says which you got. On Pro the value order is not there at once either: after a change, the first reads come back in rule order while Jev works the plan out ('jevPending' true, and 'orderedBy' says so), and the value order arrives on a later read, once Jev's own rows have landed and the ranking has been asked. Read again rather than assume the order you got is the value order. An item's reasons describe the work and never repeat one rule's message once per finding: one sentence for what was found and why it matters, one naming up to four examples and counting the rest, and one for what fixing it earns, however many findings are behind it. An item's 'diff' is the change itself, one line per case; it is empty when the change depends on a choice only the person can make, and 'touches' then says 'no change until you choose'. An empty diff never means there is nothing to do, and a finding restated is never a diff line. Each item's 'tables' says, per table, how many of the objects it touches are in that table, a short phrase naming that table's own cases, and that table's own change lines, so you can answer 'what is left on Sales' without re-reading the whole plan. 'history' is the plan's story, newest last, each entry carrying a kind (drawn, redrawn, done, started, skipped, unskipped, refused, proposed, approved, cancelled), who did it (you, assistant, plan, engine), the item, the revision and the detail lines. Each item also carries 'state' (target, gap, proposed, applied, done, skipped), which is how far along the propose, review, approve road it is, as distinct from 'status', which is whether the work can be acted on; applied means the change set landed and done means the gap is gone, and applied always comes first because nothing stamps done, the absence of the gap does. An item with changes worked out carries 'changeSet': every line with its before, its after, where it came from, and a 'kept' flag you turn on and off with set_plan_item; a 'digest' over the lines and the model revision they were worked out against, which model_plan_action('approve') makes you quote so you can only ever approve exactly what you read; 'refused', what was looked at and deliberately left out, with the reason; the cleanup row is a suggestion list for keeping the model lean: every unused column is a line, each with a reason, the ones Semanticus suggests arrive kept with suggested: true and the rest arrive dropped, and the person reviews the list before anything is removed; and 'stale' with a plain reason when the model or the file moved after the lines were worked out, in which case the changes are shown and never silently re-applied. Every row also carries three separate facts: 'source' (found, jev, words, you, workflow, repeat), 'doer' (semanticus, you, assistant; Jev is a source and never a doer) and 'stateWord' (done, set_aside, checking, on_it, paused, waiting, needs_you, ready), which the engine works out, with 'stateNote' beside it; also 'doneWhen' and 'doneText' (how done is known), 'objects', 'held', 'order' (your place in the person's order, on their tasks for you), 'note', 'reply', 'claim' and 'originLink'. 'who', 'status' and 'state' stay for one more release and are deprecated. Each row carries reads, writes, footprintKnown and waitsFor; a row with waitsFor waits for those rows. 'assistantQueue' is 'paused' when the person has paused tasks for you. Rows with ids starting 'pt-' are the person's tasks: adding one, pausing, reordering, changing who does it, the switch and notes are theirs to do in Semanticus, and no tool here does them. A plan too large to read in one result comes back short, and no read is ever more than 40,000 characters, on any model: each row with its state and its counts (touches), its detail left out ('detail' lists, per row, whether its detail is shown, how many lines it holds and where its next page starts), what a row waits for as the ids of the first few and a count (waitsForCount), and 'history' cut to the newest few entries with their first lines (detailNote says how many there are in all). On a plan with very many rows the rows themselves are cut to what fits, the reasons first and then the rows at the end of the list, and detailNote says how many are here. Pass item = a row's id to read that row's lines, tables, objects and every row it waits for, a page at a time (offset = that row's detail.next until it is null, max lines per page); item = rows to read the rows a page at a time (offset = the row to start at, max rows); item = history to read the plan's history a page at a time; or item = history/N to read entry N's lines a page at a time, when a history entry ends with '... and N more lines'. A plan that fits comes back whole. Reads only: nothing here changes the model. get_plan is the same changes as one flat change-by-change list, not different work.

Entitlement: Free findings in rule order. Pro adds ranking through the permitted advice points. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
itemstringNonullA row id from this read, to read that row in detail: its lines, its tables, its objects and every row it waits for, a page at a time. Or 'rows' (the rows a page at a time), 'history' (the plan's history a page at a time), or 'history/N' (one history entry's lines a page at a time). Leave empty for the plan.
offsetintNo0With item: where this page starts (a row's detail: 0, then that row's detail.next; rows: the row number to start at; history: the entry; history/N: the line)
maxintNo0With item: most lines of each list (or most rows, or history entries) on this page (default 40, at most 200). A page also stops at 40,000 characters, so it can hold fewer.
get_next_actionsThe three most valuable things to do to this model right now: the top of the plan, with the same reasons and the same ids.

This is the same list get_model_summary shows under its suggestions, so the two can never disagree. Reads only.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

get_words_queueThe Plan row 'Give the words to your assistant' from one call, a page at a time: every open description, business-name, synonym and AI-instructions finding on the open model, plus each measure whose format Semanticus cannot prove and leaves for you to choose, ordered by how much each one raises the AI-readiness grade (a finding that holds the grade under a cap comes first, then the most score points; a lift is what that one fix adds alone now).

The best-practice format findings that remain (a rule such as INTEGER_FORMATTING or PERCENTAGE_FORMATTING that wants an exact pattern, on a measure the plan will not write a format to itself) come last, each with the pattern the rule asks for in its message and no lift: set it with set_measure_format if it suits what the measure holds. Each item names the tool to use (set_description, rename_object, set_synonyms, create_linguistic_schema when the model has no synonym schema yet, set_ai_instructions, or set_measure_format), the object, what the rule asks, the points it adds; the page's 'grounding' holds each object's DAX, table and sibling names once, under the objectRef of its items. A page holds at most 40 items and at most 40,000 characters of JSON, whichever comes first, so a model with long measures gives fewer per page. Total and Kinds count the whole queue on every page; call again with offset = Next until Next is null. Read only: it writes nothing. Semanticus writes no words itself; you author them, and the Plan checks they land.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
maxintNoLocalEngine.WordsPageDefaultMost items on this page (default 40, at most 100). A page also stops at 40,000 characters, so it can hold fewer.
offsetintNo0Where the page starts in the whole list: 0, then the Next of the page before
list_assistant_requestsThe tasks the person has given you on the Plan that are ready now, in their order, plus the ones you already hold and the ones not offered yet with the row each waits for.

Each request carries its id (the task id, 'pt-...'), the person's words, their note, the brief a Send carried, the objects, how done is known, and 'independent': true when it changes nothing another offered task touches, so you can take it beside them; a task Semanticus cannot read says so and is never called independent. 'switch' is 'paused' when the person has paused tasks for you: then nothing is offered, and you carry on with what they ask you directly. Reads only. Take one with claim_request.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

model_plan_actionAct on one item of the model plan.

Five actions. 'propose' works out the exact changes for that item and attaches them to it, and writes nothing: the row then carries every line with its before and after, a digest over them, and the model revision they were worked out against (get_model_plan with item = the row's id reads them); this answer carries the row's state and that digest. 'approve' applies the lines that are kept, all of them or none, in one undoable step, and you must quote the digest the plan showed you, so you can only ever approve the exact diff you read; it refuses if the model moved, if the file on disk moved, or if the lines changed after you read them, and if any kept line cannot be made the whole set is put back and nothing is changed. 'cancel' drops the worked-out changes and writes nothing. 'start' is the older single step: run a safe-fix row straight away with no review. 'done' is the person's: marking an aim or a task done is refused to you with a sentence (they do it in Semanticus); finish a task they gave you with complete_request instead. Keep and drop one line with set_plan_item (approved true or false) between propose and approve. Free on every tier: reading, propose, keep, drop and cancel. Semanticus Pro: start, and approve on a row the engine runs for you (who=auto), because that is the same run by another name. Approve on a row that is yours to do is free. Not every item can propose: descriptions are words and go to your assistant, and a row where the rules have an opinion and you have the answer names the page to decide it on instead of pretending to a change. The way back from an approve is one undo step on this session, not a durable checkpoint, and the result says so. The answer is short and comes first: 'sentence' (what changed, and what was left out and why), then 'skipped' (what it left out, each with its reason; when that list is too long for the answer, 'skippedNote' counts the rest and says where they are), 'rows' (the new state of the rows it touched), 'readyDigest' (quote it to run the plan again) and 'counts' (rows in each state). It is not the plan: get_model_plan reads that.

Entitlement: Free for manual rows. Pro is required for actions on rows Semanticus does for you. Read each action below. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
idstringYesNoneThe item id from get_model_plan
actionstringNo"start"Propose | approve | cancel | start | done
digeststringNonullRequired for 'approve': the changeSet.digest the plan showed for this item. It covers the lines and the model revision they were worked out against, so an approve of anything but exactly what you read is refused. Ignored by every other action.
remove_plan_targetRefused to you: aims and tasks are the person's to add, remove and mark done, so this answers with that sentence and changes nothing.

What it does from their side: take one target they added off the plan, and the item it became with it. Only the targets marked source 'you' can be removed; the aim per goal that comes from the rules is derived from the model on every call and is not yours or anyone's to delete. Takes either the target's own id or the id of the item it became, because you are shown both. Free, and it changes nothing in the model. To say you finished a target rather than that you no longer want it, use model_plan_action with action 'done' instead, which leaves it on the list marked done.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
idstringYesNoneThe target id from 'targets' on get_model_plan, or the item id, e.g. 'target/every-measure-has-a-check'
route_askWork out which part of Semanticus answers a question asked in ordinary words, and answer the question itself when the engine's own numbers already do.

It only ever names a place to go; it never runs anything and never changes anything. The first pass is word matching and needs no permission: the plain nouns and verbs each page is about are matched locally, nothing is sent anywhere, and a clear winner is answered on the spot with 'asked' false. Only a question the words cannot place is sent on, and only then does permission for this model matter. When a create word is recognised, 'create' names the thing being made. The words place a line on 'askdata' (Ask your data, where ask_data answers it) with no permission needed when it splits a number by something ('units per brand', 'customer count by city') or uses the page's own words ('total sales by region', 'top 10 products'); a line that only names a field ('what were sales last month') is placed only when permission lets the service be asked, and otherwise reads the no-match line. The same words can be a task and a question, and nothing here decides that for the person: whenever a line is placed on 'askdata', the answer carries both readings and neither is hidden. 'reading' names the top one, 'task' or 'question', and its place is on 'tool', 'area', 'confidence' and 'sentence' as usual; 'other' carries the second one, with its own 'kind', 'tool', 'area', 'confidence' and 'line' to show. order: the question reading is first only when the line plainly asks, which is read from the words of the line alone and never from what placed it. A line plainly asks when it ends in a question mark, opens with what, which, how, why, when, who or where (after a softening 'please', 'can you' or 'could we'), opens with 'show me' or 'list', or opens by asking for Ask your data by name ('ask your data please', 'go to ask your data'). Every other line reads the task first with Ask your data as the named second choice, the examples above included: 'total sales by region' reads task first. The task reading names the page the words say the work is done on, or no page at all, which is ordinary for a task and is exactly what the Plan's row shows for the same words; the person's Enter in the Plan's field keeps the words as a task whichever reading came first. confidence belongs to the reading it sits on: 'confidence' is the top reading's and 'other.confidence' the second one's. A reading the words or the engine's own numbers decided is 1, a reading the service decided carries the service's own number, and a task reading that names no page is 0. The service decides only the page it names: one page other than Ask your data (a single reading, on top), or the question reading on Ask your data, which sits on top or on 'other' by the order rule. So where 'asked' is true and the question is second, the service's number is 'other.confidence' and the top reads no tool at 0; that answer has a 'reading', which a line the service left unplaced does not. When nothing matches, 'fallback' is 'menu', 'sentence' is the plain line a person is shown and 'reason' carries why it went no further, which is for you and not for them. This is a Semanticus Pro feature; a session without Pro is refused before any word is matched.

Entitlement: Pro: Ask about this model. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
textstringYesNoneWhat the person typed, in their own words, e.g. 'why is my margin measure wrong'
skip_model_plan_itemSet one thing on the plan aside, with a reason.

It stays on the plan, marked as set aside and showing the reason, so the next person to read it knows it was a decision rather than something missed. The reason is required. Kept beside the model's other settings, so it travels with the project and not with the person. Changes nothing in the model. The answer is short and comes first: 'sentence' (what changed, and what was left out and why), then 'skipped' (what it left out, each with its reason; when that list is too long for the answer, 'skippedNote' counts the rest and says where they are), 'rows' (the new state of the rows it touched), 'readyDigest' (quote it to run the plan again) and 'counts' (rows in each state). It is not the plan: get_model_plan reads that.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
idstringYesNoneThe item id from get_model_plan, e.g. 'safefix/Visibility'
reasonstringYesNoneWhy you are setting it aside, in your own words. Shown on the plan beside the item.
unskip_model_plan_itemPut an item that was set aside back on the plan as ordinary work, and forget the reason it was set aside.

Changes nothing in the model. The answer is short and comes first: 'sentence' (what changed, and what was left out and why), then 'skipped' (what it left out, each with its reason; when that list is too long for the answer, 'skippedNote' counts the rest and says where they are), 'rows' (the new state of the rows it touched), 'readyDigest' (quote it to run the plan again) and 'counts' (rows in each state). It is not the plan: get_model_plan reads that.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
idstringYesNoneThe item id from get_model_plan

AI readiness

ai_readiness_scanScore the open model A to F for AI readiness, meaning how well Copilot and Fabric data agents can use it.

It returns the overall grade and 0-100 score, per-category scores, coverage KPIs and the reasons any hard gate holds the grade down. detail='summary' adds the total finding count and counts by severity, fix kind and top rule, with no findings list, and stays small on any model. detail='full' (the default) also returns the findings in priority order, each tagged SafeFix (a deterministic fix exists), AiContent (you write it) or Proposal (a person should review it). live=true adds the live cardinality rules: it reads each column's distinct-value count (columnstatistics) from the connected model and checks the Copilot index limits (scale-qna-index, the 5,000,000-value index ceiling, and scale-hicard-column). live=true needs a live connection (connect_xmla or connect_local) and is refused without one. The filters narrow only the returned findings; scores and counts always cover the whole model, and a filter given with detail='summary' is refused. Read-only.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
detailstringNo"full"Full (the default: scores plus the findings) or summary (scores and counts only)
liveboolNofalseTrue = also run the live cardinality rules on the connected model (needs a live connection)
categorystringNonullOnly return findings in this category (e.g. 'Naming'). Null/empty = all categories.
severityMinstringNonullOnly return findings at this severity or higher: Info|Medium|High|Critical. Null/empty = all.
maxFindingsintNo0Cap the returned findings to this many (0 = no cap, the default). Capping is opt-in so findings are never hidden silently.
apply_fixApply the deterministic fix for one finding on one object, as one undoable change.

System='bpa' fixes a Best Practice Analyzer violation that bpa_scan marks CanAutoFix, for example a bi-directional relationship made single, or SummarizeBy set to None on a key column. system='air' fixes an AI-readiness SafeFix finding: vis-fk (hide a foreign-key column), fmt-summarize and summarize-dimension (SummarizeBy None), cat-geo (geographic data category), dim-primary-name (mark the column that names each row of a dimension as its row label). A finding with no deterministic fix is refused; get its instruction from get_fix_prompt with the same system, rule and object.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
systemstringYesNoneWhich rule system: 'bpa' (Best Practice Analyzer) or 'air' (AI readiness)
ruleIdstringYesNoneRule id from bpa_scan or ai_readiness_scan, e.g. 'vis-fk' for air
objRefstringYesNoneObject ref the finding is on
apply_safe_fixesApply every deterministic fix for one rule system as one undoable batch, then return what changed and the new scorecard.

System='air' applies the AI-readiness safe fixes: hide foreign-key columns, set SummarizeBy to None on key, relationship and identifier columns, set geographic data categories, and mark each dimension's row label. It renames nothing and writes no content. system='bpa' applies every Best Practice Analyzer auto-fix, repeating until a pass changes nothing, so a fix that creates another finding is cleared in the same call. For system='bpa', read 'unfixed' before you report the model clean: it lists each auto-fixable finding still present with the reason it survived (including one left alone because the person accepted the same change under another rule), and 'remaining' is how many. The batch did everything it said only when remaining is 0. A data type change, and a key on a table that already has one, are left for the person: they stay in 'unfixed' with the reason, and apply_fix still makes them one at a time. Content findings, and naming findings that need a new name, are left alone; get_fix_prompt covers those. For the readiness fixes plus a queue of content to write, use make_model_ai_ready.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
systemstringYesNoneWhich rule system: 'bpa' (Best Practice Analyzer) or 'air' (AI readiness)
create_linguistic_schemaCreate the model's linguistic schema: the synonym store Copilot and data agents read, which also holds the AI instructions and the AI data schema.

Seeds a culture's linguistic metadata; it does not change the Power BI Q&A setting. Call once before set_synonyms. Pass null culture for the default (en-us). On an existing schema it self-heals: entities bound to hidden or deleted objects are pruned, and any visible-name collisions Copilot can't tell apart are surfaced as a warning.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
culturestringNonullCulture id (e.g. 'en-us'), or null for default
get_ai_instructionsRead the model's Prep-for-AI AI instructions (the lsdl 'CustomInstructions' string set_ai_instructions writes): the text, its length vs the 10,000-char cap, and the culture read.

Read-only. Call before editing instructions so an append/update doesn't clobber what's already there.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
culturestringNonullCulture id (e.g. 'en-us'), or null for default
get_custom_rulesList the custom (user-authored) rules embedded on the model, both kinds: BPA rules (BestPracticeAnalyzer annotation) and AI-readiness rules (Semanticus_ReadinessRules annotation), plus the valid readiness Category list and the supported Scope vocabulary.

Read-only; the manage view behind the Studio 'Custom rules' panels.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

get_fix_promptGet a ready-made instruction for fixing one finding that has no deterministic fix: which tool to call and what to write, with the rule and the object's context.

System='bpa' covers Best Practice Analyzer violations. system='air' covers AI-readiness content findings such as desc-measure, name-column, fmt-measure and syn-field, and includes grounding (DAX, table, sibling names). Read-only; it changes nothing.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
systemstringYesNoneWhich rule system: 'bpa' (Best Practice Analyzer) or 'air' (AI readiness)
ruleIdstringYesNoneRule id from bpa_scan or ai_readiness_scan, e.g. 'desc-measure' for air
objRefstringYesNoneObject ref the finding is on
get_groundingGet grounding context for an object (name, table, DAX expression, format string, existing description, sibling names) so you can author a high-quality business description or a clearer name.

Call this before set_description.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
objRefstringYesNoneObject ref, e.g. 'measure:Sales/Total Sales' or 'column:Customer/City'
load_rulesSave custom rules on the model, from a file path, an http(s) URL or inline JSON.

They travel with the model, the load is undoable, and they add to the built-in rules without ever replacing them. replace=false merges with the model's existing custom rules by id; replace=true makes them exactly this set. system='bpa' takes the standard BPARules.json schema: an array of {ID, Name, Category, Severity, Scope, Expression, FixExpression?, Description}. system='air' takes AI-readiness rules: {ID, Name?, Category (an existing readiness category: Naming, Descriptions, Synonyms, Relationships, Visibility, Formatting, CopilotLimits, DataAgentConfig or BestPractice), Severity? (Info, Medium, High or Critical; default Medium), Scope (the BPA scope words, such as Measure, Column, Table), Expression (the violation test, in the BPA expression language), AppliesTo? (the population; an empty population leaves the rule dormant), Message?, Description?, FixKind? (None, AiContent or Proposal; SafeFix is refused)}. Readiness rules are checked against the open model before anything is written, a built-in rule id is refused, and a custom rule cannot set a hard gate. Preview first with validate_rule, list what is saved with get_custom_rules, clear with reset_rules. Returns the new rule counts.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
systemstringYesNoneWhich rule system: 'bpa' (Best Practice Analyzer) or 'air' (AI readiness)
sourcestringYesNoneA file path, an http(s) URL, or inline JSON array of rules
replaceboolNofalseFalse = merge with the model's existing custom rules; true = replace them
make_model_ai_readyApplies every deterministic AI-readiness safe fix (the same set as apply_safe_fixes) as one undoable batch, then returns the new scorecard plus a prioritized work queue of up to maxQueue AI-content findings (accepted ones left out, and so is any change the person declined by accepting another finding about the same thing; do not make a change that is not in the queue), each with its grounding (DAX, table, sibling names).

It writes no descriptions, names or synonyms itself: the queue is for you to author with set_description, rename_object or set_synonyms, or to stage for review with propose_plan.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
maxQueueintNo40Max AI-content items to return with grounding (default 40)
reset_rulesRemove every custom rule of one system from the model, so scans use only the built-in rules again: the bundled Power BI set for system='bpa', the built-in readiness rules for system='air'.

Undoable.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
systemstringYesNoneWhich rule system: 'bpa' (Best Practice Analyzer) or 'air' (AI readiness)
set_ai_data_schemaInclude or exclude a field (measure/column/table) from the Prep-for-AI 'AI data schema': the focused field set Copilot/data agents reason over.

Included=false excludes it (marks it Hidden in the lsdl); included=true restores it. Excluding noise (keys, sort/helper columns, intermediate measures) sharpens AI answers without hiding the field from report authors. Auto-enables the linguistic schema if needed; round-trip verified, live, a single undoable step. caveat: for a deployed model the lsdl edit syncs only after a model refresh. Persist with save_model. On Pro the Plan can propose these choices as rows (the ai.schema point, what Copilot sees); this op is the same change done by hand.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
objRefstringYesNoneObject ref, e.g. 'measure:Sales/Total Sales', 'column:Sales/CustomerKey', 'table:Bridge'
includedboolYesNoneTrue = include in the AI data schema; false = exclude (mark Hidden)
culturestringNonullCulture id (e.g. 'en-us'), or null for default
set_ai_instructionsSet the model's Prep-for-AI AI instructions: business context, terminology and analysis rules that guide Copilot/data agents (stored on the model as the lsdl 'CustomInstructions' string).

Pass empty/null to clear. Max 10,000 chars (the service ignores anything beyond; the call is rejected if over). Auto-enables the linguistic schema if needed; the write is round-trip verified, live in the shared session, and a single undoable step. caveat: for a deployed model an lsdl edit syncs to the service only after a model refresh. It is not instant. Persist to disk with save_model.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
instructionsstringYesNoneThe AI instructions text (<=10000 chars); empty/null clears them
culturestringNonullCulture id (e.g. 'en-us'), or null for default
set_synonymsSet the synonyms (alternate words users might say) for a measure/column/table, e.g.

Total Sales -> ['revenue','turnover','sales amount']. Auto-enables the linguistic schema if needed. Helps Copilot and data agents map natural language to the right field. The list replaces the object's own synonyms: a word left out is removed. The object's name term and Power BI's own generated words are kept, except what Power BI still records from an old name, which a list that leaves it out clears. Hidden targets are refused, and entities bound to hidden or deleted objects are pruned automatically. Two visible fields that read as the same word do not make a write fail; the readiness scan reports them as a Copilot ambiguity.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
objRefstringYesNoneObject ref, e.g. 'measure:Sales/Total Sales'
termsstringYesNoneSynonym terms
culturestringNonullCulture id, or null for default
validate_ruleCompile + test-run a custom rule (or a whole set) against the open model without saving: the authoring preview for both rule kinds.

Kind='bpa' or 'readiness'; rules = inline JSON (one rule object or an array, the same schema the matching load op accepts). Per rule you get: compile errors from the real expression parser (with the failing position), the would-be Applicable population, the violation count, the first few flagged object names, and a dormant flag (empty population = the rule would never move a score). Save with load_rules (system='bpa' or 'air') once valid.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
kindstringYesNoneWhich rule system: 'bpa' or 'readiness'
rulesstringYesNoneInline JSON: one rule object or an array of rules

Lineage and impact

analyze_cloud_reportsReport-aware safe-to-remove over cloud (published) reports: the Measure-Killer headline against the live service.

Fetches each report's pbir via the Fabric 'Get Report Definition' API, reconciles its field usage to the open model by name, and recomputes safe-to-remove excluding any field a report uses. reportIds empty = every non-paginated report in the workspace. Behaviour is read-only (Semanticus never modifies the report), but getDefinition requires a write-capable Fabric scope (Item.ReadWrite.All / Report.ReadWrite.All) + the Contributor role, so you must pass consent=true to acknowledge that (tell the user first). Per-report failures (paginated/rdl, a report blocked by an encrypted sensitivity label, a download error) are reported as unreadable with a reason, never silently dropped, so 'safe' is never overstated. A model must be open and must be the one these reports bind to.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: deferred. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
workspaceIdstringYesNoneWorkspace (group) id the reports live in
reportIdsstringYesNoneReport ids to analyze; empty = every non-paginated report in the workspace
consentboolNofalseMust be true to acknowledge getDefinition needs a write-capable Fabric scope + Contributor role (behaviour stays read-only)
authModestringNo"azcli"Azcli (default) | serviceprincipal | interactive | devicecode
tenantIdstringNonullOptional Entra tenant id or domain (cross-tenant / guest override; default = the signed-in tenant)
cancellationTokenCancellationTokenNodefault
analyze_reportsReport-aware lineage (the safe-to-remove gap-closer): parse one or more local Power BI report definitions in pbir format (a PBIP '<Report>.Report' folder, its 'definition' folder, a .pbip file, or a project root) and return which model fields each report uses, plus a safe-to-remove sweep that excludes anything a report uses.

This closes the model-only blind spot where a descriptive column a report displays (but no measure references) wrongly looks unused. Report field references are reconciled to the open model by name (the model must be the one the reports bind to). Offline (local files); the cloud 'Get Report Definition' path will reuse the same parser. Legacy .pbix / rdl are not parsed yet (reported as unreadable → result stays model-only with a caveat).

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
pathsstringYesNoneLocal pbir report path(s): a '<Report>.Report' folder, a 'definition' folder, a .pbip file, or a PBIP project root.
check_reportsRead the reports chosen for this model and keep what each one uses, so impact_assessment, unused_objects, remove_safe_objects and the apply-time recheck all answer from the same reading.

Ids empty = every chosen report. Local report folders need no sign-in. A published report needs consent=true: reading its definition asks Fabric for permission that can also edit reports, even though Semanticus only reads it. A report that cannot be read is reported as couldNotBeFullyChecked with the reason, never silently dropped, so 'no use found' is never overstated.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
idsstringNonullChosen report ids to read; empty = every report chosen for this model
consentboolNofalseMust be true to read a published report: the sign-in asks for permission that can also edit reports. Semanticus uses it only to read.
authModestringNonullAzcli (default) | serviceprincipal | interactive | devicecode. Published reports only.
tenantIdstringNonullOptional Entra tenant id or domain. Published reports only.
cancellationTokenCancellationTokenNodefault
get_lineageRead-only lineage graph of the open model (offline, from tom): every node (data source, table, column, measure) and every directed edge: source→table (resolved from partition M / shared expressions), table→column/measure (contains), dependant→dependency (DAX), and FK→PK (relationship).

Use it to trace where a field comes from and what flows from it. note (Phase 1): model-only. Published-report field usage is not yet included (see .Caveat).

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

impact_assessmentCompose the deterministic change assessment before editing, renaming, restructuring or removing one model object.

Returns the transitive tom blast radius, the affected reports and visuals from this model'S report scope (set_report_scope + check_reports), the current-model saved checks to run afterwards, what was checked and every gap as a plain sentence, one verdict token, and the exact next op. scope='modelAndReports' is the honest default: with no report checked it returns Unknown/NeedsReview, never green, and the next op is check_reports. scope='model' deliberately proves only model-internal impact. modelImpact holds the model's own blast radius: every DAX dependent, plus for a column the relationships, hierarchies and sort-by columns that use it, each with its depth, and counts by kind. scope='model' returns only that half. reportPaths folds a local report folder into the scope for this one call. Free and read-only; it omits report contents and does not apply the change.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
objectRefstringYesNoneObject ref from search_model or get_lineage
intentstringNo"change"Change, rename, remove, or restructure
scopestringNo"modelAndReports"ModelAndReports (default) or model
reportPathsstringNonullOptional local pbir project/report definition paths that form the explicit report review scope
list_report_scopeWhich published reports and local report folders this model's answers are checked against, and what came of reading each one.

State per report: checked | couldNotBeFullyChecked | notChecked | needsChecking (the model changed after the report was read). The choices are saved with the model and come back on reopen as notChecked, because a saved choice is not evidence that anything was read; the check results live in this session. impact_assessment, unused_objects, remove_safe_objects and the apply-time recheck of a delete_if_unused plan item all read this same scope. Free and read-only.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

list_reportsList the published reports in a Fabric/Power BI workspace (id, name, datasetId, reportType, webUrl) via the non-admin per-workspace path.

The datasetId tells you which reports bind to a given semantic model. Match it to the open model to find the reports that use it. reportType 'PaginatedReport' = rdl (its field usage can't be parsed). Live read against api.powerbi.com using your Entra identity. Read-only. Pair with analyze_cloud_reports to close the safe-to-remove blind spot using real published-report usage.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
workspaceIdstringYesNoneWorkspace (group) id
authModestringNo"azcli"Azcli (default) | serviceprincipal | interactive | devicecode
tenantIdstringNonullOptional Entra tenant id or domain (cross-tenant / guest override; default = the signed-in tenant)
cancellationTokenCancellationTokenNodefault
remove_safe_objectsThe safe-to-remove sweep's act half: delete the verified-safe objects (unused measures/columns) as one undoable transaction.

The safe set is recomputed server-side and each item re-verified at apply time. An item whose status changed since your scan (something now references it) is skipped with the reason, never deleted stale. refs (optional) narrows the sweep to those candidates from unused_objects/analyze_reports; omit to remove every currently-safe item. A 'visibleAttribute' item is never swept, named or not; its skip reason names the reviewed route that does remove it. reportPaths (optional, local pbir, same forms as analyze_reports) makes the verification report-aware, so a field a report displays is never removed. Returns removed[] / skipped[{ref,reason}] / count; writes one audit record with the evidence; undo_change reverses the whole sweep in one step.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
refsstringNonullOptional candidate refs (e.g. 'measure:Sales/Old Total'); omit/empty = every currently verified-safe item. A 'visibleAttribute' ref skips here; the reason names the route that removes it.
reportPathsstringNonullOptional local pbir report path(s): verification then also requires each item to be unused by these reports
set_report_scopeChoose the reports this model is checked against.

Replaces the whole list. Each choice is either kind='published' (with workspaceId, reportId and name, from list_workspaces + list_reports) or kind='local' (with path: a Power BI project (.pbip) or its .Report folder; pbix is not supported). Saves the choice beside the model; nothing is read here, so every choice comes back as notChecked until check_reports runs. Read the reports with check_reports.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
choicesLineage.ReportScopeChoiceYesNoneThe whole chosen set. An empty array clears the list.
unused_objectsRead-only reverse safe-to-remove sweep (the 'Measure Killer'): every measure/column that no model object references, a deletion-candidate list.

Conservative: a column used by a relationship, hierarchy, sort-by, or RLS is never listed. Verdict per item: 'safe' (nothing references it), 'usedByUnusedOnly' (referenced only by other unused/dead objects, surfaced with BlockedBy), 'caution' (a report reading could not rule it out), 'visibleAttribute' (a visible column of a dimension table with no model reference: people query by it in reports, Q&A and Copilot, so a sweep never takes it. That is not a refusal of the person: a reviewed removal still removes it, through add_plan_item kind 'delete_if_unused' + apply_plan, or delete_object). It reads this model's report scope (set_report_scope, check_reports): with no report chosen it is a model-only sweep, so a field used only by a published report still appears as 'safe'; when every chosen report has been checked, fields those reports use are excluded; while any chosen report is still unchecked, every would-be 'safe' item comes back as 'caution'. .Caveat names the basis the list carries.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

Object authoring

apply_dax_scriptApply an edited DAX script (the 'dax' output of script_objects, with '// @object <ref>' headers) back to the model: each block's expression is set on its object in one undoable batch.

Lets you bulk-edit many measures/calc columns/calc items in one document and commit together. All-or-nothing: a missing ref or invalid DAX refuses the whole script and writes nothing. Returns {applied[], skipped[]}.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
scriptstringYesNoneThe DAX script text (with // @object <ref> headers, as produced by script_objects format='dax')
apply_tmdlApply edited output from script_objects(format='tmdl') back to the model in place.

Existing table/role documents and individually scripted measures round-trip through tom's native partial-update path in one undoable batch. Measure ownership is pinned by the emitted // @object ref; changing its header/parent is refused (use rename_object/create_measure for structural changes). A brand-new top-level object is skipped (use its typed create op). Returns {applied[], skipped[]}.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
scriptstringYesNoneTMDL text produced by script_objects: top-level table/role documents or sentinel-owned measure blocks
create_calculated_columnAdd a DAX calculated column to a table.

Returns the new ref ('column:Table/Name'). Undoable.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
tableRefstringYesNoneTable ref or name
namestringYesNoneColumn name
expressionstringYesNoneDAX expression
create_calculated_tableCreate a DAX calculated table (its single partition is a DAX expression, e.g.

A date dimension or bridge). Returns the table ref ('table:Name'). Undoable.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
namestringYesNoneTable name (unique)
expressionstringYesNoneDAX table expression, e.g. 'calendarauto()' or "summarize(Sales,Sales[Region])"
create_calculation_groupCreate a calculation group (a special table).

Add calculation items with create_calculation_item. Requires compatibility level >= 1470. Returns the new ref ('table:Name'). Undoable.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
namestringYesNoneCalculation group name (unique)
create_calculation_itemAdd a calculation item to a calculation group.

The expression typically uses selectedmeasure(), e.g. 'calculate(selectedmeasure(), datesytd(...))'. Returns the new ref. Undoable.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
calcGroupRefstringYesNoneCalculation group ref or name, e.g. 'table:Time Intelligence'
namestringYesNoneCalculation item name
expressionstringYesNoneDAX expression (usually wraps selectedmeasure())
create_columnAdd a data column (a physical/source column) to a table.

DataType: String|Int64|Decimal|Double|DateTime|Boolean (default String). sourceColumn is the underlying physical column name (defaults to the column name). Returns the new ref ('column:Table/Name'). Undoable.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
tableRefstringYesNoneTable ref or bare table name, e.g. 'table:Sales' or 'Sales'
namestringYesNoneColumn name
dataTypestringNo"String"String | Int64 | Decimal | Double | DateTime | Boolean
sourceColumnstringNonullUnderlying physical/source column (defaults to name)
create_data_agentCreate a new (empty draft) Fabric data agent: data_agent.json + a minimal draft stage_config with aiInstructions.

Dry run by default: commit=false returns the exact request and changes nothing; commit=true creates it. aiInstructions capped at 15000 chars.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: experimental. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
workspaceIdstringYesNoneTarget workspace id
namestringYesNoneData agent display name
aiInstructionsstringNonullAI instructions for the agent (<=15000 chars; empty allowed)
commitboolNofalseFalse = dry run (default, sends nothing); true = create
authModestringNo"azcli"Azcli (default) | serviceprincipal | interactive | devicecode
cancellationTokenCancellationTokenNodefault
create_data_sourceCreate a structured (M) data source pointing at a Fabric SQL endpoint / Lakehouse-or-Warehouse SQL analytics endpoint (protocol 'tds').

Needs compatibility level >= 1400. Referenced by name from create_directlake_table or inside an M expression. Returns the data source name. Undoable. (Credentials are supplied out-of-band at refresh. None are stored here.).

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
namestringYesNoneData source name (unique), e.g. 'FabricSql'
serverstringNonullServer, e.g. 'xxxxx.datawarehouse.fabric.microsoft.com'
databasestringNonullDatabase / Lakehouse / Warehouse name
create_directlake_tableCreate a direct lake table backed by a Fabric Lakehouse/Warehouse entity (Parquet/Delta, no data copy).

Needs compatibility level >= 1604. Bind it to a source created first with create_named_expression (M to the SQL endpoint) or create_data_source (structured), referenced by name. Returns the table ref ('table:Name'). Undoable.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
namestringYesNoneTable name (unique)
entityNamestringNonullThe lakehouse/warehouse entity (physical table) name; defaults to the table name
schemaNamestringNonullSchema of the entity, e.g. 'dbo' (optional)
sourceNamestringNonullName of the shared expression (create_named_expression) or structured data source (create_data_source) to read from
create_field_parameterCreate a Power BI field parameter: a calculated table of nameof(...) rows that drives a slicer to swap which measures/columns a visual shows.

Builds the full Power-BI-Desktop-identical structure (the 3 columns, the ParameterMetadata marker, sort-by, hidden plumbing columns, and the field-switch key). Items are measure/column refs in display order; each label defaults to the object's name. Requires a Power BI-mode model at compatibility level >= 1400. Returns the table ref ('table:Name'). Undoable.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
namestringYesNoneField-parameter table name (unique)
itemsFieldParameterItemYesNoneFields in display order. Each is {objectRef: 'measure:…' or 'column:…', label?: 'optional display name'}
create_functionCreate a DAX user-defined function (udf).

The expression is a lambda, e.g. '(x: int64, y: int64) => x + y'. Names cannot contain spaces. Requires model compatibility level >= 1702 (call set_compatibility_level first if needed). Returns the new ref ('function:Name'). Undoable.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
namestringYesNoneFunction name (no spaces; letters/digits/_/. only)
expressionstringYesNoneLambda expression, e.g. '(x: int64) => x * 2'
create_hierarchyCreate a hierarchy on a table from an ordered list of its column names (top level first).

Returns the new ref. Undoable.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
tableRefstringYesNoneTable ref or name
namestringYesNoneHierarchy name
levelColumnsstringYesNoneOrdered column names for the levels (top first), e.g. ['Year','Quarter','Month']
create_history_checkpointCreate a durable, model-scoped git checkpoint without committing unrelated repository files.

Dry run by default: commit=false reports the owned paths, changed files and whether the model will be saved. Pass commit=true after review. Refuses a detached branch, conflicts, or unrelated staged files instead of sweeping them into the commit. The result names the exact checkpoint hash; use restore_history_checkpoint to preview a restore.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
labelstringNonullPlain accepted-state label, e.g. 'Before pricing refactor'
commitboolNofalseFalse = preview only (default); true = save and create the checkpoint commit
create_import_tableCreate an import-mode table whose data is loaded via an M partition, e.g.

From a Fabric SQL endpoint via Sql.Database(...). Bundles the table + its M partition (no orphaned placeholder). Add columns with create_column. Returns the table ref ('table:Name'). Undoable.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
namestringYesNoneTable name (unique)
mExpressionstringNonullThe M expression that returns the table, e.g. 'let s = Sql.Database("...","dw"), t = s{[Schema="dbo",Item="Sales"]}[Data] in t'
create_measureCreate a new measure on a table.

Returns the new object ref. Undoable. Pass displayFolder to create it already filed ('Parent\Child' nests). Create + folder is one undo step.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
tableRefstringYesNoneTable ref, e.g. 'table:Sales'
namestringYesNoneMeasure name
expressionstringYesNoneDAX expression
displayFolderstringNonullOptional display folder path, e.g. 'KPIs' or 'Sales\Growth'. Empty = table root.
create_named_expressionCreate a shared (model-level) M expression / parameter: the source target for a Direct Lake partition, or reusable M referenced by name (#"Name") inside import partitions.

Returns the expression name. Undoable.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
namestringYesNoneExpression name (unique), e.g. 'Lakehouse'
expressionstringNonullThe M expression, e.g. 'let s = Sql.Database("x.datawarehouse.fabric.microsoft.com","lh") in s'
create_perspectiveCreate a perspective: a named, curated subset of the model's tables/columns/measures/hierarchies (a focused Copilot or report view).

Add members with set_perspective_member; delete with delete_object and rename with rename_object. Returns the new ref ('perspective:Name'). Undoable.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
namestringYesNonePerspective name (unique)
create_relationshipCreate a single-column relationship from a foreign-key column (the many side) to a lookup column (the one side).

CrossFilter: OneDirection|BothDirections (optional). isActive optional. Returns the new ref ('relationship:Name'). Undoable.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
fromColumnRefstringYesNoneFrom column (many / foreign-key side), e.g. 'column:Sales/CustomerKey'
toColumnRefstringYesNoneTo column (one / lookup side), e.g. 'column:Customer/CustomerKey'
crossFilterstringNonullOneDirection | BothDirections (optional)
isActivebool?NonullTrue=active (default), false=inactive (optional)
create_roleCreate a security role.

ModelPermission defaults to None (Read is auto-applied once you add an RLS filter). Then use set_table_permission to add per-table row filters and set_role_member to add members. Undoable.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
namestringYesNoneRole name (unique)
modelPermissionstringNonullNone (default) | Read | ReadRefresh | Refresh | Administrator
create_tableCreate a new (empty) table.

Add columns with create_column/create_calculated_column; it needs a partition before it can be deployed/refreshed. Returns the new ref ('table:Name'). Undoable.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
namestringYesNoneTable name (unique)
delete_objectDelete any model object by ref (measure/column/table/hierarchy/relationship/calculation-group/calculation-item/role…).

Deleting an absent ref is a net-zero no-op. DAX references to a deleted object are not auto-rewritten. They will error; check dependents first. Undoable.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
objRefstringYesNoneObject ref, e.g. 'measure:Sales/Old Total' or 'table:Staging'
delete_objectsDelete many objects in one undoable step (the multi-select delete).

Same rules as delete_object: an absent ref is skipped, DAX references are not auto-rewritten. One undo restores every object that this call removed. Use delete_object for a single ref.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
objRefsstringYesNoneObject refs to delete, e.g. ['measure:Sales/Old Total','measure:Sales/Unused']
duplicate_objectDuplicate a measure, calculated/data column, hierarchy, calculation item, table (incl.

Calculated tables / field parameters), or calculation group (a deep clone). newName optional (collision-safe auto-name if omitted). targetRef optional: a 'table:' ref to clone a measure onto another table, or a calc group's 'table:' ref to clone a calculation item onto another group. Columns/hierarchies stay on their own table; tables duplicate at model scope. Returns the new ref. Undoable.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
objRefstringYesNoneObject ref to duplicate
newNamestringNonullName for the copy (optional)
targetRefstringNonullOptional target container: 'table:X' for a measure, a calculation group's 'table:' ref for a calc item. Omit to duplicate beside the original.
rename_objectRename a measure/column/table.

All DAX references to it are automatically rewritten (safe rename). Returns the new ref. Undoable. (Report-layer bindings outside the model can't be updated. Review for renames used in reports.)

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
objRefstringYesNoneObject ref, e.g. 'measure:Sales/Sales Amt'
newNamestringYesNoneNew name
sessionIdstringNonullOptional session targeting: the sessionId you read for the model you mean to edit (create_model / open_model / open_local / open_live return it; model_overview reads it back). If the live session is no longer that one, the rename is refused before anything is written. Omit it to rename in whatever model is currently open (the existing behavior).
set_compatibility_levelRaise the model's compatibility level (a one-way upgrade).

Needed for newer features. DAX user-defined functions require 1702+. Refuses to lower it. Undoable within the session, but re-deploying an upgraded model to an older runtime may fail.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
levelintYesNoneTarget compatibility level, e.g. 1702

Compare and source control

apply_model_diffSelectively merge a source model's changes into a target (the alm-Toolkit 'Update'): makes the target match the source for the chosen objects.

Target is the open model when you omit targetFile and targetEndpoint (undoable merge), a model file on disk (targetFile), or a published model on an XMLA endpoint (targetEndpoint + targetDatabase). source defaults to the open model; pass sourceFile or sourceGitRef to merge from elsewhere. dry run by default (commit=false reports what would apply, including any deletes). Pass commit=true to write. A write to a file or into the open model needs the review token the preview returned. selectedRefs limits to specific object refs (e.g. ['measure:Sales/Total']); omit to apply all differences. Pushing to a published model runs an always-on drift guard: if a target object changed since the diff, the push is refused unless you pass overrideReason (recorded in the audit trail). Every committed push to a published model first writes a restore point (returned as restorePointId) so it can be undone with rollback_push; if a push contains deletes and the restore point cannot be written, the push is refused. Next: run model_diff first to see the object refs; on a drift refusal, re-run model_diff to see the new state before overriding.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
targetFilestringNonullTarget model on disk (TMDL/PBIP folder or .bim) to update; omit with targetEndpoint empty to merge into the open model
targetEndpointstringNonullTarget XMLA endpoint of a published model to push to (e.g. powerbi://api.powerbi.com/v1.0/myorg/Workspace); requires targetDatabase
targetDatabasestringNonullTarget dataset (database) name on the endpoint: required with targetEndpoint
selectedRefsstringNonullObject refs to apply (e.g. 'measure:Sales/Total'); empty = all differences
sourceFilestringNonullMerge from this model on disk (TMDL/PBIP or .bim) instead of the open model
sourceGitRefstringNonull...or merge from this git ref of the open model's repo (e.g. 'main', a commit hash)
overrideReasonstringNonullAccountable override for the drift guard on a published-model push: the reason you're pushing despite the target having changed since the diff. Recorded in the audit trail.
authModestringNonullAuth mode for a published-model target (default 'azcli'; e.g. 'serviceprincipal', 'interactive')
targetTenantIdstringNonullOptional Entra tenant id or domain for a published-model target. Set it when the target lives in a different tenant than your default az login, so the read and the write both authenticate against that tenant
commitboolNofalseFalse = preview (default); true = write the target
confirmTokenstringNonullThe review token returned by the preview; required to write a file or the open model, and it must still match
cherry_pickCopy objects from another model into the open model (cross-model copy/paste), e.g.

Copy a measure from a teammate's model into yours. dry run by default (commit=false reports what would copy, what already exists (would overwrite), and what can't). Pass commit=true to apply as one undoable batch. Source is a model on disk (sourceFile) or a git ref of the open model's repo (gitRef). refs are object refs like ['measure:Sales/Margin %']. Supported into the open model: measures, calculated columns, and calculation items (into an existing group). For a whole table or calculation group, use apply_model_diff to a file target instead.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
refsstringYesNoneObject refs to copy into the open model, e.g. ['measure:Sales/Margin %']
sourceFilestringNonullCopy from this model on disk (TMDL/PBIP folder or .bim)
gitRefstringNonull...or copy from this git ref of the open model's repo (e.g. 'main', a commit hash)
commitboolNofalseFalse = preview (default); true = apply into the open model
get_reference_treeGet the model's object tree as flat nodes: every table (and calculation group) with its measures, calculated columns, and calculation items, each carrying a ref (e.g.

'measure:Sales/Total Sales'), display name, kind, and whether it has children. This is the same reference tree the vs Code compare/cherry-pick picker shows. Use it to enumerate the model's authorable objects in one call, to pick refs for model_diff / apply_model_diff / cherry_pick, or as a cheap structural map of what exists. Defaults to the open model; pass sourceFile to read a model on disk instead. Read-only.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
sourceFilestringNonullRead this model on disk (TMDL/PBIP folder or .bim) instead of the open session
git_branchList branches with no name or flags.

To change state, pass a branch name and set create=true, checkout=true, or both. If switching changes the on-disk model, the result names the model path to reopen and flags modelReloadNeeded.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
namestringNonullBranch name; empty = list branches
createboolNofalseCreate the branch
checkoutboolNofalseSwitch to it
git_checkoutSwitch to a git ref (branch, tag, or commit).

Refuses while the open model has unsaved edits. If the on-disk model changes, the result names the model path to reopen and flags modelReloadNeeded.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
gitRefstringYesNoneBranch / tag / commit to check out
git_cloneClone a git repository and locate the semantic model inside it.

A relative target stays inside the current workspace, and the target must not already exist. Returns the model path to open with open_model. Uses the user's git credential helper.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
urlstringYesNoneRepository URL
directorystringYesNoneTarget directory to clone into
git_commitCommit the open model to git.

Dry run by default (commit=false returns the file set that would be committed and whether the model needs saving first; nothing changes). Pass commit=true to actually commit. It saves the open model's unsaved edits to disk first, stages the model folder, then commits. Returns the commit hash + files.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
messagestringYesNoneCommit message
filesstringNonullOptional explicit file list to stage (default: stage the model folder)
commitboolNofalseFalse = preview (default); true = actually commit
git_diffThe unified text diff of the open model's git working tree (the on-disk TMDL diff).

Pass a file path to scope it; staged=true for the staged diff. Read-only.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
pathstringNonullOptional file path to scope the diff (relative to the repo)
stagedboolNofalseTrue = the staged diff; false = the working-tree diff
git_logRecent commits on the open model's repository (hash, author, date, subject).

Read-only.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
maxintNo20Max commits (default 20)
git_pullFast-forward pull the current branch from its upstream.

Refuses while the open model has unsaved edits. If the on-disk model changes, the result names the model path to reopen and flags modelReloadNeeded.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

git_pushPush commits to the remote.

Dry run by default (confirm=false reports what would push). Pass confirm=true to push. Uses the user's git credential helper. The engine never handles git credentials.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
remotestringNonullRemote (default: the branch's configured remote)
branchstringNonullBranch (default: current)
confirmboolNofalseFalse = preview (default); true = actually push
git_statusSource control status of the open model's git repository: current branch, ahead/behind, and the changed TMDL files (staged/worktree).

Also flags whether the open model has unsaved in-memory edits (git_commit saves them to disk first). Read-only.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

list_history_checkpointsList durable checkpoints for the open model on the current git branch.

Checkpoints are ordinary model-scoped commits, so they survive closing the session and cloning the repository. Returns supported=false for a model outside git; session undo remains the short-term alternative. Read-only.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
maxintNo50Maximum checkpoints to return (1-500, default 50)
model_diffAlm-Toolkit-grade semantic compare of the open model against another version, by default the git ref 'head' (i.e.

What you changed since the last commit). Returns an object-level diff (per table/column/measure/relationship/role/...: Create/Update/Delete) with each object's before/after text. Pass a different gitRef to compare against a branch/commit, or targetFile to compare against a model on disk, or sourceFile to compare two files. Read-only.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
gitRefstringNo"HEAD"Compare the open model against this git ref (default 'head'); ignored if targetFile is set
targetFilestringNonullCompare against a model on disk (TMDL/PBIP folder or .bim) instead of git
sourceFilestringNonullCompare this file (left/source) instead of the open model
restore_history_checkpointRestore the open file model to one of its durable checkpoints without resetting the branch or unrelated files.

Dry run by default: restore=false names the model paths and safety sequence. Pass restore=true only after review. The engine first commits the current model as a rescue checkpoint, restores the selected model paths, reopens the model, and commits the restored state. Returns all three hashes so the action stays reversible. Live published models use rollback_push and its restore points instead.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
hashstringYesNoneFull or short hash returned by list_history_checkpoints
restoreboolNofalseFalse = preview only (default); true = create rescue checkpoint and restore

Source and M

apply_schema_updateUpdate-Schema step 3: apply a chosen subset of a schema diff as one undoable change: add the source columns you accept, retype the ones whose type drifted, remove the ones the source dropped.

Each item: {change: Added|Removed|TypeChanged, column, dataType? (tom type, for Added/TypeChanged), sourceColumn? (physical name for Added, defaults to column)}. Items that can't apply (a calculated column, a name clash, an unknown column) are skipped with a reason. The accepted changes still commit atomically. Returns per-kind counts + the applied/skipped lists.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
tableRefstringYesNoneTable ref or name, e.g. 'table:Sales'
itemsSchemaUpdateItemYesNoneThe accepted diff items to apply. Each: {change, column, dataType?, sourceColumn?}.
diff_schemaUpdate-Schema step 2: diff a table's source columns against its current model columns: added at the source, removed from it, or type-changed.

Each item carries a stable id for per-item selection. By default it probes the live source (like get_source_schema); pass sourceColumns to diff a supplied/synthesized schema instead (the offline/manual path, no connection needed). Calculated columns are never flagged (they're DAX-derived, not source-driven). Returns Reachable=false + a message when the live source can't be read. Feed the accepted items to apply_schema_update.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
tableRefstringYesNoneTable ref or name, e.g. 'table:Sales'
sourceColumnsSourceColumnNonullOptional supplied source columns to diff against (skips the live probe). Each: {name, dataType (tom type), sqlType?}. Omit/empty to probe the live source.
authModestringNo"azcli"Entra auth mode when probing live: azcli (default) | interactive | devicecode | serviceprincipal | token
tenantIdstringNonullOptional Entra tenant id/domain to target when probing live
get_incremental_refresh_policyRead a table's incremental refresh policy (rolling-window store + incremental window, granularity, mode).

Returns enabled=false if no policy is defined. Read-only.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
tableRefstringYesNoneTable ref, e.g. 'table:Sales'
get_source_schemaUpdate-Schema step 1: re-read a table's source columns (names + data types) schema-only, without importing data, by probing the SQL/Fabric endpoint its partition query reads (server/database/schema/table parsed from the partition M, or read off a Direct-Lake entity partition) over tds.

Returns the source columns mapped to tom types (String|Int64|Decimal|Double|DateTime|Boolean). Needs a reachable source: for an offline snapshot, a non-SQL source, or a native-query partition it returns Reachable=false with a clear message (never throws). Use diff_schema to compare against the model.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
tableRefstringYesNoneTable ref or name, e.g. 'table:Sales'
authModestringNo"azcli"Entra auth mode for the SQL endpoint: azcli (default) | interactive | devicecode | serviceprincipal | token
tenantIdstringNonullOptional Entra tenant id/domain to target
list_refresh_typesList the partition refresh ('process') options, each with a plain-language explanation: Full (reload + recalc), DataOnly (reload, no recalc), Calculate (recalc only), ClearValues (empty it), Automatic (refresh if stale), Add (append rows), plus the table-level Defragment / Indexes.

Read-only. Use it to pick a type for refresh_partition.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

remove_incremental_refresh_policyRemove a table's incremental refresh policy (sets RefreshPolicy = null).

Leaves RangeStart/RangeEnd and the partition M intact. Deterministic, undoable.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
tableRefstringYesNoneTable ref, e.g. 'table:Sales'
set_incremental_refresh_policyDefine/update a table's incremental refresh policy: store N periods of history and re-import the latest M periods.

Set autoWire=true to create or repair RangeStart/RangeEnd and append the required half-open date filter without replacing existing M steps. Leave it false to validate and refuse when prerequisites are missing. Metadata only; it does not refresh data. Deterministic and undoable. Existing-policy fields are preserved when omitted.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
tableRefstringYesNoneTable ref, e.g. 'table:Sales'
dateColumnstringYesNoneThe Date/DateTime column the partition M filters on RangeStart/RangeEnd (validated to exist; pass empty to skip the column check)
rollingWindowPeriodsint?NonullRolling-window periods to store (history). Default 5
rollingWindowGranularitystringNonullRolling-window granularity: Day|Month|Quarter|Year. Default Year
incrementalPeriodsint?NonullIncremental periods to re-import each refresh. Default 10
incrementalGranularitystringNonullIncremental granularity: Day|Month|Quarter|Year. Default Day
incrementalPeriodsOffsetint?NonullOffset in periods from now to the rolling-window head. Default 0
modestringNonullImport (default) or Hybrid (real-time DirectQuery hot bucket; needs compatibility level 1565+)
pollingExpressionstringNonullDetect-Data-Changes polling M expression (a scalar checked to skip re-importing an unchanged partition, e.g. a max(last-modified) query). null preserves, empty string clears, non-empty sets it.
autoWireboolNofalseCreate or repair the two date/time parameters and append the half-open partition filter before enabling the policy. Requires dateColumn and an M partition.

DAX and query

ask_dataAnswer a question about the model's numbers with one fixed query shape (summarizecolumns with treatas or keepfilters filters, and topn and order by), built, checked and run by Semanticus.

Pass 'question' in plain words ("net sales by store region for 2025, top 10 products") and Jev reads which measures, columns, filters and top N it asks for from the model's names, column types, folders and descriptions; or pass the parts yourself (group_by, measures, filters, top, top_by, lowest, sort_by, descending), which are taken as said. To ask again with one part changed, pass the answer's 'parts' object back as 'parts' (either name style works) with the one part changed, or pass the snake_case parameters; a name ask_data does not take is refused, never ignored. Filter values are matched on this computer against the connected model's values: pass the words ("Coast", "2025") and Semanticus finds the real value, or says none matches. Before running it checks that every column reaches every set of rows each measure counts through active relationships, that each filter value is really in the data and the filters can all hold, that a sort names a split column or a shown measure, and that the DAX checks out, and it caps the rows (max_rows, default 500). Returns outcome (answered, built, needs-you, refused, error), a 'statement' (one plain sentence, the first thing to read, saying what the answer shows: "This shows Net Sales for each Region, where Year is 2025."), a plain reading line such as "Net Sales by Region, Year = 2025, top 10 by Net Sales", who read it (jev, or you when the parts were given), the parts it settled, the DAX, each check, any unsure lines, and the rows. Nothing runs when a part was not sure: 'unsure' says what to settle. When the run itself fails, outcome is error, the rows check says so in one plain line and 'error' carries the server's own words. When Jev was torn between two good readings of one part, the top one runs and 'others' names the other ("Showing Net Sales. You may have meant Units."), with that reading's line and its whole 'parts', ready to pass back as 'parts' to run it instead. Before a number is shown, a question read from words is checked once more: does the reading give the numbers the question asks for? When it does not (a change, a share, things with no sales, a forecast, a period it left out), when Jev is not sure, or when the check could not be made, nothing runs, 'unsure' says what is missing, and 'others' offers the reading as it is (anyway: true) with its 'parts': pass those parts back as 'parts' to run it as given, or ask again in other words. Read-only; needs a connected model with data to match values and run. Returns rows, so the agent policy's QueryData rule applies to the connected target. Every ask is kept in the model's question history (list_data_questions), without its rows. Ask your data is a Semanticus Pro feature.

Entitlement: Pro: Ask your data. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
questionstringNonullThe question in plain words. Leave it out when you pass the parts
partsJsonElement?NonullA previous answer's 'parts' object, passed back whole with any part changed. The parameters below, when given, override it
group_bystringNonullColumns to split by, e.g. ["'Store'[Region]"] or ["column:Store/Region"]
measuresstringNonullMeasures to show, by name, e.g. ["Net Sales"]
filtersJsonElement?NonullFilters as a JSON list of {"column": "'Date'[Year]", "op": "is", "values": ["2025"]}. op is is, is_not, after, from, before or up_to; values are words matched against the column's real values. A column of days takes after, from, before or up_to with one day written as 2025-12-31
topint?NonullKeep only the top N rows, ranked by top_by
top_bystringNonullThe measure that ranks the top rows (default: the first measure)
lowestbool?NonullRank from the smallest value (a bottom N)
sort_bystringNonullA split column or a shown measure to sort by
descendingbool?NonullSort from the largest or last value down
max_rowsint?NonullThe most rows to return (default 500, at most 10000)
runbool?NonullFalse builds and checks the query without running it
benchmark_daxTime a DAX query on the connected live model.

Mode='warm' (the default) runs it 'runs' times without clearing the cache and returns the first run, the fastest and median warm runs in milliseconds, and each run. mode='coldWarm' runs it cold (the cache is cleared before each run) and warm, and returns the average, standard deviation, minimum and maximum of total time and storage-engine time for each, plus each run. Cold runs and the storage-engine split need a local Power BI Desktop or an admin XMLA endpoint. Clearing the cache on a shared or cloud endpoint affects everyone using it, so there it needs confirm=true, and without it the result is warm only. clearForCold=false keeps a coldWarm run warm only. Use it before and after a rewrite to show the rewrite is faster. It does not change the model. runs: 1 to 25.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
querystringYesNoneDAX query, e.g. evaluate summarizecolumns('Date'[Year], "Sales", [Total Sales])
runsintNo5How many runs (per temperature in coldWarm mode). Default 5, max 25.
modestringNo"warm"Warm (the default) or coldWarm
clearForColdboolNotrueColdWarm only: clear the cache before each cold run (default true). false = warm only.
confirmboolNofalseColdWarm only: required to clear the cache on a shared or cloud endpoint (affects all users); ignored on local Power BI Desktop.
blame_valueAnswer "what moved this number?" deterministically.

The engine ambiently snapshots the top measures' values + their whole DAX dependency-cone expressions at checkpoint moments (apply_plan / optimize_measure / deploy_live / save_model, automatic); this op finds the most recent movement of a measure (or since a given point) and attributes it honestly: verdict 'attributed' when exactly one recorded edit sits in the window; 'interval' when several do: candidates come ranked by dependency overlap (formula-changing edits first) and are a ranking, never a causal claim; 'data-suspected' when every formula is identical but the value moved (data/refresh is the suspect. Proving it needs a shadow pre-edit instance, which v1 does not keep); 'inconclusive' when the history can't answer. Formula-caused movement is proven by a deterministic expression diff of the dependency cone between the two points (ExprDiffs). Free. Read-only.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
measureRefstringYesNoneThe measure whose number moved, e.g. 'measure:Sales/Total Sales'
contextstringNonullWhich cell to explain: omit for the grand total ('(model context)'), or a recorded slice key from list_value_history, e.g. "Product[Category]=Audio"
sinceCheckpointstringNonullExplain the movement since this recorded point instead of the most recent one: a revision number or an iso timestamp from list_value_history
capture_query_planCapture a DAX query's logical and physical query plans (the DAXQueryPlan trace) to understand why it's slow.

The Formula Engine builds the logical plan, the Storage Engine the physical plan (with #Records per operator). Use it alongside profile_dax when a query is fe-bound (a tall physical plan / huge intermediate records points at the costly operators). Needs a local Power BI Desktop or an admin XMLA endpoint; degrades to 'unavailable' otherwise. Read-only.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
querystringYesNoneDAX query to plan, e.g. evaluate summarizecolumns(...)
clear_cacheClear the Storage-Engine (VertiPaq) cache for the connected model: the DAX-Studio 'Clear Cache' primitive that makes cold-vs-warm benchmarking meaningful (run it before a query to measure the cold/worst-case cost).

Non-destructive: it only evicts the cache (the engine rebuilds it on the next query); no data or metadata changes. safety: on a shared/cloud endpoint this evicts the cache for all users (their next queries run cold), so it is refused there unless you pass confirm=true. Needs a local Power BI Desktop or an admin XMLA endpoint.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
confirmboolNofalseRequired on a shared/cloud endpoint to acknowledge it affects all users; ignored (always allowed) on a local Power BI Desktop instance.
evaluate_and_logDebug a DAX query that contains evaluateandlog(<expr>, "label") calls: runs it and returns the query result plus every logged intermediate (label, the sub-expression, and its evaluated rows/values) captured from the engine.

Wrap the sub-expressions you want to inspect in evaluateandlog to see what they actually evaluate to. Needs a local Power BI Desktop or admin XMLA. Read-only. The logged intermediates can include row samples of any table, so the agent policy's QueryData rule applies to every call on the connected target (regardless of the outer query shape). An Ask refusal names the approval to request; a Deny means the target's policy forbids it (a human can run it or change the policy).

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
querystringYesNoneDAX query containing evaluateandlog(...) calls
maxRowsintNo1000Max rows for the query result (default 1000)
explain_valueA deterministic evidence dossier for one cell of one measure: the value re-derived in the cell's exact filter context (the same summarizecolumns shape a real visual runs), the measure's dependency chain (what feeds it), source lineage (where each leaf column's data comes from), top contributors split by a related dimension, and (when the value is blank) a why-is-this-blank checklist (filters remove every row / no relationship path / filter flows the wrong way / inactive relationship / blank by design / RLS advisory) with the likely cause named.

Honesty rules: contributors ship only when the parts provably sum to the total (distinct counts / ratios / min-max / semi-additive measures get an explicit refusal, never a misleading breakdown); RLS is listed as roles that would filter these tables (the engine cannot impersonate a role, so never 'computed under role X'). Describe the cell with filterContext: Filters = column+members (a pivot cell's row/col keys are single-member filters), ExtraPredicates = raw DAX boolean lines (page-filter style). offline the dossier degrades to chain/lineage/RLS with Evidence.Available=false. Connect (open_local / open_live) for the value, blank checks, and breakdown. Next steps: probe_measure to test the measure across many contexts; blame_value to ask what changed a number over time. Free, read-only.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
measureRefstringYesNoneThe measure, e.g. 'measure:Sales/Total Sales' (a unique bare name like 'Total Sales' also works)
filterContextExplainFilterContextNonullThe cell's filter context: { filters: [{column: "'Table'[Column]", members: ["…"], empty: false}], extraPredicates: ["'Date'[Year] >= 2024"], groupBy: [] }. Omit for the grand total.
decomposeboolNotrueCompute the top-contributors breakdown (default true; it is skipped automatically when the parts don't sum)
decomposeBystringNonullBreak the number down by this column ('Table'[Column]); omit to let the engine pick a related dimension deterministically
topKintNo5How many top contributors to return (default 5, max 25)
get_daxGet the DAX expression of a measure or calculated column/table by ref (e.g.

'measure:Sales/Total Sales').

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
objRefstringYesNoneRef of a measure or calculated column/table
lint_daxDeterministic DAX best-practice lint (sqlbi/DAX-Patterns), ~15 token-path rules over one DAX expression: iferror/iserror plus the divide- and search/find-specific forms, error() as control flow, earlier/earliest, extended columns inside summarize, comparison-to-blank(), hand-rolled zero guards, var-as-live-alias inside calculate, unused VARs, the selectedvalue / distinctcount / removefilters idioms, a measure in a boolean filter predicate, and bare-table calculate filters.

With an open session the table-identity rules activate (bare-table filter). Token-based, so comments / strings / [bracketed names] never false-fire. Read-only, free, advisory per-expression. The model-scored layer is the AI-readiness BestPractice category (ai_readiness_scan). Run it on a rewrite before applying.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
expressionstringYesNoneThe DAX expression to lint (e.g. a measure body)
list_data_questionsRead the open model's question history for ask_data, newest first: each question's words, the reading line, who read it (jev or you), the outcome, the settled parts (pass them to ask_data as 'parts' to ask again or edit one part without Jev), the DAX, how many rows came back, when, and which door asked.

Rows are never kept. Both the Studio and ask_data write the same history, kept beside the model like the Plan and never committed with it; a model opened live keeps its own, and an unsaved model keeps none. Read-only. Ask your data is a Semanticus Pro feature.

Entitlement: Pro: Ask your data. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
limitintNo50The most questions to return (default 50)
list_functionsList the model's DAX user-defined functions (UDFs).

Each has a ref like 'function:MyFunc'. Read its body with get_dax, edit with update_measure, rename with rename_object.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

list_value_historyThe recorded values of one measure across every checkpoint moment (apply_plan / optimize_measure / deploy_live / save_model), the raw time series behind blame_value, and the UI sparkline's feed.

Points with a null value are honest gaps: the formulas were snapshotted but the number wasn't observed there (offline capture, or the edit's impact cone never reached the measure). Truncated=true means retention pruned older points (last 200 checkpoints / 20MB) or unreadable lines were skipped. Free, read-only.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
measureRefstringYesNoneMeasure ref, e.g. 'measure:Sales/Total Sales'
contextstringNonullWhich cell's history: omit for the grand total, or a recorded slice key, e.g. "Product[Category]=Audio"
optimize_measureOptimize a measure with evidence.

Give 2 or more candidate DAX rewrites; the engine validates each (a candidate that references the measure itself is rejected), checks each returns identical values to the current body across the summarizecolumns(verifyGroupBy) matrix you supply, benchmarks only the ones that matched (warm wall-clock over that grid, not a server fe/se trace), and, when apply is true (the default), applies the fastest that beats the current body beyond a measured noise band as one undoable edit, recording the proof and benchmark as evidence. apply=false is a dry run that returns the same evidence and changes nothing. Equivalence is only as strong as verifyGroupBy, which must be a JSON list of text column names: a grand-total-only match is downgraded to unverified and never applied, so pass representative group-by columns. Nothing is applied with fewer than 2 valid candidates, without a live connection (open_live or open_local), or when no candidate is proven; a candidate that matched only under degraded fidelity is reported, not applied. Free on every tier.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
measureRefstringYesNoneMeasure/calc ref, e.g. 'measure:Sales/Total Sales'
candidatesstringYesNone>=2 candidate DAX rewrites to race
verifyGroupByJsonElementYesNoneA JSON list of text group-by columns, e.g. ["'Date'[Year]"]
verifyFiltersstringNonullOptional table filters applied to the comparison
applyboolNotrueTrue (default) applies the fastest proven winner as one undoable edit; false = dry run: return the evidence, change nothing
pick_chart_kindPick the chart a Queries result opens as: Jev's pick among the charts the chart rules leave (queries.chart_kind).

Pass the result's shape and the rules' own answer: 'fits' (the kinds the rules leave, in their order) and 'rules_pick'. Kinds are matrix, line, bar, area, table, card and scatter. Jev's chart pick is off in this version until its replay clears its bar, so today this returns the rules' pick with by 'rules' and a note saying why; it does the same whenever Jev is not asked or not sure. Returns kind, by (jev or rules), a fixed reason sentence written by Semanticus, the confidence when Jev answered, and a note. Sends the question's words and the shape only, never rows or values. Read-only; never changes the model. Ask your data is a Semanticus Pro feature.

Entitlement: Pro: Ask your data. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
shapeJsonElementYesNoneThe result's shape as JSON: {"dims": [{"name": "Region", "isDate": false, "distinct": 4}], "measures": 1, "rows": 4}
fitsstringYesNoneThe chart kinds the chart rules leave for this shape, in the rules' order
rules_pickstringYesNoneThe chart the rules picked; the answer whenever Jev does not pick
wordsstringNonullThe question in plain words, when there were any
pivot_measureTest a measure (or any scalar DAX) across a pivot: evaluate summarizecolumns(rowFields..., colField?, filters..., "value", measureExpr).

Returns long-form rows the caller pivots into a row x column matrix. Use it to sanity-check a measure's values by category/date before trusting it. Read-only; requires a live connection. Returns rows of source grouping values, so the agent policy's QueryData rule applies to the connected target. An Ask refusal names the approval to request; a Deny means the target's policy forbids it (a human can run it or change the policy).

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
measureExprstringYesNoneScalar DAX to evaluate, e.g. [Total Sales] or sum(Sales[Amount])
rowFieldsstringYesNoneRow group-by columns, e.g. ["'Product'[Category]"]
colFieldstringNonullOptional single column group-by for the matrix columns, e.g. "'Date'[Year]"
filtersstringNonullOptional table filters, e.g. ["keepfilters('Date'[Year]=2024)"]
maxRowsintNo100000Max rows (default 100000)
preview_tablePreview the first N rows of a table on the connected live model (evaluate topn(N, 'Table')).

Accepts a table name or a 'table:Name' ref. Requires a live connection. Reads data rows, so the agent policy's QueryData rule applies to the connected target. An Ask refusal names the approval to request; a Deny means the target's policy forbids it (a human can run it or change the policy).

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
tablestringYesNoneTable name or 'table:Name' ref
topNintNo200How many rows (default 200)
probe_measureRun a measure across many filter contexts to gather evidence before you trust it (value/blank/error per member, non-blank coverage, additivity) across a scenario matrix.

DAX context-dependence bugs (missing time-intel guards, blanks, non-additivity) are invisible until you run the measure in different contexts. It replicates a real visual (summarizecolumns with your filter args as the outer/slicer context + a group-by axis) so allselected / selectedvalue / isinscope resolve correctly. A naive one-context test lies about those. Pass a primaryAxis to auto-generate grand/single/multi/empty/boundary scenarios, and/or scenarios[] for cross-filter cases (name columns + members; do not hand-write DAX). Reports behavior across contexts, never 'correct'. You judge it against intent. Read-only; needs a live connection.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
exprstringYesNoneThe measure DAX expression to probe (inlined; not registered in the model)
primaryAxisstringNonullA column to auto-generate default scenarios from, e.g. "'Date'[Month]" (optional if you pass scenarios[])
scenariosProbeScenarioNonullOptional agent-authored scenarios: each {name, groupBy:[cols], filters:[{column, members:[...], empty?}]}
includeDefaultsboolNotrueAlso append the engine's default scenarios (grand/single/multi/empty/boundary) from primaryAxis
profile_daxProfile a DAX query's server timings on the connected live model: total ms, the Formula-Engine vs Storage-Engine split, the number of se scans, se cpu and parallelism, and the heaviest scans (xmSQL).

Use it to understand why a query is slow (fe-bound vs se-bound) when optimizing. Needs a local Power BI Desktop or an admin XMLA endpoint; falls back to wall-clock only otherwise. Read-only.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
querystringYesNoneDAX query to profile, e.g. evaluate summarizecolumns(...)
reconcile_measureReconcile a DAX measure against an independent SQL ground truth, cell by cell (the Tests-tab correctness spine).

The engine runs the DAX side (summarizecolumns over your groupBy + the measure, plus an independent grand-total query) over the live XMLA connection and runs your supplied SQL over the Fabric SQL endpoint, full-outer-joins them by the composite grouping key, and judges every cell under an explicit tolerance + blank policy. The engine never authors the SQL. You supply the ground truth. The SQL runs against the source endpoint as your own identity (the engine holds no elevated credential. It can only read what you already can; the endpoint's nature + your warehouse permissions decide what is possible). Whether you (an agent) may run it is governed by the QueryData permission setting on the SQL target (the permissions tab, Ask/Deny/Allow), exactly like preview_table / run_dax. A human runs ungated. groupBy entries are resolved to real model columns (a 'column:Table/Column' ref or a plain 'Table'[Column]); an unresolved entry is refused (this prevents wrong results, not writes). blankPolicy is required ("zero"|"null"|"distinct"). Grade on status (Reconciled|Mismatch|InsufficientCoverage|NothingVerifiable|InputError), not anyMismatch; an uncaveated pass is Reconciled and unverifiable==0 and complete==true, and even then expected-member coverage is unknown (coverageKnown=false; it reconciles the members observed, not that none is missing). A total-only run is InsufficientCoverage by design (a matching total can hide the VertiPaq blank-row trap). Requires a live connection; reads source-row aggregates from both the model and the SQL endpoint. Returns the status, summary, worst offender, coverage facts, per-side execution timestamps (independent connections may see different snapshots), snapshotNote, and the mismatching cells (capped).

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
measureRefstringYesNoneMeasure to test (a name or 'measure:Name')
sqlstringYesNoneGround-truth SQL. Grouped mode: return the groupBy key columns (same order) then the aggregate value column. Total-only mode (empty groupBy): aggregate to one row/value. The engine never writes this.
blankPolicystringYesNoneBlank policy, required, no default: "zero" (blank/null read as 0; additive), "null" (blank≈null, both differ from 0), or "distinct" (blank, null and 0 all distinct)
groupBystringNonullDAX grouping columns, e.g. ["'Date'[Year]"]. Empty = grand-total-only (InsufficientCoverage by design).
toleranceAbsolutedoubleNo1e-9Absolute tolerance floor (finite, >= 0). Default 1e-9.
toleranceRelativedoubleNo1e-7Relative tolerance as a fraction of abs(sql): 1.0 = 100%, not 1%. Finite, >= 0. Default 1e-7.
sqlGrandTotalstringNonullOptional independent grand-total SQL for grouped mode (a single row/value at total context). Queried separately, never rebuilt from members.
maxRowsintNo100000Member-row cap (default 100000). A truncated run is marked incomplete, never a pass.
serverstringNonullOptional Fabric SQL endpoint override; derived from the model's SQL source when omitted
databasestringNonullOptional database override
authModestringNonullSQL Entra auth mode (default azcli)
tenantIdstringNonullOptional tenant id for the SQL token
run_daxRun a DAX query (evaluate / define...evaluate) against the connected live model and return columns + rows (capped).

Returns {error} if not connected or the query fails. Read-only. A row-returning query (evaluate <table>, summarizecolumns, filter, values, topn, …) reads source rows, so the agent policy's QueryData rule applies to the connected target. An Ask refusal names the approval to request; a Deny means the target's policy forbids it (a human can run it or change the policy). A scalar probe (evaluate row(...) / evaluate { … }) is a calculation and is never gated.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
querystringYesNoneDAX query, e.g. evaluate topn(100, Sales)
maxRowsintNo10000Max rows to return (default 10000)
cancellationTokenCancellationTokenNodefault
run_dmvRun a dmv query (e.g.

Select * from $system.TMSCHEMA_MEASURES) against the connected live model. Read-only.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
querystringYesNoneDmv select query
maxRowsintNo10000Max rows (default 10000)
update_measureSet the DAX expression of a measure, calculated column, calculated table, calculation item or DAX function (a function takes a lambda such as (x: int64) => x + 1).

The expression is validated offline first: malformed syntax, arity problems and unknown table, column or measure references are refused before anything is written, whatever the Record verified edits setting. An unchanged expression is a no-op. The change is applied to the live shared session, appears immediately in the vs Code UI, and is a single undoable step.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
objRefstringYesNoneRef of the measure/calculated object, e.g. 'measure:Sales/Total Sales'
expressionstringYesNoneThe new DAX expression
sessionIdstringNonullOptional session targeting: the sessionId you read for the model you mean to edit (create_model / open_model / open_local / open_live return it; model_overview reads it back). If the live session is no longer that one, the edit is refused before anything is written. Omit it to edit whatever model is currently open (the existing behavior).
validate_daxValidate a DAX expression against the open model before you write it (create_measure/update_measure).

Catches unbalanced brackets (error) and unknown table/column/measure references (warning), with line:column. Offline/read-only, no live engine needed. By default valid=false only on a structural error. strict=true judges it the way a DAX write does: every warning, such as a missing column, is an error and valid is false.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
expressionstringYesNoneThe DAX expression to check, e.g. "calculate ( sum ( Sales[Amount] ), Sales[Year] = 2024 )"
strictboolNofalseTrue = treat every warning (a missing column or measure, an arity problem) as an error, the same verdict a write would give. Default false.
verify_dax_equivalenceProve a candidate DAX rewrite is behavior-preserving before applying it: evaluates exprA (original) and exprB (rewrite) side by side across multiple context shapes built from groupBy (the fully-crossed leaf rows and each single-column subtotal and the grand total) and reports whether all values match plus any mismatching contexts.

The extra shapes matter: summarizecolumns leaves pin every dimension, so a wrong-scope rewrite (wrong denominator, collapsed context transition, over-broad all/allexcept) can match at every leaf yet diverge at a subtotal or the grand total. This gate catches that. Use it, over a representative group-by matrix, before replacing a measure with a hand-applied rewrite (update_measure); optimize_measure and apply_plan run the same proof themselves. Read-only.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
exprAstringYesNoneOriginal scalar DAX expression (e.g. the current measure body)
exprBstringYesNoneCandidate rewrite scalar DAX expression
groupBystringYesNoneGroup-by columns forming the filter-context matrix, e.g. ["'Date'[Year]", "'Product'[Category]"]
filtersstringNonullOptional table filters applied to the whole comparison, e.g. ["keepfilters('Date'[Year]=2024)"]
maxRowsintNo100000Max matrix rows to compare (default 100000)
vpaq_scanStorage analysis of the connected live query model.

Returns observed column and table bytes, component bytes, encoding, an observed-denominator percentage, and an explicit storageMode. Import mode establishes complete model totals, directLake is resident-only, and unknown leaves completeness unconfirmed. Requires a live connection.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
topNintNo25How many top columns to return (default 25)

Documentation and spec

autogenerate_spec_from_fabricAuto-generate a starter model spec by introspecting a fabric SQL endpoint (Warehouse / Lakehouse SQL analytics endpoint) over tds: reads INFORMATION_SCHEMA (tables, columns + types, declared PK/FK) using your Entra identity (a deterministic, read-only schema read; no data is copied).

Classifies fact/dimension from FK topology, maps SQL types to tom types, hides key columns, and proposes additive measures + a time-intelligence set. storageMode 'import' (M) or 'directLake'. authMode: azcli (default) | serviceprincipal | interactive | devicecode. If the endpoint rejects the sign-in with an authentication error, the workspace is usually in a different tenant than your az login. Pass tenantId. To reuse a SQL endpoint the person already saved on Connections (same sign-in, no password stored), read it with list_sql_sources and pass its server, database, authMode and tenantId. Which links are drafted inactive, each with a plain note on the relationship saying why (a measure can still use it with userelationship): a fact table's own links always stay on (to the date table and to each dimension it references); when two of a fact's links reach the same table (an invoice date and a due date), the one listed first among the fact's columns stays on and the rest are off; any other link (a snowflake hop, a dimension's own date key) that would give a table a second path is off; a table linked to itself is off and not built. A source date table (a non-fact table named like date or calendar with a date column) is set as dateTable and marked as the date table on build, keyed on its date column; only a source with none gets a calendar table. The result is a first draft. Refine it, then create_model + build_model_from_spec. (Fabric often declares no enforced keys, so relationships may be empty. Add them in the spec.) Returns the spec view.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: critical.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
serverstringYesNoneFabric SQL endpoint, e.g. 'xxxxx.datawarehouse.fabric.microsoft.com'
databasestringYesNoneWarehouse / Lakehouse database name
storageModestringNo"import"Import | directLake
authModestringNo"azcli"Azcli (default) | serviceprincipal | interactive | devicecode
tenantIdstringNonullEntra tenant id or domain that owns the Fabric workspace; leave blank to use your az cli default. Needed when your az login is in a different tenant than the workspace.
autogenerate_spec_from_modelAuto-generate a starter model spec from the currently open model (read-only, does not change the model): classifies each table fact/dimension/date/calculated by its relationship roles, captures columns + data types + keys + relationships + existing measures, proposes additive 'Total <col>' measures for numeric fact columns, and suggests a time-intelligence set + date table.

The autogen is a first draft. Refine it (set_spec / the Spec tab), then build_model_from_spec. Returns the spec view.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

build_model_from_specMaterialise the current model spec into the open model as one undoable transaction (a single undo reverts the whole build).

Composes the authoring primitives in dependency order: data source + shared M -> tables (import/Direct Lake/calculated, with columns + data types + keys) -> relationships (FK->PK) -> date table -> measures -> time-intelligence. Existing objects are skipped (re-run safe); per-row failures are reported without aborting. Build into the current session. Call create_model first for a from-scratch build. Returns a report (created/skipped/errors + before->after counts).

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

clear_specDiscard the current model spec (nothing in the model is affected.

The spec never mutated it). Returns the empty spec view.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

get_doc_modelGet the complete documentation snapshot of the model that the exporter renders: header (name, compatibility level, culture, counts), the relationship graph, every table's detail (description, hierarchies, partitions with their source (M/SQL/DAX or, for Direct Lake, the Entity binding), calc-group items), all measures & columns (with DAX), KPIs, roles/RLS, perspectives, data sources, shared expressions, the Prep-for-AI surface, the AI-readiness + BPA scorecards, and (when live-connected) VertiPaq storage stats, plus any authored Documentation narrative.

Read-only. Use it to understand the whole model at once or to see what the built docs will contain.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
topNintNo50Max columns to include in the storage (VertiPaq) top-columns list; only used when live-connected
get_doc_outlineList the model objects that can carry Documentation narrative (the model, every table, every measure) and which narrative sections each already has.

Use this to discover where to add business context for the exported documentation. The narrative is additional context for the docs, separate from each object's first-class Description (which you set with set_description).

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

get_doc_sectionRead one Documentation narrative section (Markdown) for an object.

ObjRef is 'model' for the model-wide narrative, or 'table:Name' / 'measure:Table/Name' (narrative is supported on the model, tables and measures). Common sectionKeys: 'overview', 'businessContext', 'notes' (per object); 'overview', 'glossary', 'methodology' (model). Returns null if empty.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
objRefstringYesNoneObject ref, or 'model' for the model-wide narrative
sectionKeystringYesNoneSection key, e.g. 'businessContext'
get_specGet the current model spec: the structured plan for the model to build (storage mode + Fabric source, tables with columns/types/role, relationships, core measures, time-intelligence).

The spec is an authoring artifact (not the model itself); build_model_from_spec materialises it. Returns { version, source, spec } (spec is null if none is loaded). Read-only.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

load_specLoad a model spec from a JSON file (written by save_spec) and make it the current spec.

Broadcasts live to the Spec tab. Returns the loaded spec view.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
pathstringYesNoneAbsolute path to a spec JSON file
save_specSave the current model spec to a JSON file (for version control / sharing).

Pass an absolute path, e.g. '.../model.spec.json'. Returns the spec view.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
pathstringYesNoneAbsolute path to write the spec JSON to
set_doc_sectionAuthor/insert a Documentation narrative section (Markdown) for an object: additional business context that merges into the exported documentation, separate from the model's Descriptions.

ObjRef is 'model' or 'table:Name' / 'measure:Table/Name' (narrative is supported on the model, tables and measures; other refs are rejected). Common sectionKeys: 'overview', 'businessContext', 'notes' (per object); 'overview', 'glossary', 'methodology' (model). Set markdown to empty/null to clear the section. This is the collaborate-on-the-docs path: it's stored as a model annotation, broadcasts live to the human's Documentation tab, and is undoable.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
objRefstringYesNoneObject ref, or 'model' for the model-wide narrative
sectionKeystringYesNoneSection key, e.g. 'businessContext'
markdownstringYesNoneMarkdown content (empty/null clears the section)
set_specReplace the current model spec with the supplied JSON (the whole ModelSpec document).

Use this to author or refine the spec; it broadcasts live to the Spec tab. Shape: { name, compatibilityLevel, storageMode: 'import'|'directLake', source: { kind:'fabric-sql', server, database, schema }, tables: [{ name, role:'fact'|'dimension'|'date'|'calculated'|'isolated', entity, schema, mExpression, calculatedExpression, sourceName, columns: [{ name, dataType, sourceColumn, isKey, hidden, summarizeBy }] }], relationships: [{ fromTable, fromColumn, toTable, toColumn, cardinality:'manyToOne'(default)|'oneToOne'|'oneToMany'|'manyToMany', crossFilter, isActive, note }], measures: [{ table, name, dax (or expression), description, formatString, displayFolder }], timeIntelligence: ['ytd','py',...], timeIntelligenceBaseMeasures: [...], dateTable: { name, dateColumn, startExpr, endExpr, markAsDate } }. A relationship's note is plain words for the person on why a link is off; the build ignores it. When dateTable.name is one of the spec's own tables, the build marks that table as the date table keyed on dateColumn (or its one date column) and adds no calendar table; a table already marked is left as it is. Otherwise a calendar table named dateTable.name is added from startExpr and endExpr. Does not touch the model. Returns the new spec view.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
specJsonstringYesNoneThe whole ModelSpec as JSON

BPA and waivers

bpa_scanCheck the model against the Best Practice Analyzer: general modelling rules for performance, DAX, formatting, naming and layout.

Both details carry the Best practice letter, A to F, as bestPractice with bestPracticeWhy (ai_readiness_scan's grade is the other letter, AI readiness). The rule: Best practice is A when the model has no open errors and no open warnings. Info notes never count against the letter. A finding you accepted counts as passed. An error or warning rule that could not be checked also stops an A. Below A, each open error counts 5 points and each open warning 2 points. The points are divided by the number of objects checked, so a big model is not marked down for its size. Tables, columns, measures, relationships, roles and the like are objects; partitions are not, because the table already stands for them. B is up to 0.10 points per object, C is over 0.10 up to 0.25, D is over 0.25 up to 0.50, and F is over 0.50. It uses the bundled Power BI rule set plus any custom rules saved on the model (load_rules and reset_rules with system='bpa'). detail='summary' returns counts only: rule count, violation count, auto-fixable count, rule errors, orphaned waivers, and counts by category, rule and severity. It is the lighter first call on a large model. detail='full' (the default) also returns the violations, each with rule, category, severity, object, message and whether it can be fixed automatically (CanAutoFix). The filters narrow only the returned violations, and the counts always cover the whole model. A filter given with detail='summary' is refused, because a summary has no list to narrow. For AI readiness use ai_readiness_scan. Read-only.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
detailstringNo"full"Full (the default: counts plus the violations) or summary (counts only)
categorystringNonullOnly return violations in this BPA category. Null/empty = all.
ruleIdstringNonullOnly return violations of this BPA rule id. Null/empty = all.
severityMinstringNonullOnly return violations at this severity or higher: Info|Warning|Error. Null/empty = all.
autoFixableOnlyboolNofalseTrue = only return deterministically auto-fixable violations.
maxViolationsintNo0Cap the returned violations to this many (0 = no cap, the default).
list_waiversList every accepted (waived) finding on the model: system, rule id, object ref (null = rule-level/model-wide), the reason, who waived it and when.

The audit trail behind the scorecard's waived count. This is the raw store, so it can include waivers whose rule id is no longer in the loaded rule set: those accept nothing, and bpa_scan and ai_readiness_scan report them as OrphanedWaivers with a count. Compare the two before you trust a waiver.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

unwaive_findingRemove a waiver so the finding counts against the score again (re-instates it).

System: 'bpa' or 'air'. objRef set = un-waive that instance; empty/'*' = remove the rule-level waiver. Never gated (it makes the model more compliant). Undoable; also clears Tabular Editor's ignore annotation for a per-instance BPA waiver.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
systemstringYesNone'bpa' or 'air'
ruleIdstringYesNoneRule id
objRefstringYesNoneObject ref, or empty/'*' for the rule-level waiver
waive_findingWaive (accept) a finding so it stops counting against the score, for findings you've consciously decided not to fix (e.g.

'we keep these unused columns'). system: 'bpa' or 'air'. objRef set = waive this instance; objRef empty/'*' = waive the entire rule, every instance model-wide. a reason is required: a waiver is an audited decision (stored with who+when on the model), never a silent suppression. The finding is still surfaced (tagged 'waived' with its reason) and the scorecard reports a waived count, so the grade is honest. Hard gates (Copilot index ceiling, >50% measures undescribed) are not lifted by waivers. Persisted on the model (undoable, travels with it); per-instance BPA waivers also write Tabular Editor's BestPracticeAnalyzer_IgnoreRules so te3 honours them. Re-scan to see the score move.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
systemstringYesNoneWhich system the rule belongs to: 'bpa' or 'air'
ruleIdstringYesNoneRule id (e.g. 'UNNECESSARY_COLUMNS' for bpa, 'name-measure' for air)
objRefstringYesNoneObject ref to waive (e.g. 'column:Sales/Foo'); empty or '*' = waive the whole rule model-wide
reasonstringYesNoneWhy this finding is accepted: required, stored for audit

Deployment and Fabric

cicd_generateGenerate a ready-to-run fabric-cicd ci scaffold (parameter.yml + a GitHub Actions or Azure DevOps workflow + deploy.py) running the real publish_all_items in ci.

Pure file authoring, no Fabric call. Returns the contents; write=true also writes them into the repo.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: critical.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
targetstringNo"github"Github (default, GitHub Actions) | ado (Azure DevOps)
workspaceIdstringNonullTarget workspace id to seed parameter.yml (optional)
environmentstringNo"PROD"Environment name for the parameter.yml replace_value key (default prod)
writeboolNofalseFalse = return contents only (default); true = also write the files into the repo
cicd_publishPublish the open model's on-disk definition (PBIP/TMDL) to a Fabric workspace via updateDefinition, a full overwrite of the target semantic model.

Dry run by default (enumerates parts + target, writes nothing); the live publish (commit=true) is human-only from the Deploy tab. An agent's commit is refused, previewing is allowed.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: dry-run-only. Risk class: critical.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
workspaceIdstringNonullTarget workspace id
itemIdstringNonullTarget semantic-model item id (in that workspace)
commitboolNofalseFalse = dry run (default); true = publish (refused for the agent door)
authModestringNo"azcli"Azcli (default) | serviceprincipal | interactive | devicecode
cancellationTokenCancellationTokenNodefault
deploy_gateThe deploy-readiness gate for this change: findings the change set introduces or touches can block; older whole-model warnings become olderWarnings (a count, never a block) plus checkLine pointing at AI Readiness.

With no change set to scope to (no edits in this session yet, a model-wide edit, or no saved or published copy) it judges the whole model instead: wholeModel=true and checkLine opens with why. Read-only. waived BPA findings never block (they're audited acceptances, bpaWaivedBlocking counts them); readiness hard-gates still apply when this change touches them.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: critical.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

deploy_liveDeploy the session's metadata edits back to the live Power BI / Fabric / Azure as model over XMLA (the write half of open_live).

Metadata only (names/descriptions/visibility/categories/format strings/folders/summarize-by, measure + calc-column DAX, partition sources (M / calc-table DAX / legacy), shared expressions, and the linguistic schema) via Model.SaveChanges(), matched by LineageTag so renames land on the right object. no data refresh. Absence never deletes: an object that is only on the live model is reported in LiveOnly and left alone unless you pass it in deleteRefs (the opt-in tick). A new calculated table is created (and Calculate-recalced on commit); other structural changes (new data/import tables, new data columns, new partitions, source-type or Direct Lake rebinds, incremental-refresh policy) are reported in Unmatched/LiveOnly, never silently dropped. Empty endpoint = deploy back to the model this session opened (the round-trip); or pass endpoint + database. dry run by default: commit=true writes, and that write needs the review token the preview returned. A committed write first saves a restore point of the live model's metadata (list_restore_points) so rollback_push can undo it; if that snapshot fails, a write with deleteRefs is refused and a write without deletes goes ahead with a warning. Needs a Read-Write XMLA endpoint and a write principal (authMode=serviceprincipal is the reliable one).

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supervised. Risk class: critical.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
endpointstringNonullXMLA endpoint; empty = deploy back to the live model this session was opened from (open_live)
databasestringNonullDataset / database name; ignored when endpoint is empty (the bound source's dataset is used)
authModestringNo"serviceprincipal"Serviceprincipal (recommended) | azcli | interactive | devicecode
tenantIdstringNonullOptional Entra tenant id or domain
commitboolNofalseFalse = dry run (report the change set, write nothing); true = commit the live write
overrideReasonstringNonullWhy you are shipping past a red deploy gate: required to override; recorded in the model's append-only audit trail
confirmTokenstringNonullThe review token returned by the preview; required to write, and it must still match
deleteRefsstringNonullObject refs from the preview LiveOnly list to remove; omit to leave extra live objects alone. Never a flag that means remove everything missing.
deploy_stagePromote items between Fabric deployment-pipeline stages.

Dry run by default (the New/Update preview + the readiness gate); commit=true deploys. An agent may deploy to non-production stages only. Promoting to production needs a human confirming from the Deploy tab with the confirmToken their own dry-run shows. A failing gate blocks unless forceOverride=true. items = source item ids (empty = all supported).

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: dry-run-only. Risk class: critical.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
pipelineIdstringYesNoneDeployment-pipeline id
sourceStageIdstringYesNoneSource stage id (e.g. Dev)
targetStageIdstringYesNoneTarget stage id (e.g. Test)
itemsstringNonullSource item ids to deploy; empty = all supported items
notestringNonullOptional deployment note
commitboolNofalseFalse = dry run preview (default); true = deploy
confirmTokenstringNonullThe confirmToken from a human dry-run (production only; an agent cannot obtain it)
forceOverrideboolNofalseTrue = deploy even if the readiness gate fails
authModestringNo"azcli"Azcli (default) | serviceprincipal | interactive | devicecode
overrideReasonstringNonullRequired with forceOverride when the readiness gate fails; recorded in the audit trail
cancellationTokenCancellationTokenNodefault
deployment_historyList a deployment pipeline's recent deployments (status, source→target stages, item counts, who deployed).

Read-only.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: critical.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
pipelineIdstringYesNoneDeployment-pipeline id
authModestringNo"azcli"Azcli (default) | serviceprincipal | interactive | devicecode
cancellationTokenCancellationTokenNodefault
fabric_git_commitCommit the workspace's changes to git (workspace→git).

Dry run by default (commit=false reports the pending change count; writes nothing). Pass commit=true to commit. items = item objectIds for a selective commit (empty = all).

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: dry-run-only. Risk class: critical.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
workspaceIdstringYesNoneWorkspace id
commentstringNonullCommit message
itemsstringNonullItem objectIds to commit; empty = all workspace changes
commitboolNofalseFalse = dry run (default); true = commit to git
authModestringNo"azcli"Azcli (default) | serviceprincipal | interactive | devicecode
cancellationTokenCancellationTokenNodefault
fabric_git_connectConnect a workspace to a git repo (Azure DevOps or GitHub).

Dry run by default (commit=false). Pass commit=true to connect. Needs workspace Admin. After connecting, initialize + fabric_git_update/commit to sync.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: dry-run-only. Risk class: critical.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
workspaceIdstringYesNoneWorkspace id
providerstringYesNoneAzureDevOps | GitHub
organizationstringYesNoneAzure DevOps organization or GitHub owner
projectstringNonullAzure DevOps project (ado only)
repositorystringNonullRepository name
branchstringNo"main"Branch (default main)
directorystringNonullDirectory within the repo (default /)
connectionIdstringNonullA configured-connection id (required for GitHub; optional for ado which can use automatic creds)
commitboolNofalseFalse = dry run (default); true = connect
authModestringNo"azcli"Azcli (default) | serviceprincipal | interactive | devicecode
cancellationTokenCancellationTokenNodefault
fabric_git_connectionThe workspace's Fabric Git connection: provider (Azure DevOps / GitHub), repo/branch/directory, connection state, last-synced commit.

Read-only.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: critical.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
workspaceIdstringYesNoneWorkspace id
authModestringNo"azcli"Azcli (default) | serviceprincipal | interactive | devicecode
cancellationTokenCancellationTokenNodefault
fabric_git_disconnectDisconnect a workspace from git.

Dry run by default (commit=false). Pass commit=true to disconnect. Needs workspace Admin.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: dry-run-only. Risk class: critical.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
workspaceIdstringYesNoneWorkspace id
commitboolNofalseFalse = dry run (default); true = disconnect
authModestringNo"azcli"Azcli (default) | serviceprincipal | interactive | devicecode
cancellationTokenCancellationTokenNodefault
fabric_git_statusThe workspace ⇄ git diff: each changed item (workspace change vs remote change vs conflict), plus the workspace + remote commit hashes.

Read-only.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: critical.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
workspaceIdstringYesNoneWorkspace id
authModestringNo"azcli"Azcli (default) | serviceprincipal | interactive | devicecode
cancellationTokenCancellationTokenNodefault
fabric_git_updateUpdate the workspace from git (git→workspace): overwrites workspace items with the git version.

Dry run by default (commit=false reports the incoming change count + any conflicts). Pass commit=true to apply. conflictPolicy = PreferRemote (default) | PreferWorkspace; allowOverride=true permits overwriting items that have workspace changes.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: dry-run-only. Risk class: critical.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
workspaceIdstringYesNoneWorkspace id
conflictPolicystringNo"PreferRemote"PreferRemote (default) | PreferWorkspace
allowOverrideboolNofalseAllow overwriting items that have workspace changes
commitboolNofalseFalse = dry run (default); true = update the workspace from git
authModestringNo"azcli"Azcli (default) | serviceprincipal | interactive | devicecode
cancellationTokenCancellationTokenNodefault
get_pipeline_stagesList a deployment pipeline's stages in order (Dev=0, Test=1, Prod=2…) with each stage's assigned workspace.

Needs an Admin role on the pipeline. Live read; read-only.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
pipelineIdstringYesNoneDeployment-pipeline id (from list_deployment_pipelines)
authModestringNo"azcli"Azcli (default) | serviceprincipal | interactive | devicecode
cancellationTokenCancellationTokenNodefault
get_stage_itemsList the items in a pipeline stage (itemType e.g.

SemanticModel/Report, with source/target item ids + last deployment time). Use it to resolve the SemanticModel itemId to deploy. Needs Contributor on the stage workspace. Live read; read-only.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
pipelineIdstringYesNoneDeployment-pipeline id
stageIdstringYesNoneStage id (from get_pipeline_stages)
authModestringNo"azcli"Azcli (default) | serviceprincipal | interactive | devicecode
cancellationTokenCancellationTokenNodefault
list_deployment_pipelinesList the Fabric deployment pipelines you can access (id, displayName, description).

Use get_pipeline_stages then get_stage_items to drill into a pipeline's Dev/Test/Prod stages. Live read; read-only.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: critical.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
authModestringNo"azcli"Azcli (default) | serviceprincipal | interactive | devicecode
cancellationTokenCancellationTokenNodefault
list_restore_pointsList the pre-push snapshots a published model can be rolled back to.

Every committed deploy_live write and every committed apply_model_diff push to an XMLA endpoint writes one first, so the push can be undone. This is the only way back from a live delete (a deploy re-creates measures, calculated columns, calculated tables and named expressions, but a relationship, role, perspective, hierarchy, partition, culture, datasource or data table removed from a published model is otherwise gone for good). Newest first. Only the newest 10 per target are kept. Filter by endpoint + database, or omit both for every target. Snapshots live in ~/.semanticus/restore and hold the target's full model metadata (measures, M queries, role filters, connection strings, never row data) in clear text; purge_restore_points removes them. An integrityError means rollback is refused, while purge remains available through its validated storage path. Read-only and free. Next: rollback_push(id) to preview a restore.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
endpointstringNonullOnly restore points for this XMLA endpoint (requires database)
databasestringNonullOnly restore points for this dataset (database) name
list_workspacesList the Fabric workspaces you can access (id, displayName, type, capacity).

Live read against api.fabric.microsoft.com using your Entra identity. Read-only.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
authModestringNo"azcli"Azcli (default) | serviceprincipal | interactive | devicecode
cancellationTokenCancellationTokenNodefault
preview_deployPreview what promoting a model between pipeline stages would change (New vs Update per item, by source→target pairing) + the readiness gate.

Read-only, deploys nothing. ('Update' items may be identical; Different-vs-NoDifference is only known after a real deploy.)

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: critical.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
pipelineIdstringYesNoneDeployment-pipeline id
sourceStageIdstringYesNoneSource stage id (e.g. Dev)
targetStageIdstringYesNoneTarget stage id (e.g. Test)
authModestringNo"azcli"Azcli (default) | serviceprincipal | interactive | devicecode
cancellationTokenCancellationTokenNodefault
purge_restore_pointsPermanently delete pre-push snapshots from ~/.semanticus/restore using a review-then-confirm flow.

Choose exactly one selector: id removes one restore point, or olderThanDays selects every snapshot older than that non-negative age. dry run by default: confirm=false returns the exact candidates and a token without deleting. After reviewing them, pass confirm=true with that exact confirmToken; a stale or changed candidate set is refused. Reports partial file-delete failures honestly. Use this to clear model metadata from disk only when you accept that the guarded live push can no longer be undone.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
idstringNonullSelect exactly this restore point id; do not combine with olderThanDays
olderThanDaysint?NonullOr select every restore point older than this non-negative number of days; do not combine with id
confirmboolNofalseFalse (default) previews exact candidates; true permanently deletes only with the matching preview token
confirmTokenstringNonullExact token returned by the immediately preceding dry-run preview
refresh_partitionRefresh ('process') a single partition of the live model.

Types: Full (reload + recalc, the default), DataOnly (reload, no recalc), Calculate (recalc only), ClearValues (empty it, destructive), Automatic (refresh only if stale), Add (append rows). live data write against the Analysis Services engine: runs as a dry run by default (reports what would run, connects to nothing); pass commit=true to actually execute. Leave endpoint empty to target the live model this session was opened from (open_live/open_local binds it); a file model has nothing to refresh. See list_refresh_types for full explanations.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: experimental. Risk class: critical.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
partitionRefstringYesNonePartition ref, e.g. 'partition:Sales/2024'
refreshTypestringNo"Full"Refresh type: Full (default) | DataOnly | Calculate | ClearValues | Automatic | Add
endpointstringNonullXMLA endpoint; empty = the live model this session was opened from (open_live/open_local)
databasestringNonullDataset / database name; ignored when endpoint is empty (the bound source's dataset is used)
authModestringNo"serviceprincipal"Serviceprincipal (recommended) | azcli | interactive | devicecode
tenantIdstringNonullOptional Entra tenant id or domain
commitboolNofalseFalse = dry run (report what would run, execute nothing); true = commit the live refresh
rollback_pushUndo a push to a published model by restoring it to a pre-push snapshot (see list_restore_points).

Dry run by default: commit=false reports exactly what would be restored and (critically) what would be removed, i.e. every object that exists on the target now but not in the snapshot. That includes anything the push added and anything anyone else added since, so read RemovedRefs before committing. Pass commit=true to write. Restores the object kinds a redeploy cannot: relationships, roles (RLS), perspectives, hierarchies, partitions, cultures, datasources and data tables. Resolution is by lineage identity, so an object republished under you is refused rather than overwritten. Recorded in the audit trail. free at both tiers. The undo for an irreversible write is never gated. Next: run list_restore_points to find the id; run rollback_push(id) to preview; then rollback_push(id, commit=true).

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
restorePointIdstringYesNoneRestore point id from list_restore_points (e.g. '20260710T031500Z-3f9c1a')
authModestringNonullAuth mode for the endpoint (default 'azcli'; e.g. 'serviceprincipal', 'interactive')
commitboolNofalseFalse = preview what would change (default); true = write the target

Session and lifecycle

connect_localConnect (read-only) to a local Analysis Services instance (an open Power BI Desktop).

Pass a Data Source like 'localhost:51234', or leave it empty to auto-pick the running Power BI Desktop instance.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
dataSourcestringNonullData source, e.g. 'localhost:51234'; empty = auto-discover
databasestringNonullOptional database name
connect_xmlaConnect (read-only) to a Power BI / Fabric / Azure as XMLA endpoint to run DAX/dmv against the live deployed model while you edit files offline.

Endpoint e.g. 'powerbi://api.powerbi.com/v1.0/myorg/<Workspace>'. authMode: azcli (default, uses your az login), interactive (browser), or devicecode. tenantId optional: target a specific Entra tenant when your az login is a different tenant than the model's (same as open_live). The result's account field names the identity signed in, when known.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
endpointstringYesNoneXMLA endpoint, e.g. powerbi://api.powerbi.com/v1.0/myorg/<Workspace>
databasestringYesNoneDataset / database name
authModestringNo"azcli"Interactive (browser/mfa via Azure.Identity) | serviceprincipal (AZURE_*/FABRIC_* env) | azcli | devicecode
tenantIdstringNonullOptional Entra tenant id or domain to authenticate against
accountProfileIdstringNonullOptional saved account profile id (from list_account_profiles) to connect as, for this connection only, and never changes the tenant default. Must be an already-signed-in profile; adding a new account is a human action (you will be refused).
connection_statusReport the current live query connection: connected, kind, data source.

For which model is being edited versus which one answers queries (they can be two different copies), use connection_context.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

create_modelCreate a brand-new, empty semantic model from scratch and make it the current session (replaces any open model).

Default compatibility level 1604 (Direct-Lake-capable, Power BI mode). The model is unsaved: the first save_model must be given a path. Build it with create_data_source / create_named_expression / create_import_table / create_directlake_table / create_column / create_measure / create_relationship, etc. Returns the new session. Refuses while the open model has unsaved edits unless discardUnsaved is true.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
namestringNonullModel/database name (e.g. 'Sales'); empty = 'SemanticModel'
compatibilityLevelintNo1604Compatibility level; default 1604 (>=1604 is required for Direct Lake). Use the default unless you have a reason.
discardUnsavedboolNofalseTrue = throw away unsaved edits and create anyway; default false refuses while unsaved
disconnectClose the live query connection (the one connect_xmla, connect_local, open_live or open_local attached).

The open model, its unsaved edits and its undo history stay in the session; run_dax, run_dmv and the other live tools need a new connection afterwards. Returns the resulting connection status.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

get_entitlementGet the current Semanticus tier (free | pro) and the features it grants.

features carries the wire ids for the tabs this installation may open: today that is workflows and askData (Ask your data: ask_data, list_data_questions and pick_chart_kind), so a Pro session reports ["workflows","askData"] and a free session reports []. Two more things are paid and carry no wire id because neither is a tab: route_ask, and the ranked and run model plan. Read the tier for those. Everything else is free, every read and every bulk apply included. Check this before calling a workflow tool, ask_data or route_ask, so a refusal is never a surprise.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: critical.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

list_local_instancesList running local Power BI Desktop Analysis Services instances (port + workspace).

Use one with connect_local.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

list_workspace_modelsList the semantic models in one Fabric workspace (id, displayName, description).

Pair with list_workspaces to find the workspace id, then connect_xmla or open_live with the workspace address and the model's displayName as the database. Live read against api.fabric.microsoft.com using your Entra identity. Read-only.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
workspaceIdstringYesNoneWorkspace id, from list_workspaces
authModestringNo"azcli"Azcli (default) | serviceprincipal | interactive | devicecode
cancellationTokenCancellationTokenNodefault
open_liveLoad the full editable model from a Power BI / Fabric / Azure as XMLA endpoint into the session, so the whole workbench (AI-readiness scan, BPA, the change-plan, and every edit) operates on the live deployed model.

Unlike connect_xmla (which only enables read-only DAX/dmv), this loads the model's metadata via tom, exactly as Tabular Editor attaches to a deployed model. Edits stay in-memory and undoable; push them back with deploy_live (the write half, dry-run by default) or persist to a TMDL folder with save_model for review/deployment. endpoint e.g. 'powerbi://api.powerbi.com/v1.0/myorg/<Workspace>'. Leave database empty to load the workspace's only/first dataset. authMode: interactive (browser/mfa via Azure.Identity) | serviceprincipal (AZURE_*/FABRIC_* env, most reliable for Fabric) | azcli (default) | devicecode. tenantId optional: target a specific Entra tenant when your az login is a different tenant than the model's.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
endpointstringYesNoneXMLA endpoint, e.g. powerbi://api.powerbi.com/v1.0/myorg/<Workspace>
databasestringNonullDataset / database name; empty = the workspace's first/only dataset
authModestringNo"azcli"Interactive | serviceprincipal | azcli | devicecode
tenantIdstringNonullOptional Entra tenant id or domain to authenticate against
accountProfileIdstringNonullOptional saved account profile id (from list_account_profiles) to open as, for this open only, and never changes the tenant default. Must be an already-signed-in profile; adding a new account or an interactive sign-in is a human action (you will be refused).
discardUnsavedboolNofalseTrue = throw away unsaved edits and open anyway; default false refuses while unsaved
open_localUnified open of a running local Power BI Desktop model: makes the same instance both editable in the tree (its metadata is snapshotted into the session) and queryable live (DAX/dmv).

Localhost uses integrated Windows auth: no token. Leave dataSource empty to auto-pick the running instance, or pass 'localhost:51234' (see list_local_instances). Refuses while the open model has unsaved edits unless discardUnsaved is true.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
dataSourcestringNonullData source, e.g. 'localhost:51234'; empty = auto-discover the running Power BI Desktop instance
databasestringNonullOptional database/dataset name; empty = the instance's first/only model
discardUnsavedboolNofalseTrue = throw away unsaved edits and open anyway; default false refuses while unsaved
open_modelOpen a semantic model from a Power BI PBIP (point at the .pbip file, the project folder, or the .SemanticModel folder), a TMDL folder, or a .bim file path.

Returns basic counts. Refuses while the open model has unsaved edits unless discardUnsaved is true.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
pathstringYesNoneAbsolute path to a .bim file, a TMDL folder, or a PBIP semantic-model folder
discardUnsavedboolNofalseTrue = throw away unsaved edits and open anyway; default false refuses while unsaved
redo_changeRe-apply the change most recently undone with undo_change: steps forward one entry on the shared undo timeline.

Live (broadcasts to the UI). toEntry (optional): an undone entry id from get_plan_history; redoes every undone change up to and including it in one step. Returns CanUndo / CanRedo / AtCheckpoint / Steps / RedoSteps. Making a new edit after an undo clears the redo stack.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: critical.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
toEntrystringNonullOptional: the undone get_plan_history entry id to redo up to, including it. Omit for one step.
save_modelSave the model.

Omit path to overwrite the file or folder you opened. Pass a folder path to save as TMDL (tabular model definition language), or a .bim file path. format defaults to TMDL; when overwriting, a .bim stays a .bim. If the files on disk changed after this model was opened, the save is refused unless overwrite is true.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: critical.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
pathstringNonullTarget path. Omit or pass null to overwrite the source.
formatstringNonullFormat: TMDL (default), bim, or folder. Ignored when overwriting a .bim source.
overwriteboolNofalseTrue = replace files that changed on disk after this model was opened; default false refuses that overwrite
undo_changeUndo the most recent change on the shared session: steps back one entry on the model's single undo timeline.

A whole batch (apply_plan / apply_safe_fixes / a generator) undoes as one step. The timeline is shared across both drivers, so this reverts the last change regardless of who made it (your edits or the human's in the vs Code UI). The revert is live. It broadcasts to the UI immediately. toEntry (optional): an entry id from get_plan_history; undoes that change and every later one in one step, one broadcast. Refused with a sentence when the entry is from before this session or already undone. Returns CanUndo / CanRedo / AtCheckpoint / Steps / RedoSteps. Use it to back out a change you just applied.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: critical.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
toEntrystringNonullOptional: the get_plan_history entry id to undo back to, including it. Omit for one step.

Connections

connection_contextExplain the model identity currently being edited and the model identity currently answering queries.

They may deliberately be two copies: for example, a safe local working copy for edits while the published model answers real-data queries. Returns relationship=sameInstance only when that is proven; workingCopyAndPublished and twoModels explicitly mean two model contexts are in play. Read this before comparing, testing, or deploying so you never assume the query target is the write target. 'sqlEndpoint' is the open model's SQL endpoint (the saved SQL source its checks read from unless a check names its own), null when it has none; 'sqlEndpointSuggestion' is what the model's own sources read from, offered when no endpoint is set. Holds no credentials. Read-only and free. Next: list_connections to choose a remembered model, connect_xmla/connect_local to change only the query model, or open_live/open_local to edit and query one live model.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

delete_sql_sourceRemove a saved SQL source.

Refused while any model uses it as its SQL endpoint (the refusal names those models; clear them with set_model_sql_endpoint first), and while the open model's saved checks or table mappings still point at it, and the refusal says how many of each, so 'still in use' is never an unexplained no. Change or remove those first. Returns deleted=false with a plain note rather than throwing. Honest limit: this can only see the model that is open. A source used by a model that is not open can still be removed, and those checks then report that the source they were set to use is no longer saved rather than quietly running somewhere else. Next: list_tests to see which checks use a source.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
idstringYesNoneSource id from list_sql_sources
forget_connectionRemove a connection from the remembered list (see list_connections).

Does not disconnect anything and does not touch the model. It only forgets the endpoint, its auth mode, its target label and its working folder. Re-connecting to the same endpoint records it again, unlabelled, which means it will be treated as production until the user labels it.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
idstringYesNoneConnection id from list_connections
list_account_profilesThe saved Microsoft identities on this device: the multi-account profile store.

Device-local and credential-free (username, tenant, sign-in method, last sign-in, last use), a local read with no network and no prompt; it holds no token or secret (tokens stay only in the encrypted Microsoft cache). 'isDefault' marks the account an unqualified open of that tenant uses; 'signedIn' is whether a saved sign-in record exists here (the strongest a no-network read can prove: the cached token may still need a silent refresh, and if it has aged out your acquisition fails with an honest error, never a prompt). A signed-out profile has no record and needs an interactive sign-in, a human action. Pass a profile 'id' as accountProfileId to open_live / connect_xmla to open as that account for one open without changing the tenant default. You may select a signed-in profile, but adding a new account, an interactive sign-in, and making an account the default are all human actions done from Connections. Read-only and free. Next: open_live/connect_xmla with accountProfileId; list_connections for the target list.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

list_connection_historyThe device-local connection timeline (connects, opens, account switches and sign-ins), newest first, the same log the Connections drawer shows.

Optionally filter to one connection id (from list_connections). Each event carries the where (endpoint/dataset), the account upn in play when known, the outcome (ok. A failed open that changed nothing is still recorded), a short detail note, and a utc timestamp. Holds no credentials, never a token or secret. Use it to see who last connected where, or to confirm an account switch actually took effect. Read-only and free. Next: probe_connection_accounts for who the next open will sign in as; list_connections for the target list.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
connectionIdstringNonullOnly this connection id (from list_connections); omit for the whole timeline
limitintNo50Most-recent N events to return (default 50)
list_connectionsEvery model source this machine has opened or connected to (XMLA endpoints, local running models, and local files or projects), newest first.

Use this instead of asking the user to retype an endpoint or path. Each record carries kind (xmla | localDesktop | file), endpoint (the XMLA address, local data source, or file path), dataset, auth mode, model name, last-used, and the user's target label. Holds no secrets: authMode is a mode name, never a token. 'label' is what the user declared the environment to be (local | dev | uat | prod); an empty label means the target is treated as production, the strictest reading and the only inference ever made. never guess a label from an endpoint's name. Only the user can set a label, in Connections in vs Code; the agent cannot. 'workingFolder' is a durable local copy made from that source. 'publishConnectionId' is the separate final XMLA destination when one is linked; a local source does not become a published destination by implication. A file record is a local file or project this machine has opened; reopen it with open_model on its endpoint path. It cannot answer queries by itself. Read-only and free. Next: connection_context for the active edit/query/publish identities, or prepare_working_copy to preview a local workflow.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

list_model_sql_endpointsEvery model's SQL endpoint ('rows': model name, connectionId when the model is a saved connection, and the endpoint's source id, name, server, database and last test), plus 'notLinked': the saved SQL sources that no model uses as its endpoint, each with how many of the open model's checks and table mappings still name it (a source with zero of both can be removed).

Existing setups were linked once on upgrade from what each model's checks already used, by id, so no check changed where it points. Read-only and free. Next: set_model_sql_endpoint to link or clear one, delete_sql_source to remove an unused source.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

list_sql_source_usageWhat each saved SQL source is used by: for every source, its id, its name, the titles of the saved checks pointing at it, and the model tables mapped to it.

Nothing else: no check definitions, no expected values, no verdicts, no row counts. Read-only and free, on both doors. Call it before removing or re-pointing a source so you know what would break, and to show source usage without reading the Tests feature. It can only see the model that is open; with none open every source comes back with no usage rather than an error. Next: list_sql_sources for the connection details, delete_sql_source to remove an unused one.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

list_sql_sourcesThe named SQL sources saved on this machine, newest first.

A SQL source is where an independent ground truth is read from: the warehouse or lakehouse a check compares a measure against, or the table a row count is counted in. It is not the model that answers DAX (that is list_connections). Each record carries id, name, server, database, the sign-in mode name, tenant, when it was created, when it was last tested and whether that test passed. lastTestOk is null when it has never been tested, false when the last test failed: a never-tested source is not a working one. Holds no secrets: authMode is a mode name, never a token, and there is no password anywhere in the record. Use the id as sqlSourceId on a saved check or a table mapping so an endpoint is typed once instead of per check. Read-only and free. Next: test_sql_source to prove one works, save_sql_source to add or change one, set_table_source_mapping to point a table at one.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

prepare_working_copyPreview or confirm the safe local-edit workflow from a remembered source connection.

The source may be XMLA or a local running model. Default commit=false is read-only: it names the local folder, explains which model will answer tests/queries, names the separate XMLA publish destination when one is selected, and refuses any non-empty folder not proven to belong to that source. commit=true creates or opens the durable local model, then attaches the optional queryConnectionId. Omit queryConnectionId to query the source. For a local source, publishConnectionId is optional and must name an XMLA connection; for an XMLA source it defaults to the source. Local files alone cannot execute DAX. Reopening never refreshes or overwrites local edits, and this operation never pushes changes. Use list_connections for the ids. Next: read connection_context, edit and test locally, then review changes before an explicit push to the linked published model.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
connectionIdstringYesNoneConnection id from list_connections
parentFolderstringNonullParent folder for a new <model>.SemanticModel working copy; omit to reopen the connection's existing workingFolder
commitboolNofalseFalse previews without writing; true confirms creation/open and query attachment
queryConnectionIdstringNonullOptional connection id that will answer tests/queries; omit to query the source
publishConnectionIdstringNonullOptional final XMLA publish destination; defaults to the source when the source is XMLA, and remains unlinked when the source is localDesktop
probe_auth_prerequisitesPreview whether an advanced sign-in mode (serviceprincipal | azcli) can actually authenticate on this machine, so you can warn the user before a connect attempt instead of failing after one.

Returns presence + names only, never a secret value: for serviceprincipal, which of the client id / client secret / tenant env vars (each with its accepted alias names) are set; for azcli, whether a signed-in cli session was detected (and its account/tenant when so). 'ready' is the overall verdict; 'detail' is an honest, actionable note when not ready (e.g. 'Run az login'). This is a local-only probe: no interactive prompt, no network sign-in beyond a local az account show. Read-only and free. Next: connect_xmla / open_live to actually connect once ready is true.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
modestringNo"azcli"Serviceprincipal (or sp) | azcli (default)
tenantIdstringNonullOptional Entra tenant id or domain to target
probe_connection_accountsFor each remembered XMLA target, the account (upn) the next open will actually sign in as, a cheap silent probe (a local disk read of the saved sign-in, no network, no prompt).

A sign-in is remembered per tenant and credential family (interactive / device-code), so 'account' is that identity, which may differ from a target's own last-used one. 'account' is null when it is genuinely unknown: no saved msal record for that tenant and family (for example azcli / service-principal keep none); a null account is unknown, never signed-out. 'previousAccount' surfaces the target's last-used account as provenance ('was' / 'last opened as'), both when a different current account supersedes it and when the current account is unknown, so a prediction is never invented from the last-used hint. Holds no credential. Use it to show 'as <account>' before connecting, or to confirm which identity a switch left in place. Read-only and free. Next: list_connections for the full target list; list_connection_history for the timeline.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

remember_xmla_connectionRemember an XMLA endpoint in the shared connection registry without connecting to it.

Stores endpoint, optional model name and auth mode only; never a token or secret. New records are unlabelled and therefore treated as production until the human labels them. Use this only when the endpoint is already known, then list_connections to retrieve its id. This does not open, query, edit, or publish a model.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
endpointstringYesNoneXMLA endpoint
databasestringNonullOptional model/database name
modelNamestringNonullOptional display model name
authModestringNo"azcli"Azcli | interactive | serviceprincipal
save_sql_sourceSave a named SQL source, or update one by id.

Pass name, server (just the address, like contoso-sql.database.windows.net), database, and authMode: 'interactive' (a browser sign-in), 'devicecode' (a code entered on another device), 'azcli' (the Azure cli sign-in already on this machine), or 'serviceprincipal' (an app registration). tenantId is optional. never pass a password, a token or a connection string: a connection-string shape in server or database is refused at the boundary rather than stripped, 'token' is refused as a mode by name, and the record has no password field to put one in. Semanticus signs in at use time with the mode you name here, so every check that uses this source signs in the way the source says. Two sources cannot share a name. Omit id to create; pass an id from list_sql_sources to update. Next: test_sql_source to prove it works before a check depends on it.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
namestringYesNoneWhat to call it, shown wherever a source is picked (e.g. 'Contoso warehouse')
serverstringYesNoneThe SQL server address only, never a connection string
databasestringYesNoneThe database on that server
authModestringYesNoneHow to sign in: interactive | devicecode | azcli | serviceprincipal. Never a token.
tenantIdstringNonullOptional Entra tenant id
idstringNonullId from list_sql_sources to update an existing source; omit to create a new one
set_model_sql_endpointGive a model its SQL endpoint: the one saved SQL source its checks read from unless a check names its own.

Pass a sqlSourceId from list_sql_sources, or null to clear it. It applies to the open model, or to a saved model from list_connections when you pass its connectionId. Resolution for every check is: the check's own source or inline server first (the quiet per-check override for a model whose tables come from two warehouses), then the model's endpoint, then what the model's own partitions read from. A table-count mapping from set_table_source_mapping still wins for its table. A working copy made with prepare_working_copy starts with the endpoint of the model it came from. The source record is not copied: several models can share one saved source. Writes only machine-local metadata, never the model. Free. Next: connection_context to read it back, run_tests to count against it.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
sqlSourceIdstringYesNoneSource id from list_sql_sources, or null to clear the model's endpoint
connectionIdstringNonullOptional connection id from list_connections for a saved model that is not open; omit for the open model
set_publish_destinationLink the open editable model to a remembered XMLA connection as its explicit final publish destination.

Works for Semanticus-created working copies and existing user-owned local files, including files in source control. Writes only machine-local connection metadata: it never edits model/repository files and never deploys. Use list_connections for the XMLA connection id. The actual push remains a separate preview + confirmation through apply_model_diff. Pass clear=true with no connectionId to let go of the destination; the change is recorded in the connection history like a set. Next: connection_context to verify Editing and Publish to before reviewing changes.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: critical.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
connectionIdstringNonullXMLA connection id from list_connections. Omit it when clear is true.
clearboolNofalseTrue lets go of the open model's publish destination instead of setting one. Nothing is deployed or deleted; clearing when none is set changes nothing and says so in 'note'. A model open live from its workspace saves straight back to it, so its destination cannot be cleared: open a local copy instead.
test_sql_sourceOpen a connection to one saved SQL source using its own sign-in and run a single test query (select 1).

Returns ok plus a plain-words note, and records the outcome on the source so list_sql_sources can show it. A failure is recorded as a failure and is never rounded up to ok. This reads nothing from the user's data: one constant value, no table touched. Agent-origin calls go through the standard QueryData permission gate on that SQL target and can never trigger an interactive sign-in: a stale cached sign-in fails honestly instead of opening a browser on the user's machine. Use it before a check or a table mapping depends on the source. free.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
idstringYesNoneSource id from list_sql_sources

DAX library

daxlib_installInstall a DaxLib package's DAX UDFs into the open model as one atomic, undoable transaction (raises compatibility level to 1702 if needed; pulls in dependency packages, deps-first).

By default existing functions of the same name are left untouched (reported as skipped); pass replaceExisting=true to overwrite. Provenance is recorded so daxlib_list_installed / daxlib_uninstall work. Undoable in one step.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
idstringYesNonePackage id
versionstringNonullVersion (omit for latest stable)
replaceExistingboolNofalseOverwrite functions of the same name (default false = skip them)
daxlib_list_installedList the DaxLib packages installed in the open model (from the Semanticus_DaxLibInstalled provenance annotation): id, version, and the udf names each owns.

Offline, no network.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

daxlib_package_infoGet a DaxLib package's detail: metadata, dependencies, and the list of udf names it would install (the blast radius to review before installing).

Anonymous + read-only. Omit 'version' for the latest stable.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
idstringYesNonePackage id
versionstringNonullVersion (omit for latest stable)
daxlib_uninstallRemove a DaxLib package previously installed by Semanticus: deletes the UDFs it owns (per provenance) in one undoable batch and clears its provenance record.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
idstringYesNonePackage id to remove
daxlib_versionsList the published versions of a DaxLib package (newest-first, including -prerelease tags).

Anonymous + read-only.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
idstringYesNonePackage id, e.g. 'Daxlib.Sample'

Calendars

define_calendarCreate a calendar on a table (calendar-based time intelligence, cl 1701+): map its columns to TimeUnit categories (Year, Quarter, Month, Week, Date, MonthOfYear, DayOfWeek, …: absolute units and recurring '…OfYear' variants), with optional associated columns per unit and a 'timeRelated' bucket for untagged time columns (e.g.

IsWorkingDay). Enables calendar-aware DAX: totalytd(expr, '<calendar>'). A table can hold several calendars (Gregorian + Fiscal + iso…) over the same columns. One undoable step; persist with save_model. Requires cl 1701+ (set_compatibility_level).

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
tableRefstringYesNoneTable name or 'table:Name' ref
namestringYesNoneCalendar name, e.g. 'Fiscal'
mappingsCalendarMappingSpecYesNoneColumn→category mappings; timeUnit = a TimeUnit name, or 'timeRelated' for the untagged bucket; associated=true adds the column as an associated column of that unit (map the primary first)
descriptionstringNonullOptional calendar description
define_calendar_from_templateOne-step calendar setup (the modern replacement for generate_date_table): generate a template's calculated columns (only where absent: existing columns are kept and mapped as-is) and the calendar with its TimeUnit mappings, as one undoable step.

Templates: gregorian (Year/Quarter/Month/Day + name-by-number sort pairing) · fiscal (fiscalStartMonth, fy labeled by ending year) · iso (iso-8601 weeks, Thursday rule) · 445 (4-4-5 retail periods over iso weeks) · 13period (13 four-week periods). Targets an existing table with a date column (dateColumn, auto-detected when unambiguous), or creates a fresh calendar() calculated table when tableName doesn't exist. The week-based templates (iso/445/13period) share iso scaffolding columns so they coexist on one table. Requires cl 1701+.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
templatestringYesNoneGregorian | fiscal | iso | 445 | 13period
tableNamestringNonullTarget table (default 'Date'; created as a calculated calendar() table if absent)
dateColumnstringNonullDate column on the table (default: 'Date', else the single DateTime column)
fiscalStartMonthintNo7Fiscal template: first month of the fiscal year, 1-12 (default 7 = July)
startExprstringNonullNew-table only: DAX start-date expression (default date(year(today())-5,1,1))
endExprstringNonullNew-table only: DAX end-date expression (default date(year(today()),12,31))
calendarNamestringNonullCalendar name override (default: the template's, e.g. 'Fiscal', '4-4-5')
delete_calendarDelete a calendar from a table (the columns themselves are untouched).

Undoable.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
tableRefstringYesNoneTable name or 'table:Name' ref
namestringYesNoneCalendar name
generate_date_tableClassic approach: create a calculated date table (Date, Year, Quarter, Month Number/Name, Year-Month, Day, Day-of-Week) over a date range and mark it as the model's date table (DataCategory='Time', with its Date column as the key).

For calendar-based time intelligence (cl 1701+, the modern approach with calendar-aware DAX like totalytd(expr, 'Fiscal')), prefer define_calendar_from_template. Defaults: name 'Date', range 5 years back to end of this year. Columns materialize on deploy/process. Undoable.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
tableNamestringNo"Date"Table name (default 'Date')
startExprstringNonullDAX start-date expression (default date(year(today())-5,1,1))
endExprstringNonullDAX end-date expression (default date(year(today()),12,31))
markAsDateboolNotrueMark as the date table (DataCategory='Time' and the Date column as the key); default true
generate_time_intelligenceGenerate a suite of time-intelligence measures for a base measure, each correctly written against the given date column, named '<base> <variant>', placed in a 'Time Intelligence' display folder, and inheriting the base format.

Default suite: ytd, qtd, mtd, py (prior year), YoY, YoYPct. Additional opt-in variants (pass in 'variants'): roll12/r3m/r6m (rolling 12/3/6-month windows), sply (same period last year), pytd (prior-year ytd), pm (prior month), MoM + MoM% (month-over-month delta and %). Undoable.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
baseMeasureRefstringYesNoneBase measure ref, e.g. 'measure:Sales/Total Sales'
dateColumnstringYesNoneDate column as DAX ('Date'[Date]) or a column ref (column:Date/Date)
variantsstringNonullVariants (default ytd,qtd,mtd,py,YoY,YoYPct). Also: roll12, r3m, r6m, sply, pytd, pm, MoM, MoM%
displayFolderstringNonullDisplay folder (default 'Time Intelligence')
list_calendarsList the model's calendars (calendar-based time intelligence, cl 1701+): per table, each calendar's column→TimeUnit mappings (Year/Quarter/Month/Week/Date/…, primary + associated) and its time-related (untagged) bucket.

Pure offline metadata read, no connection needed. Also reports whether the model's compatibility level supports calendars at all.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
tableRefstringNonullTable name or 'table:Name' ref to filter to one table; null = all tables
mark_date_tableMark a table as the model's date table (DataCategory='Time').

Required for good time-intelligence and Copilot date handling. Deterministic, undoable.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
tableRefstringYesNoneTable ref, e.g. 'table:Date'
dateColumnstringYesNoneThe date/key column name on that table
tag_calendar_columnIncrementally edit one column mapping on an existing calendar: tag a column to a TimeUnit (replacing that unit's primary if it has one), add it as an associated column of a unit, put it in the 'timeRelated' bucket, or remove=true to untag it.

Undoable.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
tableRefstringYesNoneTable name or 'table:Name' ref
calendarNamestringYesNoneCalendar name (must exist: define_calendar first)
columnstringYesNoneColumn name on the calendar's table
timeUnitstringNonullTimeUnit name (Year/Quarter/Month/Week/Date/MonthOfYear/…), or 'timeRelated'/null for the untagged bucket
associatedboolNofalseTrue = add as an associated column of the unit (its primary must already be mapped)
removeboolNofalseTrue = remove this column's mapping instead of adding one

Data agent

delete_data_agentDelete a Fabric data agent item.

Dry run by default: commit=false returns the exact request and changes nothing; commit=true deletes it (irreversible).

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: experimental. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
workspaceIdstringYesNoneWorkspace id
agentIdstringYesNoneData agent item id
commitboolNofalseFalse = dry run (default, sends nothing); true = delete
authModestringNo"azcli"Azcli (default) | serviceprincipal | interactive | devicecode
cancellationTokenCancellationTokenNodefault
generate_data_agent_configBuild a complete semantic_model datasource config from the open model in one shot: an element tree of every table/column/measure with model descriptions carried and is_selected honoring hidden objects + the Prep-for-AI AI-data-schema exclusions; aiInstructions seeded from the model's lsdl instructions.

Returns the JSON for review (feed it to update_data_agent). Writes nothing. artifactId/workspaceId come back as placeholders (resolve the real Fabric ids first, see the Note).

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: experimental. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
maxColumnsPerTableintNo200Max columns to emit per table (default 200)
get_data_agentGet one data agent's decoded configuration: the draft (and published, if any) stage, aiInstructions, each data source (type, ids, descriptions, the raw elements tree, few-shots), and the publish description.

Live read; read-only.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: experimental. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
workspaceIdstringYesNoneWorkspace id
agentIdstringYesNoneData agent item id (from list_data_agents)
authModestringNo"azcli"Azcli (default) | serviceprincipal | interactive | devicecode
cancellationTokenCancellationTokenNodefault
list_data_agentsList the Fabric data agents in a workspace (id, name, description, type).

Live read against api.fabric.microsoft.com with your Entra identity; read-only. [verify-at-build]: the item type string isn't documented yet, so this filters items whose type contains 'dataagent' (case-insensitive). If none match, ObservedItemTypes lists every item type in the workspace so you can confirm the real one.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: experimental. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
workspaceIdstringYesNoneWorkspace id (from list_workspaces)
authModestringNo"azcli"Azcli (default) | serviceprincipal | interactive | devicecode
cancellationTokenCancellationTokenNodefault
publish_data_agentPublish a data agent: copy every draft/* part to published/* and write publish_info.json with a description ([verify-at-build]: v1 publishes via the documented definition-write path).

Dry run by default: commit=false returns the exact request and changes nothing; commit=true publishes.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: deferred. Risk class: critical.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
workspaceIdstringYesNoneWorkspace id
agentIdstringYesNoneData agent item id
descriptionstringNonullPublish description
commitboolNofalseFalse = dry run (default, sends nothing); true = publish
authModestringNo"azcli"Azcli (default) | serviceprincipal | interactive | devicecode
cancellationTokenCancellationTokenNodefault
update_data_agentUpdate a data agent's draft: replace only the parts you pass (null = keep).

Read-modify-write: fetches the current definition and re-emits all existing parts plus your changes (never drops unknown parts). aiInstructions capped at 15000 chars. datasourceJson/fewshotsJson go under the draft/{datasourceFolder}/ folder (folder = 'semantic_model-<name>'). dry run by default: commit=false returns the exact request and changes nothing.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: experimental. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
workspaceIdstringYesNoneWorkspace id
agentIdstringYesNoneData agent item id
aiInstructionsstringNonullNew AI instructions (null = keep; <=15000 chars)
datasourceFolderstringNonullDatasource folder name, e.g. 'semantic_model-Sales' (required to write datasourceJson/fewshotsJson)
datasourceJsonstringNonullDatasource.json content (from generate_data_agent_config); null = keep
fewshotsJsonstringNonullFewshots.json content; null = keep. note: few-shots aren't supported for semantic-model sources yet ([verify-at-build]).
commitboolNofalseFalse = dry run (default, sends nothing); true = update
authModestringNo"azcli"Azcli (default) | serviceprincipal | interactive | devicecode
cancellationTokenCancellationTokenNodefault

Model security

delete_roleDelete a security role (and its RLS filters + members).

Undoable.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
namestringYesNoneRole name
list_rolesList the model's security roles: each role's name, model permission (None/Read/ReadRefresh/Refresh/Administrator), per-table RLS row-filter DAX, and members.

RLS gates what data a Copilot / data-agent persona can see, so it matters for AI grounding.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

set_role_memberAdd or remove an (Azure ad / external) member of a role, by name (e.g.

A upn or group). add=true adds, add=false removes. A member must look like an email, a group name, or an object id. Adding a member that is already on the role reports that and does not create a new edit. note: adding members is blocked on a governed Power BI model (V3Restricted). Members are then managed in the Power BI service; removing/listing always works. Undoable.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
roleNamestringYesNoneRole name
memberNamestringYesNoneMember name (upn / group / object id)
addboolNotrueTrue = add, false = remove
set_role_permissionSet a role's model-level permission: None | Read | ReadRefresh | Refresh | Administrator.

Undoable.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
namestringYesNoneRole name
modelPermissionstringYesNoneNone | Read | ReadRefresh | Refresh | Administrator
set_table_olsSet a table's object-level (metadata) security for a role: controls whether the role can see the table at all (distinct from set_table_permission's row filter).

'None' hides the table's metadata + data from the role; 'Read' grants it; 'Default' removes the override (visible). Requires model compatibility level >= 1400 (errors clearly below). A calculation group cannot carry OLS. Surfaced via list_roles → ObjectPermissions. Undoable.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
roleNamestringYesNoneRole name
tableRefstringYesNoneTable ref or name, e.g. 'table:Salary' or 'Salary'
permissionstringYesNoneDefault | None | Read
set_table_permissionSet (or clear) a table's RLS row-filter DAX for a role: the boolean filter applied to that table's rows for members of the role, e.g.

"[Region] = lookupvalue(...)" or "[Owner] = userprincipalname()". Pass an empty filter to remove it. Invalid DAX (unknown columns/functions, incomplete expressions, unknown tables) is refused and nothing is saved. Setting a filter auto-promotes the role's permission from None to Read. The result echoes the resulting ModelPermission and a Promoted flag so the elevation is explicit. RLS row-filters cannot target a calculation group. The filter is a DAX expression and participates in rename fixup. Undoable.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
roleNamestringYesNoneRole name
tableRefstringYesNoneTable ref or name, e.g. 'table:Sales' or 'Sales'
filterDaxstringYesNoneDAX boolean row filter; empty/null removes the filter

Cross-cutting tools

dry_runPlan mode for the model: rehearse any single model-mutating op through its real code path and get back the exact change set it would make (the model/didChange deltas) plus the op's own return value, with a hard guarantee of no mutation, no undo entry, no broadcast, and no audit record (the edit is applied, then rolled back).

Preview a create_measure / update_measure / rename_object / set_property / define_calendar before committing, or check whether an op would fail. A rehearsal that finds the failure is still a successful dry-run (WouldSucceed=false with the op's real teaching error). 'argsJson' is a JSON object of the op's arguments by name, e.g. {"tableRef":"table:Sales","name":"Margin","expression":"[Sales]-[Cost]"}. Entitlement gates stay active (a Pro refusal is the real answer you'd get). denied (each refusal names the right path): external/system I/O + lifecycle (save_model/open_*/connect_*/refresh_partition/export_vpax/clear_cache/evaluate_and_log/benchmark_*), deploy/cloud/git/fabric/cicd/daxlib/data-agent (already commit-gated, run directly), the undo timeline (undo_change/redo_change), multi-mutate composites whose later steps read earlier writes (apply_plan/apply_safe_fixes/make_model_ai_ready/apply_model_diff/cherry_pick/build_model_from_spec/apply_dax_script/apply_tmdl: use propose_plan / preview paths / apply one typed op), and workflow/knowledge/waiver/connection bookkeeping. After a green rehearsal, run the op itself to apply.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: critical.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
opstringYesNoneThe op name to rehearse (from get_op_catalog), e.g. 'create_measure'
argsJsonstringNonullThe op's arguments as a JSON object keyed by argument name; omit for an op that takes none
export_vpaxExport the open model to a VertiPaq-Analyzer .vpax file (the interchange format for VertiPaq Analyzer, DAX Studio, and the sqlbi ecosystem), using Microsoft/sqlbi's official Dax.Vpax.

Writes the model metadata (tables, columns, measures, relationships). Works offline. Storage statistics (column sizes / cardinality) require a processed/live model and are not included yet. Returns the path, table count, and a note; door-safe (a bad path returns .Error rather than throwing).

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
pathstringYesNoneTarget .vpax file path to write.
get_layoutGet the saved diagram positions for the model's tables (x/y, and width/height when set).

Returns only tables that have a stored position. Tables not listed are unplaced (auto-laid-out by the UI). keep=true marks a table the Diagram leaves where it is when it moves tables apart to make room for the lines; the Diagram may otherwise move tables it finds too close for their lines and save the new spots. Positions are engine-owned (a .semanticus/layout.json sidecar beside the model), keyed by a stable LineageTag so a position survives a table rename, and excluded from the model diff. Read it to render or reason about the table layout the human sees.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

harness_reportRead-only harness-ergonomics report over the l0 experience log (.semanticus/experience.jsonl): per-op counts + error rates, retry clusters (>=2 consecutive same-op failures), the top-N recurring error messages, top flail sites (failures-before-a-success per op), and the four harness KPIs (task success rate, tokens/outcome [not derivable from l0 v1], flail rate per 100 events, human interventions).

Use it to find where agents flail so you can fix tool ergonomics (better error messages, terser results): a permanent improvement, cheaper than learning machinery. Fail-soft: a missing/empty/corrupt log returns an empty report with a note, never an error. Does not mutate the model.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
topNintNo10How many rows to keep in the error-frequency and flail-site tables (default 10).
propose_replaceBulk find & replace as a reviewable Change Plan (nothing mutates).

Runs the same detailed search as search_model, then turns every replaceable match into the right kind of plan item: name matches → 'rename' items (FormulaFixup rewrites every DAX/RLS reference at apply; renames are opt-in 'proposed'); description/displayFolder/formatString/synonyms → plain-text set items (pre-approved, safe); matches inside DAX string literals/comments → 'set_dax' items spliced span-wise so reference spans are never touched (opt-in: they change results; validated for syntax); M bodies → 'set_m' items (opt-in, literal, not reference-fixed). DAX-reference/DAX-code/RLS matches yield no items. The view's .note reports them honestly (rename the referenced object instead). Items that cannot apply (name collisions, empty results) come back status='skipped' with the reason. replaces any current plan. Next: get_plan to review, set_plan_item to approve/reject, then apply_plan.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
findstringYesNoneText to find (a literal substring, or a regex when regex=true)
replacestringYesNoneReplacement text (literal: capture-group expansion like $1 is not applied in this version)
caseSensitiveboolNofalseMatch case exactly (default false)
wholeWordboolNofalseMatch whole words only (default false)
regexboolNofalseTreat find as a regex (default false)
kindsstringNonullRestrict to object kinds, e.g. ['measure','column']. Empty = all kinds.
fieldsstringNonullRestrict to fields, e.g. ['name','description','displayFolder']. Empty = name+description+expression (the search_model default surface).
scopestringNonullRestrict scope: 'table:Sales' or 'folder:Financials'. Empty = whole model.
maxItemsintNo500Cap on plan items (default 500); overflow is reported in the view's note.
replace_in_objectSafely replace matched text in one object field, routed by the field's matchClass (from search_model).

Name → a reference-aware rename (FormulaFixup rewrites every DAX/RLS reference); description/displayFolder/formatString → plain-text set; expression → replaces text inside a DAX string-literal or comment only (validated for syntax); mExpression → literal M edit (with a warning: M is not reference-fixed); synonyms → updates the linguistic terms. hard-blocked: a match on a DAX identifier/reference or on DAX code. It returns the 'rename the object instead' hint rather than corrupting the formula. RLS filters are rename-only. This is a single, free, undoable edit. Pass spanStart/spanLen (from a hit's spans[]) to change only that one occurrence; omit them to replace every occurrence in the field. preview=true rehearses: returns the same before/after + warnings (+ .references blast radius for a rename) without mutating, and reports a safety refusal in .blocked instead of throwing. Returns before/after, the (possibly new) ref, and any warnings (e.g. M references the old name). For many matches at once, use propose_replace + apply_plan instead.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
objRefstringYesNoneObject ref, e.g. 'measure:Sales/Total Sales' (or 'namedexpr:Name' for a shared M expression)
fieldstringYesNoneField to edit: name | description | expression | displayFolder | formatString | mExpression | synonyms
findstringYesNoneText to find (a literal substring, or a regex when regex=true)
replacestringYesNoneReplacement text (literal: capture-group expansion like $1 is not applied in this version)
caseSensitiveboolNofalseMatch case exactly (default false)
wholeWordboolNofalseMatch whole words only (default false)
regexboolNofalseTreat find as a regex (default false)
spanStartintNo-1Optional: replace only the occurrence at this raw offset (from a hit's spans[].start). -1 = every occurrence.
spanLenintNo0Length of that occurrence (from a hit's spans[].len). Required if spanStart is set.
culturestringNonullSynonyms only: which culture's terms to edit (default: the one the search found)
previewboolNofalseTrue = rehearse only: compute before/after + warnings, change nothing (a safety refusal lands in .blocked, not a throw)
save_layoutPersist diagram positions for tables (x/y, optional width/height).

Identify each table by its ref (preferred) or name. Set keep=true on a table to keep that exact spot: otherwise, when tables sit on top of each other or too close for the lines between them, the Diagram moves them apart just enough and saves the new spots (read them back with get_layout). A table saved without keep loses an earlier keep. merges with existing positions (tables you omit keep theirs; deleted tables are pruned) and the engine re-keys each by its stable LineageTag, so the layout survives renames. Writes the .semanticus/layout.json sidecar beside the model. This is not a model edit (it does not touch the model definition or its diff). The model must be saved on disk first; otherwise returns an Error.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
tablesLayoutNodeYesNoneTables to position. Each: ref (preferred) or name, plus x and y (and optional width/height, and keep=true to keep exactly that spot).
originstringNo"agent"Originating driver tag for the change (default 'agent')

Agent governance

get_agent_policyRead the agent-permissions policy: what you (the agent) are allowed to do to a live target, by environment.

Returns the global on/off switch, the active preset, and the capability×label matrix. Labels are local | dev | uat | prod; an unlabelled target is treated as prod (the strictest). Actions are allow | ask | deny: 'ask' means a human must approve the specific action in the UI before you can do it (see list_pending_approvals. You request approval simply by attempting the action). Reading, and running a calculation, are never gated. Use this to know before you try: if pushing to a target is 'deny' or 'ask', tell the user rather than failing repeatedly. Only a human can change this policy or the labels it reads; the user sets labels in Connections, in vs Code. Read-only and free.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: critical.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

list_pending_approvalsThe 'waiting for you' queue: actions you attempted that the policy said need a human's approval (an 'ask').

Each entry is bound to the exact action (capability + target + intent); the human approves it in the UI, then you retry the same action and it proceeds once (a grant is one-shot and expires). Use this to see what you're waiting on. You cannot approve your own actions. That asymmetry is the point. Read-only and free.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

Typed decisions

get_decision_budgetWhat the suggestions have used, in tokens and in us dollars.

Two counts, and they are different numbers: the plain fields are this session on this machine (a count only: a session has no cap, capInputTokens and remainingInputTokens are null, and usedUsd is what it cost at the provider rate recorded by the running service), and the monthly ones are the whole licence's allowance for the calendar month (monthlyUsedUsd of monthlyCapUsd), read live from the service. A null monthly figure means it could not be read and monthlyReason says why in plain words; never read a null as a zero. Counts, money and a date only, never any content and never a credential. When the month's allowance runs out the product stops suggesting and behaves as it does with no service at all; nothing you can do offline is affected. Reads only.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

get_decision_pointsList every place this product can ask an outside service for a suggestion.

Each one shows exactly what it would send, how sure it has to be, what happens when it is not sure enough, and whether it is switched on for this model. A point with 'live' false is one this build never asks, whatever 'enabled' says: its replay bar is unmet, so nothing is sent for it and the switch cannot be turned on. This list is the whole audit surface: nothing can ask anything that is not on it. Reads only.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

propose_measure_defaultsSuggest a display folder and a number format for a measure that was created without either.

It suggests only: nothing is written, and the measure is exactly as you left it. When it cannot suggest, 'reason' says why in plain words (no service set up, no permission for this model, not Pro, switched off, or nothing sure enough). The formula itself is never sent, only facts worked out from it on this computer. Use set_display_folder and set_measure_format to act on a suggestion. Reads only.

Entitlement: Free entry point. Jev advice requires Pro and current permission for this model. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
objRefstringYesNoneMeasure ref, e.g. 'measure:Sales/Total Sales' (see list_measures)
set_decision_point_enabledSwitch one suggestion on or off for the open model.

Off means it is never asked, whatever the permission says. Each model has its own switches. A saved model keeps them in its folder, so they travel with the project and not with the person; a model open live keeps them in this workspace; a model not saved yet keeps them until its first save. When a switch was decided by something other than this model's own switch, 'note' says what.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
namestringYesNoneThe point name from get_decision_points, e.g. 'measure.folder_and_format'
enabledboolYesNoneTrue to allow it, false to switch it off

Orientation and model reads

get_dependenciesDAX dependency edges for an object (measure, calculated column/table, calculation item, udf, column).

Direction='dependsOn' (default) lists what its DAX consumes (check before editing); direction='dependents' lists what references it (check before delete_object/rename_object to see what would dangle). Returns each ref/name/kind; empty when the object has no DAX edges.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
objRefstringYesNoneObject ref, e.g. 'measure:Sales/Total Sales', 'column:Sales/Amount', 'function:Utils/fmt'
directionstringNo"dependsOn"'dependsOn' or 'upstream' (what it consumes); 'dependents' or 'downstream' (what references it). Default dependsOn.
get_model_factsThe open model's facts in one snapshot: every table and column with its settings (type, hidden, summarize by, category, sort by, format, key, relationship side), how many measures use each column, whether checked reports use it, and, when the model is connected to its own data, facts derived from that data: distinct count, blank share, whole numbers, unique on every row, looks like a year, month, day or quarter, shares that look like places, links, image links or email addresses, same-table columns that pair one to one, storage bytes and cardinality.

Also the storage findings the Storage tab shows. Never contains a row, a raw value, a minimum, a maximum or a sample. data is live, local or none; with none there are no measured blocks, which means unknown, not zero. A large table is measured on a bounded sample and says sampled. producers says where each fact came from, how much it covers and how fresh it is. Cached per model revision and report selection and rebuilt in the background after a change. No approval is asked for: the facts are counts and patterns, not rows. Refused only when the person has denied your data reads (QueryData) on the connected target. Reads only. Free.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

get_model_fingerprintThe open model's deterministic fingerprint: table/measure/column counts, source types, fact/dim classification, a naming-convention hash, and the top domain-word tokens, plus the stable FingerprintKey used to scope insights to matching model shapes.

No inference, no embeddings. Use it to reason about 'have I seen a model like this before'. Needs an open model. Free, read-only.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

get_model_graphGet the model's structure as a graph, for relationship and star-schema checks.

Detail='summary' returns counts only: tables and relationships, tables by type (date, calculated, hidden), the relationship breakdown (many-to-many, bidirectional, inactive) and the names of visible tables that sit in no relationship. It is the lighter first call on a large model. detail='full' (the default) returns every table (column and measure counts, key columns, date-table and hidden flags) and every relationship (both ends, cardinality, cross-filter direction, active or not). Read-only; works offline.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
detailstringNo"full"Full (the default: every table and relationship) or summary (counts only)
get_model_objectsOne-call browser dataset: every table + its measures, columns, and hierarchies (with the level names, in order), each with its display folder, data type, and hidden/key flags.

Backs the Advanced-Modelling object browser (perspective/field-parameter/RLS pickers). Prefer this over separate list_measures + list_columns when you need the whole object surface at once (it also carries hierarchies, which those omit). Read-only metadata; works offline.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

get_model_summarySession-start orientation for a fresh session, after a context compaction, or at a handoff.

One round-trip, token-budgeted (≤~2k tokens), giving connection state · entitlement · model overview · a compact excerpt from the model's declared Primer · AI-readiness · structural graph · in-flight work · recent activity · deterministic next actions. Drill down with get_model_primer, connection_status, get_entitlement, ai_readiness_scan, get_model_graph, get_workflow_run, get_plan, get_spec and list_calendars. It omits full findings, object detail and DAX bodies.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

get_objectGet an object's properties by ref (e.g.

'measure:Sales/Total Sales', 'column:Sales/Amount', 'table:Sales').

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
objRefstringYesNoneObject ref
list_columnsList every column (excluding the internal RowNumber) with the metadata that drives column AI-readiness/authoring: ref, name, table, data type, display folder, format string, summarize-by, data category, and flags for key / hidden / calculated / has-description (+ description, + DAX expression for calculated columns).

One call to audit smells like a visible key column, a key with SummarizeBy != None, or a missing description/format.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

list_measuresList every measure in the model with the metadata that drives AI-readiness and authoring: ref, name, owning table, display folder, format string, hidden flag, whether it has a description (+ the description), and its DAX expression.

One call to audit naming/folders/formats/descriptions across all measures (e.g. find measures missing a description or a format string).

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

list_objectsList child objects of a node.

Pass an empty/null parentRef to list tables; pass a table ref (e.g. 'table:Sales') to list its measures and columns.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
parentRefstringYesNoneParent object ref, or null/empty for the model root (tables)
model_overviewSummarize the open semantic model: name, source, sessionId, table/measure counts, and whether there are unsaved changes.

A cheap check of which model is open. For session-start orientation (connection, tier, grade, in-flight work, next actions) use get_model_summary.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

script_objectsScript one or many objects to text (read-only, never mutates).

Format: 'dax' (annotated expressions for measures/calc columns/calc tables/calc items/UDFs), 'tmdl' (per-object TMDL: the model's native, readable on-disk format; the preferred export), or 'tmsl' (createOrReplace JSON; tmsl's unit is the table/role, so a child object scripts its containing table, deduped to containers). Pass several refs to capture a whole batch (e.g. all of a table's measures) in one document. Unresolvable refs are skipped.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
refsstringYesNoneObject refs to script, e.g. ['measure:Sales/Total','measure:Sales/Margin']
formatstringNo"dax"Output format: dax | tmdl | tmsl (default dax)
search_modelDetailed model-wide search.

Default (no filters): case-insensitive substring over object names, descriptions, and DAX expressions: the classic behaviour. Optional modes: caseSensitive, wholeWord, regex (validated, with a timeout guard). Optional filters: kinds[] (measure/column/table/hierarchy/calcitem/function/role/perspective/partition), fields[] (name, description, expression, displayFolder, formatString, rlsFilter, mExpression, synonyms. Pass fields to widen beyond the default name+description+expression), and scope ('table:Name' or 'folder:Name'). Each hit carries ref, kind, table, the field matched, a snippet, raw-offset spans[], and (key for replace) a matchClass (ObjectName | PlainText | DaxReference | DaxLiteral | DaxComment | DaxCode | MExpression) with replaceable + replaceHint. matchClass tells you how to change it safely: ObjectName → rename_object (references auto-update); DaxReference/DaxCode → not text-replaceable (rename the object); DaxLiteral/DaxComment/PlainText/MExpression → replace_in_object. Results carry byField/byMatchClass/byKind facet counts and paging (offset). An invalid regex is reported in .Error (not thrown).

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
querystringYesNoneText to find. A literal substring, or a regex when regex=true.
maxintNo100Max hits to return (default 100)
caseSensitiveboolNofalseMatch case exactly (default false)
wholeWordboolNofalseMatch whole words only (word boundaries) (default false)
regexboolNofalseTreat query as a .net regular expression (default false)
kindsstringNonullRestrict to object kinds, e.g. ['measure','column']. Empty = all kinds.
fieldsstringNonullRestrict to fields, e.g. ['name','expression','displayFolder']. Empty = name+description+expression (the default surface).
scopestringNonullRestrict scope: 'table:Sales' or 'folder:Financials'. Empty = whole model.
offsetintNo0Paging offset: skip this many hits before returning (default 0)

Metadata and properties

get_named_expressionGet one shared M expression / parameter's M text by name (e.g.

'RangeStart').

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
namestringYesNoneExpression name
get_partition_mGet a partition's M source expression.

Errors if the partition is not an M source (e.g. a Direct Lake Entity or DAX calculated partition).

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
partitionRefstringYesNonePartition ref, e.g. 'partition:Sales/Sales'
get_perspectivesList the model's perspectives and the object refs currently shown in each (the objects×perspectives membership matrix).

Read-only.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

get_propertiesList an object's editable properties (the property grid surface).

Each: name, displayName, category, kind (string/bool/number/enum), current value, enum options, read-only. Pass 'model:' for model-level settings, or any table/column/measure/relationship/function ref. Pair with set_property.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
objRefstringYesNoneObject ref, e.g. 'model:' or 'column:Sales/Amount'
list_calculation_groupsList the model's calculation groups with their precedence and ordered items (each item's DAX expression + dynamic format-string).

Read-only. Author with create_calculation_group / create_calculation_item / set_calc_group_precedence / set_calc_item_format_string.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

list_format_templatesBrowse the curated number-format-string template library (colour is report-side, out of scope): 86 templates across 17 categories (whole numbers, decimals, percentages, currency, scaled K/M/B, signed/variance, Unicode change-indicators, accounting, dates, times, durations, kpi glyphs, ratios, basis points, custom units, blank/zero, scientific).

Each has an id, category, name, kind ('static' literal | 'dynamic' DAX expression), the format string, a sampleInput->exampleOutput, a 'common' flag (~20 pinned), and any credit/pack. Apply a static template with set_measure_format (measure) or set_calc_item_format_string (a quoted literal on a calc item); apply a dynamic one with set_measure_format_expression (measure) or set_calc_item_format_string (raw expression on a calc item). Read-only; works with no model open. Use this instead of guessing glyphs / scaling-commas.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
categorystringNonullOptional category filter (equals or contains, case-insensitive), e.g. 'Percentages' or 'change'
searchstringNonullOptional fuzzy search over id/name/category/format-string/description
list_named_expressionsList the model's shared M expressions + parameters (name, kind, M, description).

RangeStart/RangeEnd parameters show here. Edit one with update_named_expression, create with create_named_expression.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

No client parameters.

list_partitionsList a table's partitions (ref, mode, source type, data source).

Read a partition's M with get_partition_m, edit it with set_partition_m.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: standard.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
tableRefstringYesNoneTable ref or bare table name, e.g. 'table:Sales' or 'Sales'
rename_display_folderRename (or move) a display folder on a table by rewriting the DisplayFolder prefix on every member (measures, columns and hierarchies, nested subfolders included) in one undoable batch.

ToPath may be nested ('Parent\Child') to move the folder; empty toPath removes the folder level (members are promoted). Fails with a teaching message if no member is in fromPath (folders exist only through their members).

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
tableRefstringYesNoneTable ref, e.g. 'table:Sales'
fromPathstringYesNoneThe current folder path exactly as on the members, e.g. 'KPIs' or 'Sales\Growth'
toPathstringNonullThe new folder path; empty = remove this folder level
set_calc_group_precedenceSet a calculation group's precedence (an integer; a higher precedence is applied first when multiple calculation groups combine).

Give each calc group a distinct precedence so their combination order is deterministic. Undoable.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
calcGroupRefstringYesNoneCalculation group ref, e.g. 'calcgroup:Time Intelligence' or 'table:Time Intelligence'
precedenceintYesNonePrecedence integer (higher applies first)
set_calc_item_format_stringSet (or clear) a calculation item's dynamic format-string expression: the DAX that overrides the format string of measures evaluated under this item (e.g.

A '% of Total' item rendering 0.0%, or a currency item). Pass an empty string to clear it (the item falls back to the base/model format). Undoable.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
calcItemRefstringYesNoneCalculation item ref, e.g. 'calcitem:Time Intelligence/ytd'
formatExpressionstringYesNoneFormat-string DAX expression; empty clears it
set_column_data_typeSet a data (source) column's data type: String|Int64|Decimal|Double|DateTime|Boolean.

Only applies to physical/source columns (a calculated column derives its type from its DAX). Undoable.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
columnRefstringYesNoneColumn ref, e.g. 'column:Sales/Amount'
dataTypestringYesNoneString | Int64 | Decimal | Double | DateTime | Boolean
set_column_hiddenShow/hide a column.

Hidden columns are excluded from Copilot/data-agent grounding. Hide technical/key/FK columns. Deterministic, undoable.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
objRefstringYesNoneColumn ref
hiddenboolYesNoneTrue to hide, false to show
set_column_olsSet a column's object-level (metadata) security for a role: controls whether the role can see the column.

'None' hides the column from the role; 'Read' grants it; 'Default' removes the override (visible). Requires model compatibility level >= 1400 (errors clearly below). Surfaced via list_roles → ObjectPermissions[].Columns. Undoable.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
roleNamestringYesNoneRole name
columnRefstringYesNoneColumn ref, e.g. 'column:Employee/Salary'
permissionstringYesNoneDefault | None | Read
set_data_categorySet a column's data category (e.g.

'City','Country','StateOrProvince','PostalCode','WebUrl','ImageUrl'). Helps Copilot/maps. Deterministic, undoable.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
objRefstringYesNoneColumn ref, e.g. 'column:Geography/City'
dataCategorystringYesNoneData category
set_descriptionSet an object's description: a measure, table, column, hierarchy, perspective, calculation item or any other object that has one.

Keep it <=200 chars and front-loaded: Copilot truncates. Applies as a reviewable, undoable change tagged as the agent. Use after get_grounding.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
objRefstringYesNoneObject ref
textstringYesNoneBusiness description, <=200 chars, front-loaded
set_display_folderFile measures/columns/hierarchies into a display folder in one undoable batch (or clear with an empty folder).

A display folder is just the DisplayFolder string on each member ('Parent\Child' nests). It has no existence of its own, so an empty folder cannot persist: create one by moving/creating a member into it. All-or-nothing: any bad ref rolls the whole batch back. For a single object set_property(DisplayFolder) works too; this op keeps a multi-object gesture to one undo step.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
refsstringYesNoneObject refs to file, e.g. ['measure:Sales/Total Sales','measure:Sales/Margin'] (measures/columns/hierarchies; see list_measures / list_columns)
folderstringNonullTarget folder path ('KPIs' or 'Sales\Growth'); empty/null clears (back to the table root)
set_measure_formatSet a measure's static format string (e.g.

'0.0%', '\$#,0', '#,0'). Deterministic, undoable. For a dynamic (per-filter-context) format that switches by magnitude/sign/currency, use set_measure_format_expression. Browse curated strings with list_format_templates.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
objRefstringYesNoneMeasure ref, e.g. 'measure:Sales/Total Sales'
formatStringstringYesNoneFormat string
set_measure_format_expressionSet (or clear) a measure's dynamic format-string expression: the DAX that returns a format string, evaluated per filter context (Power BI's 'Format = Dynamic').

This is how magnitude-adaptive scaling (500->'500', 5e6->'5M'), per-currency, per-selected-measure, and duration/bps formats work on a plain measure (a static string can't). Pass an empty string to clear it (the measure falls back to its static/model format). A non-blank expression auto-clears any static format string. Requires model compatibility level 1601+. Undoable. (For a static literal use set_measure_format; browse ready-made expressions with list_format_templates.)

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
objRefstringYesNoneMeasure ref, e.g. 'measure:Sales/YoY %'
formatExpressionstringYesNoneFormat-string DAX expression (e.g. a switch over selectedmeasure()); empty clears it
set_partition_mReplace a partition's M source expression (M partitions only).

Use to add an incremental-refresh RangeStart/RangeEnd date filter, or to edit the query. Undoable.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
partitionRefstringYesNonePartition ref, e.g. 'partition:Sales/Sales'
mExpressionstringYesNoneThe full M expression (a let … in … query)
set_perspective_memberInclude (or exclude) one object in a perspective.

The object ref is a table/column/measure/hierarchy. Including a table cascades to all its columns/measures/hierarchies. Undoable.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
perspectiveRefstringYesNonePerspective ref or name, e.g. 'perspective:Finance'
objectRefstringYesNoneObject ref to include/exclude: table:/column:/measure:/hierarchy:
includeboolYesNoneTrue to include in the perspective, false to exclude
set_propertiesSet one property to one value across many objects as a single atomic, undoable change (the multi-select property edit).

Same value encoding as set_property. all-or-nothing: if any object lacks the property or the value is invalid, nothing changes and the error names the object; one undo reverts the whole batch. Use set_property for a single object.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
objRefsstringYesNoneObject refs to edit, e.g. ['measure:Sales/Total','measure:Sales/Margin'] (see list_objects / list_measures / list_columns)
propertyNamestringYesNoneProperty name (exactly as returned by get_properties), applied to every object
valuestringYesNoneNew value as a string, applied to every object: same encoding as set_property (true/false, enum name, number)
set_propertySet one property of an object by name (from get_properties).

Value is the string form: 'true'/'false' for bool, the enum name for enum, the number for numeric. Setting 'Name' renames (DAX refs auto-rewritten). Undoable.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
objRefstringYesNoneObject ref
propertyNamestringYesNoneProperty name (exactly as returned by get_properties)
valuestringYesNoneNew value, as a string
set_relationship_activeActivate or deactivate a relationship.

Only one active relationship can exist on a given path between two tables. Inactive ones are reached on demand via userelationship in DAX (e.g. role-playing date relationships like Order Date vs Ship Date). isActive=true activates it, false deactivates it. Deterministic, undoable.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
relationshipNamestringYesNoneRelationship name
isActiveboolYesNoneTrue = active, false = inactive
set_relationship_cardinalitySet a single-column relationship's end cardinalities.

FromCardinality is the FK/from side, toCardinality the lookup/to side; each is 'Many' or 'One' (a null/empty end is left unchanged). A normal star-schema relationship is Many→One. Use this to fix a mis-shaped relationship in place instead of deleting and recreating it. Deterministic, undoable.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
relationshipNamestringYesNoneRelationship name
fromCardinalitystringYesNoneFrom (FK) side cardinality: 'Many' or 'One' (null = unchanged)
toCardinalitystringYesNoneTo (lookup) side cardinality: 'Many' or 'One' (null = unchanged)
set_relationship_crossfilterSet a relationship's cross-filter direction (OneDirection or BothDirections).

Prefer OneDirection in a star schema. Bidirectional can confuse AI filter context. Undoable.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
relationshipNamestringYesNoneRelationship name
crossFilteringBehaviorstringYesNoneOneDirection or BothDirections
set_sort_by_columnSet a column's sort-by column (e.g.

Sort 'Month Name' by 'Month Number'). Deterministic, undoable.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
objRefstringYesNoneColumn ref to sort
sortByColumnNamestringYesNoneName of the column to sort by (same table)
set_summarize_bySet a column's default aggregation (None/Sum/Average/Min/Max/Count/DistinctCount).

Use None for keys/years/codes. Deterministic, undoable. On Pro the Plan can propose an explicit base measure for a number column in place of the column adding up by itself (the column.summarize point); this op is the same setting done by hand.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
objRefstringYesNoneColumn ref
summarizeBystringYesNoneAggregate: None, Sum, Average, Min, Max, Count, DistinctCount
update_named_expressionReplace the M of an existing shared expression / parameter (create it first with create_named_expression).

Undoable.

Entitlement: Free entry point. Paid advice and selected automatic actions still need Pro where stated. Release class: supported. Risk class: high.

Permission: the current target policy applies. Exact approvals and human-only actions remain as stated in this operation’s description.

NameC# typeRequiredDefaultMeaning
namestringYesNoneExpression name
expressionstringYesNoneThe new M expression

A read before a write

Read the model and the current preview first. Use the returned identifiers and digests. Do not guess them from a name. For example, get_model_plan reads the current Plan; a later action must meet its own permission and entitlement rules.

{"name":"get_model_plan","arguments":{}}

Compatibility names

This catalogue lists current declared wire names. Old bookmarked operation names remain as fragment links where a current name can be identified. They are not additional operations and should not be called as aliases unless the running server advertises them. Choose the current operation by its description.

About this catalogue

Checked against this release. The running server supplies the complete JSON schema. Operation names and parameter contracts stay unchanged.