Agent tool reference
Browse every registered agent tool, its purpose, availability, required parameters, and exact JSON schema.
Every tool on Unity's one tool surface: the assistant, the tool endpoints and MCP list the same tools with the same schemas. Each entry below gives its purpose, access, whether it only reads, its parameters and its exact JSON schema. Use the search field to find a tool, field or capability. Connect your AI explains how to connect and call them.
A parameter that accepts null may be omitted. readOnly tools may be called with a workspace:read key and are MCP's readOnlyHint; view tools are available to anyone who can open the report and edit tools need Edit access. The running backend answers GET /api/reports/{report_id}/tools with the tools you may call there, and GET /api/agent/documentation?topic={topic} (or ReadUnityDocumentation) reads Unity's guides. You can also download this reference as JSON.
66 tools
Discovery and documentation
CreateReportchanges
Create a report you own, with one empty canvas page and one conversation. Returns its reportId and first page's id (defaultPageId). Connect data with SaveConnection.
Access: Any signed-in account; reaches reports.
MCP only: on a connection not limited to one report.
Parameters
namestringRequired1 to 50 characters.
Exact JSON schema
{
"type": "function",
"function": {
"name": "CreateReport",
"description": "Create a report you own, with one empty canvas page and one conversation. Returns its reportId and first page's id (defaultPageId). Connect data with SaveConnection.",
"parameters": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "1 to 50 characters."
}
},
"required": [
"name"
],
"additionalProperties": false
}
}
}
GetReportDefinitionread-only
Export this report as one JSON document (unityReportDefinition 1, schema unity://schemas/report-definition.json): its name and instructions; the model's entities, fields by fieldUid, relationships, calculated tables and measures; every page (a native page's layout and visuals by visualUid, an HTML page's source, datasets and bindings); the filters, as designed (people's own values are not in it); and the connections it uses by id, name and type, never their settings or credentials. The same state always exports the same bytes. version reads a saved version (ListReportVersions); pageId returns only that page and its filters. Read-only.
Access: Edit access; reaches history, model, pages, report.
With access to specific pages only: pages you may edit (Edit on the page; View and Edit content are read-only).
Parameters
versioninteger | nullOptionalA saved version from ListReportVersions; null for the report now.
minimum:1pageIdstring | nullOptionalA page's pageId: only that page and its filters (page Edit is enough); null for the whole report.
Exact JSON schema
{
"type": "function",
"function": {
"name": "GetReportDefinition",
"description": "Export this report as one JSON document (unityReportDefinition 1, schema unity://schemas/report-definition.json): its name and instructions; the model's entities, fields by fieldUid, relationships, calculated tables and measures; every page (a native page's layout and visuals by visualUid, an HTML page's source, datasets and bindings); the filters, as designed (people's own values are not in it); and the connections it uses by id, name and type, never their settings or credentials. The same state always exports the same bytes. version reads a saved version (ListReportVersions); pageId returns only that page and its filters. Read-only.",
"parameters": {
"type": "object",
"properties": {
"version": {
"type": [
"integer",
"null"
],
"minimum": 1,
"description": "A saved version from ListReportVersions; null for the report now."
},
"pageId": {
"type": [
"string",
"null"
],
"description": "A page's pageId: only that page and its filters (page Edit is enough); null for the whole report."
}
},
"required": [],
"additionalProperties": false
}
}
}
InspectDataModelread-only
Search the complete accessible model catalog, including entity source SQL, typed fields, business descriptions, measures, relationships and field usage across accessible reports. Use connectionId from InspectReport or null for the current report model. Read definitionId, fieldUid and versions before editing. Follow nextOffset when incomplete; prompt summaries may omit entries.
Access: View access; reaches model.
With access to specific pages only: any access (a tool that names a page works on pages shared with you; the model and query tools are the report Viewer's).
Parameters
connectionIdinteger | nullOptionalSee the operation description and exact schema for this value.
querystring | nullOptionalSee the operation description and exact schema for this value.
kindstring | nullOptionalSee the operation description and exact schema for this value.
enum:["all","entity","field","relationship",null]fieldUidsarray | nullOptionalSee the operation description and exact schema for this value.
offsetinteger | nullOptionalSee the operation description and exact schema for this value.
minimum:0limitinteger | nullOptionalSee the operation description and exact schema for this value.
minimum:1maximum:100
Exact JSON schema
{
"type": "function",
"function": {
"name": "InspectDataModel",
"description": "Search the complete accessible model catalog, including entity source SQL, typed fields, business descriptions, measures, relationships and field usage across accessible reports. Use connectionId from InspectReport or null for the current report model. Read definitionId, fieldUid and versions before editing. Follow nextOffset when incomplete; prompt summaries may omit entries.",
"parameters": {
"type": "object",
"properties": {
"connectionId": {
"type": [
"integer",
"null"
]
},
"query": {
"type": [
"string",
"null"
]
},
"kind": {
"type": [
"string",
"null"
],
"enum": [
"all",
"entity",
"field",
"relationship",
null
]
},
"fieldUids": {
"type": [
"array",
"null"
],
"items": {
"type": "string"
}
},
"offset": {
"type": [
"integer",
"null"
],
"minimum": 0
},
"limit": {
"type": [
"integer",
"null"
],
"minimum": 1,
"maximum": 100
}
},
"required": [],
"additionalProperties": false
}
}
}
InspectReportread-only
Inspect current persisted report state across ALL pages: every page, and the native visuals of traditional pages (an HTML page's content is read with InspectHtmlPage). Search titles, then request detail by visualKeys to retrieve each visual's query, appearance and filters. reportInstructions holds the report's saved instructions (null when none). Every traditional page has a fixed logical size (saved, or the default 1280×720) that the window, panels and zoom never change; it clips overflow and never grows to fit visuals. Page canvasBounds and visual layout.fitsWithinPage/overflowPixels verify geometry against it; layout.overlaps lists intersecting visuals; userSelected marks what the user had selected when the message was sent. Follow nextOffset until complete when enumerating.
Access: View access; reaches model, pages.
With access to specific pages only: any access (a tool that names a page works on pages shared with you; the model and query tools are the report Viewer's).
Parameters
querystring | nullOptionalSee the operation description and exact schema for this value.
kindstring | nullOptionalSee the operation description and exact schema for this value.
enum:["all","page","visual","connection",null]pageIdstring | nullOptionalStable pageId from InspectReport.
visualKeysarray | nullOptionalSee the operation description and exact schema for this value.
detailboolean | nullOptionalSee the operation description and exact schema for this value.
offsetinteger | nullOptionalSee the operation description and exact schema for this value.
minimum:0limitinteger | nullOptionalSee the operation description and exact schema for this value.
minimum:1maximum:100
Exact JSON schema
{
"type": "function",
"function": {
"name": "InspectReport",
"description": "Inspect current persisted report state across ALL pages: every page, and the native visuals of traditional pages (an HTML page's content is read with InspectHtmlPage). Search titles, then request detail by visualKeys to retrieve each visual's query, appearance and filters. reportInstructions holds the report's saved instructions (null when none). Every traditional page has a fixed logical size (saved, or the default 1280×720) that the window, panels and zoom never change; it clips overflow and never grows to fit visuals. Page canvasBounds and visual layout.fitsWithinPage/overflowPixels verify geometry against it; layout.overlaps lists intersecting visuals; userSelected marks what the user had selected when the message was sent. Follow nextOffset until complete when enumerating.",
"parameters": {
"type": "object",
"properties": {
"query": {
"type": [
"string",
"null"
]
},
"kind": {
"type": [
"string",
"null"
],
"enum": [
"all",
"page",
"visual",
"connection",
null
]
},
"pageId": {
"type": [
"string",
"null"
],
"description": "Stable pageId from InspectReport."
},
"visualKeys": {
"type": [
"array",
"null"
],
"items": {
"type": "string"
}
},
"detail": {
"type": [
"boolean",
"null"
]
},
"offset": {
"type": [
"integer",
"null"
],
"minimum": 0
},
"limit": {
"type": [
"integer",
"null"
],
"minimum": 1,
"maximum": 100
}
},
"required": [],
"additionalProperties": false
}
}
}
ListReportsread-only
List the reports you can open, newest first: reportId, name, accessLevel, contentEdit (a View share that may also edit page content), createdAt (UTC) and sourceCount. A report shared with you page by page has access level Pages and lists those pages (pageId, pageName, pageKind, accessLevel): the assistant tools work on them, and View pages allow reading only. A report you delete stays listed with its deletion's status until the deletion completes.
Access: Any signed-in account; reaches reports.
MCP only: on a connection not limited to one report.
Parameters
This tool takes no parameters.
Exact JSON schema
{
"type": "function",
"function": {
"name": "ListReports",
"description": "List the reports you can open, newest first: reportId, name, accessLevel, contentEdit (a View share that may also edit page content), createdAt (UTC) and sourceCount. A report shared with you page by page has access level Pages and lists those pages (pageId, pageName, pageKind, accessLevel): the assistant tools work on them, and View pages allow reading only. A report you delete stays listed with its deletion's status until the deletion completes.",
"parameters": {
"type": "object",
"properties": {},
"additionalProperties": false
}
}
}
ReadUnityDocumentationread-only
Read a Unity runtime guide by topic; topic:null lists the topics. No report mutation.
Access: View access; reaches docs.
With access to specific pages only: any access (a tool that names a page works on pages shared with you; the model and query tools are the report Viewer's).
Parameters
topicstring | nullOptionalSee the operation description and exact schema for this value.
enum:["index","connections","sql","html-authoring","html-templates","testing","files","visual-editing","tabular-visuals",null]
Exact JSON schema
{
"type": "function",
"function": {
"name": "ReadUnityDocumentation",
"description": "Read a Unity runtime guide by topic; topic:null lists the topics. No report mutation.",
"parameters": {
"type": "object",
"properties": {
"topic": {
"type": [
"string",
"null"
],
"enum": [
"index",
"connections",
"sql",
"html-authoring",
"html-templates",
"testing",
"files",
"visual-editing",
"tabular-visuals",
null
]
}
},
"required": [],
"additionalProperties": false
}
}
}
UpdateReportchanges
Rename this report, save its instructions, or delete it. name is 1 to 50 characters; instructions are at most 1,500 characters ("" clears them); null keeps a value. delete=true (the owner only) deletes the report with its pages, data model and files, and the file connections imported for it that no other report uses, cancels its unfinished imports, and returns the deletion's status; it needs confirm=true and can't be undone. RestoreReportVersion brings back an earlier name or instructions.
Access: Edit access; reaches report.
Parameters
namestring | nullOptionalSee the operation description and exact schema for this value.
instructionsstring | nullOptionalSee the operation description and exact schema for this value.
deleteboolean | nullOptionalSee the operation description and exact schema for this value.
confirmboolean | nullOptionaltrue deletes the report; null otherwise.
Exact JSON schema
{
"type": "function",
"function": {
"name": "UpdateReport",
"description": "Rename this report, save its instructions, or delete it. name is 1 to 50 characters; instructions are at most 1,500 characters (\"\" clears them); null keeps a value. delete=true (the owner only) deletes the report with its pages, data model and files, and the file connections imported for it that no other report uses, cancels its unfinished imports, and returns the deletion's status; it needs confirm=true and can't be undone. RestoreReportVersion brings back an earlier name or instructions.",
"parameters": {
"type": "object",
"properties": {
"name": {
"type": [
"string",
"null"
]
},
"instructions": {
"type": [
"string",
"null"
]
},
"delete": {
"type": [
"boolean",
"null"
]
},
"confirm": {
"type": [
"boolean",
"null"
],
"description": "true deletes the report; null otherwise."
}
},
"required": [],
"additionalProperties": false
}
}
}
Connections
ImportCsvFilechanges
Import a CSV file attached to this report (ListReportFiles) as a data source, with each column's suggested type. fileId starts the import (tableName null names the table after the file); the call waits up to the read wait (about 15 s) and returns uploadId and status. At status ready it returns connectionId, attached to this report, with its table modeled, queryName (the table's name in queries) and reportVersion, and firstSpellings: per column, the later spellings of values Unity's text rule treats as equal (case, width, trailing spaces) stored as the earliest spelling in the file, as Power BI's import does, and the rows they were in ({"Place": {"spellings": 2, "rows": 130000}}). While status is queued, processing or publishing, call again with uploadId. A failed stage returns error; when a type fails, status is preview with the columns, and uploadId with columnTypes retries the import. At most three of your uploads are in progress at a time.
Access: Edit access; reaches files, source.
Parameters
fileIdstring | nullOptionalAn attached CSV file's ID, to start an import; null with uploadId.
uploadIdstring | nullOptionalThe uploadId an earlier call returned; null with fileId.
tableNamestring | nullOptionalThe new table's name, with fileId; null uses the file's name. Characters other than letters, digits and _ become _ ("Regions W1-5" becomes Regions_W1_5); a name the report already has makes a copy, queried as regions_w1_5_2.
columnTypesobject | nullOptionalColumn name -> type for every column, with uploadId; null takes the suggested types.
Exact JSON schema
{
"type": "function",
"function": {
"name": "ImportCsvFile",
"description": "Import a CSV file attached to this report (ListReportFiles) as a data source, with each column's suggested type. fileId starts the import (tableName null names the table after the file); the call waits up to the read wait (about 15 s) and returns uploadId and status. At status ready it returns connectionId, attached to this report, with its table modeled, queryName (the table's name in queries) and reportVersion, and firstSpellings: per column, the later spellings of values Unity's text rule treats as equal (case, width, trailing spaces) stored as the earliest spelling in the file, as Power BI's import does, and the rows they were in ({\"Place\": {\"spellings\": 2, \"rows\": 130000}}). While status is queued, processing or publishing, call again with uploadId. A failed stage returns error; when a type fails, status is preview with the columns, and uploadId with columnTypes retries the import. At most three of your uploads are in progress at a time.",
"parameters": {
"type": "object",
"properties": {
"fileId": {
"type": [
"string",
"null"
],
"description": "An attached CSV file's ID, to start an import; null with uploadId."
},
"uploadId": {
"type": [
"string",
"null"
],
"description": "The uploadId an earlier call returned; null with fileId."
},
"tableName": {
"type": [
"string",
"null"
],
"description": "The new table's name, with fileId; null uses the file's name. Characters other than letters, digits and _ become _ (\"Regions W1-5\" becomes Regions_W1_5); a name the report already has makes a copy, queried as regions_w1_5_2."
},
"columnTypes": {
"type": [
"object",
"null"
],
"additionalProperties": {
"type": "string",
"enum": [
"string",
"integer",
"decimal",
"boolean",
"date",
"datetime",
"date_us",
"date_eu",
"datetime_us",
"datetime_eu"
]
},
"description": "Column name -> type for every column, with uploadId; null takes the suggested types."
}
},
"required": [],
"additionalProperties": false
}
}
}
InspectConnectionread-only
Read a connection's properties, discovered source schema, or this report's saved source fragment. Schema reads are searchable and paginated; model reads include entity SQL, definitions, relationships and the current model revision. The editor draft, when present, is separately labeled submission-time UI state. No query or mutation occurs.
Access: Edit access; reaches source.
Parameters
connectionIdintegerRequiredConnection ID (from InspectConnections).
sectionstring | nullOptionalnull reads properties.
enum:["properties","schema","model",null]querystring | nullOptionalSee the operation description and exact schema for this value.
offsetinteger | nullOptionalSee the operation description and exact schema for this value.
minimum:0limitinteger | nullOptionalSee the operation description and exact schema for this value.
minimum:1maximum:100
Exact JSON schema
{
"type": "function",
"function": {
"name": "InspectConnection",
"description": "Read a connection's properties, discovered source schema, or this report's saved source fragment. Schema reads are searchable and paginated; model reads include entity SQL, definitions, relationships and the current model revision. The editor draft, when present, is separately labeled submission-time UI state. No query or mutation occurs.",
"parameters": {
"type": "object",
"properties": {
"connectionId": {
"type": "integer",
"description": "Connection ID (from InspectConnections)."
},
"section": {
"type": [
"string",
"null"
],
"enum": [
"properties",
"schema",
"model",
null
],
"description": "null reads properties."
},
"query": {
"type": [
"string",
"null"
]
},
"offset": {
"type": [
"integer",
"null"
],
"minimum": 0
},
"limit": {
"type": [
"integer",
"null"
],
"minimum": 1,
"maximum": 100
}
},
"required": [
"connectionId"
],
"additionalProperties": false
}
}
}
InspectConnectionsread-only
Find existing connections available to this user, including sources not attached to this report. Returns names, IDs, provider types and access information, without credentials. This does not attach a source.
Access: Edit access; reaches source.
Parameters
querystring | nullOptionalSee the operation description and exact schema for this value.
offsetinteger | nullOptionalSee the operation description and exact schema for this value.
minimum:0limitinteger | nullOptionalSee the operation description and exact schema for this value.
minimum:1maximum:100
Exact JSON schema
{
"type": "function",
"function": {
"name": "InspectConnections",
"description": "Find existing connections available to this user, including sources not attached to this report. Returns names, IDs, provider types and access information, without credentials. This does not attach a source.",
"parameters": {
"type": "object",
"properties": {
"query": {
"type": [
"string",
"null"
]
},
"offset": {
"type": [
"integer",
"null"
],
"minimum": 0
},
"limit": {
"type": [
"integer",
"null"
],
"minimum": 1,
"maximum": 100
}
},
"required": [],
"additionalProperties": false
}
}
}
QueryConnectionread-only
Run read-only SQL in the source's own dialect on one connection, without the model or filters. Reads the connection's source objects and returns actual rows; QueryDataModel queries the report model. Returns up to rowLimit rows with hasMore; SQL can request another ordered range. No saved SQL, model or report mapping is changed.
Access: Edit access; reaches source.
Parameters
connectionIdintegerRequiredConnection ID (from InspectConnections).
querystringRequiredSee the operation description and exact schema for this value.
rowLimitintegerRequiredSee the operation description and exact schema for this value.
minimum:1maximum:200
Exact JSON schema
{
"type": "function",
"function": {
"name": "QueryConnection",
"description": "Run read-only SQL in the source's own dialect on one connection, without the model or filters. Reads the connection's source objects and returns actual rows; QueryDataModel queries the report model. Returns up to rowLimit rows with hasMore; SQL can request another ordered range. No saved SQL, model or report mapping is changed.",
"parameters": {
"type": "object",
"properties": {
"connectionId": {
"type": "integer",
"description": "Connection ID (from InspectConnections)."
},
"query": {
"type": "string"
},
"rowLimit": {
"type": "integer",
"minimum": 1,
"maximum": 200
}
},
"required": [
"connectionId",
"query",
"rowLimit"
],
"additionalProperties": false
}
}
}
SaveConnectionchanges
Create, rename or delete one of your connections, or attach it to or detach it from this report. connectionId null creates one, attached to this report: type, authType and config (the type's settings, ReadUnityDocumentation topic=connections) are a new connection's; an existing one's settings change only in Unity, so create a new connection instead. Sign-in credentials (user name or client ID, and secrets) are never sent: while they are missing the result has needsCredentials and a credentialsUrl where the connection's owner types them in Unity. attached=false detaches it, removing its tables from this report's model. Removing a field also removes the calculated fields, measures and relationships that use it. When anything reads what a write removes, or SQL names what it renames, the write is refused with code in_use (HTTP 409) and the readers (kind, title, id, pageId, page, effect); confirm=true makes it anyway, and the result lists what went with it (removedWith) and what now shows an error (breaks). Documentation topic connections has the full rules. delete=true deletes the connection; while reports use it the call fails with code connection_in_use naming them, and confirm=true deletes it anyway; one an organization's report uses fails with code company_source_in_use even with confirm: detach it from that report first. Deleting a connection can't be undone; RestoreReportVersion brings back a detached one.
Access: Edit access; reaches model, source.
Parameters
connectionIdinteger | nullOptionalThe connection (from InspectConnections), or null to create one.
typestring | nullOptionalA new connection's type.
enum:["SQLServer","Snowflake","Databricks","AnalysisServices","API",null]namestring | nullOptionalThe connection's name, or null to keep it (a new one's is generated).
authTypestring | nullOptionalHow a new connection signs in (the type's authType values).
configobject | nullOptionalA new connection's settings (where and how), never a credential.
attachedboolean | nullOptionaltrue attaches it to this report, false removes it from this report.
deleteboolean | nullOptionaltrue deletes the connection.
confirmboolean | nullOptionaltrue deletes or detaches after code connection_in_use or in_use.
Exact JSON schema
{
"type": "function",
"function": {
"name": "SaveConnection",
"description": "Create, rename or delete one of your connections, or attach it to or detach it from this report. connectionId null creates one, attached to this report: type, authType and config (the type's settings, ReadUnityDocumentation topic=connections) are a new connection's; an existing one's settings change only in Unity, so create a new connection instead. Sign-in credentials (user name or client ID, and secrets) are never sent: while they are missing the result has needsCredentials and a credentialsUrl where the connection's owner types them in Unity. attached=false detaches it, removing its tables from this report's model. Removing a field also removes the calculated fields, measures and relationships that use it. When anything reads what a write removes, or SQL names what it renames, the write is refused with code in_use (HTTP 409) and the readers (kind, title, id, pageId, page, effect); confirm=true makes it anyway, and the result lists what went with it (removedWith) and what now shows an error (breaks). Documentation topic connections has the full rules. delete=true deletes the connection; while reports use it the call fails with code connection_in_use naming them, and confirm=true deletes it anyway; one an organization's report uses fails with code company_source_in_use even with confirm: detach it from that report first. Deleting a connection can't be undone; RestoreReportVersion brings back a detached one.",
"parameters": {
"type": "object",
"properties": {
"connectionId": {
"type": [
"integer",
"null"
],
"description": "The connection (from InspectConnections), or null to create one."
},
"type": {
"type": [
"string",
"null"
],
"enum": [
"SQLServer",
"Snowflake",
"Databricks",
"AnalysisServices",
"API",
null
],
"description": "A new connection's type."
},
"name": {
"type": [
"string",
"null"
],
"description": "The connection's name, or null to keep it (a new one's is generated)."
},
"authType": {
"type": [
"string",
"null"
],
"description": "How a new connection signs in (the type's authType values)."
},
"config": {
"type": [
"object",
"null"
],
"description": "A new connection's settings (where and how), never a credential.",
"properties": {
"account": {
"type": [
"string",
"integer",
"null"
]
},
"certificateThumbprint": {
"type": [
"string",
"integer",
"null"
]
},
"databaseName": {
"type": [
"string",
"integer",
"null"
]
},
"databricksSchema": {
"type": [
"string",
"integer",
"null"
]
},
"httpPath": {
"type": [
"string",
"integer",
"null"
]
},
"oauthScope": {
"type": [
"string",
"integer",
"null"
]
},
"oauthTokenUrl": {
"type": [
"string",
"integer",
"null"
]
},
"port": {
"type": [
"string",
"integer",
"null"
]
},
"provider": {
"type": [
"string",
"integer",
"null"
]
},
"role": {
"type": [
"string",
"integer",
"null"
]
},
"schemaName": {
"type": [
"string",
"integer",
"null"
]
},
"serverName": {
"type": [
"string",
"integer",
"null"
]
},
"tenantId": {
"type": [
"string",
"integer",
"null"
]
},
"warehouse": {
"type": [
"string",
"integer",
"null"
]
}
},
"required": [],
"additionalProperties": true
},
"attached": {
"type": [
"boolean",
"null"
],
"description": "true attaches it to this report, false removes it from this report."
},
"delete": {
"type": [
"boolean",
"null"
],
"description": "true deletes the connection."
},
"confirm": {
"type": [
"boolean",
"null"
],
"description": "true deletes or detaches after code connection_in_use or in_use."
}
},
"required": [],
"additionalProperties": false
}
}
}
TestConnectionchanges
Connect with the connection's saved settings and credentials and rediscover its tables (InspectConnection section=schema then lists them). Returns ok and checked: source when it connected (tables, the table count), with error, or sourceAuth when a reader must sign in; configuration when it only checked the settings: a file, an API provider (not called), or needsCredentials with credentialsUrl.
Access: Edit access; reaches source.
Parameters
connectionIdintegerRequiredConnection ID (from InspectConnections).
Exact JSON schema
{
"type": "function",
"function": {
"name": "TestConnection",
"description": "Connect with the connection's saved settings and credentials and rediscover its tables (InspectConnection section=schema then lists them). Returns ok and checked: source when it connected (tables, the table count), with error, or sourceAuth when a reader must sign in; configuration when it only checked the settings: a file, an API provider (not called), or needsCredentials with credentialsUrl.",
"parameters": {
"type": "object",
"properties": {
"connectionId": {
"type": "integer",
"description": "Connection ID (from InspectConnections)."
}
},
"required": [
"connectionId"
],
"additionalProperties": false
}
}
}
Queries and definitions
SaveModelDefinitionchanges
Add, edit or delete one field or measure (SQL or typed) of a source table, keeping the others. fieldUid null adds a definition; fieldUid with definition edits it (null properties keep their value); fieldUid with definition null deletes it. A rename keeps its fieldUid, a column's too (only aliasName): Unity renames it by alias in its table's query. It is checked and saved as SaveReportModelSource's definitions are; SQL can't contain a subquery. To save several at once, SaveReportModelSource's definitions replaces a source's definitions in one call. Removing a field also removes the calculated fields, measures and relationships that use it. When anything reads what a write removes, or SQL names what it renames, the write is refused with code in_use (HTTP 409) and the readers (kind, title, id, pageId, page, effect); confirm=true makes it anyway, and the result lists what went with it (removedWith) and what now shows an error (breaks). Documentation topic connections has the full rules. Uses the revision from InspectDataModel. Returns the saved definition's fieldUid.
Access: Edit access; reaches model.
Parameters
fieldUidstring | nullOptionalThe definition's or column's fieldUid from InspectDataModel, or null to add a definition.
definitionobject | nullOptionalSee the operation description and exact schema for this value.
expectedModelRevisionintegerRequiredSee the operation description and exact schema for this value.
minimum:0confirmboolean | nullOptionaltrue makes the change after code in_use; null otherwise.
Exact JSON schema
{
"type": "function",
"function": {
"name": "SaveModelDefinition",
"description": "Add, edit or delete one field or measure (SQL or typed) of a source table, keeping the others. fieldUid null adds a definition; fieldUid with definition edits it (null properties keep their value); fieldUid with definition null deletes it. A rename keeps its fieldUid, a column's too (only aliasName): Unity renames it by alias in its table's query. It is checked and saved as SaveReportModelSource's definitions are; SQL can't contain a subquery. To save several at once, SaveReportModelSource's definitions replaces a source's definitions in one call. Removing a field also removes the calculated fields, measures and relationships that use it. When anything reads what a write removes, or SQL names what it renames, the write is refused with code in_use (HTTP 409) and the readers (kind, title, id, pageId, page, effect); confirm=true makes it anyway, and the result lists what went with it (removedWith) and what now shows an error (breaks). Documentation topic connections has the full rules. Uses the revision from InspectDataModel. Returns the saved definition's fieldUid.",
"parameters": {
"type": "object",
"properties": {
"fieldUid": {
"type": [
"string",
"null"
],
"description": "The definition's or column's fieldUid from InspectDataModel, or null to add a definition."
},
"definition": {
"type": [
"object",
"null"
],
"properties": {
"aliasName": {
"type": [
"string",
"null"
],
"description": "Field or measure name used in report SQL (t.\"Total Spend\")."
},
"description": {
"type": [
"string",
"null"
],
"description": "Business meaning: inclusions, exclusions, units."
},
"sqlExpression": {
"type": [
"string",
"null"
],
"description": "DuckDB expression over the owning entity's columns; an aggregate for a measure. A typed measure has none."
},
"measureKind": {
"type": [
"string",
"null"
],
"enum": [
"composite",
"share",
"timeComparison",
"runningTotal",
"rank",
null
],
"description": "A typed measure's kind, compiled by the query builder; a SQL definition has none."
},
"spec": {
"type": [
"object",
"null"
],
"description": "A typed measure's fields by fieldUid. composite {formula: node}, a node {measure: uid}, {number: \"1.5\"} or {add|subtract|multiply|divide: [node, node]}; share {measure, across: [uid]}; timeComparison {measure, date, shift: previousYear|previousPeriod}; runningTotal {measure, along}; rank {measure, within: [uid], direction: desc|asc}."
},
"definitionType": {
"type": [
"string",
"null"
],
"enum": [
"direct_column",
"derived_column",
"measure",
null
],
"description": "measure for an aggregate, SQL or typed."
},
"canonicalType": {
"type": [
"string",
"null"
],
"enum": [
"string",
"integer",
"decimal",
"boolean",
"date",
"datetime",
"json",
"unknown",
null
],
"description": "Read-only: the type the engine returns when it is saved."
},
"sourceEntityKey": {
"type": [
"string",
"null"
],
"description": "The owning entity. A typed measure other than a composite is listed on its measure's table."
},
"sourceColumns": {
"type": [
"array",
"null"
],
"items": {
"type": "string"
},
"description": "Columns of sourceEntityKey the expression reads; not used by a typed measure."
},
"format": {
"type": [
"object",
"null"
],
"additionalProperties": false,
"properties": {
"style": {
"type": [
"string",
"null"
],
"enum": [
"number",
"percent",
"currency",
null
]
},
"decimals": {
"type": [
"integer",
"null"
],
"minimum": 0,
"maximum": 8,
"description": "Default 2."
},
"currency": {
"type": [
"string",
"null"
],
"enum": [
"USD",
"EUR",
"GBP",
"JPY",
null
],
"description": "style currency; default USD."
},
"percentInputScale": {
"type": [
"string",
"null"
],
"enum": [
"ratio",
"percentagePoints",
null
],
"description": "style percent. ratio (the default): 0.372 shows as 37.2%; percentagePoints: 37.2 shows as 37.2%."
},
"thousandsSeparator": {
"type": [
"boolean",
"null"
],
"description": "Default true."
}
},
"description": "How visuals show this field's values unless a visual sets its own format; an aggregation of it (sum, count) has none. Empty ({}, or every property null in a tool call) removes it.",
"required": []
}
},
"required": []
},
"expectedModelRevision": {
"type": "integer",
"minimum": 0
},
"confirm": {
"type": [
"boolean",
"null"
],
"description": "true makes the change after code in_use; null otherwise."
}
},
"required": [
"expectedModelRevision"
],
"additionalProperties": false
}
}
}
Pages
CreatePagechanges
Create a new named page in this report. Returns the new page UUID. Set pageKind to html for an arbitrary HTML page, or report for a traditional canvas.
Access: Edit access; reaches pages.
Parameters
namestringRequiredPage name, 1 to 50 characters.
pageKindstring | nullOptionalSee the operation description and exact schema for this value.
enum:["report","html",null]
Exact JSON schema
{
"type": "function",
"function": {
"name": "CreatePage",
"description": "Create a new named page in this report. Returns the new page UUID. Set pageKind to html for an arbitrary HTML page, or report for a traditional canvas.",
"parameters": {
"type": "object",
"properties": {
"name": {
"type": "string",
"description": "Page name, 1 to 50 characters."
},
"pageKind": {
"type": [
"string",
"null"
],
"enum": [
"report",
"html",
null
]
}
},
"required": [
"name"
],
"additionalProperties": false
}
}
}
DeletePagechanges
Delete a page and its visuals/filters. Conversations remain accessible in the report.
Access: Edit access; reaches pages.
Parameters
pageIdstringRequiredSee the operation description and exact schema for this value.
Exact JSON schema
{
"type": "function",
"function": {
"name": "DeletePage",
"description": "Delete a page and its visuals/filters. Conversations remain accessible in the report.",
"parameters": {
"type": "object",
"properties": {
"pageId": {
"type": "string"
}
},
"required": [
"pageId"
],
"additionalProperties": false
}
}
}
DuplicatePagechanges
Copy a page's visual definitions, layout and persistent filters into a new named page.
Access: Edit access; reaches pages.
Parameters
pageIdstringRequiredSee the operation description and exact schema for this value.
namestringRequiredName of the new page, 1 to 50 characters.
Exact JSON schema
{
"type": "function",
"function": {
"name": "DuplicatePage",
"description": "Copy a page's visual definitions, layout and persistent filters into a new named page.",
"parameters": {
"type": "object",
"properties": {
"pageId": {
"type": "string"
},
"name": {
"type": "string",
"description": "Name of the new page, 1 to 50 characters."
}
},
"required": [
"pageId",
"name"
],
"additionalProperties": false
}
}
}
PreviewPageread-only
See a real screenshot of a saved page, HTML or native, using Unity's renderer, current data and the filters as they apply to you. Returns the image to the model with readiness and errors, image geometry and viewport coverage; a native page also lists its visuals with any read error. Separate from the user's transient browser state. An HTML page: use nextScrollY for lower sections or visualId to scroll to one registered visual. A native page is shown whole, fitted to the viewport, from its visuals' saved reads: tables show their first page and matrices their first view, and nothing is clicked. Width/height null use the last editor viewport (bounded) or 1280x900. theme only emulates browser prefers-color-scheme; null/system use light. It never overrides authored appearance or clicks an HTML theme toggle. This tool does not edit the report.
Access: Edit access; reaches pages.
With access to specific pages only: pages you may edit (Edit on the page; View and Edit content are read-only).
Parameters
pageIdstringRequiredSee the operation description and exact schema for this value.
visualIdstring | nullOptionalAn HTML page's registered visual; null for a native page.
scrollYinteger | nullOptionalSee the operation description and exact schema for this value.
minimum:0maximum:200000widthinteger | nullOptionalSee the operation description and exact schema for this value.
minimum:320maximum:1920heightinteger | nullOptionalSee the operation description and exact schema for this value.
minimum:240maximum:1200themestring | nullOptionalSee the operation description and exact schema for this value.
enum:["light","dark","system",null]
Exact JSON schema
{
"type": "function",
"function": {
"name": "PreviewPage",
"description": "See a real screenshot of a saved page, HTML or native, using Unity's renderer, current data and the filters as they apply to you. Returns the image to the model with readiness and errors, image geometry and viewport coverage; a native page also lists its visuals with any read error. Separate from the user's transient browser state. An HTML page: use nextScrollY for lower sections or visualId to scroll to one registered visual. A native page is shown whole, fitted to the viewport, from its visuals' saved reads: tables show their first page and matrices their first view, and nothing is clicked. Width/height null use the last editor viewport (bounded) or 1280x900. theme only emulates browser prefers-color-scheme; null/system use light. It never overrides authored appearance or clicks an HTML theme toggle. This tool does not edit the report.",
"parameters": {
"type": "object",
"properties": {
"pageId": {
"type": "string"
},
"visualId": {
"type": [
"string",
"null"
],
"description": "An HTML page's registered visual; null for a native page."
},
"scrollY": {
"type": [
"integer",
"null"
],
"minimum": 0,
"maximum": 200000
},
"width": {
"type": [
"integer",
"null"
],
"minimum": 320,
"maximum": 1920
},
"height": {
"type": [
"integer",
"null"
],
"minimum": 240,
"maximum": 1200
},
"theme": {
"type": [
"string",
"null"
],
"enum": [
"light",
"dark",
"system",
null
]
}
},
"required": [
"pageId"
],
"additionalProperties": false
}
}
}
UpdatePagechanges
Edit a page name, canvas dimensions, canvas background and outer background. InspectReport supplies saved settings and resolved canvasBounds. Returns the saved page (InspectReport reads its canvasBounds); visuals are preserved. Dimensions are logical canvas pixels, independent of zoom. Change the page size only when the user asks for it; never to make visuals fit.
Access: Edit access; reaches pages.
Parameters
pageIdstringRequiredSee the operation description and exact schema for this value.
namestring | nullOptionalNew page name, 1 to 50 characters; null keeps the name.
viewportJsonstring | null | object | arrayOptionalJSON patch with width, height (1–3000), backgroundColor, outerBackgroundColor. A null dimension uses the default page size (1280×720). Omit fields to preserve them; null patch preserves all settings.
Exact JSON schema
{
"type": "function",
"function": {
"name": "UpdatePage",
"description": "Edit a page name, canvas dimensions, canvas background and outer background. InspectReport supplies saved settings and resolved canvasBounds. Returns the saved page (InspectReport reads its canvasBounds); visuals are preserved. Dimensions are logical canvas pixels, independent of zoom. Change the page size only when the user asks for it; never to make visuals fit.",
"parameters": {
"type": "object",
"properties": {
"pageId": {
"type": "string"
},
"name": {
"type": [
"string",
"null"
],
"description": "New page name, 1 to 50 characters; null keeps the name."
},
"viewportJson": {
"type": [
"string",
"null",
"object",
"array"
],
"description": "JSON patch with width, height (1–3000), backgroundColor, outerBackgroundColor. A null dimension uses the default page size (1280×720). Omit fields to preserve them; null patch preserves all settings."
}
},
"required": [
"pageId"
],
"additionalProperties": false
}
}
}
Visuals and previews
CancelReadJobchanges
Stop one running data read of this report (a jobId from InspectReadJobs). Its source query is cancelled and its visual shows that the read was cancelled. Saved visuals and data are unchanged.
Access: View access; reaches chat.
With access to specific pages only: any access (a tool that names a page works on pages shared with you; the model and query tools are the report Viewer's).
Parameters
jobIdstringRequiredSee the operation description and exact schema for this value.
Exact JSON schema
{
"type": "function",
"function": {
"name": "CancelReadJob",
"description": "Stop one running data read of this report (a jobId from InspectReadJobs). Its source query is cancelled and its visual shows that the read was cancelled. Saved visuals and data are unchanged.",
"parameters": {
"type": "object",
"properties": {
"jobId": {
"type": "string"
}
},
"required": [
"jobId"
],
"additionalProperties": false
}
}
}
CreateVisualchanges
Create native visuals on report pages: 1 to 100 per call, on any pages of this report. InspectVisualCapabilities provides the definition schema. definitionJson contains title, query, customization and kind-specific fields. Explicit coordinates are preserved; a null position gets free space beside the page's visuals and this call's other items. Omitted customization uses Unity defaults. All or nothing: if any item is refused, nothing is saved and each refused item is named by its index; otherwise the call is one report version. Returns each visual's visualUid, revision and pageId, in order. Runs no query: QueryReportData reads a visual's data. PreviewVisual checks a definition without saving it.
Access: Edit access; reaches pages.
With access to specific pages only: pages you may edit (Edit on the page; View and Edit content are read-only).
Parameters
visualsarray<object>RequiredSee the operation description and exact schema for this value.
minItems:1maxItems:100
Exact JSON schema
{
"type": "function",
"function": {
"name": "CreateVisual",
"description": "Create native visuals on report pages: 1 to 100 per call, on any pages of this report. InspectVisualCapabilities provides the definition schema. definitionJson contains title, query, customization and kind-specific fields. Explicit coordinates are preserved; a null position gets free space beside the page's visuals and this call's other items. Omitted customization uses Unity defaults. All or nothing: if any item is refused, nothing is saved and each refused item is named by its index; otherwise the call is one report version. Returns each visual's visualUid, revision and pageId, in order. Runs no query: QueryReportData reads a visual's data. PreviewVisual checks a definition without saving it.",
"parameters": {
"type": "object",
"properties": {
"visuals": {
"type": "array",
"minItems": 1,
"maxItems": 100,
"items": {
"type": "object",
"properties": {
"visualType": {
"type": "string",
"enum": [
"dataTable",
"dataCard",
"shape",
"textBox",
"declarativeChart",
"matrix"
],
"description": "Canonical visual kind. dataCard is a KPI; dataTable is a table. InspectVisualCapabilities lists labels and rendering details."
},
"pageId": {
"type": "string",
"description": "Stable pageId from InspectReport."
},
"definitionJson": {
"type": [
"string",
"object",
"array"
]
},
"positionJson": {
"type": [
"string",
"null",
"object",
"array"
],
"description": "JSON {x, y, width, height, zIndex (optional)} in logical canvas pixels (default page 1280×720); null finds free space."
},
"allowOverlap": {
"type": [
"boolean",
"null"
],
"description": "Without explicit x/y, Unity finds free space by default; true skips that automatic placement. Explicit coordinates are always preserved, including intentional layers."
}
},
"required": [
"visualType",
"pageId",
"definitionJson"
],
"additionalProperties": false
}
}
},
"required": [
"visuals"
],
"additionalProperties": false
}
}
}
DeleteVisualchanges
Delete saved native visuals: 1 to 100 per call, each by its stable identity and current revision. All or nothing: if any item is refused, nothing is deleted and each refused item is named by its index; otherwise the call is one report version. Returns each visual's visualUid and pageId, in order.
Access: Edit access; reaches pages.
With access to specific pages only: pages you may edit (Edit on the page; View and Edit content are read-only).
Parameters
visualsarray<object>RequiredSee the operation description and exact schema for this value.
minItems:1maxItems:100
Exact JSON schema
{
"type": "function",
"function": {
"name": "DeleteVisual",
"description": "Delete saved native visuals: 1 to 100 per call, each by its stable identity and current revision. All or nothing: if any item is refused, nothing is deleted and each refused item is named by its index; otherwise the call is one report version. Returns each visual's visualUid and pageId, in order.",
"parameters": {
"type": "object",
"properties": {
"visuals": {
"type": "array",
"minItems": 1,
"maxItems": 100,
"items": {
"type": "object",
"properties": {
"visualUid": {
"type": "string",
"description": "Stable visualUid from inspection."
},
"expectedRevision": {
"type": "string"
}
},
"required": [
"visualUid",
"expectedRevision"
],
"additionalProperties": false
}
}
},
"required": [
"visuals"
],
"additionalProperties": false
}
}
}
DiffReportVersionsread-only
Compare two saved versions of this report (toVersion null: the report now): what was added, removed or changed, each object by section, kind, id and name with the keys that changed (a field's type compares as its canonical type). GetReportDefinition(version) reads the content. Read-only.
Access: Edit access; reaches history, model, pages, report.
With access to specific pages only: pages you may edit (Edit on the page; View and Edit content are read-only).
Parameters
fromVersionintegerRequiredSee the operation description and exact schema for this value.
minimum:1toVersioninteger | nullOptionalSee the operation description and exact schema for this value.
minimum:1pageIdstring | nullOptionalA page's pageId: only that page and its filters (page Edit is enough); null for the whole report.
Exact JSON schema
{
"type": "function",
"function": {
"name": "DiffReportVersions",
"description": "Compare two saved versions of this report (toVersion null: the report now): what was added, removed or changed, each object by section, kind, id and name with the keys that changed (a field's type compares as its canonical type). GetReportDefinition(version) reads the content. Read-only.",
"parameters": {
"type": "object",
"properties": {
"fromVersion": {
"type": "integer",
"minimum": 1
},
"toVersion": {
"type": [
"integer",
"null"
],
"minimum": 1
},
"pageId": {
"type": [
"string",
"null"
],
"description": "A page's pageId: only that page and its filters (page Edit is enough); null for the whole report."
}
},
"required": [
"fromVersion"
],
"additionalProperties": false
}
}
}
InspectChatPreviewread-only
Inspect an inline chat visual by its source conversation and message IDs, including its query, appearance, data and revision. Use InspectVisual for a saved canvas visual.
Access: Edit access; reaches chat.
With access to specific pages only: pages you may edit (Edit on the page; View and Edit content are read-only).
Parameters
dataChatIdintegerRequiredSee the operation description and exact schema for this value.
messageIdintegerRequiredSee the operation description and exact schema for this value.
Exact JSON schema
{
"type": "function",
"function": {
"name": "InspectChatPreview",
"description": "Inspect an inline chat visual by its source conversation and message IDs, including its query, appearance, data and revision. Use InspectVisual for a saved canvas visual.",
"parameters": {
"type": "object",
"properties": {
"dataChatId": {
"type": "integer"
},
"messageId": {
"type": "integer"
}
},
"required": [
"dataChatId",
"messageId"
],
"additionalProperties": false
}
}
}
InspectReadJobsread-only
List this report's data reads (loads) by the current user: running ones, and those that ended in the last 15 minutes. A read is one visual's data load (or an HTML page's, a dataset's or a query's), with its jobId, kind and id (the visual type and ID), pageId, rowsRead and rowsTotal (the rows it reads in all, once known; null otherwise). A running read has status running (or stopping), phase (queued, preparing, source: the database is computing or sending rows, engine: Unity computes), elapsedSeconds so far, secondsSinceProgress and continuesInBackground. An ended read has elapsedSeconds (its duration), endedSecondsAgo and outcome: status succeeded, failed (with error) or stopped (with reason: cancelled, abandoned, stalled or ceiling). A read stops on its own when its rows stop moving for 2 minutes, at its 15-minute ceiling, or when nothing waits for it. jobId returns that read only. waitSeconds (0-60) waits that long, or until the read (every running read without jobId) ends, before answering. Reads only; nothing changes.
Access: View access; reaches chat.
With access to specific pages only: any access (a tool that names a page works on pages shared with you; the model and query tools are the report Viewer's).
Parameters
jobIdstring | nullOptionalA jobId, or null for the report's reads.
waitSecondsinteger | nullOptionalSee the operation description and exact schema for this value.
minimum:0maximum:60
Exact JSON schema
{
"type": "function",
"function": {
"name": "InspectReadJobs",
"description": "List this report's data reads (loads) by the current user: running ones, and those that ended in the last 15 minutes. A read is one visual's data load (or an HTML page's, a dataset's or a query's), with its jobId, kind and id (the visual type and ID), pageId, rowsRead and rowsTotal (the rows it reads in all, once known; null otherwise). A running read has status running (or stopping), phase (queued, preparing, source: the database is computing or sending rows, engine: Unity computes), elapsedSeconds so far, secondsSinceProgress and continuesInBackground. An ended read has elapsedSeconds (its duration), endedSecondsAgo and outcome: status succeeded, failed (with error) or stopped (with reason: cancelled, abandoned, stalled or ceiling). A read stops on its own when its rows stop moving for 2 minutes, at its 15-minute ceiling, or when nothing waits for it. jobId returns that read only. waitSeconds (0-60) waits that long, or until the read (every running read without jobId) ends, before answering. Reads only; nothing changes.",
"parameters": {
"type": "object",
"properties": {
"jobId": {
"type": [
"string",
"null"
],
"description": "A jobId, or null for the report's reads."
},
"waitSeconds": {
"type": [
"integer",
"null"
],
"minimum": 0,
"maximum": 60
}
},
"required": [],
"additionalProperties": false
}
}
}
InspectVisualread-only
Read a saved native visual: its visual query, outputs and generatedSql (read-only), appearance, layout and revision, on any accessible report page. Does not run its query. The revision is used for optimistic writes. A visual saved before visual queries has no query and returns legacySql, its old SQL, read-only, for rebuilding. InspectFilters reads the filters that apply to it.
Access: View access; reaches pages.
With access to specific pages only: any access (a tool that names a page works on pages shared with you; the model and query tools are the report Viewer's).
Parameters
visualUidstringRequiredStable visualUid from inspection.
Exact JSON schema
{
"type": "function",
"function": {
"name": "InspectVisual",
"description": "Read a saved native visual: its visual query, outputs and generatedSql (read-only), appearance, layout and revision, on any accessible report page. Does not run its query. The revision is used for optimistic writes. A visual saved before visual queries has no query and returns legacySql, its old SQL, read-only, for rebuilding. InspectFilters reads the filters that apply to it.",
"parameters": {
"type": "object",
"properties": {
"visualUid": {
"type": "string",
"description": "Stable visualUid from inspection."
}
},
"required": [
"visualUid"
],
"additionalProperties": false
}
}
}
InspectVisualCapabilitiesread-only
Inspect Unity's visual schemas and rendering semantics. kinds=[] lists concise options. Request one to three known kinds; section=definition for creation/preview, changes for edits, appearance for Unity theme settings, or null for all authoring sections. Chart inspection includes a concise Vega-Lite guide; section=renderer retrieves exact presentation schemas, optionally focused with rendererPath.
Access: View access; reaches docs.
With access to specific pages only: any access (a tool that names a page works on pages shared with you; the model and query tools are the report Viewer's).
Parameters
kindsarray | nullOptionalSee the operation description and exact schema for this value.
maxItems:3sectionstring | nullOptionalSee the operation description and exact schema for this value.
enum:["definition","changes","appearance","renderer","all",null]rendererPathstring | nullOptionalWith kinds=[declarativeChart] and section=renderer: mark, encoding.color, encoding.x.axis, encoding.color.scale, config.axis, transform, params, or another property path. Null returns the complete renderer schema.
Exact JSON schema
{
"type": "function",
"function": {
"name": "InspectVisualCapabilities",
"description": "Inspect Unity's visual schemas and rendering semantics. kinds=[] lists concise options. Request one to three known kinds; section=definition for creation/preview, changes for edits, appearance for Unity theme settings, or null for all authoring sections. Chart inspection includes a concise Vega-Lite guide; section=renderer retrieves exact presentation schemas, optionally focused with rendererPath.",
"parameters": {
"type": "object",
"properties": {
"kinds": {
"type": [
"array",
"null"
],
"items": {
"type": "string",
"enum": [
"dataTable",
"dataCard",
"shape",
"textBox",
"declarativeChart",
"matrix"
],
"description": "Canonical visual kind. dataCard is a KPI; dataTable is a table. InspectVisualCapabilities lists labels and rendering details."
},
"maxItems": 3
},
"section": {
"type": [
"string",
"null"
],
"enum": [
"definition",
"changes",
"appearance",
"renderer",
"all",
null
]
},
"rendererPath": {
"type": [
"string",
"null"
],
"description": "With kinds=[declarativeChart] and section=renderer: mark, encoding.color, encoding.x.axis, encoding.color.scale, config.axis, transform, params, or another property path. Null returns the complete renderer schema."
}
},
"required": [],
"additionalProperties": false
}
}
}
ListReportVersionsread-only
List this report's saved versions, newest first. Every saved change makes a version (its result's reportVersion); version n is the report after that change. Each entry is one assistant run or one person's burst of edits (each within 5 minutes of the one before): version (its last), firstVersion, count, actor (who), at (when), its last label and what it changed. expand lists one entry's versions one by one: to undo one change inside an entry, restore the version before that change. The first list of the whole report also has deletedPages, each with the version that still has it. GetReportDefinition(version) reads one, DiffReportVersions compares two and RestoreReportVersion brings one back. Read-only.
Access: Edit access; reaches history, model, pages, report.
With access to specific pages only: pages you may edit (Edit on the page; View and Edit content are read-only).
Parameters
pageIdstring | nullOptionalA page's pageId: only the versions that changed that page or its filters (page Edit is enough); null for the whole report.
beforeVersioninteger | nullOptionalnextBeforeVersion from the previous list, for older entries; null for the newest.
minimum:1expandinteger | nullOptionalAn entry's version: its versions one by one, newest first; null for the grouped list.
minimum:1
Exact JSON schema
{
"type": "function",
"function": {
"name": "ListReportVersions",
"description": "List this report's saved versions, newest first. Every saved change makes a version (its result's reportVersion); version n is the report after that change. Each entry is one assistant run or one person's burst of edits (each within 5 minutes of the one before): version (its last), firstVersion, count, actor (who), at (when), its last label and what it changed. expand lists one entry's versions one by one: to undo one change inside an entry, restore the version before that change. The first list of the whole report also has deletedPages, each with the version that still has it. GetReportDefinition(version) reads one, DiffReportVersions compares two and RestoreReportVersion brings one back. Read-only.",
"parameters": {
"type": "object",
"properties": {
"pageId": {
"type": [
"string",
"null"
],
"description": "A page's pageId: only the versions that changed that page or its filters (page Edit is enough); null for the whole report."
},
"beforeVersion": {
"type": [
"integer",
"null"
],
"minimum": 1,
"description": "nextBeforeVersion from the previous list, for older entries; null for the newest."
},
"expand": {
"type": [
"integer",
"null"
],
"minimum": 1,
"description": "An entry's version: its versions one by one, newest first; null for the grouped list."
}
},
"required": [],
"additionalProperties": false
}
}
}
PreviewVisualread-only
Check an unsaved visual definition: Unity validates it and runs its query, and returns the result. Nothing is saved. Inspect the kind's definition schema, then supply definitionJson. Returns the rows, outputs and generatedSql. It reads without the report's filters. In Unity's chat the result is also shown as an inline preview. CreateVisual saves a visual to a report page.
Access: Edit access; reaches chat, model.
With access to specific pages only: pages you may edit (Edit on the page; View and Edit content are read-only).
Parameters
visualTypestringRequiredCanonical visual kind. dataCard is a KPI; dataTable is a table. InspectVisualCapabilities lists labels and rendering details.
enum:["dataTable","dataCard","shape","textBox","declarativeChart","matrix"]definitionJsonstring | object | arrayRequiredSee the operation description and exact schema for this value.
Exact JSON schema
{
"type": "function",
"function": {
"name": "PreviewVisual",
"description": "Check an unsaved visual definition: Unity validates it and runs its query, and returns the result. Nothing is saved. Inspect the kind's definition schema, then supply definitionJson. Returns the rows, outputs and generatedSql. It reads without the report's filters. In Unity's chat the result is also shown as an inline preview. CreateVisual saves a visual to a report page.",
"parameters": {
"type": "object",
"properties": {
"visualType": {
"type": "string",
"enum": [
"dataTable",
"dataCard",
"shape",
"textBox",
"declarativeChart",
"matrix"
],
"description": "Canonical visual kind. dataCard is a KPI; dataTable is a table. InspectVisualCapabilities lists labels and rendering details."
},
"definitionJson": {
"type": [
"string",
"object",
"array"
]
}
},
"required": [
"visualType",
"definitionJson"
],
"additionalProperties": false
}
}
}
QueryDataModelread-only
Run read-only SQL over the report's data model, without the report's filters. The SQL is DuckDB's, across any entities of the model, including joins across databases and uploaded files; page and visual filters and clicks don't apply either. Connections are resolved from entity bindings; no active connection is selected. Returns up to rowLimit rows with hasMore, without changing the model. engine says which engine served the read: source (an imported file's engine), runtime (Unity's engine), or analysis_services (Analysis Services evaluated the model's measures and Unity's engine completed the query). Either way, text compares by Unity's one rule (like Power BI): case, trailing spaces, width/kana forms and invisible formatting characters are ignored; accents and inner spaces count (Star Bucks and StarBucks differ); LIKE and CONTAINS ignore case only; ORDER BY uses one fixed Unicode order; a merged group shows its first spelling (an imported file stores each value's first spelling in the file, as Power BI's import does; over a database, its smallest variant in code-point order); x COLLATE C compares exactly (over an imported file, its stored first spellings). On a case-sensitive database the answer can differ from running the same SQL there directly. A query over one imported file runs in that file's engine; otherwise the runtime engine serves it, reading from each SQL Server source only the columns, rows or pre-aggregated groups the query needs.
Access: View access; reaches model.
With access to specific pages only: any access (a tool that names a page works on pages shared with you; the model and query tools are the report Viewer's).
Parameters
querystringRequiredSee the operation description and exact schema for this value.
rowLimitintegerRequiredSee the operation description and exact schema for this value.
minimum:1maximum:200
Exact JSON schema
{
"type": "function",
"function": {
"name": "QueryDataModel",
"description": "Run read-only SQL over the report's data model, without the report's filters. The SQL is DuckDB's, across any entities of the model, including joins across databases and uploaded files; page and visual filters and clicks don't apply either. Connections are resolved from entity bindings; no active connection is selected. Returns up to rowLimit rows with hasMore, without changing the model. `engine` says which engine served the read: `source` (an imported file's engine), `runtime` (Unity's engine), or `analysis_services` (Analysis Services evaluated the model's measures and Unity's engine completed the query). Either way, text compares by Unity's one rule (like Power BI): case, trailing spaces, width/kana forms and invisible formatting characters are ignored; accents and inner spaces count (Star Bucks and StarBucks differ); LIKE and CONTAINS ignore case only; ORDER BY uses one fixed Unicode order; a merged group shows its first spelling (an imported file stores each value's first spelling in the file, as Power BI's import does; over a database, its smallest variant in code-point order); `x COLLATE C` compares exactly (over an imported file, its stored first spellings). On a case-sensitive database the answer can differ from running the same SQL there directly. A query over one imported file runs in that file's engine; otherwise the runtime engine serves it, reading from each SQL Server source only the columns, rows or pre-aggregated groups the query needs.",
"parameters": {
"type": "object",
"properties": {
"query": {
"type": "string"
},
"rowLimit": {
"type": "integer",
"minimum": 1,
"maximum": 200
}
},
"required": [
"query",
"rowLimit"
],
"additionalProperties": false
}
}
}
QueryReportDataread-only
Read what the report shows: a saved visual, a saved HTML dataset, or a trial visual query, under the report's filters and your clicks. Send one target. visualUid reads a native visual as the canvas shows it, under the filters as they apply to you (InspectFilters), after interactionFilters (clicks on other visuals of its page), and a table in your own sort (mySort) when you set one. dataId with its pageId reads an HTML dataset as its page reads it, with its own filters. query reads a trial visual query under the report's filters (and a page's, with pageId) and optional filters, as a paged dataset saved with them reads it (a dataset without paging fails over 10,000 rows). Every target pages alike: rowLimit rows from pageIndex; pagination's totalRows and hasMore describe the whole result, and nextPageIndex reads on. A table, matrix, paged dataset or trial query keeps its rows for 10 minutes after its last page, and later pages read them. A matrix reads every row in its order, each node open: its first column, __unity_level, is the row's depth (0 the grand total, first on page 0), and rows above the deepest level are subtotals. filtersNotApplied lists filters with no relationship path to the read, which leave its rows unfiltered. Reads current saved data, not unsaved edits; InspectVisual and InspectHtmlPage read definitions.
Access: View access; reaches model, pages.
With access to specific pages only: any access (a tool that names a page works on pages shared with you; the model and query tools are the report Viewer's).
Parameters
visualUidstring | nullOptionalA native visual's visualUid.
dataIdstring | nullOptionalAn HTML dataset's id (InspectHtmlPage), with its pageId.
queryobject | nullOptionalGroups and values naming model fields by fieldUid (InspectDataModel). A value is a measure, or a column with an aggregation. Tables combine only through model relationships. Output names are the result's column names.
pageIdstring | nullOptionalThe dataset's page, or the page whose filters a trial query reads under; null for a visual.
filtersarray | nullOptionalA trial query's own filters, as a dataset's (locked is ignored); null for none.
maxItems:50interactionFiltersarray | nullOptionalClicks on other visuals of the visual's page, null for none: one item per group of the clicked point. A click filters in the clicked visual's context, with its own visual filters.
maxItems:20rowLimitinteger | nullOptionalRows to return; null selects 50.
minimum:1maximum:1000pageIndexinteger | nullOptionalZero-based page of rowLimit rows; null selects 0.
minimum:0
Exact JSON schema
{
"type": "function",
"function": {
"name": "QueryReportData",
"description": "Read what the report shows: a saved visual, a saved HTML dataset, or a trial visual query, under the report's filters and your clicks. Send one target. visualUid reads a native visual as the canvas shows it, under the filters as they apply to you (InspectFilters), after interactionFilters (clicks on other visuals of its page), and a table in your own sort (mySort) when you set one. dataId with its pageId reads an HTML dataset as its page reads it, with its own filters. query reads a trial visual query under the report's filters (and a page's, with pageId) and optional filters, as a paged dataset saved with them reads it (a dataset without paging fails over 10,000 rows). Every target pages alike: rowLimit rows from pageIndex; pagination's totalRows and hasMore describe the whole result, and nextPageIndex reads on. A table, matrix, paged dataset or trial query keeps its rows for 10 minutes after its last page, and later pages read them. A matrix reads every row in its order, each node open: its first column, __unity_level, is the row's depth (0 the grand total, first on page 0), and rows above the deepest level are subtotals. filtersNotApplied lists filters with no relationship path to the read, which leave its rows unfiltered. Reads current saved data, not unsaved edits; InspectVisual and InspectHtmlPage read definitions.",
"parameters": {
"type": "object",
"properties": {
"visualUid": {
"type": [
"string",
"null"
],
"description": "A native visual's visualUid."
},
"dataId": {
"type": [
"string",
"null"
],
"description": "An HTML dataset's id (InspectHtmlPage), with its pageId."
},
"query": {
"type": [
"object",
"null"
],
"description": "Groups and values naming model fields by fieldUid (InspectDataModel). A value is a measure, or a column with an aggregation. Tables combine only through model relationships. Output names are the result's column names.",
"properties": {
"groups": {
"type": [
"array",
"null"
],
"maxItems": 20,
"items": {
"type": "object",
"additionalProperties": false,
"required": [
"name",
"field"
],
"properties": {
"name": {
"type": "string",
"minLength": 1,
"description": "Output column name, unique ignoring case; presentation binds to it."
},
"field": {
"type": "string",
"minLength": 1,
"description": "fieldUid from InspectDataModel."
},
"grain": {
"type": [
"string",
"null"
],
"enum": [
"year",
"quarter",
"month",
"week",
"day",
null
],
"description": "A date or datetime field truncated to this period."
}
}
}
},
"values": {
"type": [
"array",
"null"
],
"maxItems": 20,
"items": {
"type": "object",
"additionalProperties": false,
"required": [
"name",
"field"
],
"properties": {
"name": {
"type": "string",
"minLength": 1,
"description": "Output column name, unique ignoring case; presentation binds to it."
},
"field": {
"type": "string",
"minLength": 1,
"description": "fieldUid from InspectDataModel."
},
"aggregation": {
"type": [
"string",
"null"
],
"enum": [
"sum",
"avg",
"min",
"max",
"count",
"countDistinct",
null
],
"description": "For a column or calculated field; a measure takes none. count counts non-null values, so count of a key column counts rows; countDistinct counts distinct values, a blank as one, as Power BI's Count (Distinct)."
}
}
}
},
"sort": {
"type": [
"array",
"null"
],
"description": "Output names in order; every group is added as a tiebreak.",
"items": {
"type": "object",
"additionalProperties": false,
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"minLength": 1,
"description": "Output column name, unique ignoring case; presentation binds to it."
},
"direction": {
"type": [
"string",
"null"
],
"enum": [
"asc",
"desc",
null
]
}
}
}
},
"top": {
"type": [
"object",
"null"
],
"description": "Keep the count members of a group ranked by a value; totals cover the kept members.",
"additionalProperties": false,
"required": [
"group",
"count",
"by"
],
"properties": {
"group": {
"type": "string",
"minLength": 1,
"description": "Output column name, unique ignoring case; presentation binds to it."
},
"count": {
"type": "integer",
"minimum": 1
},
"by": {
"type": "string",
"minLength": 1,
"description": "Output column name, unique ignoring case; presentation binds to it."
},
"direction": {
"type": [
"string",
"null"
],
"enum": [
"asc",
"desc",
null
]
}
}
}
},
"additionalProperties": false,
"required": []
},
"pageId": {
"type": [
"string",
"null"
],
"description": "The dataset's page, or the page whose filters a trial query reads under; null for a visual."
},
"filters": {
"type": [
"array",
"null"
],
"maxItems": 50,
"items": {
"type": "object",
"properties": {
"filterUid": {
"type": [
"string",
"null"
],
"description": "Null adds a filter; a filterUid changes that filter."
},
"fieldUid": {
"type": "string",
"description": "The model field (InspectDataModel). Fixed once created."
},
"kind": {
"type": "string",
"enum": [
"basic",
"advanced",
"relativeDate"
],
"description": "basic: a checklist of values; advanced: one or two conditions; relativeDate: last, this or next N days, weeks, months, quarters or years, today in UTC. A measure takes advanced."
},
"default": {
"anyOf": [
{
"type": "object",
"properties": {
"values": {
"type": "array",
"items": {
"type": [
"string",
"number",
"boolean",
"null"
]
},
"description": "The values to keep; null is (Blank)."
},
"exclude": {
"type": "boolean",
"description": "true keeps every value except these."
}
},
"required": [
"values",
"exclude"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"conditions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"operator": {
"type": "string",
"enum": [
"is",
"isNot",
"contains",
"doesNotContain",
"startsWith",
"doesNotStartWith",
"isBlank",
"isNotBlank",
"lessThan",
"lessThanOrEqual",
"greaterThan",
"greaterThanOrEqual"
],
"description": "Text: is, isNot, contains, doesNotContain, startsWith, doesNotStartWith, isBlank, isNotBlank. Numbers, dates and measures: is, isNot, lessThan, lessThanOrEqual, greaterThan, greaterThanOrEqual, isBlank, isNotBlank. doesNotContain, doesNotStartWith and isBlank keep (Blank), which also stands for related rows with no row in the field's table. is, isNot and comparisons treat (Blank) as DAX does, as 0, empty text or the date 1899-12-30: lessThan 1970 keeps it, isNot 0 drops it. A measure filter's is, isNot and comparisons never keep a blank measure. On a date and time, is and isNot compare the day."
},
"value": {
"type": [
"string",
"number",
"null"
]
}
},
"required": [
"operator"
],
"additionalProperties": false
}
},
"join": {
"type": [
"string",
"null"
],
"enum": [
"and",
"or",
null
],
"description": "and or or with two conditions; null with one."
}
},
"required": [
"conditions"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"when": {
"type": "string",
"enum": [
"last",
"this",
"next"
],
"description": "last and next count whole units before or after the current one; this is the current one. Weeks start on Monday."
},
"count": {
"type": [
"integer",
"null"
],
"description": "1 to 1000 with last and next; null with this."
},
"unit": {
"type": "string",
"enum": [
"day",
"week",
"month",
"quarter",
"year"
]
}
},
"required": [
"when",
"unit"
],
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The filter's value for its kind; null shows all."
},
"locked": {
"type": "boolean",
"description": "Viewers can't change it."
},
"hidden": {
"type": "boolean",
"description": "It applies, but viewers don't see it."
},
"label": {
"type": [
"string",
"null"
],
"description": "Null uses the field's name."
}
},
"required": [
"fieldUid",
"kind",
"locked",
"hidden"
],
"additionalProperties": false
},
"description": "A trial query's own filters, as a dataset's (locked is ignored); null for none."
},
"interactionFilters": {
"type": [
"array",
"null"
],
"maxItems": 20,
"description": "Clicks on other visuals of the visual's page, null for none: one item per group of the clicked point. A click filters in the clicked visual's context, with its own visual filters.",
"items": {
"type": "object",
"properties": {
"sourceVisualId": {
"type": "string",
"description": "The clicked visual's visualUid."
},
"outputColumn": {
"type": "string",
"description": "A group output of the clicked visual's query."
},
"value": {
"type": [
"string",
"number",
"boolean",
"null"
],
"description": "The clicked value as that visual's data returns it; null is (Blank); false also selects (Blank), as in Power BI."
}
},
"required": [
"sourceVisualId",
"outputColumn"
],
"additionalProperties": false
}
},
"rowLimit": {
"type": [
"integer",
"null"
],
"minimum": 1,
"maximum": 1000,
"description": "Rows to return; null selects 50."
},
"pageIndex": {
"type": [
"integer",
"null"
],
"minimum": 0,
"description": "Zero-based page of rowLimit rows; null selects 0."
}
},
"required": [],
"additionalProperties": false
}
}
}
RefreshModelFieldschanges
Rediscover an Analysis Services model's columns and measures for this report, as the current user. Existing fields keep their names, new ones are added and removed ones disappear. Use after the model changed (a new measure or column). Removing a field also removes the calculated fields, measures and relationships that use it. When anything reads what a write removes, or SQL names what it renames, the write is refused with code in_use (HTTP 409) and the readers (kind, title, id, pageId, page, effect); confirm=true makes it anyway, and the result lists what went with it (removedWith) and what now shows an error (breaks). Documentation topic connections has the full rules. Returns addedFields/removedFields and reportVersion.
Access: Edit access; reaches model, source.
Parameters
connectionIdintegerRequiredSee the operation description and exact schema for this value.
minimum:1expectedModelRevisionintegerRequiredSee the operation description and exact schema for this value.
minimum:0confirmboolean | nullOptionaltrue makes the change after code in_use; null otherwise.
Exact JSON schema
{
"type": "function",
"function": {
"name": "RefreshModelFields",
"description": "Rediscover an Analysis Services model's columns and measures for this report, as the current user. Existing fields keep their names, new ones are added and removed ones disappear. Use after the model changed (a new measure or column). Removing a field also removes the calculated fields, measures and relationships that use it. When anything reads what a write removes, or SQL names what it renames, the write is refused with code in_use (HTTP 409) and the readers (kind, title, id, pageId, page, effect); confirm=true makes it anyway, and the result lists what went with it (removedWith) and what now shows an error (breaks). Documentation topic connections has the full rules. Returns addedFields/removedFields and reportVersion.",
"parameters": {
"type": "object",
"properties": {
"connectionId": {
"type": "integer",
"minimum": 1
},
"expectedModelRevision": {
"type": "integer",
"minimum": 0
},
"confirm": {
"type": [
"boolean",
"null"
],
"description": "true makes the change after code in_use; null otherwise."
}
},
"required": [
"connectionId",
"expectedModelRevision"
],
"additionalProperties": false
}
}
}
ReplaceVisualchanges
Change a saved native visual kind using its current revision and a target definition from InspectVisualCapabilities. Preserves logical identity, page, position and size, filters and assistant history atomically. UpdateVisual handles same-kind edits.
Access: Edit access; reaches pages.
With access to specific pages only: pages you may edit (Edit on the page; View and Edit content are read-only).
Parameters
visualUidstringRequiredStable visualUid from inspection.
expectedRevisionstringRequiredSee the operation description and exact schema for this value.
targetTypestringRequiredCanonical visual kind. dataCard is a KPI; dataTable is a table. InspectVisualCapabilities lists labels and rendering details.
enum:["dataTable","dataCard","shape","textBox","declarativeChart","matrix"]definitionJsonstring | object | arrayRequiredSee the operation description and exact schema for this value.
Exact JSON schema
{
"type": "function",
"function": {
"name": "ReplaceVisual",
"description": "Change a saved native visual kind using its current revision and a target definition from InspectVisualCapabilities. Preserves logical identity, page, position and size, filters and assistant history atomically. UpdateVisual handles same-kind edits.",
"parameters": {
"type": "object",
"properties": {
"visualUid": {
"type": "string",
"description": "Stable visualUid from inspection."
},
"expectedRevision": {
"type": "string"
},
"targetType": {
"type": "string",
"enum": [
"dataTable",
"dataCard",
"shape",
"textBox",
"declarativeChart",
"matrix"
],
"description": "Canonical visual kind. dataCard is a KPI; dataTable is a table. InspectVisualCapabilities lists labels and rendering details."
},
"definitionJson": {
"type": [
"string",
"object",
"array"
]
}
},
"required": [
"visualUid",
"expectedRevision",
"targetType",
"definitionJson"
],
"additionalProperties": false
}
}
}
RestoreReportVersionchanges
Restore this report, or one page with pageId (a deleted page too: deletedPages), to a saved version, with the checks a save makes. Version n is the report after change n: to undo a change, restore the version listed before it (ListReportVersions); for one change inside a grouped entry, expand the entry and restore the version before that change. dryRun:true changes nothing and returns what would change (changes), what can't come back (warnings), expectedVersion and expectedWarnings; restoring (dryRun:false) needs both and is refused when the report or the warnings moved since. Restoring the whole report deletes pages added after that version. A restore is a new version.
Access: Edit access; reaches history, model, pages, report.
With access to specific pages only: pages you may edit (Edit on the page; View and Edit content are read-only).
Parameters
versionintegerRequiredThe version to bring back (ListReportVersions).
minimum:1pageIdstring | nullOptionalA page's pageId: only that page and its filters (page Edit is enough; a deleted page needs report Edit); null for the whole report.
dryRunboolean | nullOptionalnull is a dry run.
expectedVersioninteger | nullOptionalexpectedVersion from the dry run; null for a dry run.
expectedWarningsstring | nullOptionalexpectedWarnings from the dry run; null for a dry run.
Exact JSON schema
{
"type": "function",
"function": {
"name": "RestoreReportVersion",
"description": "Restore this report, or one page with pageId (a deleted page too: deletedPages), to a saved version, with the checks a save makes. Version n is the report after change n: to undo a change, restore the version listed before it (ListReportVersions); for one change inside a grouped entry, expand the entry and restore the version before that change. dryRun:true changes nothing and returns what would change (changes), what can't come back (warnings), expectedVersion and expectedWarnings; restoring (dryRun:false) needs both and is refused when the report or the warnings moved since. Restoring the whole report deletes pages added after that version. A restore is a new version.",
"parameters": {
"type": "object",
"properties": {
"version": {
"type": "integer",
"minimum": 1,
"description": "The version to bring back (ListReportVersions)."
},
"pageId": {
"type": [
"string",
"null"
],
"description": "A page's pageId: only that page and its filters (page Edit is enough; a deleted page needs report Edit); null for the whole report."
},
"dryRun": {
"type": [
"boolean",
"null"
],
"description": "null is a dry run."
},
"expectedVersion": {
"type": [
"integer",
"null"
],
"description": "expectedVersion from the dry run; null for a dry run."
},
"expectedWarnings": {
"type": [
"string",
"null"
],
"description": "expectedWarnings from the dry run; null for a dry run."
}
},
"required": [
"version"
],
"additionalProperties": false
}
}
}
SaveCalculatedTablechanges
Create, edit or delete a calculated table: report SQL (DuckDB) over this report's tables whose output columns become fields. It is static: computed from all rows of its tables; filters reach it only through its relationships. Saving runs the SQL once to set its fields and types; a column keeps its fieldUid while its name stays. entityKey cannot change; sql=null deletes it and its relationships, listed in removedRelationships. Removing a field also removes the calculated fields, measures and relationships that use it. When anything reads what a write removes, or SQL names what it renames, the write is refused with code in_use (HTTP 409) and the readers (kind, title, id, pageId, page, effect); confirm=true makes it anyway, and the result lists what went with it (removedWith) and what now shows an error (breaks). Documentation topic connections has the full rules. Uses the revision from InspectDataModel. Returns reportVersion.
Access: Edit access; reaches model.
Parameters
entityKeystringRequiredSee the operation description and exact schema for this value.
pattern:"^[A-Za-z_][A-Za-z0-9_]{0,127}$"sqlstring | nullOptionalOne SELECT or WITH statement, or null to delete the calculated table.
displayNamestring | nullOptionalDisplay label, or null to keep it (the key for a new table).
descriptionstring | nullOptionalWhat it holds, or null to keep it.
expectedModelRevisionintegerRequiredSee the operation description and exact schema for this value.
minimum:0confirmboolean | nullOptionaltrue makes the change after code in_use; null otherwise.
Exact JSON schema
{
"type": "function",
"function": {
"name": "SaveCalculatedTable",
"description": "Create, edit or delete a calculated table: report SQL (DuckDB) over this report's tables whose output columns become fields. It is static: computed from all rows of its tables; filters reach it only through its relationships. Saving runs the SQL once to set its fields and types; a column keeps its fieldUid while its name stays. entityKey cannot change; sql=null deletes it and its relationships, listed in removedRelationships. Removing a field also removes the calculated fields, measures and relationships that use it. When anything reads what a write removes, or SQL names what it renames, the write is refused with code in_use (HTTP 409) and the readers (kind, title, id, pageId, page, effect); confirm=true makes it anyway, and the result lists what went with it (removedWith) and what now shows an error (breaks). Documentation topic connections has the full rules. Uses the revision from InspectDataModel. Returns reportVersion.",
"parameters": {
"type": "object",
"properties": {
"entityKey": {
"type": "string",
"pattern": "^[A-Za-z_][A-Za-z0-9_]{0,127}$"
},
"sql": {
"type": [
"string",
"null"
],
"description": "One SELECT or WITH statement, or null to delete the calculated table."
},
"displayName": {
"type": [
"string",
"null"
],
"description": "Display label, or null to keep it (the key for a new table)."
},
"description": {
"type": [
"string",
"null"
],
"description": "What it holds, or null to keep it."
},
"expectedModelRevision": {
"type": "integer",
"minimum": 0
},
"confirm": {
"type": [
"boolean",
"null"
],
"description": "true makes the change after code in_use; null otherwise."
}
},
"required": [
"entityKey",
"expectedModelRevision"
],
"additionalProperties": false
}
}
}
SaveModelRelationshipchanges
Add, edit or remove one relationship, keeping the others. Relationships join source columns, not calculated fields. Its two ends identify it, in either direction. An existing one takes the isActive, crossFilter and relationshipName sent (null keeps them); a new one is active and single unless they are sent. remove=true removes it. A relationship change (added, removed, activated, deactivated or a new crossFilter) that would break a saved visual or page dataset, change what it shows (another join path), or stop or change a filter's reach to one is refused with code in_use and the readers (effect breaks, changes or stopsFiltering); confirm=true makes it anyway, and the result lists them (breaks). A key (to) end with duplicate or blank values is refused (code duplicate_key or blank_key), as is a both that gives a filter a second path (code ambiguous_both). Uses the revision from InspectDataModel.
Access: Edit access; reaches model.
Parameters
relationshipobjectRequiredSee the operation description and exact schema for this value.
removeboolean | nullOptionaltrue removes the relationship; null otherwise.
expectedModelRevisionintegerRequiredSee the operation description and exact schema for this value.
minimum:0confirmboolean | nullOptionaltrue makes the change after code in_use; null otherwise.
Exact JSON schema
{
"type": "function",
"function": {
"name": "SaveModelRelationship",
"description": "Add, edit or remove one relationship, keeping the others. Relationships join source columns, not calculated fields. Its two ends identify it, in either direction. An existing one takes the isActive, crossFilter and relationshipName sent (null keeps them); a new one is active and single unless they are sent. remove=true removes it. A relationship change (added, removed, activated, deactivated or a new crossFilter) that would break a saved visual or page dataset, change what it shows (another join path), or stop or change a filter's reach to one is refused with code in_use and the readers (effect breaks, changes or stopsFiltering); confirm=true makes it anyway, and the result lists them (breaks). A key (to) end with duplicate or blank values is refused (code duplicate_key or blank_key), as is a both that gives a filter a second path (code ambiguous_both). Uses the revision from InspectDataModel.",
"parameters": {
"type": "object",
"properties": {
"relationship": {
"type": "object",
"properties": {
"fromEntityKey": {
"type": "string"
},
"fromColumn": {
"type": "string"
},
"toEntityKey": {
"type": "string"
},
"toColumn": {
"type": "string"
},
"isActive": {
"type": [
"boolean",
"null"
],
"default": true
},
"crossFilter": {
"type": [
"string",
"null"
],
"enum": [
"single",
"both",
null
],
"description": "single (the default when absent): filters flow from the to (key) end to the from end; both: each end filters the other."
},
"relationshipName": {
"type": [
"string",
"null"
],
"description": "A display name."
}
},
"required": [
"fromEntityKey",
"fromColumn",
"toEntityKey",
"toColumn"
],
"additionalProperties": false
},
"remove": {
"type": [
"boolean",
"null"
],
"description": "true removes the relationship; null otherwise."
},
"expectedModelRevision": {
"type": "integer",
"minimum": 0
},
"confirm": {
"type": [
"boolean",
"null"
],
"description": "true makes the change after code in_use; null otherwise."
}
},
"required": [
"relationship",
"expectedModelRevision"
],
"additionalProperties": false
}
}
}
SaveReportModelRelationshipschanges
Replace this report's complete relationship collection, including relationships between sources. Relationships join source columns, not calculated fields. Supply relationshipsJson as an array with fromEntityKey, fromColumn, toEntityKey, toColumn, isActive, crossFilter (single, the default, filters from the to (key) end to the from end; both filters both ways) and relationshipName (a display name). A relationship change (added, removed, activated, deactivated or a new crossFilter) that would break a saved visual or page dataset, change what it shows (another join path), or stop or change a filter's reach to one is refused with code in_use and the readers (effect breaks, changes or stopsFiltering); confirm=true makes it anyway, and the result lists them (breaks). A key (to) end with duplicate or blank values is refused (code duplicate_key or blank_key), as is a both that gives a filter a second path (code ambiguous_both). Uses the revision returned by InspectDataModel and changes only this report. Returns reportVersion.
Access: Edit access; reaches model.
Parameters
relationshipsJsonstring | object | arrayRequiredSee the operation description and exact schema for this value.
expectedModelRevisionintegerRequiredSee the operation description and exact schema for this value.
minimum:0confirmboolean | nullOptionaltrue makes the change after code in_use; null otherwise.
Exact JSON schema
{
"type": "function",
"function": {
"name": "SaveReportModelRelationships",
"description": "Replace this report's complete relationship collection, including relationships between sources. Relationships join source columns, not calculated fields. Supply relationshipsJson as an array with fromEntityKey, fromColumn, toEntityKey, toColumn, isActive, crossFilter (single, the default, filters from the to (key) end to the from end; both filters both ways) and relationshipName (a display name). A relationship change (added, removed, activated, deactivated or a new crossFilter) that would break a saved visual or page dataset, change what it shows (another join path), or stop or change a filter's reach to one is refused with code in_use and the readers (effect breaks, changes or stopsFiltering); confirm=true makes it anyway, and the result lists them (breaks). A key (to) end with duplicate or blank values is refused (code duplicate_key or blank_key), as is a both that gives a filter a second path (code ambiguous_both). Uses the revision returned by InspectDataModel and changes only this report. Returns reportVersion.",
"parameters": {
"type": "object",
"properties": {
"relationshipsJson": {
"type": [
"string",
"object",
"array"
]
},
"expectedModelRevision": {
"type": "integer",
"minimum": 0
},
"confirm": {
"type": [
"boolean",
"null"
],
"description": "true makes the change after code in_use; null otherwise."
}
},
"required": [
"relationshipsJson",
"expectedModelRevision"
],
"additionalProperties": false
}
}
}
SaveReportModelSourcechanges
Save explicit changes to one source in the current report data model using the editor's validation and persistence services. changesJson accepts sourceMode, selectedSchema, selectedTables, entities, relationships, definitions and description. Omitted fields are preserved; supplied arrays replace that collection. Use the model revision from inspection. Entity SQL describes physical source objects. Relationship-only changes do not execute entity SQL. Only this report uses the saved model. The save is live immediately. A query's entity key cannot change after it is saved: change entityName instead. Changing an output's name in entity SQL makes a new field; SaveModelDefinition renames a field and keeps what uses it. Removing a field also removes the calculated fields, measures and relationships that use it. When anything reads what a write removes, or SQL names what it renames, the write is refused with code in_use (HTTP 409) and the readers (kind, title, id, pageId, page, effect); confirm=true makes it anyway, and the result lists what went with it (removedWith) and what now shows an error (breaks). Documentation topic connections has the full rules. A relationship change (added, removed, activated, deactivated or a new crossFilter) that would break a saved visual or page dataset, change what it shows (another join path), or stop or change a filter's reach to one is refused with code in_use and the readers (effect breaks, changes or stopsFiltering); confirm=true makes it anyway, and the result lists them (breaks). A key (to) end with duplicate or blank values is refused (code duplicate_key or blank_key), as is a both that gives a filter a second path (code ambiguous_both). ReadUnityDocumentation topic=connections describes these Unity fields.
Access: Edit access; reaches model, source.
Parameters
connectionIdintegerRequiredConnection ID (from InspectConnections).
expectedModelRevisionintegerRequiredSee the operation description and exact schema for this value.
minimum:0changesJsonstring | objectRequiredSee the operation description and exact schema for this value.
confirmboolean | nullOptionaltrue makes the change after code in_use; null otherwise.
Exact JSON schema
{
"type": "function",
"function": {
"name": "SaveReportModelSource",
"description": "Save explicit changes to one source in the current report data model using the editor's validation and persistence services. changesJson accepts sourceMode, selectedSchema, selectedTables, entities, relationships, definitions and description. Omitted fields are preserved; supplied arrays replace that collection. Use the model revision from inspection. Entity SQL describes physical source objects. Relationship-only changes do not execute entity SQL. Only this report uses the saved model. The save is live immediately. A query's entity key cannot change after it is saved: change entityName instead. Changing an output's name in entity SQL makes a new field; SaveModelDefinition renames a field and keeps what uses it. Removing a field also removes the calculated fields, measures and relationships that use it. When anything reads what a write removes, or SQL names what it renames, the write is refused with code in_use (HTTP 409) and the readers (kind, title, id, pageId, page, effect); confirm=true makes it anyway, and the result lists what went with it (removedWith) and what now shows an error (breaks). Documentation topic connections has the full rules. A relationship change (added, removed, activated, deactivated or a new crossFilter) that would break a saved visual or page dataset, change what it shows (another join path), or stop or change a filter's reach to one is refused with code in_use and the readers (effect breaks, changes or stopsFiltering); confirm=true makes it anyway, and the result lists them (breaks). A key (to) end with duplicate or blank values is refused (code duplicate_key or blank_key), as is a both that gives a filter a second path (code ambiguous_both). ReadUnityDocumentation topic=connections describes these Unity fields.",
"parameters": {
"type": "object",
"properties": {
"connectionId": {
"type": "integer",
"description": "Connection ID (from InspectConnections)."
},
"expectedModelRevision": {
"type": "integer",
"minimum": 0
},
"changesJson": {
"type": [
"string",
"object"
],
"properties": {
"sourceMode": {
"type": [
"string",
"null"
],
"enum": [
"tables",
"custom_sql",
null
],
"description": "tables: entities read whole tables; custom_sql: authored queries."
},
"selectedTables": {
"type": [
"array",
"null"
],
"items": {
"type": "string"
},
"description": "Tables to model, as discovered (dbo.transactions). Sent without entities, each one with no query yet gets one, and the saved queries stay."
},
"selectedSchema": {
"type": [
"object",
"null"
],
"properties": {
"tables": {
"type": [
"object",
"null"
],
"description": "Table name -> {} for each selected table."
}
},
"description": "tables mode: the selection; columns come from discovery.",
"required": []
},
"entities": {
"type": [
"array",
"null"
],
"items": {
"type": "object",
"properties": {
"entityKey": {
"type": [
"string",
"null"
],
"description": "Report-unique entity key: the one name report SQL reads this output by (FROM dbo_transactions), exactly, with no schema. Lowercase; case is ignored when reading. It cannot change after saving."
},
"entityName": {
"type": [
"string",
"null"
],
"description": "Display name only; report SQL does not read an output by it."
},
"entityUid": {
"type": [
"string",
"null"
],
"description": "Read-only identity (ent_...), assigned by Unity; sent with another entityKey, the save is refused."
},
"entitySqlQuery": {
"type": [
"string",
"null"
],
"description": "The source query in the source's native dialect (T-SQL for SQL Server); API providers use provider query JSON."
},
"sourceTableName": {
"type": [
"string",
"null"
],
"description": "The table it reads in tables mode (dbo.transactions)."
},
"description": {
"type": [
"string",
"null"
]
},
"isPrimary": {
"type": [
"boolean",
"null"
],
"description": "The source's primary output."
},
"primaryKeyColumns": {
"type": [
"array",
"null"
],
"items": {
"type": "string"
},
"description": "Row identity: the source's declared key; empty when it declares none."
},
"entityColumns": {
"type": [
"array",
"null"
],
"items": {
"type": "string"
}
},
"entityColumnsDetailed": {
"type": [
"array",
"null"
],
"items": {
"type": "object"
}
}
},
"required": []
},
"description": "Replaces this source's entities."
},
"relationships": {
"type": [
"array",
"null"
],
"items": {
"type": "object",
"properties": {
"fromEntityKey": {
"type": [
"string",
"null"
]
},
"fromColumn": {
"type": [
"string",
"null"
]
},
"toEntityKey": {
"type": [
"string",
"null"
]
},
"toColumn": {
"type": [
"string",
"null"
]
},
"isActive": {
"type": [
"boolean",
"null"
],
"default": true
},
"crossFilter": {
"type": [
"string",
"null"
],
"enum": [
"single",
"both",
null
],
"description": "single (the default when absent): filters flow from the to (key) end to the from end; both: each end filters the other."
},
"relationshipName": {
"type": [
"string",
"null"
],
"description": "A display name."
},
"relationshipId": {
"type": [
"integer",
"null"
],
"description": "Read-only."
}
},
"description": "A filter reaches the other end as a key set, in the relationship's crossFilter direction; it never multiplies rows.",
"required": []
},
"description": "Relationships within this source."
},
"definitions": {
"type": [
"array",
"null"
],
"items": {
"type": "object",
"properties": {
"definitionId": {
"type": [
"integer",
"null"
],
"description": "Assigned by Unity. Sent back with its definitionVersion, it edits that definition (a stale version answers 409); without it, a definition is matched by aliasName and sourceEntityKey."
},
"definitionVersion": {
"type": [
"integer",
"null"
],
"description": "Read-only; the version a definitionId edit is checked against."
},
"aliasName": {
"type": [
"string",
"null"
],
"description": "Field or measure name used in report SQL (t.\"Total Spend\")."
},
"description": {
"type": [
"string",
"null"
],
"description": "Business meaning: inclusions, exclusions, units."
},
"sqlExpression": {
"type": [
"string",
"null"
],
"description": "DuckDB expression over the owning entity's columns; an aggregate for a measure. A typed measure has none."
},
"measureKind": {
"type": [
"string",
"null"
],
"enum": [
"composite",
"share",
"timeComparison",
"runningTotal",
"rank",
null
],
"description": "A typed measure's kind, compiled by the query builder; a SQL definition has none."
},
"spec": {
"type": [
"object",
"null"
],
"description": "A typed measure's fields by fieldUid. composite {formula: node}, a node {measure: uid}, {number: \"1.5\"} or {add|subtract|multiply|divide: [node, node]}; share {measure, across: [uid]}; timeComparison {measure, date, shift: previousYear|previousPeriod}; runningTotal {measure, along}; rank {measure, within: [uid], direction: desc|asc}."
},
"definitionType": {
"type": [
"string",
"null"
],
"enum": [
"direct_column",
"derived_column",
"measure",
null
],
"description": "measure for an aggregate, SQL or typed."
},
"canonicalType": {
"type": [
"string",
"null"
],
"enum": [
"string",
"integer",
"decimal",
"boolean",
"date",
"datetime",
"json",
"unknown",
null
],
"description": "Read-only: the type the engine returns when it is saved."
},
"sourceEntityKey": {
"type": [
"string",
"null"
],
"description": "The owning entity. A typed measure other than a composite is listed on its measure's table."
},
"sourceColumns": {
"type": [
"array",
"null"
],
"items": {
"type": "string"
},
"description": "Columns of sourceEntityKey the expression reads; not used by a typed measure."
},
"format": {
"type": [
"object",
"null"
],
"additionalProperties": false,
"properties": {
"style": {
"type": [
"string",
"null"
],
"enum": [
"number",
"percent",
"currency",
null
]
},
"decimals": {
"type": [
"integer",
"null"
],
"minimum": 0,
"maximum": 8,
"description": "Default 2."
},
"currency": {
"type": [
"string",
"null"
],
"enum": [
"USD",
"EUR",
"GBP",
"JPY",
null
],
"description": "style currency; default USD."
},
"percentInputScale": {
"type": [
"string",
"null"
],
"enum": [
"ratio",
"percentagePoints",
null
],
"description": "style percent. ratio (the default): 0.372 shows as 37.2%; percentagePoints: 37.2 shows as 37.2%."
},
"thousandsSeparator": {
"type": [
"boolean",
"null"
],
"description": "Default true."
}
},
"description": "How visuals show this field's values unless a visual sets its own format; an aggregation of it (sum, count) has none. Empty ({}, or every property null in a tool call) removes it.",
"required": []
}
},
"description": "A SQL definition (sqlExpression) or a typed measure (measureKind and spec).",
"required": []
},
"description": "This source's reusable fields and measures."
},
"description": {
"type": [
"string",
"null"
]
}
},
"required": []
},
"confirm": {
"type": [
"boolean",
"null"
],
"description": "true makes the change after code in_use; null otherwise."
}
},
"required": [
"connectionId",
"expectedModelRevision",
"changesJson"
],
"additionalProperties": false
}
}
}
UpdateChatPreviewchanges
Edit an existing inline chat preview in place, preserving its source conversation. Inspect first for expectedRevision. changesJson contains native visual definition fields; omitted fields are preserved, customization:null restores defaults. visualType:null keeps its type. This never creates or updates a canvas visual.
Access: Edit access; reaches chat.
With access to specific pages only: pages you may edit (Edit on the page; View and Edit content are read-only).
Parameters
dataChatIdintegerRequiredSee the operation description and exact schema for this value.
messageIdintegerRequiredSee the operation description and exact schema for this value.
expectedRevisionstringRequiredSee the operation description and exact schema for this value.
changesJsonstring | object | arrayRequiredSee the operation description and exact schema for this value.
visualTypestring | nullOptionalCanonical visual kind. dataCard is a KPI; dataTable is a table. InspectVisualCapabilities lists labels and rendering details.
enum:["declarativeChart","matrix","dataTable","dataCard",null]
Exact JSON schema
{
"type": "function",
"function": {
"name": "UpdateChatPreview",
"description": "Edit an existing inline chat preview in place, preserving its source conversation. Inspect first for expectedRevision. changesJson contains native visual definition fields; omitted fields are preserved, customization:null restores defaults. visualType:null keeps its type. This never creates or updates a canvas visual.",
"parameters": {
"type": "object",
"properties": {
"dataChatId": {
"type": "integer"
},
"messageId": {
"type": "integer"
},
"expectedRevision": {
"type": "string"
},
"changesJson": {
"type": [
"string",
"object",
"array"
]
},
"visualType": {
"type": [
"string",
"null"
],
"enum": [
"declarativeChart",
"matrix",
"dataTable",
"dataCard",
null
],
"description": "Canonical visual kind. dataCard is a KPI; dataTable is a table. InspectVisualCapabilities lists labels and rendering details."
}
},
"required": [
"dataChatId",
"messageId",
"expectedRevision",
"changesJson"
],
"additionalProperties": false
}
}
}
UpdateMyViewchanges
Set your own view of this report, its filter values and table sorts: only you see them, and they're kept between visits. Each value replaces yours for that filter (null shows all); each sort replaces yours for that table (direction null returns it to the table's own order, its query's sort); reset true first returns all of yours to the defaults. Locked and hidden filters need Edit access.
Access: View access; reaches pages.
With access to specific pages only: any access (a tool that names a page works on pages shared with you; the model and query tools are the report Viewer's).
Parameters
valuesarray | nullOptionalSee the operation description and exact schema for this value.
sortsarray | nullOptionalSee the operation description and exact schema for this value.
resetboolean | nullOptionalSee the operation description and exact schema for this value.
Exact JSON schema
{
"type": "function",
"function": {
"name": "UpdateMyView",
"description": "Set your own view of this report, its filter values and table sorts: only you see them, and they're kept between visits. Each value replaces yours for that filter (null shows all); each sort replaces yours for that table (direction null returns it to the table's own order, its query's sort); reset true first returns all of yours to the defaults. Locked and hidden filters need Edit access.",
"parameters": {
"type": "object",
"properties": {
"values": {
"type": [
"array",
"null"
],
"items": {
"type": "object",
"properties": {
"filterUid": {
"type": "string"
},
"value": {
"anyOf": [
{
"type": "object",
"properties": {
"values": {
"type": "array",
"items": {
"type": [
"string",
"number",
"boolean",
"null"
]
},
"description": "The values to keep; null is (Blank)."
},
"exclude": {
"type": "boolean",
"description": "true keeps every value except these."
}
},
"required": [
"values",
"exclude"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"conditions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"operator": {
"type": "string",
"enum": [
"is",
"isNot",
"contains",
"doesNotContain",
"startsWith",
"doesNotStartWith",
"isBlank",
"isNotBlank",
"lessThan",
"lessThanOrEqual",
"greaterThan",
"greaterThanOrEqual"
],
"description": "Text: is, isNot, contains, doesNotContain, startsWith, doesNotStartWith, isBlank, isNotBlank. Numbers, dates and measures: is, isNot, lessThan, lessThanOrEqual, greaterThan, greaterThanOrEqual, isBlank, isNotBlank. doesNotContain, doesNotStartWith and isBlank keep (Blank), which also stands for related rows with no row in the field's table. is, isNot and comparisons treat (Blank) as DAX does, as 0, empty text or the date 1899-12-30: lessThan 1970 keeps it, isNot 0 drops it. A measure filter's is, isNot and comparisons never keep a blank measure. On a date and time, is and isNot compare the day."
},
"value": {
"type": [
"string",
"number",
"null"
]
}
},
"required": [
"operator"
],
"additionalProperties": false
}
},
"join": {
"type": [
"string",
"null"
],
"enum": [
"and",
"or",
null
],
"description": "and or or with two conditions; null with one."
}
},
"required": [
"conditions"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"when": {
"type": "string",
"enum": [
"last",
"this",
"next"
],
"description": "last and next count whole units before or after the current one; this is the current one. Weeks start on Monday."
},
"count": {
"type": [
"integer",
"null"
],
"description": "1 to 1000 with last and next; null with this."
},
"unit": {
"type": "string",
"enum": [
"day",
"week",
"month",
"quarter",
"year"
]
}
},
"required": [
"when",
"unit"
],
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The filter's value for its kind; null shows all."
}
},
"required": [
"filterUid"
],
"additionalProperties": false
}
},
"sorts": {
"type": [
"array",
"null"
],
"items": {
"type": "object",
"properties": {
"visualUid": {
"type": "string",
"description": "The table's visualUid."
},
"output": {
"type": "string",
"description": "An output of the table's query."
},
"direction": {
"type": [
"string",
"null"
],
"enum": [
"asc",
"desc",
null
]
}
},
"required": [
"visualUid",
"output"
],
"additionalProperties": false
}
},
"reset": {
"type": [
"boolean",
"null"
]
}
},
"required": [],
"additionalProperties": false
}
}
}
UpdateVisualchanges
Edit native visuals on any pages: 1 to 100 per call. Supply each revision from InspectVisual. changesJson is a small JSON object with only the intended changes: title, customization, position, pageId, query (not textBox or shape), and by kind subtitle (dataCard), shapeType (shape), columnConfig (dataTable), rendererSpec (declarativeChart), matrixSpec (matrix). InspectVisualCapabilities supplies the kind-specific change schema. Appearance merges; arrays replace. Existing business logic changes require the user's intent. All or nothing: if any item is refused, nothing is saved and each refused item is named by its index; otherwise the call is one report version. Stale revisions fail visibly; inspect again and reason before retrying. Returns each visual's visualUid, revision and pageId, in order. Runs no query: QueryReportData reads a visual's data.
Access: Edit access; reaches pages.
With access to specific pages only: pages you may edit (Edit on the page; View and Edit content are read-only).
Parameters
visualsarray<object>RequiredSee the operation description and exact schema for this value.
minItems:1maxItems:100
Exact JSON schema
{
"type": "function",
"function": {
"name": "UpdateVisual",
"description": "Edit native visuals on any pages: 1 to 100 per call. Supply each revision from InspectVisual. changesJson is a small JSON object with only the intended changes: title, customization, position, pageId, query (not textBox or shape), and by kind subtitle (dataCard), shapeType (shape), columnConfig (dataTable), rendererSpec (declarativeChart), matrixSpec (matrix). InspectVisualCapabilities supplies the kind-specific change schema. Appearance merges; arrays replace. Existing business logic changes require the user's intent. All or nothing: if any item is refused, nothing is saved and each refused item is named by its index; otherwise the call is one report version. Stale revisions fail visibly; inspect again and reason before retrying. Returns each visual's visualUid, revision and pageId, in order. Runs no query: QueryReportData reads a visual's data.",
"parameters": {
"type": "object",
"properties": {
"visuals": {
"type": "array",
"minItems": 1,
"maxItems": 100,
"items": {
"type": "object",
"properties": {
"visualUid": {
"type": "string",
"description": "Stable visualUid from inspection."
},
"expectedRevision": {
"type": "string"
},
"changesJson": {
"type": [
"string",
"object",
"array"
],
"description": "JSON patch of editable fields shown in inspection. When a chart's output names change, include the rendererSpec that binds them in this same patch (a matrix and a table follow their query). InspectVisualCapabilities section=changes provides the schema."
}
},
"required": [
"visualUid",
"expectedRevision",
"changesJson"
],
"additionalProperties": false
}
}
},
"required": [
"visuals"
],
"additionalProperties": false
}
}
}
Filters and change history
InspectFiltersread-only
Read the filters on a page: the report's, the page's and each native visual's, with kind, default, locked and hidden, and the value that applies to you (yours, or the default). pageId null reads the report's filters only. sorts lists your own table sorts (the page's; every page's when pageId is null). differs is true when any of your values in this report differs from its default, or you sort a table yourself. Viewers don't see hidden filters. A filter that can't be read is listed with broken; remove it. UpdateFilters takes the filterRevision returned here as expectedFilterRevision. An HTML page's dataset filters are part of its datasets (InspectHtmlPage).
Access: View access; reaches pages.
With access to specific pages only: any access (a tool that names a page works on pages shared with you; the model and query tools are the report Viewer's).
Parameters
pageIdstring | nullOptionalStable pageId from InspectReport.
Exact JSON schema
{
"type": "function",
"function": {
"name": "InspectFilters",
"description": "Read the filters on a page: the report's, the page's and each native visual's, with kind, default, locked and hidden, and the value that applies to you (yours, or the default). pageId null reads the report's filters only. sorts lists your own table sorts (the page's; every page's when pageId is null). differs is true when any of your values in this report differs from its default, or you sort a table yourself. Viewers don't see hidden filters. A filter that can't be read is listed with broken; remove it. UpdateFilters takes the filterRevision returned here as expectedFilterRevision. An HTML page's dataset filters are part of its datasets (InspectHtmlPage).",
"parameters": {
"type": "object",
"properties": {
"pageId": {
"type": [
"string",
"null"
],
"description": "Stable pageId from InspectReport."
}
},
"required": [],
"additionalProperties": false
}
}
}
UpdateFilterschanges
Add, change or remove filters for everyone (report design; Edit access, and report Edit for report scope). filterUid null adds a filter; an existing filterUid changes its kind, default, locked, hidden or label, since its field and scope are fixed; remove deletes filters and everyone's values for them. A new default doesn't change the value of people who set their own; changing kind, locked or hidden returns everyone to the default. expectedFilterRevision is the filterRevision InspectFilters returned; if the filters changed since, nothing is saved.
Access: Edit access; reaches pages.
With access to specific pages only: pages you may edit (Edit on the page; View and Edit content are read-only).
Parameters
filtersarray | nullOptionalSee the operation description and exact schema for this value.
removearray | nullOptionalfilterUids to remove.
expectedFilterRevisionintegerRequiredSee the operation description and exact schema for this value.
Exact JSON schema
{
"type": "function",
"function": {
"name": "UpdateFilters",
"description": "Add, change or remove filters for everyone (report design; Edit access, and report Edit for report scope). filterUid null adds a filter; an existing filterUid changes its kind, default, locked, hidden or label, since its field and scope are fixed; remove deletes filters and everyone's values for them. A new default doesn't change the value of people who set their own; changing kind, locked or hidden returns everyone to the default. expectedFilterRevision is the filterRevision InspectFilters returned; if the filters changed since, nothing is saved.",
"parameters": {
"type": "object",
"properties": {
"filters": {
"type": [
"array",
"null"
],
"items": {
"type": "object",
"properties": {
"filterUid": {
"type": [
"string",
"null"
],
"description": "Null adds a filter; a filterUid changes that filter."
},
"fieldUid": {
"type": "string",
"description": "The model field (InspectDataModel). Fixed once created."
},
"kind": {
"type": "string",
"enum": [
"basic",
"advanced",
"relativeDate"
],
"description": "basic: a checklist of values; advanced: one or two conditions; relativeDate: last, this or next N days, weeks, months, quarters or years, today in UTC. A measure takes advanced."
},
"default": {
"anyOf": [
{
"type": "object",
"properties": {
"values": {
"type": "array",
"items": {
"type": [
"string",
"number",
"boolean",
"null"
]
},
"description": "The values to keep; null is (Blank)."
},
"exclude": {
"type": "boolean",
"description": "true keeps every value except these."
}
},
"required": [
"values",
"exclude"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"conditions": {
"type": "array",
"items": {
"type": "object",
"properties": {
"operator": {
"type": "string",
"enum": [
"is",
"isNot",
"contains",
"doesNotContain",
"startsWith",
"doesNotStartWith",
"isBlank",
"isNotBlank",
"lessThan",
"lessThanOrEqual",
"greaterThan",
"greaterThanOrEqual"
],
"description": "Text: is, isNot, contains, doesNotContain, startsWith, doesNotStartWith, isBlank, isNotBlank. Numbers, dates and measures: is, isNot, lessThan, lessThanOrEqual, greaterThan, greaterThanOrEqual, isBlank, isNotBlank. doesNotContain, doesNotStartWith and isBlank keep (Blank), which also stands for related rows with no row in the field's table. is, isNot and comparisons treat (Blank) as DAX does, as 0, empty text or the date 1899-12-30: lessThan 1970 keeps it, isNot 0 drops it. A measure filter's is, isNot and comparisons never keep a blank measure. On a date and time, is and isNot compare the day."
},
"value": {
"type": [
"string",
"number",
"null"
]
}
},
"required": [
"operator"
],
"additionalProperties": false
}
},
"join": {
"type": [
"string",
"null"
],
"enum": [
"and",
"or",
null
],
"description": "and or or with two conditions; null with one."
}
},
"required": [
"conditions"
],
"additionalProperties": false
},
{
"type": "object",
"properties": {
"when": {
"type": "string",
"enum": [
"last",
"this",
"next"
],
"description": "last and next count whole units before or after the current one; this is the current one. Weeks start on Monday."
},
"count": {
"type": [
"integer",
"null"
],
"description": "1 to 1000 with last and next; null with this."
},
"unit": {
"type": "string",
"enum": [
"day",
"week",
"month",
"quarter",
"year"
]
}
},
"required": [
"when",
"unit"
],
"additionalProperties": false
},
{
"type": "null"
}
],
"description": "The filter's value for its kind; null shows all."
},
"locked": {
"type": "boolean",
"description": "Viewers can't change it."
},
"hidden": {
"type": "boolean",
"description": "It applies, but viewers don't see it."
},
"label": {
"type": [
"string",
"null"
],
"description": "Null uses the field's name."
},
"scope": {
"type": "string",
"enum": [
"report",
"page",
"visual"
],
"description": "report (target null), page (target: the page's pageId) or visual (target: visualUid). Fixed once created."
},
"target": {
"type": [
"string",
"null"
]
}
},
"required": [
"fieldUid",
"kind",
"locked",
"hidden",
"scope"
],
"additionalProperties": false
}
},
"remove": {
"type": [
"array",
"null"
],
"items": {
"type": "string"
},
"description": "filterUids to remove."
},
"expectedFilterRevision": {
"type": "integer"
}
},
"required": [
"expectedFilterRevision"
],
"additionalProperties": false
}
}
}
HTML pages and testing
EditHtmlPagechanges
Edit elements of the page HTML or a registered visual's html by data-unity-id, without retyping markup: setText, setAttribute, setStyle, move, remove, insert, duplicate, replaceElement. Ops apply in order to the one part (null = page HTML; visual/<visualId>/html = that visual's markup) and are saved as one version, or nothing is. A refusal names a code: edit_in_code (that markup cannot be edited structurally; use PatchHtmlSource or UpdateHtmlPage), not_found (no such element in the part) or invalid. Returns the uids written. InspectHtmlPage with view:'outline' lists elements and their uids.
Access: Edit access; reaches pages.
With access to specific pages only: pages you may edit (Edit on the page; View and Edit content are read-only).
Parameters
baseVersionintegerRequiredThis page's current version from InspectHtmlPage (its
version). Each page has its own version; other pages, new pages and templates do not change it. A save on an older version applies only if nothing changed since that touched the source it reads or writes; otherwise it is refused and nothing is saved.pageIdstringRequiredSee the operation description and exact schema for this value.
partstring | nullOptionalnull = page HTML, or
visual/<visualId>/html.opsarray<object>Required1-100 element ops. Send only the fields an op uses; the others are null.
labelstringRequiredSee the operation description and exact schema for this value.
Exact JSON schema
{
"type": "function",
"function": {
"name": "EditHtmlPage",
"description": "Edit elements of the page HTML or a registered visual's html by data-unity-id, without retyping markup: setText, setAttribute, setStyle, move, remove, insert, duplicate, replaceElement. Ops apply in order to the one `part` (null = page HTML; `visual/<visualId>/html` = that visual's markup) and are saved as one version, or nothing is. A refusal names a code: edit_in_code (that markup cannot be edited structurally; use PatchHtmlSource or UpdateHtmlPage), not_found (no such element in the part) or invalid. Returns the uids written. InspectHtmlPage with view:'outline' lists elements and their uids.",
"parameters": {
"type": "object",
"properties": {
"baseVersion": {
"type": "integer",
"description": "This page's current version from InspectHtmlPage (its `version`). Each page has its own version; other pages, new pages and templates do not change it. A save on an older version applies only if nothing changed since that touched the source it reads or writes; otherwise it is refused and nothing is saved."
},
"pageId": {
"type": "string"
},
"part": {
"type": [
"string",
"null"
],
"description": "null = page HTML, or `visual/<visualId>/html`."
},
"ops": {
"type": "array",
"items": {
"type": "object",
"properties": {
"op": {
"type": "string",
"enum": [
"setText",
"setAttribute",
"setStyle",
"move",
"remove",
"insert",
"duplicate",
"replaceElement"
]
},
"uid": {
"type": [
"string",
"null"
],
"description": "Target element's data-unity-id (setText, setAttribute, setStyle, move, remove, duplicate, replaceElement)."
},
"text": {
"type": [
"string",
"null"
],
"description": "setText: the new text (replaces the element's text-only content; written escaped)."
},
"name": {
"type": [
"string",
"null"
],
"description": "setAttribute: the attribute name (not data-unity-id)."
},
"value": {
"type": [
"string",
"null"
],
"description": "setAttribute: the attribute value; null removes the attribute."
},
"style": {
"type": [
"array",
"null"
],
"description": "setStyle: declarations to set or remove on the element's style attribute; other declarations keep their order.",
"items": {
"type": "object",
"properties": {
"property": {
"type": "string"
},
"value": {
"type": [
"string",
"null"
],
"description": "null removes the declaration."
}
},
"required": [
"property"
],
"additionalProperties": false
}
},
"parentUid": {
"type": [
"string",
"null"
],
"description": "move/insert: destination parent's uid; '#root' or null = top level of the part."
},
"beforeUid": {
"type": [
"string",
"null"
],
"description": "move/insert: place before this child of the destination; null = last."
},
"html": {
"type": [
"string",
"null"
],
"description": "insert: the fragment to add; replaceElement: the element's complete replacement. Must be well-formed (close every element). Omit data-unity-id on new elements."
}
},
"required": [
"op"
],
"additionalProperties": false
},
"description": "1-100 element ops. Send only the fields an op uses; the others are null."
},
"label": {
"type": "string"
}
},
"required": [
"baseVersion",
"pageId",
"ops",
"label"
],
"additionalProperties": false
}
}
}
ImportHtmlTemplatechanges
Copy one complete built-in HTML file into an EXISTING HTML page as one saved version. Preserves datasets, registered visuals, saved filters and other pages. Register live visuals first with SaveHtmlVisuals. Optional mounts replace the pristine template container contents with placeholders for visualIds; sectionIds come from InspectHtmlTemplate. Optional exact edits apply AFTER mounts; mismatched edits/overlapping mounts save nothing. Empty arrays copy the original wholesale. This replaces page composition and leaves illustrative examples until you adapt/remove them; it does not connect demo controls to Unity.
Access: Edit access; reaches pages.
With access to specific pages only: pages you may edit (Edit on the page; View and Edit content are read-only).
Parameters
templateIdstringRequiredSee the operation description and exact schema for this value.
pageIdstringRequiredSee the operation description and exact schema for this value.
baseVersionintegerRequiredThis page's current version from InspectHtmlPage (its
version). Each page has its own version; other pages and templates do not change it.mountsarray | nullOptionalSee the operation description and exact schema for this value.
editsarray | nullOptionalSee the operation description and exact schema for this value.
labelstringRequiredSee the operation description and exact schema for this value.
Exact JSON schema
{
"type": "function",
"function": {
"name": "ImportHtmlTemplate",
"description": "Copy one complete built-in HTML file into an EXISTING HTML page as one saved version. Preserves datasets, registered visuals, saved filters and other pages. Register live visuals first with SaveHtmlVisuals. Optional mounts replace the pristine template container contents with placeholders for visualIds; sectionIds come from InspectHtmlTemplate. Optional exact edits apply AFTER mounts; mismatched edits/overlapping mounts save nothing. Empty arrays copy the original wholesale. This replaces page composition and leaves illustrative examples until you adapt/remove them; it does not connect demo controls to Unity.",
"parameters": {
"type": "object",
"properties": {
"templateId": {
"type": "string"
},
"pageId": {
"type": "string"
},
"baseVersion": {
"type": "integer",
"description": "This page's current version from InspectHtmlPage (its `version`). Each page has its own version; other pages and templates do not change it."
},
"mounts": {
"type": [
"array",
"null"
],
"items": {
"type": "object",
"properties": {
"sectionId": {
"type": "string"
},
"visualIds": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"sectionId",
"visualIds"
],
"additionalProperties": false
}
},
"edits": {
"type": [
"array",
"null"
],
"items": {
"type": "object",
"properties": {
"find": {
"type": "string"
},
"replace": {
"type": "string"
},
"expectedMatches": {
"type": "integer",
"minimum": 1
}
},
"required": [
"find",
"replace",
"expectedMatches"
],
"additionalProperties": false
}
},
"label": {
"type": "string"
}
},
"required": [
"templateId",
"pageId",
"baseVersion",
"label"
],
"additionalProperties": false
}
}
}
InspectHtmlPageread-only
Read one saved HTML page: its version (send it as baseVersion) with its full composition, datasets, visuals and current renderer feedback. InspectReport lists the pages. view:'outline' replaces the source with a bounded outline of each HTML part: landmarks, text and media elements, visual mounts and bound elements, with their data-unity-id, classes, short text and layout hints; view null or 'source' returns the source.
Access: View access; reaches pages.
With access to specific pages only: any access (a tool that names a page works on pages shared with you; the model and query tools are the report Viewer's).
Parameters
pageIdstringRequiredSee the operation description and exact schema for this value.
viewstring | nullOptionalSee the operation description and exact schema for this value.
enum:["source","outline",null]
Exact JSON schema
{
"type": "function",
"function": {
"name": "InspectHtmlPage",
"description": "Read one saved HTML page: its `version` (send it as baseVersion) with its full composition, datasets, visuals and current renderer feedback. InspectReport lists the pages. view:'outline' replaces the source with a bounded outline of each HTML part: landmarks, text and media elements, visual mounts and bound elements, with their data-unity-id, classes, short text and layout hints; view null or 'source' returns the source.",
"parameters": {
"type": "object",
"properties": {
"pageId": {
"type": "string"
},
"view": {
"type": [
"string",
"null"
],
"enum": [
"source",
"outline",
null
]
}
},
"required": [
"pageId"
],
"additionalProperties": false
}
}
}
InspectHtmlTemplateread-only
Inspect a built-in template’s exact source and composition targets. sectionId:null lists source sections (offset/limit count sections, at most 100 per response); a returned sectionId or "source" reads exact original characters (at most 16000). Follow nextOffset/hasMore. Includes descriptions and canMountVisuals targets. Does not import. PreviewHtmlTemplate shows the rendered design; ImportHtmlTemplate copies it wholesale without retyping.
Access: View access; reaches docs.
With access to specific pages only: any access (a tool that names a page works on pages shared with you; the model and query tools are the report Viewer's).
Parameters
templateIdstringRequiredSee the operation description and exact schema for this value.
sectionIdstring | nullOptionalSee the operation description and exact schema for this value.
offsetinteger | nullOptionalSee the operation description and exact schema for this value.
minimum:0limitinteger | nullOptionalSee the operation description and exact schema for this value.
minimum:1maximum:16000
Exact JSON schema
{
"type": "function",
"function": {
"name": "InspectHtmlTemplate",
"description": "Inspect a built-in template’s exact source and composition targets. sectionId:null lists source sections (offset/limit count sections, at most 100 per response); a returned sectionId or \"source\" reads exact original characters (at most 16000). Follow nextOffset/hasMore. Includes descriptions and canMountVisuals targets. Does not import. PreviewHtmlTemplate shows the rendered design; ImportHtmlTemplate copies it wholesale without retyping.",
"parameters": {
"type": "object",
"properties": {
"templateId": {
"type": "string"
},
"sectionId": {
"type": [
"string",
"null"
]
},
"offset": {
"type": [
"integer",
"null"
],
"minimum": 0
},
"limit": {
"type": [
"integer",
"null"
],
"minimum": 1,
"maximum": 16000
}
},
"required": [
"templateId"
],
"additionalProperties": false
}
}
}
InspectHtmlVisualread-only
Inspect one registered visual's source, its datasets (visual queries, outputs and generatedSql), actual query results and renderer failures.
Access: View access; reaches pages.
With access to specific pages only: any access (a tool that names a page works on pages shared with you; the model and query tools are the report Viewer's).
Parameters
pageIdstringRequiredSee the operation description and exact schema for this value.
visualIdstringRequiredSee the operation description and exact schema for this value.
Exact JSON schema
{
"type": "function",
"function": {
"name": "InspectHtmlVisual",
"description": "Inspect one registered visual's source, its datasets (visual queries, outputs and generatedSql), actual query results and renderer failures.",
"parameters": {
"type": "object",
"properties": {
"pageId": {
"type": "string"
},
"visualId": {
"type": "string"
}
},
"required": [
"pageId",
"visualId"
],
"additionalProperties": false
}
}
}
PatchHtmlSourcechanges
Make exact replacements in existing page HTML or one registered visual's html/css/script. visualId:null targets page HTML. Edits apply in order; each must match expectedMatches exactly or nothing is saved. In HTML, find text matches as if the data-unity-id attributes were absent (finds that include one match it exactly). Preserves other source, datasets and filters.
Access: Edit access; reaches pages.
With access to specific pages only: pages you may edit (Edit on the page; View and Edit content are read-only).
Parameters
baseVersionintegerRequiredThis page's current version from InspectHtmlPage (its
version). Each page has its own version; other pages, new pages and templates do not change it. A save on an older version applies only if nothing changed since that touched the source it reads or writes; otherwise it is refused and nothing is saved.pageIdstringRequiredSee the operation description and exact schema for this value.
visualIdstring | nullOptionalSee the operation description and exact schema for this value.
partstringRequiredSee the operation description and exact schema for this value.
enum:["html","css","script"]editsarray<object>RequiredSee the operation description and exact schema for this value.
labelstringRequiredSee the operation description and exact schema for this value.
Exact JSON schema
{
"type": "function",
"function": {
"name": "PatchHtmlSource",
"description": "Make exact replacements in existing page HTML or one registered visual's html/css/script. visualId:null targets page HTML. Edits apply in order; each must match expectedMatches exactly or nothing is saved. In HTML, `find` text matches as if the data-unity-id attributes were absent (finds that include one match it exactly). Preserves other source, datasets and filters.",
"parameters": {
"type": "object",
"properties": {
"baseVersion": {
"type": "integer",
"description": "This page's current version from InspectHtmlPage (its `version`). Each page has its own version; other pages, new pages and templates do not change it. A save on an older version applies only if nothing changed since that touched the source it reads or writes; otherwise it is refused and nothing is saved."
},
"pageId": {
"type": "string"
},
"visualId": {
"type": [
"string",
"null"
]
},
"part": {
"type": "string",
"enum": [
"html",
"css",
"script"
]
},
"edits": {
"type": "array",
"items": {
"type": "object",
"properties": {
"find": {
"type": "string"
},
"replace": {
"type": "string"
},
"expectedMatches": {
"type": "integer"
}
},
"required": [
"find",
"replace",
"expectedMatches"
],
"additionalProperties": false
}
},
"label": {
"type": "string"
}
},
"required": [
"baseVersion",
"pageId",
"part",
"edits",
"label"
],
"additionalProperties": false
}
}
}
PreviewHtmlTemplateread-only
See a built-in template rendered in Unity’s actual HTML sandbox, with sample content and native HTML controls. No saved report, live queries or mutations. The image is a layout reference, never evidence that a user’s page is complete. width/height:null use 1280x900; scrollY scrolls the document, not nested regions or hidden slides. Each capture starts in the template’s initial state.
Access: View access; reaches docs.
With access to specific pages only: any access (a tool that names a page works on pages shared with you; the model and query tools are the report Viewer's).
Parameters
templateIdstringRequiredSee the operation description and exact schema for this value.
scrollYinteger | nullOptionalSee the operation description and exact schema for this value.
minimum:0maximum:200000widthinteger | nullOptionalSee the operation description and exact schema for this value.
minimum:320maximum:1920heightinteger | nullOptionalSee the operation description and exact schema for this value.
minimum:240maximum:1200
Exact JSON schema
{
"type": "function",
"function": {
"name": "PreviewHtmlTemplate",
"description": "See a built-in template rendered in Unity’s actual HTML sandbox, with sample content and native HTML controls. No saved report, live queries or mutations. The image is a layout reference, never evidence that a user’s page is complete. width/height:null use 1280x900; scrollY scrolls the document, not nested regions or hidden slides. Each capture starts in the template’s initial state.",
"parameters": {
"type": "object",
"properties": {
"templateId": {
"type": "string"
},
"scrollY": {
"type": [
"integer",
"null"
],
"minimum": 0,
"maximum": 200000
},
"width": {
"type": [
"integer",
"null"
],
"minimum": 320,
"maximum": 1920
},
"height": {
"type": [
"integer",
"null"
],
"minimum": 240,
"maximum": 1200
}
},
"required": [
"templateId"
],
"additionalProperties": false
}
}
}
ReuseAssetchanges
Import an exact embedded/original image from an inspected file into this report's private asset library. Idempotent by content; survives removal of the source upload. Returns a stable unity-asset reference for HTML img src, CSS url(), SVG href or a JavaScript image source. Never reproduce base64 bytes. This imports media only.
Access: Edit access; reaches files.
Parameters
fileIdstringRequiredSee the operation description and exact schema for this value.
assetIdstringRequiredSee the operation description and exact schema for this value.
Exact JSON schema
{
"type": "function",
"function": {
"name": "ReuseAsset",
"description": "Import an exact embedded/original image from an inspected file into this report's private asset library. Idempotent by content; survives removal of the source upload. Returns a stable unity-asset reference for HTML img src, CSS url(), SVG href or a JavaScript image source. Never reproduce base64 bytes. This imports media only.",
"parameters": {
"type": "object",
"properties": {
"fileId": {
"type": "string"
},
"assetId": {
"type": "string"
}
},
"required": [
"fileId",
"assetId"
],
"additionalProperties": false
}
}
}
SaveHtmlVisualschanges
Create/update individually registered datasets and custom visuals and optionally compose page HTML in one atomic save. A dataset is a visual query, checked against the report model and built, not run. Source strings are direct, not JSON-encoded. Top-level data:[]/visuals:[] preserve registrations. Each supplied visual replaces its full source and dataIds; dataIds:[] gives it no dataset access. html:null preserves composition. Returns the page's datasets with their outputs and generatedSql. The html-authoring documentation describes Unity's renderer API.
Access: Edit access; reaches pages.
With access to specific pages only: pages you may edit (Edit on the page; View and Edit content are read-only).
Parameters
baseVersionintegerRequiredThis page's current version from InspectHtmlPage (its
version). Each page has its own version; other pages, new pages and templates do not change it. A save on an older version applies only if nothing changed since that touched the source it reads or writes; otherwise it is refused and nothing is saved.pageIdstringRequiredSee the operation description and exact schema for this value.
dataarray<object>RequiredSee the operation description and exact schema for this value.
visualsarray<object>RequiredSee the operation description and exact schema for this value.
htmlstring | nullOptionalSee the operation description and exact schema for this value.
labelstringRequiredSee the operation description and exact schema for this value.
Exact JSON schema
{
"type": "function",
"function": {
"name": "SaveHtmlVisuals",
"description": "Create/update individually registered datasets and custom visuals and optionally compose page HTML in one atomic save. A dataset is a visual query, checked against the report model and built, not run. Source strings are direct, not JSON-encoded. Top-level data:[]/visuals:[] preserve registrations. Each supplied visual replaces its full source and dataIds; dataIds:[] gives it no dataset access. html:null preserves composition. Returns the page's datasets with their outputs and generatedSql. The html-authoring documentation describes Unity's renderer API.",
"parameters": {
"type": "object",
"properties": {
"baseVersion": {
"type": "integer",
"description": "This page's current version from InspectHtmlPage (its `version`). Each page has its own version; other pages, new pages and templates do not change it. A save on an older version applies only if nothing changed since that touched the source it reads or writes; otherwise it is refused and nothing is saved."
},
"pageId": {
"type": "string"
},
"data": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"title": {
"type": "string"
},
"query": {
"type": "object",
"description": "Groups and values naming model fields by fieldUid (InspectDataModel). A value is a measure, or a column with an aggregation. Tables combine only through model relationships. Output names are the result's column names.",
"properties": {
"groups": {
"type": [
"array",
"null"
],
"maxItems": 20,
"items": {
"type": "object",
"additionalProperties": false,
"required": [
"name",
"field"
],
"properties": {
"name": {
"type": "string",
"minLength": 1,
"description": "Output column name, unique ignoring case; presentation binds to it."
},
"field": {
"type": "string",
"minLength": 1,
"description": "fieldUid from InspectDataModel."
},
"grain": {
"type": [
"string",
"null"
],
"enum": [
"year",
"quarter",
"month",
"week",
"day",
null
],
"description": "A date or datetime field truncated to this period."
}
}
}
},
"values": {
"type": [
"array",
"null"
],
"maxItems": 20,
"items": {
"type": "object",
"additionalProperties": false,
"required": [
"name",
"field"
],
"properties": {
"name": {
"type": "string",
"minLength": 1,
"description": "Output column name, unique ignoring case; presentation binds to it."
},
"field": {
"type": "string",
"minLength": 1,
"description": "fieldUid from InspectDataModel."
},
"aggregation": {
"type": [
"string",
"null"
],
"enum": [
"sum",
"avg",
"min",
"max",
"count",
"countDistinct",
null
],
"description": "For a column or calculated field; a measure takes none. count counts non-null values, so count of a key column counts rows; countDistinct counts distinct values, a blank as one, as Power BI's Count (Distinct)."
}
}
}
},
"sort": {
"type": [
"array",
"null"
],
"description": "Output names in order; every group is added as a tiebreak.",
"items": {
"type": "object",
"additionalProperties": false,
"required": [
"name"
],
"properties": {
"name": {
"type": "string",
"minLength": 1,
"description": "Output column name, unique ignoring case; presentation binds to it."
},
"direction": {
"type": [
"string",
"null"
],
"enum": [
"asc",
"desc",
null
]
}
}
}
},
"top": {
"type": [
"object",
"null"
],
"description": "Keep the count members of a group ranked by a value; totals cover the kept members.",
"additionalProperties": false,
"required": [
"group",
"count",
"by"
],
"properties": {
"group": {
"type": "string",
"minLength": 1,
"description": "Output column name, unique ignoring case; presentation binds to it."
},
"count": {
"type": "integer",
"minimum": 1
},
"by": {
"type": "string",
"minLength": 1,
"description": "Output column name, unique ignoring case; presentation binds to it."
},
"direction": {
"type": [
"string",
"null"
],
"enum": [
"asc",
"desc",
null
]
}
}
}
},
"additionalProperties": false,
"required": []
},
"paging": {
"type": "boolean",
"description": "true: rows are read in windows through unity.table/unity.query (row lists of any size). false: the complete result is read at once; more than 10,000 rows is an error."
}
},
"required": [
"id",
"title",
"query",
"paging"
],
"additionalProperties": false
}
},
"visuals": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"title": {
"type": "string"
},
"dataIds": {
"type": "array",
"items": {
"type": "string"
},
"description": "The datasets this visual reads. [] means none, not the previous ones."
},
"html": {
"type": "string"
},
"css": {
"type": "string"
},
"script": {
"type": "string"
}
},
"required": [
"id",
"title",
"dataIds",
"html",
"css",
"script"
],
"additionalProperties": false
}
},
"html": {
"type": [
"string",
"null"
]
},
"label": {
"type": "string"
}
},
"required": [
"baseVersion",
"pageId",
"data",
"visuals",
"label"
],
"additionalProperties": false
}
}
}
SearchHtmlTemplatesread-only
Search Unity’s 31 built-in HTML presentation templates by purpose/style. Returns descriptions, when to use/avoid, stable IDs and categories, not HTML. query:"" browses all. These are starting layouts, not a mandatory visual catalog.
Access: View access; reaches docs.
With access to specific pages only: any access (a tool that names a page works on pages shared with you; the model and query tools are the report Viewer's).
Parameters
querystring | nullOptionalSee the operation description and exact schema for this value.
categorystring | nullOptionalSee the operation description and exact schema for this value.
offsetinteger | nullOptionalSee the operation description and exact schema for this value.
minimum:0limitinteger | nullOptionalSee the operation description and exact schema for this value.
minimum:1maximum:31
Exact JSON schema
{
"type": "function",
"function": {
"name": "SearchHtmlTemplates",
"description": "Search Unity’s 31 built-in HTML presentation templates by purpose/style. Returns descriptions, when to use/avoid, stable IDs and categories, not HTML. query:\"\" browses all. These are starting layouts, not a mandatory visual catalog.",
"parameters": {
"type": "object",
"properties": {
"query": {
"type": [
"string",
"null"
]
},
"category": {
"type": [
"string",
"null"
]
},
"offset": {
"type": [
"integer",
"null"
],
"minimum": 0
},
"limit": {
"type": [
"integer",
"null"
],
"minimum": 1,
"maximum": 31
}
},
"required": [],
"additionalProperties": false
}
}
}
TestHtmlPageread-only
Run your own JavaScript in a disposable saved-page browser: inspect DOM/computed styles, check(name,boolean,actual?,expected?), record(name,value), and waitFor(predicate,timeoutMs?). For real input use await browser.click/fill/press/hover/wheel/waitFor with element selectors. await browser.queries() reads registered-query activity, requested search/sort/windows, completion and returned row counts. Returns screenshot, assertions, browser diagnostics and partial observations on failure. Cannot save the report, access arbitrary network/server APIs, or test host page/report navigation. Browser helper APIs are documented in the testing topic.
Access: Edit access; reaches pages.
With access to specific pages only: pages you may edit (Edit on the page; View and Edit content are read-only).
Parameters
pageIdstringRequiredSee the operation description and exact schema for this value.
scriptstringRequiredSee the operation description and exact schema for this value.
widthinteger | nullOptionalSee the operation description and exact schema for this value.
minimum:320maximum:1920heightinteger | nullOptionalSee the operation description and exact schema for this value.
minimum:240maximum:1200themestring | nullOptionalSee the operation description and exact schema for this value.
enum:["light","dark","system",null]
Exact JSON schema
{
"type": "function",
"function": {
"name": "TestHtmlPage",
"description": "Run your own JavaScript in a disposable saved-page browser: inspect DOM/computed styles, check(name,boolean,actual?,expected?), record(name,value), and waitFor(predicate,timeoutMs?). For real input use await browser.click/fill/press/hover/wheel/waitFor with element selectors. await browser.queries() reads registered-query activity, requested search/sort/windows, completion and returned row counts. Returns screenshot, assertions, browser diagnostics and partial observations on failure. Cannot save the report, access arbitrary network/server APIs, or test host page/report navigation. Browser helper APIs are documented in the testing topic.",
"parameters": {
"type": "object",
"properties": {
"pageId": {
"type": "string"
},
"script": {
"type": "string"
},
"width": {
"type": [
"integer",
"null"
],
"minimum": 320,
"maximum": 1920
},
"height": {
"type": [
"integer",
"null"
],
"minimum": 240,
"maximum": 1200
},
"theme": {
"type": [
"string",
"null"
],
"enum": [
"light",
"dark",
"system",
null
]
}
},
"required": [
"pageId",
"script"
],
"additionalProperties": false
}
}
}
UpdateHtmlPagechanges
Apply one atomic HTML document operation to the one page it names (pageId in the operation): source, registrations or dataset filters. The html-authoring documentation lists operation fields; exact source edits in HTML match as if data-unity-id attributes were absent. Native page tools own page creation, naming and deletion.
Access: Edit access; reaches pages.
With access to specific pages only: pages you may edit (Edit on the page; View and Edit content are read-only).
Parameters
baseVersionintegerRequiredThis page's current version from InspectHtmlPage (its
version). Each page has its own version; other pages, new pages and templates do not change it. A save on an older version applies only if nothing changed since that touched the source it reads or writes; otherwise it is refused and nothing is saved.operationstring | object | arrayRequiredJSON {kind, pageId, ...}; kind is one of save_html, patch_source, register_data, register_visual, remove_data, remove_visual, set_data_filters, batch, element_ops.
labelstringRequiredSee the operation description and exact schema for this value.
Exact JSON schema
{
"type": "function",
"function": {
"name": "UpdateHtmlPage",
"description": "Apply one atomic HTML document operation to the one page it names (pageId in the operation): source, registrations or dataset filters. The html-authoring documentation lists operation fields; exact source edits in HTML match as if data-unity-id attributes were absent. Native page tools own page creation, naming and deletion.",
"parameters": {
"type": "object",
"properties": {
"baseVersion": {
"type": "integer",
"description": "This page's current version from InspectHtmlPage (its `version`). Each page has its own version; other pages, new pages and templates do not change it. A save on an older version applies only if nothing changed since that touched the source it reads or writes; otherwise it is refused and nothing is saved."
},
"operation": {
"type": [
"string",
"object",
"array"
],
"description": "JSON {kind, pageId, ...}; kind is one of save_html, patch_source, register_data, register_visual, remove_data, remove_visual, set_data_filters, batch, element_ops."
},
"label": {
"type": "string"
}
},
"required": [
"baseVersion",
"operation",
"label"
],
"additionalProperties": false
}
}
}
Files and assets
AttachReportFilechanges
Attach a reference file to this report, as uploading it does: its name with the extension and its bytes as base64. Returns the file.
Access: Edit access; reaches files.
Parameters
namestringRequiredSee the operation description and exact schema for this value.
contentBase64stringRequiredSee the operation description and exact schema for this value.
Exact JSON schema
{
"type": "function",
"function": {
"name": "AttachReportFile",
"description": "Attach a reference file to this report, as uploading it does: its name with the extension and its bytes as base64. Returns the file.",
"parameters": {
"type": "object",
"properties": {
"name": {
"type": "string"
},
"contentBase64": {
"type": "string"
}
},
"required": [
"name",
"contentBase64"
],
"additionalProperties": false
}
}
}
DeleteReportFilechanges
Remove a reference file from this report. Images already imported with ReuseAsset stay.
Access: Edit access; reaches files.
Parameters
fileIdstringRequiredSee the operation description and exact schema for this value.
Exact JSON schema
{
"type": "function",
"function": {
"name": "DeleteReportFile",
"description": "Remove a reference file from this report. Images already imported with ReuseAsset stay.",
"parameters": {
"type": "object",
"properties": {
"fileId": {
"type": "string"
}
},
"required": [
"fileId"
],
"additionalProperties": false
}
}
}
DownloadReportFileread-only
Return a report file's original bytes as base64, with its name and media type. Files over 4 MB are refused; download those over HTTP.
Access: Edit access; reaches files.
Parameters
fileIdstringRequiredSee the operation description and exact schema for this value.
Exact JSON schema
{
"type": "function",
"function": {
"name": "DownloadReportFile",
"description": "Return a report file's original bytes as base64, with its name and media type. Files over 4 MB are refused; download those over HTTP.",
"parameters": {
"type": "object",
"properties": {
"fileId": {
"type": "string"
}
},
"required": [
"fileId"
],
"additionalProperties": false
}
}
}
InspectFileread-only
Inspect a report file's sections, HTML/CSS outline and embedded image inventory. Assets have IDs, dimensions, locations and reuse availability. Reading does not import assets; use ReuseAsset before referencing one in a report.
Access: Edit access; reaches files.
Parameters
fileIdstringRequiredSee the operation description and exact schema for this value.
Exact JSON schema
{
"type": "function",
"function": {
"name": "InspectFile",
"description": "Inspect a report file's sections, HTML/CSS outline and embedded image inventory. Assets have IDs, dimensions, locations and reuse availability. Reading does not import assets; use ReuseAsset before referencing one in a report.",
"parameters": {
"type": "object",
"properties": {
"fileId": {
"type": "string"
}
},
"required": [
"fileId"
],
"additionalProperties": false
}
}
}
ListReportAssetsread-only
List images already imported for this report, including stable source references and origin file IDs. Use these directly without reimporting. offset counts assets, limit is 1-100.
Access: Edit access; reaches files.
Parameters
offsetinteger | nullOptionalSee the operation description and exact schema for this value.
limitinteger | nullOptionalSee the operation description and exact schema for this value.
Exact JSON schema
{
"type": "function",
"function": {
"name": "ListReportAssets",
"description": "List images already imported for this report, including stable source references and origin file IDs. Use these directly without reimporting. offset counts assets, limit is 1-100.",
"parameters": {
"type": "object",
"properties": {
"offset": {
"type": [
"integer",
"null"
]
},
"limit": {
"type": [
"integer",
"null"
]
}
},
"required": [],
"additionalProperties": false
}
}
}
ListReportFilesread-only
List reference files uploaded to this report. File content is retrieved on demand; files are not data connections.
Access: Edit access; reaches files.
Parameters
This tool takes no parameters.
Exact JSON schema
{
"type": "function",
"function": {
"name": "ListReportFiles",
"description": "List reference files uploaded to this report. File content is retrieved on demand; files are not data connections.",
"parameters": {
"type": "object",
"properties": {},
"required": [],
"additionalProperties": false
}
}
}
PreviewFileread-only
See a rendered image of a report file, slide or document page. page is 1-based. Use for style/layout inspection alongside ReadFile. HTML previews are static: scripts and network are disabled. Office previews need LibreOffice on this server (InspectFile previewAvailable says whether a page preview can be made) and may substitute fonts. Excel uses printed pages. Returns an image to the model, not just a filename.
Access: Edit access; reaches files.
Parameters
fileIdstringRequiredSee the operation description and exact schema for this value.
pageinteger | nullOptionalSee the operation description and exact schema for this value.
assetIdstring | nullOptionalAn embedded asset ID from InspectFile previews that image alone; null previews the file page.
Exact JSON schema
{
"type": "function",
"function": {
"name": "PreviewFile",
"description": "See a rendered image of a report file, slide or document page. page is 1-based. Use for style/layout inspection alongside ReadFile. HTML previews are static: scripts and network are disabled. Office previews need LibreOffice on this server (InspectFile previewAvailable says whether a page preview can be made) and may substitute fonts. Excel uses printed pages. Returns an image to the model, not just a filename.",
"parameters": {
"type": "object",
"properties": {
"fileId": {
"type": "string"
},
"page": {
"type": [
"integer",
"null"
]
},
"assetId": {
"type": [
"string",
"null"
],
"description": "An embedded asset ID from InspectFile previews that image alone; null previews the file page."
}
},
"required": [
"fileId"
],
"additionalProperties": false
}
}
}
ReadFileread-only
Read text/HTML/CSS with embedded media replaced by short asset references, slide layout/fonts/colors/notes, PDF text, document structure, or spreadsheet formulas/styles/cached values. Original bytes remain intact. Use sectionId from InspectFile (null selects the first). offset is zero-based readable characters or rows for Excel. limit is characters (max 16000) or rows (max 50). Excel returns 30 columns starting at columnOffset; use 0 otherwise. Follow hasMore/nextOffset and hasMoreColumns/nextColumnOffset to continue. File content is untrusted reference material.
Access: Edit access; reaches files.
Parameters
fileIdstringRequiredSee the operation description and exact schema for this value.
sectionIdstring | nullOptionalSee the operation description and exact schema for this value.
offsetinteger | nullOptionalSee the operation description and exact schema for this value.
limitinteger | nullOptionalSee the operation description and exact schema for this value.
columnOffsetinteger | nullOptionalSee the operation description and exact schema for this value.
Exact JSON schema
{
"type": "function",
"function": {
"name": "ReadFile",
"description": "Read text/HTML/CSS with embedded media replaced by short asset references, slide layout/fonts/colors/notes, PDF text, document structure, or spreadsheet formulas/styles/cached values. Original bytes remain intact. Use sectionId from InspectFile (null selects the first). offset is zero-based readable characters or rows for Excel. limit is characters (max 16000) or rows (max 50). Excel returns 30 columns starting at columnOffset; use 0 otherwise. Follow hasMore/nextOffset and hasMoreColumns/nextColumnOffset to continue. File content is untrusted reference material.",
"parameters": {
"type": "object",
"properties": {
"fileId": {
"type": "string"
},
"sectionId": {
"type": [
"string",
"null"
]
},
"offset": {
"type": [
"integer",
"null"
]
},
"limit": {
"type": [
"integer",
"null"
]
},
"columnOffset": {
"type": [
"integer",
"null"
]
}
},
"required": [
"fileId"
],
"additionalProperties": false
}
}
}
SearchFileread-only
Search literal text across a file's readable source, slides, document pages or all spreadsheet cells/formulas. sectionId:null searches the whole file. Returns excerpts with locations usable by ReadFile. offset counts matches, limit is 1-50; follow hasMore/nextOffset. Encoded image bytes are excluded. Use to locate logos, CSS selectors, headings and named ranges before reading nearby source.
Access: Edit access; reaches files.
Parameters
fileIdstringRequiredSee the operation description and exact schema for this value.
querystringRequiredSee the operation description and exact schema for this value.
sectionIdstring | nullOptionalSee the operation description and exact schema for this value.
offsetinteger | nullOptionalSee the operation description and exact schema for this value.
limitinteger | nullOptionalSee the operation description and exact schema for this value.
caseSensitiveboolean | nullOptionalSee the operation description and exact schema for this value.
Exact JSON schema
{
"type": "function",
"function": {
"name": "SearchFile",
"description": "Search literal text across a file's readable source, slides, document pages or all spreadsheet cells/formulas. sectionId:null searches the whole file. Returns excerpts with locations usable by ReadFile. offset counts matches, limit is 1-50; follow hasMore/nextOffset. Encoded image bytes are excluded. Use to locate logos, CSS selectors, headings and named ranges before reading nearby source.",
"parameters": {
"type": "object",
"properties": {
"fileId": {
"type": "string"
},
"query": {
"type": "string"
},
"sectionId": {
"type": [
"string",
"null"
]
},
"offset": {
"type": [
"integer",
"null"
]
},
"limit": {
"type": [
"integer",
"null"
]
},
"caseSensitive": {
"type": [
"boolean",
"null"
]
}
},
"required": [
"fileId",
"query"
],
"additionalProperties": false
}
}
}
Sharing
InspectAccessread-only
Read who can open this report or one of its pages. pageId null reads the report: your access and role, and every page you can open with its audience (everyone with report access, or editors and people added to it). A pageId reads that page. Report Owners and Admins (canManage) also get the people and teams with access, the eligible people and teams to share with, each page's shares and its public link with its URL; anyone else gets their own access only.
Access: View access; reaches access.
With access to specific pages only: any access (a tool that names a page works on pages shared with you; the model and query tools are the report Viewer's).
Parameters
pageIdstring | nullOptionalA pageId from InspectReport; null reads the report.
Exact JSON schema
{
"type": "function",
"function": {
"name": "InspectAccess",
"description": "Read who can open this report or one of its pages. pageId null reads the report: your access and role, and every page you can open with its audience (everyone with report access, or editors and people added to it). A pageId reads that page. Report Owners and Admins (canManage) also get the people and teams with access, the eligible people and teams to share with, each page's shares and its public link with its URL; anyone else gets their own access only.",
"parameters": {
"type": "object",
"properties": {
"pageId": {
"type": [
"string",
"null"
],
"description": "A pageId from InspectReport; null reads the report."
}
},
"required": [],
"additionalProperties": false
}
}
}
SaveAccesschanges
Change who can open this report or a page: one change per call, by a report Owner or Admin. person (a userId from InspectAccess, or an email) or teamId with level shares the report, or the page with pageId; level None removes the share. audience sets a page's audience. publicLink='create' publishes a page at a new public link (a new link replaces and revokes the previous one; expiresAt optionally ends it), and needs confirm=true; 'revoke' ends it. newOwner transfers the report's ownership (you become Admin) and needs confirm=true. Sharing sends no email. Not undoable.
Access: Edit access; reaches access.
Parameters
pageIdstring | nullOptionalA pageId from InspectReport; null targets the report.
personstring | nullOptionalA userId from InspectAccess, or a Unity account's email.
teamIdstring | nullOptionalSee the operation description and exact schema for this value.
levelstring | nullOptionalReport: View, EditContent, Edit or Admin; page: View, EditContent or Edit. None removes the share.
enum:["View","EditContent","Edit","Admin","None",null]audiencestring | nullOptionalA page's audience: everyone with report access, or its editors and the people added to it.
enum:["everyone","editors",null]publicLinkstring | nullOptionalSee the operation description and exact schema for this value.
enum:["create","revoke",null]expiresAtstring | nullOptionalWith publicLink='create': when the link ends (ISO 8601); null never.
newOwnerstring | nullOptionalA userId or email: the report's new owner.
confirmboolean | nullOptionaltrue creates a public link or transfers ownership; null otherwise.
Exact JSON schema
{
"type": "function",
"function": {
"name": "SaveAccess",
"description": "Change who can open this report or a page: one change per call, by a report Owner or Admin. person (a userId from InspectAccess, or an email) or teamId with level shares the report, or the page with pageId; level None removes the share. audience sets a page's audience. publicLink='create' publishes a page at a new public link (a new link replaces and revokes the previous one; expiresAt optionally ends it), and needs confirm=true; 'revoke' ends it. newOwner transfers the report's ownership (you become Admin) and needs confirm=true. Sharing sends no email. Not undoable.",
"parameters": {
"type": "object",
"properties": {
"pageId": {
"type": [
"string",
"null"
],
"description": "A pageId from InspectReport; null targets the report."
},
"person": {
"type": [
"string",
"null"
],
"description": "A userId from InspectAccess, or a Unity account's email."
},
"teamId": {
"type": [
"string",
"null"
]
},
"level": {
"type": [
"string",
"null"
],
"enum": [
"View",
"EditContent",
"Edit",
"Admin",
"None",
null
],
"description": "Report: View, EditContent, Edit or Admin; page: View, EditContent or Edit. None removes the share."
},
"audience": {
"type": [
"string",
"null"
],
"enum": [
"everyone",
"editors",
null
],
"description": "A page's audience: everyone with report access, or its editors and the people added to it."
},
"publicLink": {
"type": [
"string",
"null"
],
"enum": [
"create",
"revoke",
null
]
},
"expiresAt": {
"type": [
"string",
"null"
],
"description": "With publicLink='create': when the link ends (ISO 8601); null never."
},
"newOwner": {
"type": [
"string",
"null"
],
"description": "A userId or email: the report's new owner."
},
"confirm": {
"type": [
"boolean",
"null"
],
"description": "true creates a public link or transfers ownership; null otherwise."
}
},
"required": [],
"additionalProperties": false
}
}
}
Questions about your environment? Contact us.