Skip to main content
Glama
sassoftware

SAS MCP Server

Official
by sassoftware

SAS Viya MCP Server

A Model Context Protocol (MCP) server for executing SAS code, training AutoML projects, scoring models and so much more for SAS Viya environments.

Features

  • 115 tools across 11 selectable tiers, spanning the Analytics Life Cycle on SAS Viya

  • Interactive views (MCP Apps) for data, SAS logs and glossary editing in clients that render them — Claude, ChatGPT, Microsoft 365 Copilot, VS Code, Cursor

  • Prompt Templates for improving your SAS Code

  • OAuth2 authentication with PKCE flow

  • HTTP-based MCP server compatible with MCP clients

Related MCP server: ssh-mcp-server

Articles & Videos

Here you can find getting articles on how to use and integrate the SAS MCP Server in different tools and what to build with it:

Getting Started

Prerequisites

Installation

  1. Clone the repository:

git clone <repository-url>
cd sas-mcp-server
  1. Install dependencies

uv sync

NOTE: This will by default create a virtual environment called .venv in the project's root directory.

If for some reason the virtual environment is not created, please run uv venv and then re-run uv sync.

Run uv sync again after each git pull, with every MCP client that uses this checkout closed. The stdio client configurations below start the server with uv run --no-sync, so they never sync .venv themselves: on Windows, a sync while another copy of the server is running fails on its locked .exe and the server does not start (see TROUBLESHOOTING.md).

Usage

  1. Configure environment variables:

cp .env.sample .env

Edit .env and set

VIYA_ENDPOINT=https://your-viya-server.com
  1. Start the MCP server (see Choosing a deployment mode below):

Option A: HTTP mode (pre-run the server, connect from MCP client)

uv run app

The server will be available at http://localhost:8134/mcp by default. Authentication is handled via OAuth2 PKCE flow in the browser.

Option B: Stdio mode (MCP client starts the server on demand)

Authenticate once. Two equivalent options:

# Option B1 — if you have the SAS Viya CLI installed:
sas-viya auth loginCode

# Option B2 — built-in helper, no external CLI needed (Viya 2022.11+):
uv run sas-mcp-login

Both flows write an access token to a local cache (~/.sas/credentials.json and ~/.sas-mcp-server/credentials.json respectively); the stdio server reads whichever it finds. When the token expires, re-run the same command.

Then configure your MCP client to launch the server directly (see below).

Option C: Docker / Podman (containerized deployment)

Pull the pre-built image from GitHub Container Registry:

docker pull ghcr.io/sassoftware/sas-mcp-server:latest
docker run -e VIYA_ENDPOINT=https://your-viya-server.com -p 8134:8134 ghcr.io/sassoftware/sas-mcp-server:latest

Or build locally from source:

docker build -t sas-mcp-server .
docker run -e VIYA_ENDPOINT=https://your-viya-server.com -p 8134:8134 sas-mcp-server

Available image tags:

  • latest — most recent tagged release

  • <major>.<minor>.<patch> (e.g. 1.0.0) — specific release

  • <major>.<minor> (e.g. 1.0) — latest patch of a minor release

  • edge — tip of main (unreleased, for testing)

  • sha-<short> — pinned to a specific commit

Programmatic clients with a pre-existing Viya token

If your caller already holds a Viya access token (e.g. an automation script that obtained one via the SAS Viya CLI), start the HTTP-mode server with ALLOW_RAW_BEARER=true and pass the token directly:

curl -H "Authorization: Bearer $VIYA_TOKEN" http://localhost:8134/mcp ...

The server validates the token against Viya's JWKS and uses it upstream as-is, bypassing the MCP JWT swap. The default OAuth2 PKCE flow keeps working alongside — both client types share the same /mcp endpoint.

If your Viya APIs are intentionally exposed without auth (for example, a local/dev Compute API endpoint), set VIYA_AUTH=false to bypass all SASLogon/OAuth flows in both HTTP and stdio modes. In this mode the server sends upstream requests without an Authorization header.

If your compute deployment does not expose /compute/contexts and only supports a fixed session, set COMPUTE_SESSION_ID=<session_id>. The compute tools will use that session directly instead of creating context-backed sessions.

Choosing a deployment mode

HTTP

Stdio

Docker

Kubernetes

How it runs

Long-running server you start separately

MCP client spawns it on demand

Containerized HTTP server

Containerized, behind an ingress

Authentication

OAuth2 PKCE flow (browser popup)

Cached token via sas-viya CLI or sas-mcp-login

OAuth2 PKCE flow (browser popup)

PKCE and/or raw Viya bearer token

Best for

Multi-user or shared setups; production-like environments

Single-user local development; quick experimentation

Team deployments; CI/CD; environments without Python installed

Shared/organisational deployments alongside Viya

Requires

Python + uv

Python + uv (+ optional sas-viya CLI)

Docker or Podman only

A cluster, an ingress controller, a TLS secret

Credentials stored?

No — user authenticates interactively

No — only an access token (not a password) is cached

No — user authenticates interactively

No — a signing key in a Secret; users authenticate themselves

MCP client config

Point client to http://localhost:8134/mcp

Client runs uv run app-stdio

Point client to http://host:8134/mcp

Point client to https://<viya-host>/mcp

Quick guidance:

  • Starting out or exploring? Use stdio — one sas-viya auth loginCode or uv run sas-mcp-login, then your MCP client manages the server lifecycle.

  • Need secure, interactive auth? Use HTTP — no stored passwords, each user authenticates via browser.

  • Deploying for a team or on a server? Use Docker — portable, no Python dependency on the host, easy to integrate with orchestrators.

  • Running it for a whole organisation? Use Kubernetes — sample manifests and a Helm chart are in deploy/, including the routing the OAuth flow needs for either Contour (the chart's default, and the only one that can mount the server under a path prefix on an existing hostname) or ingress-nginx.

  • Using Gemini CLI? Use stdio — Gemini CLI does not support HTTP mode or browser-based OAuth. See Gemini CLI configuration.

  • Integrating with Microsoft 365 Copilot? Use Kubernetes (or any remote HTTPS deployment) — Copilot declarative agents only reach remotely hosted MCP servers. A ready-to-sideload agent package and walkthrough are in examples/m365-copilot/.

  • Adding it to a Microsoft Copilot Studio agent? Same remote HTTPS deployment, plus MCP_TOOL_RENAME=catalog_=infocat_ — Copilot Studio's agent runtime fails on tool names that start with catalog_. The steps are in examples/copilot-studio/.

  • Not sure which Microsoft route fits? examples/microsoft-copilot.md compares the declarative agent and the Copilot Studio agent, and shows the settings for one deployment that serves both.

  • Installing from a client's server catalogue? That path runs the published container in stdio mode (app-stdio), not as an HTTP server, so it authenticates from your ~/.sas token cache — which has to be mounted into the container at /app/.sas.

Limiting exposed tools (tiers)

Tools are grouped into numbered tiers. By default the server exposes all of them; set MCP_TIERS to expose only a subset — handy for keeping a client's tool list small and focused, or hiding capabilities a deployment shouldn't offer. Accepts ranges and comma lists (e.g. MCP_TIERS=0-4 or MCP_TIERS=0,1,6,7); unset means all tiers.

Tier

Group

0

Compute Contexts & Code Execution

1

Data Discovery

2

Data Operations & Files

3

Reports & Visualization

4

Batch Jobs & Async Execution

5

Automated Machine Learning

6

Model Management & Scoring

7

Decisioning Foundation (SAS Intelligent Decisioning)

8

Workbench (Execute Code Only)

9

Business Glossary (SAS Data Governance)

10

Decisioning Advanced (SAS Intelligent Decisioning) — needs Tier 7

# Example: expose only compute/discovery/data-ops and reporting
MCP_TIERS=0-3 uv run app

Read-only mode

Set MCP_READ_ONLY=true to expose only tools that neither change server-side state nor cause server-side work — 57 of the 115 tools. Withheld tools are never registered, so they are absent from the client's tool list entirely: the model cannot see them, so it cannot attempt them.

This is a filter over the tiers, not a tier of its own — the read/write split cuts across every tier (Tier 3 has both get_report and delete_report). The two settings compose:

# Every read tool, all tiers
MCP_READ_ONLY=true uv run app

# Read tools of the reporting and decisioning tiers only
MCP_TIERS=3,7 MCP_READ_ONLY=true uv run app

The definition is strict: a tool qualifies only if it can neither write nor start work. Beyond the obvious create/update/delete tools, that withholds:

Withheld

Why

execute_sas_code, submit_batch_job

Run arbitrary code — can perform any operation, including deletes

score_data, catalog_run_agent, catalog_run_adhoc_analysis

Start server-side jobs and leave run records, though they return data

promote_table_to_memory

Mutates CAS in-memory state

cancel_job, reset_compute_session

Destroy something the caller owns

Classification is fail-closed: a tool that is not explicitly classified as read-only is withheld. The list lives in src/sas_mcp_server/tools/_access.py, and a test asserts it covers every registered tool, so a newly added tool cannot silently land in read-only mode.

Tool annotations (what clients are told)

The same classification is advertised to every client as MCP tool annotations on each tools/list entry — whether or not read-only mode is on:

Hint

Derived from

readOnlyHint

exactly the read-only set above — one table, so what a client is told and what MCP_READ_ONLY enforces cannot drift

destructiveHint

tools that can remove or overwrite existing state: arbitrary code (execute_sas_code, submit_batch_job), delete_*, cancel_job, reset_compute_session, the update_* PUTs, apply_report_operations, create_report/copy_report (their replace conflict policy), publish_ml_champion_model

idempotentHint

reads, the update_* PUTs, deletes, cancel_job, reset_compute_session, promote_table_to_memory

openWorldHint

only tools that can reach beyond Viya: arbitrary code and the upload tools' url source

Clients use these to shape their approval UX — e.g. Claude groups read-only tools for one-click approval and warns before destructive ones — and to decide when to interrupt the user. They are hints, not enforcement: the spec tells clients to treat them as untrusted unless the server is trusted, and MCP_READ_ONLY remains the server-side control. Without annotations a client must assume the spec's pessimistic defaults (writable, destructive, open-world) for every tool, so this only ever reduces friction. The browser landing page marks each tool read-only / write / destructive from the same hints.

Interactive views (MCP Apps)

Some results read badly as text however well the tool shapes them: a hundred rows of a table, a SAS log, a form's worth of typed attributes. Ten tools therefore also carry a small HTML view, using the MCP Apps extension, that a supporting client renders in a sandboxed frame beside the result:

View

Tools

What it does

Data grid

query_data, get_castable_data, get_compute_table_data

Sort, filter and page through rows. Paging calls the same tool again from the view, so the person can walk a large table while the model holds only the first page.

SAS log

execute_sas_code, get_job_log, submit_batch_job

Colour-coded ERROR / WARNING / NOTE lines, jump to the next problem, problems-only and hide-notes filters, the listing on its own tab, and SAS's own HTML output on a Results tab (see HTML results). A submitted batch job is polled from the view until it ends, then its log is fetched.

Glossary term editor

get_glossary_term_type, get_glossary_term

A form generated from the term type — a real checkbox for a boolean, a date picker, a multi-select — so attribute values cannot be mistyped. Creates or updates the term and tells the assistant what was saved. A term that is still a draft can be published from here, which is the only way the API allows it.

Glossary browser

list_glossary_terms

The whole glossary as a navigable tree beside a detail pane: search across names, definitions, descriptions and attribute values; filter by term type or "has assets"; breadcrumbs, children cards, attributes, assigned assets, and a sunburst of the hierarchy. The tree pane can be resized by dragging the divider or hidden altogether. The listing's own filters become the starting filters; the rest of the glossary is loaded by the view in pages, so the model still holds only the first page. A draft — invisible to everyone but its author, which is why the tree is where you notice one — can be published from its detail pane.

Glossary import

import_glossary_terms

With dry_run=true, the rows in the order they would be sent, with resolved parent paths and the CSV's own Definition and Description columns kept apart, and an Import button. After a real import, each row's outcome and the id of the term it became — including whether the term was new or already there, which the import job itself counts as successful either way.

Every view has a ⤢ button that opens it fullscreen where the host offers that (Claude does), which is where a wide table or a long log is meant to be read; the button does not appear on a host without it.

Everything about this is additive. The tool's return value is unchanged, so a client without the extension — Claude Code, a script, an older client — sees exactly what it saw before. Every request a view makes travels through the host to this server as an ordinary tool call with the session's token; the browser never talks to Viya, and a tool a deployment withholds through MCP_TIERS or MCP_READ_ONLY has no view either — nor does any control inside a view that would have called it, so a read-only deployment shows the glossary browser without its Publish button rather than with one that can only fail. The pages are fully inlined — the vendored @modelcontextprotocol/ext-apps bridge included — so they render on hosts that ignore CSP declarations and on an air-gapped Viya. MCP_APPS=false registers no views.

Whether a view is rendered depends on the client and on how it is connected:

Client

Views

ChatGPT, Microsoft 365 Copilot, VS Code with GitHub Copilot, Cursor, Goose

Rendered — these clients implement the extension.

Claude (web, Desktop, Cowork) connected to the HTTP server as a custom connector

Rendered, including the SAS log view's Results tab. The connector speaks the 2026 protocol revision, whose handshake has no session, so the server needs MCP_STATELESS_HTTP=true and a URL that Anthropic's servers can reach.

Claude Desktop with the server in claude_desktop_config.json (which accepts stdio servers only)

Not rendered since Claude Desktop 2.2553 (22 September 2026). Desktop passes a local server's tools to the chat through a bridge that rebuilds each tool's metadata and drops the view binding, so the chat never asks for the page. The tools work as before; results are text, and execute_sas_code still returns its HTML results link. Reported as anthropics/claude-ai-mcp#1069.

Microsoft Copilot Studio agents

Not rendered — the agent runtime does not implement the extension (it announces no UI capability and never reads the view). execute_sas_code still returns its link to the HTML results.

Claude Code

Not rendered — text only, by design.

A view's own controls call other tools (the Results tab reads the page through download_file, Tier 2), so a deployment that withholds those tiers gets the view without that control. View URIs carry a fingerprint of the page (ui://sas-viya/sas-log/execute_sas_code.<hash>.html) that changes with the server version, the page files and the tier selection, because hosts cache a page by its URI — claude.ai even across a connector being removed and added again; the plain URI is served too, for hosts holding an older tool listing.

HTML results

execute_sas_code returns the SAS log and listing as text, which is what the model reads. By default it also produces the page SAS Data and AI Studio would show, with tables styled by ODS and graphs drawn, and returns a link to it:

  • How. The compute context opens no HTML destination of its own, so the server runs the code between an ods html5 statement and its close. Before the close comes ;*';*";*/;run;quit;, which ends whatever the code left open (an unterminated statement, quote or comment, or a step without run;) so that the close still runs. None of this appears in the log the model reads. html_results=false submits the code exactly as given.

  • The link. When the code printed something, the page is saved to the Viya Files service and the result gains html_results_url. Opening it in a browser asks you to sign in to SAS Viya; the file sits in no folder, so Viya's default rules let only the person who ran the code (and administrators) open it. Pages are saved without an expiration, the Files service's default, so they stay until someone deletes them.

  • In the SAS log view, the page is the Results tab, shown first when the code ran cleanly. The view fetches it through download_file, so a deployment without Tier 2 gets the link but not the tab.

  • Cost. Opening and closing the destination adds about a tenth of a second to a job, and saving the page is one more request. The page itself, 40–70 KB and mostly ODS's stylesheet, never enters the model's context; only the link does.

Available Tools

The headings below match the numbered tiers above, so MCP_TIERS maps directly to the tools you expose (e.g. MCP_TIERS=0-3 gives Tiers 0–3).

Tier 0 — Compute Contexts & Code Execution

  • execute_sas_code: Execute SAS code snippets and retrieve execution results (log and listing output), plus a link to the HTML results unless html_results=false. Runs in a reusable, per-user compute session that is kept warm across calls, so SAS state (WORK tables, macro variables, assigned librefs) persists between successive calls — use reset_compute_session to start fresh.

  • list_compute_contexts: List available compute contexts

  • reset_compute_session: Delete the cached compute session for a context, discarding its SAS state and forcing a fresh session on the next call

Tier 1 — Data Discovery

SAS Data Governance (metadata discovery & profiling):

  • catalog_search: Search the catalog for assets (tables, columns, reports, …) using the SAS catalog search grammar (free text, facets like AssetType:Report, ranges). Each hit carries a resource_uri you can hand to the matching tool (e.g. get_report, get_castable_data).

  • catalog_search_helper: Discover how to query the catalog — list the available facets, or the valid values for one facet — so you can build precise catalog_search queries.

  • catalog_find_instance: Resolve the catalog instance for a source-asset resource_uri, bridging a search hit to the profiling and download tools without handling an instance id by hand.

  • catalog_run_adhoc_analysis: Submit an ad-hoc profiling job for a table. NLP enrichment (language, sentiment, semantic IDs) is on by default, populating informationPrivacy, nlpTerms, nlpTags, and mostImportantFields.

  • catalog_get_adhoc_analysis: Poll a profiling job and cross-check the target instance, reporting profile_ready once results have landed on the asset — so a download isn't fired too early.

  • catalog_download_table_profile: Download a table's data dictionary and column profile as CSV, identified by either instance_id or resource_uri.

  • catalog_list_agents: List the catalog's discovery agents (the crawlers that populate metadata).

  • catalog_run_agent: Start a discovery agent run (asynchronous) to crawl its data source and refresh catalog metadata.

  • catalog_get_agent_history: Inspect an agent's run history — status and how much metadata each run enumerated/added/updated/removed.

CAS data (in-memory):

  • list_cas_servers: List available CAS servers

  • list_caslibs: List CAS libraries on a server

  • list_castables: List tables in a CAS library

  • list_source_tables: List source tables not yet loaded into memory (candidates for promotion)

  • get_castable_info: Get table metadata (row count, columns, size)

  • get_castable_columns: Get column names, types, labels, formats

  • get_castable_data: Fetch sample rows from a CAS table

  • query_data: Run a FedSQL SELECT against CAS or compute data and get the rows back — one SQL surface over both storage tiers. Pick the tier with target (cas for caslib.table, compute for libref.table); joins, subqueries, aggregation, and UNION all work, and the row cap is applied server-side by the tool (a LIMIT you write is ignored, since a malformed one is silently discarded by CAS). Optionally returns the query as CREATE VIEW text for you to run yourself. Reads only: writes are refused pre-flight, and SAS macro triggers (%/&) are rejected because the macro processor would expand them outside SQL. Note the two tiers cannot be joined in one statement.

Compute libraries (SAS/Compute, within a compute context):

  • list_compute_libraries: List the SAS libraries (librefs) assigned in a compute context

  • list_compute_tables: List the tables in a SAS library within a compute context

  • list_compute_columns: List the columns of a table in a SAS library

  • get_compute_table_data: Fetch a page of rows from a table in a SAS library, values formatted as SAS displays them — the compute-tier counterpart of get_castable_data

Tier 2 — Data Operations & Files

  • upload_data: Upload a data file into a CAS table — read server-side so the data never passes through the model's context — from file_path (the server reads it off disk) or url (the server fetches it and converts it to the multipart upload the endpoint requires). Ingests the formats the casManagement uploadTable API accepts — csv, tsv (csv + tab delimiter), xls, xlsx (single sheet), sas7bdat, sashdat — auto-detected from the extension or set with data_format. parquet is not accepted by that endpoint and is rejected up front with guidance (load via a path-based caslib + promote_table_to_memory, or convert to csv/sas7bdat).

  • upload_inline_data: Create a small CAS table from inline csv/tsv text passed as a string (a lookup/mapping table the model builds on the fly, or a quick test table). The payload travels through the model's context, so it's for tiny tables only — use upload_data for files or anything larger.

  • promote_table_to_memory: Load a source table into memory at global scope (idempotent)

  • list_files: List files in the Viya Files Service

  • upload_file: Upload a file to the Viya Files Service, optionally into a Content folder (parent_folder_uri). Content comes from exactly one of content (inline text), file_path (read server-side, binary-safe — xlsx, zip, images — gated by ALLOW_LOCAL_FILE_UPLOAD), or url (server-side fetch)

  • download_file: Download file content

  • find_folder: Look up a SAS Content folder by path (/Public/Content/Decisions, My Folder, My Folder/Risk), ID or URI, and return its ID, URI, name and full path — for confirming a folder the user named, or getting the URI that upload_file and MCP_DEFAULT_FOLDER take

Tier 3 — Reports & Visualization

  • list_reports: List Visual Analytics reports

  • get_report: Get report metadata and definition

  • export_report: export a report (or specific report objects) in any format the VA service supports — package (zip), pdf, png, svg, csv, tsv, xlsx, or summary. Text formats come back inline, png as image content, and binary formats (package/pdf/xlsx) as an embedded file with the right MIME type.

  • describe_report_objects: Discover what a report can contain — the eight report operations and every addable object (bar chart, list table, geo map, key value, …) with a one-line purpose, its data roles, common options, and an example payload. Call with no arguments for the catalog (including an intent→object map, placement guide, layout recipes, and the API's hard limits), object_type= for one object's contract (colloquial aliases like kpi resolve), category= to filter, or operation= for one operation's full shape — operation="addData" documents dataItems (column renames, SAS formats, aggregations, geography classification). Backs the apply_report_operations loop.

  • create_report: Create a Visual Analytics report and return its id. Optionally pass an operations array to build the whole report in one atomic call; the result carries the created page/object names+labels and a verify hint.

  • apply_report_operations: The authoring workhorse — apply an ordered batch of native VA operations (addData, addPage, addObject, updateObject, setParameterValue, updateData, changeData, applyDataView) to a report. Give a page a title with addPage's title field (a text band at the top of the page body — VA headers are controls-only); title every chart at add time via options.object.title; arrange objects with placement — page, relativeToObject (left/right/top/bottom for columns, rows, and grids), container (group into a standardContainer), or report (new_page creates-and-names a page inline for one-batch multi-page reports). The batch is atomic. Validates every operation, object key, and placement against the catalog first (reporting all errors at once), supports dry_run, handles the ETag concurrency handshake, and — with save_as=true plus result_report_name/result_folder — applies the batch save-as to a new report, leaving the source untouched. The flag alone decides the mode: without it the report is edited in place, and a name or folder given without it is refused rather than acted on. Typical loop: describe_report_objects → get_castable_columns → apply_report_operations → get_report_outline / export_report (png, page-by-page) to verify.

  • get_report_outline: Read a report's structure back — pages → objects with the handles the other tools need (object name for placement/updateObject targets, label for export_report, page label for page placement).

  • copy_report: Copy a report to a new one (optionally renaming/refoldering). Pairs with a changeData operation for the copy-and-replace pattern.

  • delete_report: Delete a report and its content.

Tier 4 — Batch Jobs & Async Execution

  • submit_batch_job: Submit a SAS job for async execution

  • get_job_status: Check job state

  • list_jobs: List recent/running jobs

  • cancel_job: Cancel a running job

  • get_job_log: Retrieve job log

Tier 5 — Automated Machine Learning

  • list_ml_projects: List AutoML projects

  • create_ml_project: Create a new AutoML project from a loaded, global-scope CAS table (caslib + table + optional CAS server)

  • run_ml_project: Run pipeline automation

  • register_ml_champion_model: Register an AutoML project's champion model to the Model Repository

  • publish_ml_champion_model: Publish an AutoML project's champion model to a scoring destination

Tier 6 — Model Management & Scoring

  • list_registered_models: List models in repository

  • list_publishing_destinations: List available scoring/publishing destinations, for use with publish_ml_champion_model

  • list_mas_modules: List published MAS modules

  • get_mas_module_step_signature: Inspect a published MAS module step's input/output variable signature before scoring

  • score_data: Score data against a published model or decision; for a decision published from the Intelligent Decisioning UI, whose inputs carry a trailing underscore, the plain names are accepted and mapped (inputs_renamed)

Tier 7 — Decisioning Foundation (SAS Intelligent Decisioning)

Build and run SAS Intelligent Decisioning decisions — rule sets that consult lookup tables, and decision flows that combine them with models, branches, conditions, assignments and sub-decisions — then publish a flow to Micro Analytic Score (MAS) so score_data can execute it. The life-cycle tools read, lock, copy and delete every kind of decisioning content. Segmentation trees, code files, value lists and custom functions are written with Tier 10; enable both (MCP_TIERS=...,7,10) for everything — the server logs a warning when Tier 10 is on without Tier 7.

Rule sets and decision flows are always stored in a SAS Content folder. The create tools take a folder — a path such as /Public/Content/Decisions, My Folder or My Folder/Risk, a folder ID, or a folder URI — and fall back to the deployment's MCP_DEFAULT_FOLDER. With neither, they refuse and the model asks the user where to store the asset. An update leaves an asset in its folder; one created before folders were required is filed by its next update, into the folder given or the default. Every create and update result carries folder, with the path the asset is in.

Business rules — rule sets:

  • create_business_ruleset / update_business_ruleset / get_business_ruleset / list_business_rulesets / delete_business_ruleset: Manage rule sets (the input/output signature the rules operate on)

  • lock_business_ruleset_revision: Lock the current rule set state as an immutable revision (what a decision step references)

  • list_business_ruleset_revisions: List a rule set's locked revisions

Business rules — rules:

  • create_business_rule / update_business_rule / get_business_rule / list_business_rules / delete_business_rule: Manage the conditional rules inside a rule set

Decision flows:

  • create_decision_flow / update_decision_flow / get_decision_flow / list_decision_flows / delete_decision_flow: Manage decision flows that chain rule set steps

  • get_decision_flow_code: Retrieve the generated DS2 execution code for a flow

  • lock_decision_flow_revision / list_decision_flow_revisions / get_decision_flow_revision: Lock, list, and fetch immutable decision revisions

  • publish_decision_flow: Publish a locked decision revision to a MAS destination, polling to completion and returning the server-generated MAS moduleId (directly usable with get_mas_module_step_signature / score_data). The code is generated for MAS, as SAS Intelligent Decisioning publishes it, so lookup tables work; the module's inputs keep the decision's variable names (the UI would add a trailing underscore, credit_score_)

create_decision_flow and update_decision_flow take steps, in which each step names what it is and the server wires it: {"type": "rule_set" | "segmentation_tree" | "code_file" | "decision", "id": ...} (a sub-decision is a decision), {"type": "model", "id": <model repository id>}, {"type": "assignment", "assignments": {"band": "GOLD"}}, {"type": "condition", "expression": "score >= 630", "on_true": [...], "on_false": [...]} and {"type": "branch", "branch_type": "range" | "equals" | "like", ...}. A referenced object's newest locked revision is used (one is locked if there is none); step terms map to same-named decision variables, and a term the decision has none for is added as a variable of its type and direction, because Intelligent Decisioning validates and publishes a step only when every term is mapped. Mappings never cross type families. Assignments set constants (compute in a rule set or code file); a model is referenced by its model repository ID and its outputs become decision variables; range branches compare inclusively (>= min, <= max) and their cases must not share a value; steps nest inside branch cases and conditions. The tool's description carries a worked example of each. rule_set_steps still works for rule-set-only flows. The result's steps_report lists the revisions used, the variables added and anything to check.

Content — one life cycle for every kind: asset_type is rule_set, decision, segmentation_tree, code_file, value_list, lookup_table, custom_function or function_category.

  • list_decisioning_assets / get_decisioning_asset / delete_decisioning_asset: List, read (with the folder it is in; a rule set with its rules, a code file with its code, a value list with its entries, a lookup table with its versions and active entries; content over 150,000 characters is summarised) and delete any of them — a lookup table that rule sets use is refused, naming them, because Viya would delete it and leave those rules invalid

  • get_decisioning_asset_code: The DS2 Viya generates for a rule set, decision or segmentation tree, or a code file's source

  • list_decisioning_asset_revisions / lock_decisioning_asset_revision: Revisions of rule sets, decisions, segmentation trees and code files. Locking freezes the current state and opens the next revision; the result says which revision was locked

  • copy_decisioning_asset: Copy a rule set (with its rules), decision, segmentation tree, code file, value list or lookup table into a folder

  • validate_decision_expression: Compile a DS2 expression — a rule condition or action, a branch, a condition step — against a signature and return the compiler's error lines, before it goes into a rule set or decision

Lookup tables — keys and the value stored for each, which rules consult: a lookup condition tests whether a variable's value is a key, a lookupValue action assigns the value for a key. create_business_rule / update_business_rule take the lookup table by name and resolve its ID (a reference without one is stored as invalid), and report any condition or action Viya stored as invalid in problems. Rules read a lookup table's active version, which activation publishes to MAS and CAS; a decision already published uses newly activated entries on its next call, without being published again.

  • get_lookup_table: Versions (which one is active, which failed to activate and why), one version's entries — paged, filtered by key — and the rule sets that use the table

  • create_lookup_table: Create one from {"key": "value"} or a list of entries, with optional column labels, in a folder; activate publishes it right away

  • update_lookup_table: Add or overwrite entries, remove keys, or replace them all; rename; relabel. An active version is never changed — a new version is started from it — and rules keep the active one until the new one is activated (activate does that in the same call)

  • activate_lookup_table: Make a version the active one and wait for the publish to settle (active, running or failed with the reason); an earlier version (a rollback) or one whose activation failed is activated as a new version with its entries; republish copies the active version to MAS and CAS again

Tier 8 — Workbench (Execute Code Only)

  • execute_sas_code: Execute SAS code snippets and retrieve execution results (log and listing output), plus a link to the HTML results unless html_results=false. Runs in a reusable compute session that is kept warm across calls, so SAS state (WORK tables, macro variables, assigned librefs) persists between successive calls

Tier 9 — Business Glossary (SAS Data Governance)

Read and author the SAS Business Glossary, and link its terms to the columns they describe. Tier 1 tells you a column is called CD_NAC_RSK; this tier tells you what that means and who says so.

Two things about the glossary are worth knowing before you start, because both are invisible in the raw API and both are handled for you here:

  • A term has two ids. It exists as a Glossary object and as a Catalog entity, with different identifiers. Every tool returns both — term_id (glossary) and catalog_entity_id (catalog) — so you never have to work out which one you are holding.

  • Custom attributes are stored under UUID keys. These tools read and write them by the label the glossary UI shows ({"Scope": "Group"}), validating required attributes and single-select values before the call is made.

Dictionary:

  • search_glossary_terms: Free-text, ranked search over term names and definitions — the way in when you know a word rather than an id. Reports assigned_asset_count, so you can see whether a term is actually in use

  • list_glossary_terms: Exact structural listing — by term type, by parent (the authoritative hierarchy), or by name fragment. include_attributes returns each term's attribute values (free — the listing already carries them), and attribute_filter keeps only the terms matching, e.g. {"Used in Risk": true}. The glossary cannot filter on attributes server-side, so that filter is applied here and the result reports how much of the dictionary it scanned

  • get_glossary_term: One term in full, with its custom attributes named rather than hashed

  • list_glossary_term_types / get_glossary_term_type: The term types available, and the attribute contract a term of that type must satisfy — call the latter before authoring. Each attribute reports the one value format Viya accepts for it, which the API itself documents nowhere

Where terms meet data:

  • list_term_assets: The columns a term is attached to, with their tables. The authoritative answer to "where is this term used?"

  • list_table_terms: The reverse — every column of a table and the term assigned to it, with the term's definition inline. The fastest read on whether a table is governed

Authoring:

  • create_glossary_term: Create a term. Publishes by default — the underlying API creates an invisible draft unless told otherwise; update_glossary_term(publish=true) promotes one later

  • import_glossary_terms: Create many terms, and their hierarchy, in one call. Children name their parent instead of needing its id, so rows can be given in any order and no id is threaded between levels; per-row failures are reported individually. Returns the term_id of each row's term, so the next step needs no lookup, and separates rows that were genuinely new from rows whose term already existed — the import job counts both as successful. A row is written whole, so update_existing replaces the term at that path rather than merging into it. dry_run=true shows the resolved rows without importing — the interactive view turns that into a table with an Import button

  • update_glossary_term: Change a term's text, parent or attributes. Merges onto the current term, so omitted fields are left alone rather than blanked; parent_id moves it in the hierarchy, and publish promotes a draft. A draft is a separate resource in the API, so this routes the write accordingly — editing one otherwise fails with a bare 404

  • delete_glossary_term: Permanently delete a term and every assignment that referenced it. There is no cascade — a term with children is refused, so delete a subtree leaf-first

  • assign_glossary_term / unassign_glossary_term: Attach a term to a table column, or detach it. This is the step that makes a term govern data — a term with no assigned assets governs nothing

Designing the vocabulary:

  • create_glossary_term_type / update_glossary_term_type / delete_glossary_term_type: Define the template terms are created from — which custom attributes they carry, which are mandatory, and what values each accepts. An edit matches attributes by label and keeps each one's identifier, so terms already carrying a value do not lose it — to rename one, give its attribute_id alongside the new label, since a new label matches nothing and would otherwise mint a new attribute; delete refuses while terms still use the type

Terms assigned this way also become searchable through Tier 1's catalog_search using the Column.term:"<term name>" facet on the datasets index, which returns the tables carrying a term without resolving individual columns.

Tier 10 — Decisioning Advanced (SAS Intelligent Decisioning)

SAS Intelligent Decisioning content beyond rule sets, for the decision flows of Tier 7: segmentation trees (written, or built from a strategy table), value lists, code files in DS2, Python and SQL, and DS2 custom functions that rule expressions call. Everything is stored in a folder, as in Tier 7. Using what this tier creates — as decision steps, and reading, locking, copying or deleting it — takes Tier 7, so enable the two together; with Tier 10 alone the server logs a warning at startup.

Segmentation trees:

  • create_segmentation_tree / update_segmentation_tree: Write a tree: nodes test a variable against values ("A;B"), comparisons (">=630"), ranges ("600<=v<630") or "Other", in order; outcomes assign variables or run DS2. An update replaces only the parts given

  • create_segmentation_tree_from_table: Build one tree from a strategy table — one row per branch, a column per decision key — as FICO-style exports (TRIAD, Blaze) describe a strategy. Keys are tested in column order and only where they split; values are range lower bounds (split="lower_bound") or exact values. Reads inline rows, a CSV, or a CAS table (load an Excel sheet with upload_data), can create a value list per variable, and reports leaves, outcomes and any rows whose path is identical but whose outcome differs

Value lists, code files and custom functions:

  • create_value_list / update_value_list_entries: Value lists of values or numeric ranges ("v>=630"); a version in production is left alone and a new version takes the entries

  • create_code_file / update_code_file: DS2, Python or SQL code files; Viya reads the signature from the code, and signature supplies the types Python cannot state

  • create_custom_function / update_custom_function: DS2 custom functions that rule expressions call, checked to compile first; a category named but missing is created

  • validate_custom_function: Compile a custom function without saving it and return the compiler's error lines

Prompt Templates

  • debug_sas_log: Analyze SAS log for errors with root-cause explanations

  • explore_dataset: Generate data-profiling SAS code

  • data_quality_check: Generate DQ assessment code

  • statistical_analysis: Set up a statistical workflow with diagnostics

  • optimize_sas_code: Review and optimize SAS code

  • explain_sas_code: Block-by-block code explanation

  • sas_macro_builder: Build production-quality SAS macros

  • generate_report: Generate ODS/PROC REPORT code

  • build_va_dashboard: Guide a polished multi-page Visual Analytics dashboard build from a CAS table — a discover → shape → structure → polish → verify method over the report-authoring tools

MCP Client Configuration

Example configurations are provided in the examples/ folder. Below are quick-start snippets for common clients.

Tip — open the endpoint in a browser. In HTTP mode, pointing a browser at the MCP URL (e.g. http://localhost:8134/mcp, or https://<host>/mcp for a deployed server) shows a landing page instead of a bare 401: what the server is, which SAS Viya it talks to, the tool tiers this deployment exposes with a one-line summary per tool, and ready-to-copy configuration for Claude Code, VS Code, Cursor, Claude connectors and generic mcp.json clients — with the deployment's real URL already filled in. Only a plain browser GET (Accept: text/html) is answered this way; MCP clients and curl see exactly what they saw before. The page is unauthenticated and shows deployment shape only (never user data); administrators can turn it off with MCP_LANDING_PAGE=false.

VS Code / Cursor / Claude Code (.vscode/mcp.json)

HTTP mode (requires uv run app running separately):

{
    "servers": {
        "sas-execution-mcp": {
            "url": "http://localhost:8134/mcp",
            "type": "http"
        }
    }
}

Stdio mode (starts the server on demand):

{
    "servers": {
        "sas-execution-mcp": {
            "command": "uv",
            "args": ["run", "--no-sync", "app-stdio"],
            "cwd": "${workspaceFolder}"
        }
    }
}

With the Claude Code CLI, pass the checkout with --directory:

claude mcp add --scope user sas-viya -- uv run --no-sync --directory /path/to/sas-mcp-server app-stdio

--no-sync makes the client start the server from .venv as it is; run uv sync yourself after updating (see Installation).

Gemini CLI (.gemini/settings.json)

Gemini CLI only supports stdio mode. Add to your ~/.gemini/settings.json or project-level .gemini/settings.json:

{
    "mcpServers": {
        "sas-viya-mcp": {
            "command": "uv",
            "args": ["run", "--no-sync", "app-stdio"],
            "cwd": "/path/to/sas-mcp-server",
            "timeout": 60000
        }
    }
}

Note: The timeout field (in milliseconds) is important — SAS Viya API calls can take longer than the Gemini CLI default of 10 seconds. A value of 60000 (60s) is recommended. Set cwd to the absolute path of your sas-mcp-server checkout.

Example

Execute SAS code through the MCP tool:

data work.students;
input Name $ Age Grade $;
datalines;
Alice 20 A
Bob 22 B
;
run;

proc print data=work.students;
run;

For more details, configuration options, and deployment options, please refer to the examples folder and follow the instructions listed there.

Collection Mode (Usage Telemetry)

An opt-in, off-by-default mode that records how the server is actually used — which tools, for what goals, with what inputs, and where they fall short. It serves two audiences:

  • Contributors giving structured feedback to the maintainers. Rather than filing prose bug reports, you can turn it on for a while and share the resulting log so maintainers can see which tools are used, which fail, and what goals have no good tool yet — a direct signal for improving existing tools and identifying new ones.

  • Organizations running the server for their own users. Teams that deploy the MCP server internally can enable it to understand what their users do with it and why, entirely within their own infrastructure.

It is implemented as a FastMCP middleware wrapper (telemetry.py + usage_logger.py) and requires no changes to any tool.

🔒 Nothing is ever sent anywhere automatically. Collection mode only appends to a local log file on the machine running the server. It is disabled unless you explicitly enable it, and even when enabled the data stays on your disk — sharing it with anyone (including the maintainers) is a deliberate, manual step you take by sending the file yourself. There is no phone-home, no network transmission, and no third party involved.

When enabled it does two things:

  1. Injects a required goal parameter into every tool's schema, asking the model to state in one sentence why it chose that tool for the current request. The goal is stripped from the arguments before the real tool runs, so tools never see it.

  2. Appends one JSON line per tool call (JSON Lines / NDJSON, schema v3) to a local log file: timestamp, run id, per-run sequence number, tool name, goal, arguments (plus a stable args_hash for retry analysis), result, status, error, latency, and the calling client's client_name / client_version. When a tool declares a failure as data (e.g. {"status": "apply_failed"}, which the MCP layer sees as success), the record also carries tool_status / is_tool_error / tool_message / failed_operation_index — so tool-level failure rates are analyzable in every mode. A run_start header record (transport, pid, server version, result mode, and an optional COLLECTION_RUN_TAG label for tagging A/B runs) opens the log and is re-emitted every 1000 records, so rotation cannot leave a stretch of the log with no header to resolve; every emission is byte-identical, so any one of them will do. Secret-shaped keys and inline Bearer/JWT tokens are redacted, the Viya hostname is masked in error/result text, and every field is size-capped.

    Records group by run_id — one per server process — not by MCP session. The protocol is moving to a sessionless model (FastMCP 4 makes it the default) in which session_id is absent or minted per request, so grouping on it would shatter every trace into single-call fragments. Under stdio, one process serves one client, so a run is that client's trace. Under HTTP a run spans every client the process served, and client_name/client_version are the only thing separating them — two users on the same client software share one run_id and one seq counter, which is an accepted limitation of dropping the session key, not something a per-process COLLECTION_LOG_PATH can fix (that splits by process, the axis run_id already covers).

Enabling it

Set the toggle in .env (all options are documented in .env.sample):

COLLECTION_MODE=true
# optional overrides (defaults shown):
# COLLECTION_LOG_PATH=~/.sas-mcp-server/tool-usage.log
# COLLECTION_LOG_RESULTS=failures  # never | failures | always (see below)
# COLLECTION_RUN_TAG=            # free-text label stamped into run_start

Tool results are recorded per COLLECTION_LOG_RESULTS — a tri-state dial: never records only a content-free shape summary (type + key names, e.g. {"_type":"object","_keys":["status","report_id"]}); failures (the default) records full (capped + redacted) result contents only for calls that errored or whose tool declared a failure — the middle ground, since failure diagnostics are the highest-value trace data and rarely carry table rows, and because under never a success and a tool-declared failure are indistinguishable in the log; always records result contents on every call. Arguments, goal, status, error text, and the tool-declared outcome fields are captured in every mode. (true/false still work as aliases for always/never.)

⚠️ Privacy: when enabled, the log captures your tool inputs (e.g. the SAS code and queries you submit) and — in failures/always modes — real result data that may include table rows, SAS listings, and PII. Redaction is heuristic (credential-shaped keys + Bearer/JWT + the Viya hostname) and does not detect PII in data values. Review the log before sharing it. The file is locked to your user (chmod 0600 on POSIX; icacls on Windows, best-effort).

Performance impact

Collection mode is designed to be cheap enough to leave on. Measured on this repo (45 registered tools, FastMCP 3.4.2):

  • Prompt tokens. The injected goal field grows the tools/list schema the model sees by roughly +2,400 input tokens (~29%) per turn. Because the tool list is stable within a session it is served from the prompt cache after the first turn (steady-state ≈ +240 tokens/turn), plus ~15–30 output tokens per call for the model to write the goal sentence. This is the only client-visible cost and it applies only while collection mode is enabled.

  • Per-call latency. Middleware + logging adds ≈1.4 ms per call at the shape-only default (≈5.3 ms with COLLECTION_LOG_RESULTS=always). The JSONL write is offloaded to a worker thread so it never blocks the event loop. Against real Viya calls (typically hundreds of milliseconds to seconds) this is negligible — the live integration suite passed identically with collection mode off and on, the overhead lost in normal network variance.

  • Disk. Roughly 0.5–0.7 KB per tool call at the shape-only default. The log rotates at COLLECTION_MAX_LOG_BYTES (default 10 MiB, ≈16k calls) and keeps COLLECTION_LOG_BACKUPS (default 3) rotated files, so on-disk growth is bounded.

Server Log

The server log starts with one line naming what runs: the server and FastMCP versions, the transport, and the SAS Viya endpoint. After that, every tool call logs the tool and the SAS Viya user it runs as:

Tool call: execute_sas_code (user: sasdemo)

The user is the id from GET /identities/users/@currentUser, asked with the caller's own token, so it is exactly the identity Viya authorizes the call against; for a client-credentials token it is the client's id. The lookup happens once per token, not once per call, and a failed lookup logs user: unknown rather than failing the tool. On a shared HTTP deployment this is what ties a field report to the person who hit it.

HTTP Debug Trace

When a tool fails, the model's summary of the error rarely shows the request that caused it — a wrong path, a missing media type, a body of the wrong shape — and one tool call can make several requests (paging, polling a compute job, fetching its log). Set HTTP_DEBUG=true in .env to write every request the server sends to the SAS Viya APIs, and each response, to a separate file:

HTTP_DEBUG=true
# The defaults; `docker --env-file` keeps a trailing comment as part of the value, so none here.
HTTP_DEBUG_LOG_PATH=~/.sas-mcp-server/http-debug.log
# Cap per recorded body in bytes; 0 records no bodies.
HTTP_DEBUG_MAX_BODY_BYTES=4096

Each exchange is two JSON lines with the same id: a request record (method, URL, headers, body) and a response record (status, elapsed_ms, headers, body). A request with no matching response failed in transit — a timeout, a refused connection, a TLS error. The trace never goes to the server log, so it is safe in stdio mode, where stdout carries the protocol.

Authorization, cookies and other credential-shaped headers, query parameters and body keys are redacted, as are inline Bearer/JWT strings. Data values are not: table rows and SAS code appear in bodies, so review the file before sharing it. Binary bodies are recorded as their size and type, bodies are capped at HTTP_DEBUG_MAX_BODY_BYTES, and the file rotates like the collection log. The server logs a warning at startup while tracing is on; it is meant for troubleshooting, not for leaving on in a shared deployment. OAuth sign-in and token-refresh calls are not traced.

Testing

The project includes two layers of tests: unit tests (fast, no credentials required) and integration tests (run against a real SAS Viya instance).

run_tests.sh vs. running pytest directly — pick by platform. run_tests.sh is a Bash convenience wrapper (it adds the ruff + pyright gates, credential wiring, and JUnit reporting). It runs on Linux/macOS — and on Windows only under Git Bash or WSL. On Windows PowerShell or cmd, use the uv run python -m pytest … commands shown under each mode below. They are cross-platform, do the same test selection, and need no setup beyond uv sync.

Running Unit Tests

Unit tests verify tool schemas, request payloads, and internal logic without making any network calls:

./run_tests.sh                                     # Linux/macOS (also runs ruff + pyright)
uv run python -m pytest -m "not integration" -v    # any platform, incl. Windows PowerShell

This runs the unit suite and deselects the integration tests, which then show up in the summary as e.g. 28 deselected. That is expected — those tests are not meant to run in a unit-only pass. They only execute in the integration modes below, because they need a live Viya instance; there is no flag that "activates" them in a not integration run.

Running Integration Tests

Integration tests call every tool against a live Viya environment. They require credentials, provided via .env or CLI arguments.

uv sync installs everything the integration suite needs, including openpyxl (used to build the Excel upload_data fixture). It lives in the test-formats dependency group, which [tool.uv] default-groups syncs by default — so no extra install step is required.

Full suite (unit + integration) — reads VIYA_ENDPOINT, VIYA_USERNAME, VIYA_PASSWORD from .env:

./run_tests.sh --integration      # Linux/macOS
uv run python -m pytest -v        # any platform

Passing credentials on the command line (wrapper only):

./run_tests.sh --integration \
    --endpoint https://your-viya-server.com \
    --username youruser \
    --password yourpassword

With the direct pytest command, set the same three variables in .env (or export them in your shell) instead.

Integration tests only (skip unit tests):

./run_tests.sh --integration-only                    # Linux/macOS
uv run python -m pytest -m integration --no-cov -v   # any platform

The pytest marker is integration, not integration-only. --integration-only is a flag of the run_tests.sh wrapper; the underlying pytest marker is just integration. Running pytest -m "integration-only" matches no marker and silently deselects all tests (0 selected). Use -m integration.

Why --no-cov? pytest.ini enforces a 90% coverage floor that only the full unit suite reaches. An integration-only run exercises far less code (~65%), so without --no-cov pytest exits non-zero with a coverage failure even though every selected test passed. run_tests.sh --integration-only adds --no-cov for you; add it yourself when calling pytest directly (or use --cov-fail-under=0).

Binary upload formats. The Excel upload_data integration test generates its .xlsx fixture with openpyxl, from the test-formats group that uv sync installs by default (see above). If you deliberately sync without it (e.g. uv sync --no-default-groups), the test importorskips — you'll see it as skipped, not failed. csv, tsv, and file_path/data_format coverage needs no extra deps. Generating a sas7bdat/sashdat fixture requires SAS itself, so those two formats are covered by unit-level payload tests only, not live.

Every one of the 115 tools and 9 prompt templates has an integration test, enforced by the test_every_tool_has_integration_coverage / test_every_prompt_has_integration_coverage guards — adding a new tool or prompt without integration coverage fails the suite. The resource-dependent tests discover real targets on the instance: score_data scores the most recently modified MAS module (discovering a real step and its inputs), and run_ml_project re-runs the most recently modified completed ML project. They skip only if the instance has no such resource at all. Likewise, test_catalog_agents_workflow skips with "No discovery agent named 'Public'" on instances where SAS Data Governance has no discovery agent named Public configured — an expected skip, not a failure; ask a Viya admin to configure one if you need that test to run.

In CI: the .github/workflows/integration.yml workflow runs this suite on demand (manual dispatch, or by adding the run-integration label to a PR) using repository secrets, and publishes the results back to the PR as a status check, a sticky comment, and a downloadable JUnit artifact. Result files are written to reports/ (git-ignored) and are never committed.

Locally (attach results to a PR yourself): run with --report to write the JUnit XML and a Markdown summary into reports/ (git-ignored), then post them to a PR with the GitHub CLI — no commit, no CI required:

./run_tests.sh --integration-only --report
gh pr comment <PR> --body-file reports/integration-summary.md   # summary table as a comment
gh gist create reports/integration.xml                          # full XML as a linkable gist

GitHub has no API/CLI to attach a binary file to a PR (drag-and-drop upload is browser-only), so the summary is posted as a comment and the raw XML is shared via a gist link or pasted in a collapsed <details> block. To produce the canonical Actions artifact from your machine instead, trigger the workflow remotely: gh workflow run integration.yml.

Test Structure

File

Description

tests/test_tool_payloads.py

Payload assertions for all 75 Tier 0-8 tools (URL paths, JSON body, query params, headers) plus error-path coverage

tests/test_integration.py

End-to-end workflow tests against a real Viya instance

tests/test_tools.py

Unit tests for the generic Viya REST helpers in viya_client (get_json, post_json, make_client, …)

tests/test_viya_utils.py

Unit tests for Viya compute session and job orchestration

tests/test_mcp_server.py

Unit tests for the HTTP auth middleware, health route, and token getter

tests/test_config.py

Unit tests for configuration loading

tests/test_config_oauth.py

Unit tests for PermissiveOAuthProxy raw-bearer handling

tests/test_auth_login.py

Unit tests for the sas-mcp-login OAuth/PKCE helper

tests/test_stdio_server.py

Unit tests for stdio token resolution and the device-code flow

tests/test_env.py

Unit tests for the env_bool helper

tests/test_prompts.py

Unit tests for prompt template rendering

Contributing

Maintainers are accepting patches and contributions to this project. Please read CONTRIBUTING.md for details about submitting contributions to this project.

License & Attribution

Except for the the contents of the /static folder, this project is licensed under the Apache 2.0 License. Elements in the /static folder are owned by SAS and are not released under an open source license. SAS and all other SAS Institute Inc. product or service names are registered trademarks or trademarks of SAS Institute Inc. in the USA and other countries. ® indicates USA registration.

Separate commercial licenses for SAS software (e.g., SAS Viya) are not included and are required to use these capabilities with SAS software.

As with any container image, direct and indirect dependencies are governed by their own licenses. Users of the published container image are responsible for ensuring that their use complies with all applicable licenses.

All third-party trademarks referenced belong to their respective owners and are only used here for identification and reference purposes, and not to imply any affiliation or endorsement by the trademark owners.

Third-Party Dependencies

This project requires the following dependencies.

Available Tools

115 tools
activate_lookup_tableActivate Lookup TableA
Destructive

Make a lookup table version the one rules use: publish its entries to MAS and CAS.

Decisions already published to MAS use the newly active entries on their next call; nothing needs to be published again. The previously active version stays in use until this one is active. outcome is active, running (still publishing after wait_seconds) or failed (activationError says why).

republish copies the already active version to MAS and CAS again — for a destination that lost it, such as CAS after a restart.

NameRequiredDescriptionDefault
versionNo"newest" (default), or a version's ID or label. An earlier version (a rollback) or one whose activation failed is activated as a new version with its entries.newest
republishNoCopy the active version to MAS and CAS again instead of activating one.
lookup_tableYesThe lookup table's ID or exact name.
wait_secondsNoHow long to wait for publishing to finish (max 300).

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the destructive annotation, the description discloses important behavioral effects: already-published decisions use new entries on their next call, the previous active version remains in use until activation completes, and outcome can be active, running, or failed. It also explains republish as a recovery operation for a destination that lost the published version.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded in the first sentence, followed by focused paragraphs on activation effects, outcome states, and republish. Every sentence adds operational meaning with no redundant filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is a destructive activation operation, and the description covers activation effects, previous-version behavior, outcome states, and republish recovery. With annotations covering safety and an output schema covering return values, no critical agent-facing detail is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds useful meaning for republish and version behavior beyond the schema text. It explains that republish is for a destination that lost the active version, and clarifies wait_seconds through the running outcome state.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb and resource: make a lookup table version active by publishing its entries to MAS and CAS. It clearly distinguishes activation from editing or creating lookup tables, though it does not explicitly name sibling alternatives such as update_lookup_table or publish_decision_flow.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explains the key usage contexts: activating a version for rules, and using republish when a destination such as CAS lost the active version. It does not explicitly state when not to use this tool versus update/publish siblings, but the conditions for activation and republish are clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

apply_report_operationsApply Report OperationsA
Destructive

Apply an ordered batch of operations to a report — the authoring workhorse.

This is how you add pages, add objects (any of the ~60 VA visual, control, and content types), set parameters, and swap data sources. operations is the native SAS Visual Analytics operations array; the whole batch is applied atomically (all succeed or nothing changes).

Operation keys (one per array element): addData, addPage, addObject, updateObject, setParameterValue, updateData, changeData, applyDataView. Call describe_report_objects for each operation's shape (operation="addData" covers formats, aggregations, and geography via dataItems) and each object's data roles, and get_castable_columns to map columns onto those roles.

Layout & titles (see describe_report_objects → placement / layout_recipes for details):

  • Page title — give addPage a title (e.g. {"addPage": {"pageName": "Overview", "title": "Sales Overview"}}); it becomes a text band at the top of that page's body. Page/report headers accept ONLY control objects — never text or visuals.

  • Chart titles — pass {"options": {"object": {"title": "..."}}} inside the object spec at add time (all types except standardContainer, which takes no options at add time).

  • One-batch multi-page — create pages inline with placement {"report": {"context": "new_page", "pageName": "Trends", "pagePosition": 1}} (numeric position) and target that pageName from later operations in the same batch.

  • Grids/columns — relativeToObject with left/right/top/bottom (geometric) or before/after (flow order) against an EXISTING object's name; same-batch forward references fail, so chain across calls using the names each result returns. Objects are auto-named and auto-sized; placement and dataRoles are write-once (updateObject changes options only).

  • Read structure back anytime with get_report_outline; verify visually with export_report page-by-page (see verify_hint in the result).

The tool validates every operation against the object catalog before any HTTP call (unknown/typo'd object type, non-addable object, bad data-role names or arity, disallowed object/placement keys) and reports ALL invalid operations at once. It also handles the ETag optimistic-concurrency handshake for you, retrying once transparently on a concurrent edit.

NameRequiredDescriptionDefault
dry_runNoValidate and return the normalized payload (plus any soft warnings about missing common roles) without writing anything.
save_asNoFalse (default) edits the report in place. True applies the operations to a NEW report instead, leaving the source untouched (atomic template instantiation; pairs with ``changeData``), named by ``result_report_name`` and/or placed by ``result_folder`` — at least one is required. This flag alone decides the mode: a ``result_report_name`` or ``result_folder`` given while it is False is refused rather than acted on, so the source can never be edited or cloned by surprise. Blank values count as not given.
report_idYesTarget report id (from ``create_report`` or ``list_reports``).
operationsYesOrdered native operations array. Example element: ``{"addObject": {"object": {"barChart": {"dataSource": "CARS", "dataRoles": {"category": "Origin", "measures": ["MSRP"]}, "options": {"object": {"title": "MSRP by Origin"}}}}, "placement": {"page": {"target": "Overview"}}}}``.
result_folderNoSave-as target folder URI; omit for My Folder.
response_formatNo``concise`` (default) returns the created page/object/ data-source names+labels; ``detailed`` also echoes the full VA response.concise
result_report_nameNoSave-as name for the new report.
result_name_conflictNoSave-as name-conflict policy — ``rename`` (default), ``abort``, or ``replace``.rename

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations (readOnlyHint=false, destructiveHint=true): discloses that the whole batch is applied atomically ('all succeed or nothing changes'), that every operation is validated against the object catalog before any HTTP call with ALL failures reported at once, that placement/dataRoles are write-once and same-batch forward references fail, and that the ETag optimistic-concurrency handshake is retried once transparently. This is rich, non-obvious behavioral context an agent needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose before the detailed bullet list, and the content is dense rather than repetitive — the inline examples and layout recipes carry genuine information. It is nonetheless long, and some bullets (e.g. chart-title and grid-placement detail) sit near the edge of what a tool description should carry versus delegating to describe_report_objects.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 8-parameter batch-mutation tool with ~60 object types, this covers everything an agent needs: atomicity, pre-flight validation, concurrency handling, save-as mode, layout/titles, and where to verify results. An output schema exists, so return-value detail is correctly omitted.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description adds real meaning beyond it by explaining the operations array's element structure, the valid operation keys, placement semantics (geometric vs flow-order, same-batch reference limits), and layout/title conventions. The one gap is that save-as flags are documented only in the schema, not reinforced in the prose.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Apply an ordered batch of operations to a report') and immediately characterizes scope ('the authoring workhorse'), then enumerates the concrete authoring actions (add pages, add objects, set parameters, swap data sources). This clearly separates it from siblings like get_report_outline, export_report, and create_report, so an agent can identify it without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent to complementary tools for sub-tasks ('Call describe_report_objects for each operation's shape', 'get_castable_columns to map columns onto those roles', read back with get_report_outline, verify with export_report). It gives clear context for when this is the right tool, but never states a when-not/exclusion case (e.g. which edits belong to other tools instead), so it stops just short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

assign_glossary_termAssign Glossary TermA
Idempotent

Assign a business term to a table column — the step that makes a term govern data.

Creating a term only defines a word. This attaches it to the column that carries it, and it is what list_table_terms, list_term_assets and the catalog's Column.term facet all read. Assigning the same term to the same column twice is reported, not duplicated.

NameRequiredDescriptionDefault
term_idNoThe glossary term UUID.
term_nameNoExact term name, if the id is not known. One of the two is required.
table_nameNoTable name, if the URI is not known.
column_nameYesThe column to assign the term to (case-insensitive).
resource_uriNoThe table's source URI (preferred).

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond the annotations by explaining what the assignment actually does, what downstream catalog facets read it, and that 'assigning the same term to the same column twice is reported, not duplicated.' This gives concrete idempotency semantics beyond the idempotentHint annotation, with no contradiction to the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded in the first sentence, and each subsequent sentence adds non-redundant context: the distinction from term creation, the downstream consumers of the assignment, and duplicate behavior. There is no filler or unnecessary repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the fully documented schema, output schema, and annotations, the description supplies the non-obvious context an agent needs: what the assignment does, what reads it, and how duplicates are handled. Nothing material is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all parameters including term_id, term_name, table_name, column_name, and resource_uri. The description does not add parameter-level meaning beyond that, so the baseline score applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Assign a business term to a table column,' and immediately conveys the operational consequence ('the step that makes a term govern data'). It also distinguishes itself from create_glossary_term by explaining that creating only defines a word, so an agent can tell assignment apart from term definition.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly implies when to use this tool: after a term exists, when the goal is to attach it to a column rather than just define it. It also ties the effect to downstream tools like list_table_terms and list_term_assets, giving useful context. However, it does not explicitly point to unassign_glossary_term as the removal alternative or state when not to use this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

cancel_jobCancel JobA
DestructiveIdempotent

Cancel a running job.

NameRequiredDescriptionDefault
job_idYesID of the job to cancel.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and readOnlyHint=false, so the description's job is lighter. The description adds the useful scoping constraint that only running jobs can be canceled, but it does not disclose potential side effects or failure behavior beyond that.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one short sentence that immediately communicates the operation and adds the key qualifier 'running' beyond the title. There is no redundancy or wasted text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter, destructive operation with full schema coverage, an output schema, and relevant annotations, the description is mostly sufficient. It clearly identifies the target and state constraint, though it could be more complete with a note about cancellation effects or error conditions.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema fully documents job_id as the ID of the job to cancel, so schema coverage is 100%. The description adds no additional parameter-level meaning beyond what the schema already provides, so the baseline score of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action (cancel) and a specific resource (a running job), making the tool's purpose immediately clear. It also distinguishes this tool from sibling job-related tools like submit_batch_job, get_job_status, list_jobs, and get_job_log.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no guidance on when to use this tool versus alternatives, such as checking job status first with get_job_status or retrieving logs with get_job_log. It only implies the tool is for running jobs, but does not explain prerequisites, ordering, or when cancellation is not appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

catalog_download_table_profileCatalog Download Table ProfileA
Read-onlyIdempotent

Download a catalog table's data dictionary and profile as CSV.

Returns the table's column metadata plus, by default, its profile (column statistics and data-quality metrics). If the table has not been profiled yet, this returns a recommendation to run catalog_run_adhoc_analysis (pre-filled with the table's URI and type) instead of an empty profile.

Identify the table by either instance_id or resource_uri (give one). Passing resource_uri lets you run search → profile → download without ever handling an instance id: the asset is resolved by resourceId the same way catalog_find_instance does. instance_id takes precedence if both are given.

NameRequiredDescriptionDefault
levelNoDetail level — 'dataDictionaryAndProfile' (default; columns + profile), 'detailedMetrics' (full per-column metrics), or 'dataDictionary' (column metadata only).dataDictionaryAndProfile
instance_idNoCatalog instance id of the table (the ``id`` from a catalog_search hit).
resource_uriNoSource URI of the table (the ``resource_uri`` from a search hit, e.g. '/dataTables/dataSources/cas~fs~.../tables/MYTABLE'). Used when ``instance_id`` is omitted.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as read-only and idempotent, and the description adds substantial behavioral context beyond that: it returns a recommendation to run catalog_run_adhoc_analysis instead of an empty profile when profiling is missing, resolves resource_uri via resourceId like catalog_find_instance, and documents that instance_id takes precedence when both are supplied.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core action and output in the first sentence, then adds fallback behavior and parameter-selection details in short, purposeful paragraphs. Every sentence contributes distinct information without repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only download tool with rich annotations, full schema coverage, an output schema, and an important edge case, the description covers the result format, unprofiled-table behavior, parameter precedence, and relevant sibling workflow. No critical usage information is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already describes all three parameters, but the description adds critical non-redundant semantics: the caller must provide either instance_id or resource_uri, instance_id takes precedence if both are given, and resource_uri supports a search → profile → download workflow without handling an instance id. This materially improves parameter understanding beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Download a catalog table's data dictionary and profile as CSV.' It also distinguishes the tool from siblings like catalog_run_adhoc_analysis by describing the unprofiled-table fallback, so an agent can clearly identify what this tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states when the tool is appropriate (downloading metadata/profile) and names the alternative catalog_run_adhoc_analysis for the unprofiled-table case. It also provides clear guidance on choosing instance_id vs resource_uri, including the workflow benefit of resource_uri. It does not exhaustively compare to all catalog siblings, but the guidance is strong.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

catalog_find_instanceCatalog Find InstanceA
Read-onlyIdempotent

Resolve the catalog instance for a source-asset URI.

catalog_search finds assets by free text and facets, but the profiling and download tools key off a catalog instance id. When you already hold a resource URI — the resource_uri from a search hit, or a CAS table path — this looks the instance up directly by resourceId (the same filter the profiling workflow uses) and returns its id plus the key profile attributes. Use it to tell at a glance whether the asset has been profiled (analysisTimeStamp) and what semantic metadata it carries (informationPrivacy, nlpTerms, nlpTags, mostImportantFields) before calling catalog_download_table_profile.

NameRequiredDescriptionDefault
resource_uriYesSource URI of the asset (e.g. '/dataTables/dataSources/cas~fs~.../tables/MYTABLE').

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is clear. The description adds useful behavior beyond annotations: it performs lookup by resourceId, returns the instance id plus profile attributes, and exposes whether the asset has been profiled via analysisTimeStamp. This gives the agent a good mental model of what will happen without contradicting the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, then builds context efficiently. Every sentence earns its place: one sentence for purpose, one for relation to catalog_search and key return fields, one for the downstream tool. The use of backticks for identifiers keeps it scannable without unnecessary verbosity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter lookup tool with a rich output schema and annotations covering safety, the description is complete. It explains the input, the output, the relationship to sibling tools, and the practical use case. Nothing an agent needs to decide whether to call this tool is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema already documents resource_uri with an example. The description adds meaning by explaining where the URI comes from (search hit or CAS table path) and connecting it to the resourceId lookup used by the profiling workflow. This goes beyond a bare schema description, though the relationship between resource_uri and resourceId could be slightly clearer.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Resolve the catalog instance for a source-asset URI.' It immediately distinguishes the tool from catalog_search by explaining that catalog_search finds assets by free text and facets while this tool resolves the instance id that profiling/download tools require. The purpose is unmistakable even without reading the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance: use it when you already hold a resource URI from a search hit or a CAS table path, and use it before calling catalog_download_table_profile. It also names the alternative, catalog_search, and explains the difference in lookup style. This is strong routing guidance for an agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

catalog_get_adhoc_analysisCatalog Get Adhoc AnalysisA
Read-onlyIdempotent

Get the status of an ad-hoc analysis job, and whether its profile is ready.

The job reaching a terminal status is not sufficient: the profile attributes are written onto the asset a little later, so a download fired the instant the job completes can come back empty. To close that gap, when the job carries a resource this also resolves the target catalog instance and reports profile_ready (the asset's analysisTimeStamp is populated — the same gate catalog_download_table_profile uses) and information_privacy (non-empty once the NLP semantic enrichment has landed). Poll until profile_ready is true, then download.

NameRequiredDescriptionDefault
job_idYesThe analysis job id returned by catalog_run_adhoc_analysis.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnlyHint/idempotentHint/destructiveHint annotations, the description discloses the delayed profile-attribute write, defines profile_ready via analysisTimeStamp, relates it to the gate catalog_download_table_profile uses, and adds the information_privacy/NLP enrichment behavior. This is substantial behavioral context, not schema repetition, and it does not contradict the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The summary sentence is front-loaded and the second paragraph earns its length: it explains the race condition, defines the readiness flags, references the download gate, and ends with the exact polling action. No filler sentences are present.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With only one parameter, an output schema, and safety annotations already supplied, the description covers the subtle timing gap, the meaning of profile_ready and information_privacy, and the correct invocation sequence. Nothing needed to call and act on this tool is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the sole job_id parameter is already documented as 'The analysis job id returned by catalog_run_adhoc_analysis.' The tool description adds only an indirect note about 'when the job carries a resource,' so the schema carries the parameter-semantics burden; baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb-resource pair: 'Get the status of an ad-hoc analysis job, and whether its profile is ready.' It then sharpens the distinction from generic job-status tools by explaining that terminal status is not sufficient, so an agent can tell this apart from get_job_status and knows it is the readiness gate before catalog_download_table_profile.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context and a direct usage pattern: 'Poll until profile_ready is true, then download.' It also explains the race condition that motivates the tool. It does not explicitly name a when-not-to-use alternative such as get_job_status, but the polling instruction and download caveat make the intended usage unmistakable.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

catalog_get_agent_historyCatalog Get Agent HistoryA
Read-onlyIdempotent

Get the execution history of a catalog agent's runs.

Each record reports a run's status and how much metadata it populated (tables enumerated/added/updated/removed), so you can confirm a run started by catalog_run_agent finished and what it changed.

NameRequiredDescriptionDefault
limitNoMaximum run records to return (default 20).
startNoOffset of the first record (default 0).
agent_idYesID of the agent (see catalog_list_agents).

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds useful behavioral context by explaining that each record reports run status and metadata population counts (enumerated/added/updated/removed), which helps the agent interpret results without contradicting annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core purpose, followed by a concise explanation of the record contents and the practical use case. Every sentence contributes meaningful information without repetition or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema exists, annotations cover the safety profile, and all parameters are documented in the schema, the description provides sufficient contextual glue: why to call it, what it returns at a high level, and how it relates to catalog_run_agent. Nothing essential for calling it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all parameters, including defaults for limit and start and the agent_id reference to catalog_list_agents. The description adds high-level context about run history but does not add significant parameter-level meaning beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Get the execution history of a catalog agent's runs.' It clearly distinguishes itself from sibling tools like catalog_run_agent by framing the purpose as confirming that a run started via catalog_run_agent finished and what it changed.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides a clear use case: use this tool to confirm whether a catalog agent run finished and what metadata it changed. It references catalog_run_agent as the initiating tool, giving contextual guidance, though it does not explicitly list exclusions or alternatives beyond that.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

catalog_list_agentsCatalog List AgentsA
Read-onlyIdempotent

List SAS Data Governance discovery agents.

Agents crawl a data source (server/library) to discover assets and collect their metadata into the catalog. Use catalog_run_agent to start one and catalog_get_agent_history to see what a run produced.

NameRequiredDescriptionDefault
limitNoMaximum agents to return (default 50).
startNoOffset of the first agent (default 0).
filter_nameNoOptional name filter (substring match).

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, non-destructive, and non-open-world, so the safety profile is fully covered structurally. The description adds useful domain context (agents crawl a server/library to collect metadata) but discloses nothing beyond that about cost, permissions, or result volume, so it is only a modest addition over the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the core action, then a compact definition of the resource, then sibling routing. No filler; every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

A read-only list tool with an output schema (so return values need no prose), full 100% parameter documentation, and named sibling alternatives. Nothing an agent needs to select and invoke it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%: limit, start, and filter_name each carry their own description including defaults and substring-match semantics. The description adds no parameter detail, so the baseline of 3 applies since the schema does all the work.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (List) plus resource (SAS Data Governance discovery agents), then defines what those agents actually do (crawl a data source to discover assets and collect metadata). This clearly separates it from catalog_run_agent and catalog_get_agent_history without the agent needing to open siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes to alternatives: catalog_run_agent to start an agent, catalog_get_agent_history to inspect a run, which tells the agent when this tool is NOT the right one. It stops short of stating the explicit trigger for calling this one (e.g. 'call before running an agent to obtain its ID'), so it is clear context rather than full when/when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

catalog_run_adhoc_analysisCatalog Run Adhoc AnalysisA

Submit an ad-hoc analysis (profiling) job for a table in the catalog.

Profiles the table — computing the data dictionary, column statistics, and data-quality metrics that catalog_download_table_profile returns. The job runs asynchronously and may take a while; poll catalog_get_adhoc_analysis with the returned job id until the profile is ready.

The three NLP job parameters are enabled by default — they drive the semantic enrichment that populates an asset's informationPrivacy, nlpTerms, nlpTags, and mostImportantFields (the privacy and keyword signals the catalog is most useful for). Leave them on unless you only need a plain column profile and want the job to finish faster.

NameRequiredDescriptionDefault
nameYesA name for the analysis job.
providerNoJob provider (default 'TABLE-BOT').TABLE-BOT
descriptionNoOptional description for the job.
resource_uriYesSource URI of the table to analyze (the ``resource_uri`` from a catalog_search hit, e.g. '/dataTables/dataSources/cas~fs~.../tables/MYTABLE').
resource_typeNoCatalog entity type of the resource. Defaults to 'CASMEMTable' when the URI is a CAS table (contains 'cas~fs~'); pass it explicitly for other asset types.
analyze_sentimentNoScore sentiment on text columns (default True).
identify_languageNoDetect each text column's language (default True).
get_nlp_semantic_idNoDerive semantic types / privacy classification (informationPrivacy, nlpTerms, nlpTags) (default True).

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations provide no meaningful hints (all false), so the description carries the burden of behavioral disclosure. It explicitly states the job runs asynchronously and may take a while, which is critical for an agent deciding whether to wait or poll. It also reveals that the three NLP parameters are enabled by default and drive semantic enrichment around informationPrivacy, nlpTerms, nlpTags, and mostImportantFields, including a performance tradeoff for disabling them. This goes well beyond the schema and annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is well-structured and front-loaded with the core action, followed by the profile contents, then the async workflow, then the NLP parameter guidance. Each sentence adds useful information and there is no filler. It is slightly longer than minimal, but every paragraph serves a distinct purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 8 parameters, an output schema, and asynchronous behavior, the description is complete: it explains what the job produces, how to retrieve the result, what the default NLP parameters do, and when to consider disabling them. The output schema covers return values, and the schema covers parameter syntax. Nothing needed for correct invocation or follow-up polling is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already documents all 8 parameters at 100% coverage, so the baseline is 3. The description adds meaningful semantics beyond the schema, especially for the NLP booleans: it explains they drive semantic enrichment and affect job duration, and it clearly names the asset fields they populate. It does not add detail for every parameter, but the schema handles those adequately.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Submit an ad-hoc analysis (profiling) job for a table in the catalog.' It then clarifies what the job produces (data dictionary, column statistics, data-quality metrics) and explicitly distinguishes it from sibling tools like catalog_download_table_profile and catalog_get_adhoc_analysis. An agent can tell exactly what this tool does and how it fits into the catalog workflow.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly explains the asynchronous workflow: submit the job, receive a job id, and poll catalog_get_adhoc_analysis until the profile is ready. It also names catalog_download_table_profile as the tool whose output this job computes, giving context for when a precomputed profile might be the alternative. It does not explicitly state when to use one over the other, but the polling instruction and sibling references provide strong practical guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

catalog_run_agentCatalog Run AgentA

Start a catalog discovery agent run (asynchronous).

Triggers the agent to crawl its data source and populate/refresh catalog metadata. The run is asynchronous — results are applied to the catalog in the background; poll catalog_get_agent_history to track completion. Note: the Catalog API can only start an agent, not stop one already running.

NameRequiredDescriptionDefault
agent_idYesID of the agent to run (see catalog_list_agents).

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses key behavioral traits beyond annotations: the run is asynchronous, results are applied in the background, and completion requires polling. It also states the cannot-stop limitation, which is critical operational context. No contradiction with the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and front-loaded, with the core action in the first sentence. Every subsequent sentence adds useful context: background application, polling, and the stop limitation. No filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter tool with an output schema and annotations, the description fully covers what the tool does, how it behaves, how to track it, and its limitation. Nothing call-critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the agent_id parameter is already documented as the ID of the agent to run with a pointer to catalog_list_agents. The main description adds no additional parameter-level meaning, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: it 'Starts a catalog discovery agent run' and explains the agent will crawl its data source and populate/refresh metadata. This clearly distinguishes it from related tools like catalog_list_agents or catalog_get_agent_history.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says to poll catalog_get_agent_history to track completion, which gives the agent a follow-up path. It also notes that the API can only start an agent, not stop one, preventing misuse. It doesn't explicitly enumerate all sibling alternatives, but the usage context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

catalog_search_helperCatalog Search HelperA
Read-onlyIdempotent

Discover how to search the catalog: list facets, or values for one facet.

Call with no facet to list the available facets — the fields you can constrain in a catalog_search query. Call with a facet name to get the suggested/valid values for that facet (e.g. the asset types or review statuses that actually exist). Use the results to build precise catalog_search queries.

NameRequiredDescriptionDefault
facetNoFacet name to get suggested values for (e.g. 'AssetType'). If omitted, returns the list of available facets instead.
limitNoMaximum entries to return (default 50).
queryNoOptional filter — when listing facets, matches facet names; when listing values, matches value prefixes.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds behavioral context: no facet returns available facets, while a facet name returns suggested/valid values that actually exist, which helps the agent understand what the tool will do.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with a clear summary, followed by two sentences that explain the two modes and the downstream purpose. Every sentence contributes useful guidance without filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the simple parameter set, full schema documentation, output schema presence, and read-only annotations, the description is complete. It explains when to call, what the two behaviors are, and how the results should be used in catalog_search.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3; the description adds extra meaning by explaining that facet values are 'the asset types or review statuses that actually exist' and that results are intended for building catalog_search queries. It does not add detail for limit or query, but those are already well documented in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Discover how to search the catalog: list facets, or values for one facet.' It clearly defines two modes and refers to catalog_search, making it easy to distinguish from the sibling catalog tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly explains when to call with no facet versus with a facet, and tells the agent to use the results to build precise catalog_search queries. It does not explicitly state when not to use the tool, but the helper role relative to catalog_search is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

copy_decisioning_assetCopy Decisioning AssetA

Copy a rule set (with its rules), decision, segmentation tree, code file, value list or lookup table.

Custom functions and function categories cannot be copied. A lookup table's copy holds the entries of its active version (or of revision_id, a version ID or label) and is not active itself.

NameRequiredDescriptionDefault
nameYesThe name of the copy.
folderNoWhere to store the copy: a folder path such as ``/Public/Content/Decisions``, ``My Folder``, a folder ID, or a folder URI. Omit to use the default folder; if there is none, ask the user.
asset_idYesThe ID of the source.
asset_typeYesrule_set, decision, segmentation_tree, code_file, value_list or lookup_table.
revision_idNoCopy this revision instead of the current state.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare a non-read-only, non-destructive, non-idempotent mutation; the description adds real behavioral detail beyond that — that child rules travel with a rule set, and that a lookup table copy carries the entries of its active (or specified) version and is not itself active. It doesn't cover naming collisions or permission requirements.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the supported types in the first sentence and spends the remainder on the two non-obvious caveats. Slightly fragmented line breaks, but no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema and annotations carry the return/safety burden, and the description covers the non-obvious edge cases (excluded types, version handling). Folder default behavior is delegated to the schema, which documents it, so nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds meaning the schema does not: revision_id is described as accepting a version ID or label, and the interaction between revision_id and the lookup table's active version is spelled out.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (copy) plus the exact set of copyable asset types, and explicitly names the two types that cannot be copied. An agent can distinguish this from siblings like create_* or get_decisioning_asset immediately.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives a clear when-not rule (custom functions and function categories cannot be copied) and clarifies which version of a lookup table gets copied. It does not explicitly route the agent to an alternative tool for the unsupported types, but the usage context is unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

copy_reportCopy ReportA
Destructive

Copy a Visual Analytics report to a new report, returning the copy's id.

Useful for tailoring a report to a new audience or for the copy-and-replace pattern — copy, then apply_report_operations with a changeData op to point the copy at a different table. Returns {"status": "copied", "id": ..., "name": ..., "source_report_id": ...}.

NameRequiredDescriptionDefault
nameNoOptional name for the copy (``resultReportName``); omit to let Viya name it.
folderNoOptional target folder URI (``resultFolder``); omit for the caller's My Folder.
report_idYesThe source report id to copy.
on_conflictNoName-conflict policy — ``rename`` (default), ``abort``, or ``replace``.rename

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint: true and idempotentHint: false. The description adds the return payload shape ({status, id, name, source_report_id}) and the copy-and-replace workflow, going beyond what annotations provide. It does not contradict the annotations, though it could have explained that on_conflict='replace' may overwrite an existing report.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the core action and result. The use-case sentence earns its place, and the return-format sentence is compact. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers purpose, usage patterns, and return shape; with schema handling parameters and annotations handling destructive behavior, little is missing. A minor gap is not explicitly calling out that on_conflict='replace' can overwrite an existing report, though that is present in the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% with detailed descriptions for all four parameters, so the baseline applies. The description does not add parameter-level details beyond what the schema already states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('Copy'), resource ('Visual Analytics report'), and outcome ('returning the copy's id'). This clearly distinguishes it from sibling report tools such as create_report, delete_report, and get_report.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides concrete use cases: tailoring a report to a new audience and the copy-and-replace pattern, explicitly naming apply_report_operations as the follow-up. It lacks explicit exclusions or alternative copy tools, but the context is clear enough for an agent to select it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_business_ruleCreate Business RuleA

Create a new rule inside an existing SAS Business Rules rule set.

A rule set can hold multiple rules, each evaluated per its conditional type. Condition/action expressions must include the variable name directly (e.g. "credit_score < 650", not just "< 650") — the API accepts the latter as valid but generates DS2 code with a missing left-hand operand. Boolean signature variables must be compared with = 0/= 1 in expressions, not = false/= true.

NameRequiredDescriptionDefault
nameYesRule name (max 30 chars).
actionsYesList of actions, each ``{"type": "assignment"|"return", "term": {"name", "dataType", "direction"}, "expression"}``, or ``{"type": "lookupValue", "term": {...}, "expression": "<key>", "lookup": "<lookup table name or ID>"}`` — assigns the value the lookup table stores for the key the expression evaluates to.
conditionsYesList of conditions (multiple conditions AND together), each ``{"type": "complex", "expression", "term": {"name", "dataType", "direction"}}``, or ``{"type": "lookup", "term": {...}, "lookup": "<lookup table name or ID>"}`` — true when the term's value is a key of the lookup table.
ruleset_idYesThe rule set UUID to add the rule to (not its name — list_business_rulesets returns both).
conditionalYes"if" starts a new independent rule chain, "elseif" continues the previous rule's chain, "or" ORs into it.
rule_fired_tracking_enabledYesWhether to record when this rule fires.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare this is a non-read-only, non-idempotent, non-destructive, closed-world mutation, so the safety profile is covered. The description goes beyond them with a genuinely valuable silent-failure disclosure: malformed expressions are accepted by the API but produce DS2 code with a missing left-hand operand, plus the boolean variable convention. It omits operational prerequisites such as lock/revision state before mutation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the action in the first sentence and follows with two dense, non-redundant pitfall notes rather than restating field names. Slightly long given everything else lives in the schema, but no sentence is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With full schema coverage, an output schema present, and annotations covering the safety profile, the description only needed to add domain pitfalls — which it does. The remaining gap is the mutation workflow context (locking a ruleset revision, whether the target must be unlocked), which would help an agent avoid a failed call.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description earns extra credit by adding expression-format semantics not in the schema (variable name must be embedded in the expression, booleans compared as = 0/= 1). It does not clarify conditional chaining or lookup-table referencing beyond what the schema already states.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Create a new rule") and pins the scope with "inside an existing SAS Business Rules rule set", which cleanly separates it from create_business_ruleset and update_business_rule. An agent can identify the operation without reading the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"New rule" vs the sibling update_business_rule implies the create-vs-modify split, and the description's mention of rule sets holding multiple rules gives context. However, it never explicitly says when to use this instead of update_business_rule, nor does it state prerequisites (e.g. that the rule set may need to be locked for a revision before adding a rule is possible).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_business_rulesetCreate Business RulesetA

Create a new SAS Business Rules rule set in a SAS Content folder.

A rule set with no rules cannot be used in a decision flow — follow up with create_business_rule to populate it.

The rule set is always stored in a folder. Without folder it goes to the deployment's default folder; when there is none, the call is refused and you should ask the user which folder to use. The result's folder says where it was stored.

NameRequiredDescriptionDefault
nameYesRule set name (max 30 chars).
folderNoWhere to store the rule set: a folder path such as ``/Public/Content/Decisions``, ``My Folder`` (or a folder below it, ``My Folder/Risk``), a folder ID, or a folder URI (``/folders/folders/<id>``). Omit to use the default folder.
signatureYesInput/output/inOut variables the rules operate on, each ``{"name", "dataType", "direction"}`` — dataType one of string, decimal, integer, date, datetime, dataGrid, boolean, any; direction one of input, output, inOut.
descriptionNoOptional description.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond annotations declaring a non-read-only, non-destructive create operation, the description discloses key behavior: the rule set is always folder-scoped, omitted folder uses a deployment default, no default causes refusal, and the result reports the storage folder. This gives the agent important operational context and error handling guidance.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is short and front-loaded: the create action comes first, followed by the required follow-up, then folder-storage edge cases. Every sentence carries actionable information without repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the output schema and annotations, the description supplies the remaining context an agent needs: dependency on create_business_rule, folder fallback behavior, refusal handling, and result folder reporting. Parameter-level details such as name length and signature structure are adequately covered by the schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents all four parameters in detail. The description adds meaningful semantics for the folder parameter by explaining default behavior and refusal conditions when folder is omitted, though it does not add equivalent detail for signature beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Create a new SAS Business Rules rule set in a SAS Content folder.' It also distinguishes rule-set creation from rule creation by instructing the agent to follow up with create_business_rule to populate the set.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear workflow guidance: an empty rule set cannot be used in a decision flow, so create_business_rule should follow. It also explains folder omission behavior and when the call is refused. It does not explicitly compare against update/get/list siblings, so it falls short of full when/when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_code_fileCreate Code FileA

Create a SAS Intelligent Decisioning code file: DS2, Python or SQL.

Viya reads the signature from the code. DS2: a package with method execute(...) — in_out parameters are outputs: package "${PACKAGE_NAME}" /inline; method execute(double score, in_out varchar band); ... end; endpackage;. Python: def execute(score): with 'Output: band' as the first statement and the outputs returned. SQL: {?:name:type} marks an input and {:name:type} an output column; the result rows also come back as a data grid.

Python cannot state types in its code, so give signature with the dataType of every input and output, or they stay unknown; for DS2 it adds descriptions and lengths. The result's status and errorMessage say whether the code parsed.

NameRequiredDescriptionDefault
codeYesThe code.
nameYesCode file name.
folderNoWhere to store it: a folder path, ``My Folder``, a folder ID or URI. Omit to use the default folder; if there is none, ask the user.
code_typeYesds2, python or sql.
signatureNoOptional ``[{"name", "dataType", "direction", "description"}]``.
descriptionNoOptional description.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond annotations (readOnlyHint=false, idempotentHint=false, destructiveHint=false), the description discloses real behavior: Viya parses the code to derive the signature, Python cannot declare types so they remain unknown unless supplied, and the result's status/errorMessage indicate parse success. That post-creation validation behavior is exactly the kind of context annotations cannot carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded in the first sentence, followed by per-language specification details in the order an agent would need them. The formatting is dense and skimmable, with only minor redundancy in restating the type/signature rules.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 6-parameter creation tool with an output schema, the description covers the essentials: required code shape per language, when signature details matter, folder defaulting (in schema), and how to detect a parse failure. It omits what happens on name collision or overwrite and whether any permissions/locking are needed before creation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 100% schema coverage the baseline is 3, but the description goes further by explaining what the loosely-typed `signature` objects must contain for Python (dataType for every input and output) versus what they add for DS2 (descriptions and lengths). It also ties code structure to the code_type enum, which the enum alone does not convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first line states a specific verb, resource, and the three supported code types (DS2, Python, SQL), so an agent can immediately tell this is a creation tool for code files rather than a decision flow or ruleset. It does not name the sibling it is not (update_code_file), so differentiation from the modify path relies on the name alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the purpose statement and reinforced by format-specific requirements per code_type, but there is no explicit 'use this when... / use update_code_file instead when...' guidance. The closest to a rule is the folder note ('omit to use the default folder; if there is none, ask the user'), which appears in the schema rather than as routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_custom_functionCreate Custom FunctionA

Create a DS2 custom function that rule expressions can call, after checking that it compiles.

The code is one DS2 method: method risk_band(double score) returns varchar(10); ... return 'LOW'; end;. Its name is the function's name. A rule then uses it in an expression, e.g. an assignment risk_band(credit_score). A new function takes a few seconds to be visible to validate_decision_expression.

NameRequiredDescriptionDefault
codeYesThe DS2 method.
categoryYesThe function category, by name or ID; a name that does not exist yet is created.
descriptionNoOptional description.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare non-readonly, non-destructive, non-idempotent, closed-world. The description adds meaningful behavioral context beyond that: the function is compile-checked on creation, and there is a propagation delay ('a few seconds to be visible to validate_decision_expression'). It omits what happens on failed compilation (error vs. partial creation), keeping it from a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the verb and resource, followed by a concrete code example and the visibility caveat. Every sentence carries information; the inline DS2 snippet is longer than strictly necessary but earns its place as a template. No wasted preamble.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values needn't be described, and annotations cover the safety profile. The description fills the important gaps – compile validation, naming rule, propagation delay. It stops short of describing failure behavior or required permissions for a mutation tool, so a minor gap remains.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description genuinely adds semantics: the `code` value is exactly one DS2 method whose name becomes the function name, which is not in the schema. That name-derivation rule is the key insight an agent needs and raises the score.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Starts with a specific verb+resource: 'Create a DS2 custom function that rule expressions can call, after checking that it compiles.' An agent can distinguish this from update_custom_function and validate_custom_function by the create intent. Sibling differentiation is implicit (validate/update variants exist) rather than called out explicitly, so not a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explains the creation context – the code is a DS2 method used by rules in expressions like risk_band(credit_score) – and hints at verification via validate_decision_expression. However, it never explicitly states when to use this versus update_custom_function or validate_custom_function, and there are no exclusions. Usage is implied rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_decision_flowCreate Decision FlowA

Create a SAS Intelligent Decisioning flow: rule sets, segmentation trees, code files, models, sub-decisions, assignments, conditions and branches.

Give the flow as steps (every step kind, wired by name) or, as before, rule_set_steps (rule sets only, wired by hand). A flow that sets defaults, scores a model, branches on its score and checks the result::

steps = [
    {"type": "assignment", "name": "Defaults",
     "assignments": {"offer": "NONE", "credit_limit": 0}},
    {"type": "model", "id": "<model repository id>"},
    {"type": "branch", "branch_type": "range", "variable": "P_BAD1", "cases": [
        {"label": "Low risk", "max": 0.1999, "steps": [
            {"type": "assignment", "assignments": {"offer": "GOLD", "credit_limit": 10000}}]},
        {"label": "Medium risk", "min": 0.2, "max": 0.4999, "steps": [
            {"type": "rule_set", "id": "<rule set id>"}]}],
     "default": [{"type": "assignment", "assignments": {"offer": "DECLINE"}}]},
    {"type": "condition", "expression": "offer = 'GOLD'",
     "on_true": [{"type": "code_file", "id": "<code file id>"}], "on_false": []},
]

Steps nest: a branch case, a branch default and either side of a condition hold steps of any kind, branches and conditions included.

  • Assignment — assignments maps a decision variable to a constant, written plainly ("GOLD", 10000): the service quotes strings itself and evaluates nothing, so "a + b" is stored as that text. Compute values in a rule set or code file. The variable must be in signature; name labels the step.

  • Model — id of a model in the model repository (list_registered_models, Tier 6). Its inputs map to same-named decision variables; its outputs (e.g. P_BAD1, I_BAD) are added as decision variables unless signature has them, a class label as a string. mappings renames: {"model variable": "decision variable"}.

  • Branch — variable (on the branch, or per case) and cases, checked in order; the first match runs, else default. range cases take min and/or max (leave one out for an open end) and compare inclusively, >= min and <= max; cases must not share a value, so end the lower case just below the next (max 0.1999 next to min 0.2). equals cases take one value; like cases a pattern with % and _ wildcards.

  • Condition — a DS2 expression over decision variables, e.g. score >= 630 and band = 'A'; check it with validate_decision_expression first.

  • Rule set, segmentation tree, code file, sub-decision — id, optional revision and mappings. Segmentation trees, code files, value lists and custom functions are created with the Tier 10 (Decisioning Advanced) tools; list_decisioning_assets finds existing ones.

The decision is always stored in a SAS Content folder. Without folder it goes to the deployment's default folder; when there is none, the call is refused and you should ask the user which folder to use. The result's folder says where it was stored.

NameRequiredDescriptionDefault
nameYesDecision name (max 60 chars).
stepsNoThe flow, in order — any step kind (see above): ``rule_set``, ``segmentation_tree``, ``code_file``, ``decision`` (a sub-decision), ``model``, ``assignment``, ``condition`` or ``branch``. ``revision`` defaults to the newest locked revision (one is locked if there is none); "working" uses the editable one. Mappings default to same-named decision variables; ``{"step term": "decision variable"}`` renames. The result's ``steps_report`` lists the revisions used, the variables added and any step input nothing maps to.
folderNoWhere to store the decision: a folder path such as ``/Public/Content/Decisions``, ``My Folder`` (or a folder below it, ``My Folder/Risk``), a folder ID, or a folder URI (``/folders/folders/<id>``). Omit to use the default folder.
signatureYesFlow-level input/output variables, each ``{"name", "direction", "dataType"}`` — direction input or output; dataType string, decimal, integer, date, datetime, boolean.
descriptionNoOptional description.
rule_set_stepsNoOrdered list of rule set steps to execute in sequence, each ``{"ruleSetId", "versionId", "mappings"}`` — versionId is a locked rule set revision (see ``lock_business_ruleset_revision``); mappings is a list of ``{"stepTermName", "direction", "targetDecisionTermName"}`` connecting the rule set's terms to this decision's signature. A term produced as output by an earlier step can be consumed as input by a later step via a shared signature entry.
add_missing_variablesNoWith ``steps``, add a decision variable for every step term none matches (default true): Intelligent Decisioning validates a step only when all its terms are mapped. The result's ``steps_report.variables_added`` lists them.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare write, non-idempotent, non-destructive, non-open-world, so safety framing is covered. The description adds real behavioral context beyond that: the decision is always stored in a SAS Content folder, the call is refused with no default folder, the result's folder field reports placement, and assignment strings are stored literally rather than evaluated. It does not mention auth/permission requirements, but on balance it adds substantive value.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the purpose statement and mode selection, then organized by step kind with bolded headers. It is long, but nearly every sentence carries operational detail; the worked example is the only section an expert agent could skim.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists so return values need no explanation, yet the description still flags steps_report and variables_added. For a 7-parameter, deeply nested construction tool it covers folder behavior, step wiring, revisions, mappings and validation cross-references — nothing an agent needs is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, yet the description goes well past it: the steps array is free-form (additionalProperties: true) in the schema, and the description supplies the entire step-kind grammar — assignment quoting rules, model id/mappings and output variables, branch range inclusivity and non-overlapping case constraints, condition DS2 expressions, and add_missing_variables default behavior. This is exactly the semantic lift a description should provide.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Create a SAS Intelligent Decisioning flow') and enumerates the step kinds it accepts, which clearly separates it from siblings like update_decision_flow, create_business_ruleset, or create_segmentation_tree. An agent can identify it as the flow-construction tool without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes between the two input modes ('give the flow as steps ... or, as before, rule_set_steps') and cross-references validate_decision_expression, list_registered_models and list_decisioning_assets. It also prescribes the fallback behavior when no default folder exists ('ask the user which folder to use'). Missing is any explicit statement of when to prefer this over update_decision_flow or creating assets individually.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_glossary_termCreate Glossary TermA

Create a business term in the SAS Business Glossary.

attributes is keyed by the attribute labels from get_glossary_term_type — call that first, because a term type can make attributes mandatory and a term missing one is rejected. Pass each value in its natural Python form and it is converted to the one spelling the glossary accepts:

  • boolean — True / False (the strings "true"/"false" are rejected by Viya; that conversion happens here)

  • multi-select — a list, e.g. ["Retail", "Wholesale"]

  • date — "2026-09-04"

  • date-time — "2026-09-04T13:41:24Z"; a bare date or a numeric offset is normalised to UTC rather than rejected

  • time — "15:41:28Z"; seconds and the Z are required, and a numeric offset is converted to UTC rather than dropped

Values are validated before the call, so a mistake comes back naming the attribute and what it expected, instead of as an opaque HTTP 400.

Terms are published by default. The underlying API defaults to creating a draft, which nobody but its author can see; that is almost never what a caller asking to "create a term" means, so this publishes unless publish is set false. A draft is promoted afterwards with update_glossary_term(publish=true), and is visible to list_glossary_terms only under include_drafts.

A term's name must be unique among its siblings (case-insensitively) and differ from its parent's; a clash is rejected, not merged.

NameRequiredDescriptionDefault
nameYesTerm name, max 100 characters, no backslashes.
labelNoDisplay name, if it should differ from ``name``.
publishNoPublish immediately (default true). False leaves a draft, which ``update_glossary_term(publish=true)`` promotes later.
parent_idNoParent term id, to nest this term in the hierarchy.
term_typeYesThe term type — its UUID or its name. Immutable afterwards.
attributesNoCustom attributes keyed by label, e.g. ``{"Scope": "Group", "Used in Risk": True, "Regions": ["EMEA", "APAC"]}``.
definitionNoWhat the term means. The field users read; worth filling in.
descriptionNoShort overview, max 1000 characters.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the minimal annotations, the description discloses major behavioral quirks: attribute values are converted to Viya's accepted spelling, validation fails with attribute-specific errors before the HTTP call, terms are published by default even though the underlying API defaults to draft, and name uniqueness is enforced case-insensitively among siblings. This is far more than the annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with a one-line purpose, then uses bold labels and bullets to organize conversion rules, publish behavior, and uniqueness constraints. Although longer than average, every sentence carries operational information an agent needs to avoid failed calls.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 8 parameters, a custom attributes object, a surprising publish default, and sibling workflow dependencies, the description covers all critical invocation details: prerequisites, value formats, failure behavior, publishing, and uniqueness. An output schema exists, so not restating return values is acceptable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although the input schema has 100% coverage, the description adds important meaning to the attributes parameter by specifying accepted Python forms for booleans, multi-selects, dates, date-times, and times. It also clarifies the publish parameter's default and effect, and explains name uniqueness for the name parameter beyond the schema text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence uses a specific verb and resource: 'Create a business term in the SAS Business Glossary.' The rest of the description refers to term-specific behaviors (term type, attributes, publish) that separate it from sibling tools like create_glossary_term_type and update_glossary_term.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly instructs callers to invoke get_glossary_term_type first because term types can impose mandatory attributes. It also names update_glossary_term(publish=true) for promoting drafts and notes that drafts are visible under list_glossary_terms only with include_drafts, giving clear workflow direction.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_glossary_term_typeCreate Glossary Term TypeA

Create a term type — the template that fixes what a term must carry.

A term type declares the custom attributes every term of that type holds, and which are mandatory. Without this tool a deployment's types can only be created in the SAS UI, so a glossary could be read and populated through MCP but never designed through it.

Each attribute is {"label": ..., "type": ...} plus, optionally, required, allowed_values, default and description:

  • single-line, multi-line — free text

  • single-select, multi-select — need allowed_values

  • boolean, date, date-time, time

The attribute identifiers the API demands are generated here, since it will not mint them itself and rejects the omission with a message that names neither the attribute nor the real problem.

NameRequiredDescriptionDefault
nameYesTerm type name, unique across the deployment.
labelNoDisplay name. Defaults to *name* — the API leaves it empty rather than defaulting it, which shows as a blank in the UI.
attributesNoThe attribute definitions, e.g. ``[{"label": "Scope", "type": "single-select", "allowed_values": ["Local", "Group"], "required": true}]``.
descriptionNoWhat terms of this type are for.
allow_custom_attributesNoLet individual terms add attributes beyond these (default false).

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only carry safety hints; the description adds meaningful behavior: it generates attribute identifiers the API requires, and it warns that the API rejects omission with a vague error. This gives an agent useful insight beyond structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and uses a compact bullet list for attribute types. It is longer than minimal but every section adds necessary detail about the API's expectations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and complete parameter documentation, the description covers the unusual API quirks and design context sufficiently. Minor omissions such as explicit exclusions or edge cases are acceptable given the sibling list and schema richness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers all parameters, so baseline is 3. The description goes further by specifying the valid attribute types, optional attribute keys, and how allowed_values interacts with select types, which clarifies the loosely typed attributes parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence 'Create a term type — the template that fixes what a term must carry' names the exact verb, resource, and purpose. It clearly distinguishes this from sibling tools like create_glossary_term and update_glossary_term_type by explaining that a term type defines attributes every term must hold.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explains the design context, noting that without this tool types can only be created in the SAS UI, so MCP users can design glossaries through it. It doesn't explicitly list when not to use it or name alternatives, but the role is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_lookup_tableCreate Lookup TableA

Create a SAS Intelligent Decisioning lookup table: keys and the value stored for each.

A rule uses it with a condition {"type": "lookup", "term": {...}, "lookup": "<name or ID>"} (is the variable's value a key?) or an action {"type": "lookupValue", "term": {...}, "expression": "<key expression>", "lookup": "<name or ID>"} (assign the key's value).

Rules only see an active version. With activate the table is published to MAS and CAS right away (usually seconds); otherwise call activate_lookup_table once the entries are final.

Keys are text up to 256 characters, values up to 512; numbers are stored as text. Keys must be unique and values not empty — an empty value behaves like a missing key.

NameRequiredDescriptionDefault
nameYesLookup table name.
folderNoWhere to store it: a folder path, ``My Folder``, a folder ID or URI. Omit to use the default folder; if there is none, ask the user.
entriesYes``{"Iran": "High", "Cuba": "High"}``, or a list of ``{"key", "value"}`` objects or ``[key, value]`` pairs.
activateNoPublish the first version right away (default false).
key_labelNoOptional name of the key column, e.g. "Country".
descriptionNoOptional description.
value_labelNoOptional name of the value column, e.g. "Risk level".
wait_secondsNoHow long to wait for activation to finish (max 300).

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations: discloses that rules only see an active version, that activation publishes to MAS and CAS in 'usually seconds', and that wait_seconds governs how long to block. It also surfaces non-obvious validation constraints (key texts up to 256 chars, values up to 512, numbers stored as text, keys unique, empty value behaves like a missing key) that no annotation or schema field conveys.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the core purpose, then layers activation semantics and constraints. Dense but every paragraph carries information; the embedded rule-JSON examples for `lookup` and `lookupValue` are the only portion that could arguably be trimmed for an agent that already knows the ruleset format.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 8-parameter creation tool with annotations and an output schema, this covers purpose, activation lifecycle, and data constraints well; return values need not be explained. It omits failure behavior — e.g. what happens on duplicate keys or name collisions — which an agent creating assets would benefit from knowing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, and the description earns above that by adding real meaning: it explains the runtime consequence of `activate` (MAS/CAS publication) and puts hard limits on the shapes accepted by `entries` and the key/value content. The remaining parameters (folder, key_label, value_label, description) are left entirely to the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb and resource ('Create a SAS Intelligent Decisioning lookup table') and immediately defines what the resource is — keys plus a stored value per key. This distinguishes it clearly from sibling creators like create_value_list, create_business_ruleset, or create_segmentation_tree without needing to inspect any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes on the activation decision: pass `activate` to publish immediately, or 'call activate_lookup_table once the entries are final' — naming the concrete sibling alternative. It does not address the update path (update_lookup_table) or when to prefer a value list instead, so it stops short of full when/when-not coverage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_ml_projectCreate Ml ProjectA

Create a new AutoML pipeline automation project from a CAS table.

The training table must already be loaded into CAS memory at global scope. This tool verifies that first and returns an actionable error otherwise (use promote_table_to_memory to load + promote a source table, and list_source_tables to find one). The data-table URI is built from server_id/caslib_name/table_name.

NameRequiredDescriptionDefault
auto_runNoWhether to automatically run pipelines after creation (default True).
server_idNoCAS server name or ID (default 'cas-shared-default').cas-shared-default
table_nameYesName of the (loaded, global) training table.
caslib_nameYesCaslib containing the training table.
descriptionNoOptional project description.
project_nameYesName for the project.
prediction_typeNo'binary', 'interval', or 'nominal' (default 'binary').binary
target_variableYesName of the target/response variable.
target_event_levelNoTarget event level for binary/nominal classification (default '1').1

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description discloses that the tool verifies table memory scope before proceeding and returns an actionable error otherwise. It also explains how the data-table URI is constructed. This adds meaningful behavioral context that the annotations and schema do not provide. It does not mention the auto_run default side effect, but the core verification behavior is clearly disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: the main purpose appears first, followed by a dense but relevant prerequisite paragraph. Every sentence contributes either purpose, precondition, error behavior, or parameter context. No filler or repetition is present.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 9-parameter creation tool with a full schema and output schema present, the description covers the critical prerequisite, verification behavior, and URI construction. It does not explain the auto_run side effect or the meaning of prediction_type, but the schema already handles parameter definitions. The main gap is the lack of mention that creation may trigger automatic pipeline runs.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all parameters. The description adds extra value by explaining that the data-table URI is built from server_id/caslib_name/table_name and by emphasizing the memory/scope requirement for the table. This helps the agent understand relationships between parameters beyond their individual schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Create a new AutoML pipeline automation project from a CAS table.' This clearly distinguishes the tool from siblings like list_ml_projects, run_ml_project, and other create_* tools. The source is specified as a CAS table, which immediately orients the agent.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states the precondition that the training table must be loaded into CAS memory at global scope, and references promote_table_to_memory and list_source_tables as the relevant helpers. It does not explicitly contrast with list_ml_projects or run_ml_project, but the prerequisite and pointer to alternative preparation tools provide strong when-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_reportCreate ReportA
Destructive

Create a Visual Analytics report and return its id for further edits.

Creates an empty report shell, or — if you pass operations — builds the whole report in one atomic call (bind data, add pages, add objects). Building at creation avoids leaving an empty report behind if a later edit fails. Returns {"status": "created", "id": ..., "name": ...} plus a created summary whose object names/labels are what follow-up placement and exports target; feed the id to apply_report_operations to keep editing. Note: VA prepends an empty default "Page 1" before any pages your operations add, so verify page-by-page with export_report (see the result's verify_hint) rather than a whole-report export.

NameRequiredDescriptionDefault
nameYesReport name (``resultReportName``). Must be unique in the folder unless ``on_conflict`` resolves it.
folderNoOptional target folder URI (``resultFolder``); omit for the caller's My Folder.
operationsNoOptional native operations array to apply at creation, in the same shape ``apply_report_operations`` takes. Call ``describe_report_objects`` for the operation and object formats.
on_conflictNoName-conflict policy — ``rename`` (default), ``abort``, or ``replace``.rename

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds meaningful behavioral details beyond the annotations: the atomic creation behavior, the empty default 'Page 1' prepended before operations, and the created summary carrying object names/labels that follow-up placement and exports target. These are non-obvious side effects an agent needs to know. It does not contradict the destructiveHint or readOnlyHint annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but well-structured, front-loading the core purpose and then layering in return semantics, behavioral caveats, and verification guidance. A few details are repeated or could be trimmed given the output schema exists, but every sentence adds functional value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with four parameters, an output schema, and a destructiveHint annotation, the description covers all the important operational aspects: creation modes, atomicity, default page behavior, return shape, follow-up editing, and verification guidance. There are no critical gaps that would prevent an agent from invoking it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds value beyond the schema by explaining that operations can 'bind data, add pages, add objects' and are applied atomically at creation, which clarifies the operations parameter's role versus using apply_report_operations later. It also frames the result as an empty shell when operations are omitted.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Create a Visual Analytics report') and a concrete deliverable ('return its id for further edits'), distinguishing it clearly from sibling tools like list_reports, get_report, and delete_report. It also clarifies the two creation modes: an empty shell or a full atomic build via operations.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells the agent to feed the returned id to apply_report_operations for further editing, and to verify page-by-page with export_report rather than a whole-report export. It also explains when the operations parameter is preferable, namely to avoid leaving an empty report behind if later edits fail.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_segmentation_treeCreate Segmentation TreeA

Create a SAS Intelligent Decisioning segmentation tree.

A node tests one variable; its valueNodes are checked in order and the first match wins, then goes to next (another node) or to an outcomeName. A value is a value, several separated by ; ("A;B"), a comparison (">=630"), a range with v ("600<=v<630"), or "Other" for everything else, missing values included. Example::

node = {"variable": "score", "valueNodes": [
    {"value": ">=630", "outcome": "low_risk"},
    {"value": "Other", "outcome": "high_risk"}]}
outcomes = [{"name": "low_risk", "assign": {"band": "LOW"}},
            {"name": "high_risk", "assign": {"band": "HIGH"}}]

An outcome assigns with assign (variable to value) or runs DS2 statements with code. To build a large tree from a strategy table, use create_segmentation_tree_from_table.

NameRequiredDescriptionDefault
nameYesTree name.
nodeYesThe root node.
folderNoWhere to store the tree: a folder path, ``My Folder``, a folder ID or URI. Omit to use the default folder; if there is none, ask the user.
matricesNoMatrix definitions, for nodes of type matrix.
outcomesNoThe outcomes the value nodes lead to.
signatureYesEvery variable the tree tests or assigns, each ``{"name", "dataType", "direction"}`` — dataType string, decimal, integer, date, datetime or boolean; direction input, output or inOut. Add ``valueListId`` / ``valueListContentId`` to tie a variable to a value list.
code_filesNoInternal code files ``{"name", "type": "internal", "code"}``.
descriptionNoOptional description.
boolean_expressionsNoNamed DS2 conditions, ``{"name", "expression"}``, for nodes of type booleanExpression (value nodes "true" / "false").

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare this is a non-read-only, non-destructive, non-idempotent create. The description adds real behavioral substance: how nodes evaluate (first match wins, then ``next`` or ``outcomeName``), how values are parsed, and that outcomes either assign or run DS2 code. It doesn't state what happens on name collisions or failure modes, keeping it at 4.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded, then structural semantics, then a compact example, then the sibling routing — a sensible order. The value-syntax sentence and example are dense but earn their space; a little of the prose could be trimmed without loss.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 9-parameter create with nested objects, the description covers the hardest parts (node tree traversal, value syntax, outcomes, folder default behavior). Secondary params like matrices, code_files, and boolean_expressions rely on their schema descriptions, and an output schema exists, so the residual gap is small.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but the critical nested objects (`node`, `outcomes`, `matrices`) are only `additionalProperties: true` in the schema — the description supplies the actual shape, value mini-language, and a concrete worked example. That is meaningfully beyond what the schema conveys.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb+resource: "Create a SAS Intelligent Decisioning segmentation tree." That immediately distinguishes it from update_segmentation_tree and from create_segmentation_tree_from_table, which is named later as the alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes large, table-driven trees to create_segmentation_tree_from_table, which is the key selection decision an agent faces here. It stops short of full when/when-not guidance (e.g. no mention of prerequisites, permissions, or duplicate-name behavior), so 4 rather than 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_segmentation_tree_from_tableCreate Segmentation Tree From TableA

Build one segmentation tree from a strategy table: one row per branch, a column per decision key.

This is how a FICO-style strategy export (TRIAD, Blaze) becomes a SAS Intelligent Decisioning tree. Decision keys are tested in the order of key_columns; a key whose values do not differ within a subtree is not tested there. Each leaf leads to an outcome that assigns the row's outcome_columns.

With split="lower_bound" a key's value is the lower bound of a range, as such exports write it: sibling values 0, 600, 630 become >= 630, 600 to < 630 and, for the lowest, Other (missing values included). With split="exact" each distinct value is its own branch.

The table comes from exactly one of rows (inline, small tables), file_path (a CSV the server reads, gated by ALLOW_LOCAL_FILE_UPLOAD) or caslib_name + table_name (a CAS table — load an Excel sheet with upload_data first). Repeated column names in a CSV get _2, _3.

The result reports what was built — leaves, split nodes, outcomes, and rows whose path is identical but whose outcome differs (conflicts) — not the tree itself, which can be hundreds of kilobytes.

NameRequiredDescriptionDefault
nameYesTree name.
rowsNoInline rows, each an object of column to value.
splitNo"lower_bound" (range lower bounds) or "exact" (values).lower_bound
folderNoWhere to store the tree (and value lists): a folder path, ``My Folder``, a folder ID or URI. Omit to use the default folder; if there is none, ask the user.
file_pathNoA CSV file the server reads.
server_idNoCAS server (default cas-shared-default).cas-shared-default
table_nameNoThe CAS table.
caslib_nameNoCaslib of a CAS table to read.
descriptionNoOptional description.
key_columnsYesDecision key columns in strategy order. A column name, or ``{"column": ..., "variable": ...}`` to name the tree variable; two columns may test the same variable (a key that appears twice in the strategy).
outcome_typesNoData type per outcome column, overriding the one inferred from the values: ``{"Scenario Group": "string"}``. Types must match the decision variables the tree is mapped to.
outcome_prefixNoPrefix of outcome names (default: the first outcome column).
outcome_columnsYesColumns the leaves assign, e.g. ["Scenario ID", "Scenario Group"].
row_label_columnNoColumn that identifies a row in the report, e.g. the branch number.
create_value_listsNoAlso create a value list per tested variable, holding the conditions its nodes use, and tie the variable to it.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare the non-read-only, non-destructive, non-idempotent posture; the description adds real behavior: the source is exactly one of rows/file_path/caslib+table, local file reads are gated by an env flag, duplicate CSV headers become _2/_3, and the response reports counts and conflicts rather than the (potentially huge) tree. No auth or rate-limit context, but the disclosure goes well beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the one-line purpose, then layered paragraphs for split semantics, source selection, and the return summary. Four paragraphs for 15 parameters is justified, though the split paragraph could be tighter and repeats some field-level detail already in the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 15-parameter, 3-required builder tool this covers what an agent actually needs: which source to supply, how to pre-stage Excel, the default-folder caveat ('if there is none, ask the user'), and that the response is a summary, not the tree. The output schema carries the rest.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description earns above that by stating the mutual-exclusivity rule between the three source modes and by explaining how key_columns order drives testing and how lower_bound vs exact reshape branch values in ways the enum alone does not convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb+resource with scope: 'Build one segmentation tree from a strategy table: one row per branch, a column per decision key.' The 'from table' framing plus the FICO/TRIAD/Blaze export context implicitly separates it from create_segmentation_tree, but that sibling is never named, so the agent must infer the split.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Says when this applies ('This is how a FICO-style strategy export (TRIAD, Blaze) becomes a SAS Intelligent Decisioning tree') and routes to two prerequisites — upload_data for Excel sheets and the ALLOW_LOCAL_FILE_UPLOAD gate for CSV. It does not state when to prefer create_segmentation_tree instead, which is the main remaining ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_value_listCreate Value ListA

Create a value list: the values (or ranges) a variable is compared with.

Segmentation tree variables and rule conditions offer a value list's entries. A numeric entry may be a range written with v: "v>=630", "600<=v<630", "v<600".

NameRequiredDescriptionDefault
nameYesValue list name.
folderNoWhere to store it: a folder path, ``My Folder``, a folder ID or URI. Omit to use the default folder; if there is none, ask the user.
entriesYesEntries as strings, or ``{"key", "label"}`` objects.
data_typeNo"character" or "numeric".character
descriptionNoOptional description.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already disclose that this is a non-read-only, non-destructive, non-idempotent, closed-world mutation, so the bar is lower. The description adds useful entry semantics and numeric range syntax, but does not address uniqueness constraints, permissions, or what happens on duplicate names.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three compact sentences, front-loaded with the action and resource. The definition and range syntax each earn their place with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists and parameter descriptions are complete, so the description needn't explain return values. It covers the core concept and entry syntax but omits sibling routing, which is a minor gap for a create tool with clear schema support.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so baseline is 3. The description goes beyond the schema by explaining that entries are values or ranges and by documenting the 'v>=630' range syntax, which is meaningful for the 'entries' parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a clear verb and resource ('Create a value list') and explains what a value list is. It does not explicitly distinguish this tool from close siblings such as create_lookup_table or update_value_list_entries, so it falls short of the top score.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description mentions domain context (segmentation tree variables and rule conditions) but gives no explicit guidance on when to use this tool versus alternatives like update_value_list_entries or create_lookup_table. No exclusions or prerequisites are stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_business_ruleDelete Business RuleA
DestructiveIdempotent

Permanently delete a rule from a SAS Business Rules rule set.

NameRequiredDescriptionDefault
rule_idYesThe rule UUID to delete.
ruleset_idYesThe parent rule set UUID (not its name — list_business_rulesets returns both).

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint and idempotentHint. The description adds 'Permanently' to reinforce irreversibility and narrows the target to a single rule within a rule set, but does not disclose additional behavior such as effect on the parent rule set or response on repeated deletes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single focused sentence with the action and object front-loaded; no filler or repetition of structured fields.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple two-parameter delete operation, the description, 100% schema coverage, idempotent/destructive annotations, and presence of an output schema cover the essentials. A brief note on prerequisite existence or effect on the ruleset would round it out, but nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and both parameters already have clear descriptions, including the important guidance that ruleset_id expects a UUID, not a name. The tool description itself adds no parameter information beyond what the schema provides, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific action ('Permanently delete') and a specific resource ('a rule from a SAS Business Rules rule set'), clearly distinguishing it from sibling tools like delete_business_ruleset or update_business_rule.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool should be used when a rule must be permanently removed, and 'permanently' signals irreversibility, but it does not explicitly contrast with update/get/list alternatives or state any prerequisites or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_business_rulesetDelete Business RulesetA
DestructiveIdempotent

Permanently delete a SAS Business Rules rule set.

Only call this once the rule set is confirmed unused by any decision flow — deleting a rule set still referenced by a decision fails.

NameRequiredDescriptionDefault
ruleset_idYesThe rule set UUID to delete (not its name — list_business_rulesets returns both).

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as destructive and non-read-only; the description adds meaningful context by stating the deletion is permanent and that deletion of a referenced ruleset fails. This goes beyond the structured annotations without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no filler. The primary action is stated first, and the crucial warning is placed immediately afterward. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter destructive operation with annotations and an output schema, the description adequately covers the critical precondition and failure mode. An agent can correctly decide whether to call this tool or first verify decision-flow references.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% description coverage, including a clear explanation that ruleset_id is a UUID and not a name. The tool description itself adds no additional parameter-level detail, so the high schema coverage justifies the baseline score of 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'delete' and the specific resource, 'SAS Business Rules rule set,' which distinguishes it from siblings like delete_business_rule and delete_decision_flow. The phrase 'Permanently delete' makes the action unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives an explicit precondition: only call once the rule set is confirmed unused by any decision flow, and it warns that deletion fails if still referenced. It does not name specific sibling tools to use for checking dependencies, so it stops short of full alternative guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_decision_flowDelete Decision FlowA
DestructiveIdempotent

Permanently delete a SAS Intelligent Decisioning flow.

NameRequiredDescriptionDefault
decision_idYesThe decision flow UUID to delete (not its name — list_decision_flows returns both).

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=true, so the description needs to add value beyond that. The word 'permanently' clarifies that deletion is irreversible rather than a soft delete or trash operation, and the parameter note '(not its name)' discloses that supplying a name will not work — both are genuine behavioral facts not present in the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single eight-word sentence with the action front-loaded, and the parameter description packs three pieces of guidance into one compact sentence. There is no filler, repetition of schema details, or redundant phrasing.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter tool with full annotations (destructive, idempotent, read-only), an existing output schema, and a parameter description covering the main pitfall (UUID vs name), the definition is nearly complete. The only gap is unspecified cascade behavior, such as whether revisions or publish state affect deletion, which would be nice but is not essential at this complexity level.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The decision_id description goes beyond a simple field label by specifying the required format (UUID), stating a negative constraint (not its name), and naming the sibling tool that returns both identifiers. This materially helps an agent invoke the tool correctly on the first attempt.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Permanently delete a SAS Intelligent Decisioning flow.' The qualifier 'permanently' adds meaningful nuance beyond a generic delete, and the resource is precise enough to distinguish this from sibling deletes like delete_business_ruleset, delete_glossary_term, and delete_report.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The main description gives no explicit when-to-use or when-not-to-use direction. However, the decision_id parameter description supplies indirect usage guidance by clarifying that a UUID is required, not a name, and pointing to list_decision_flows as the discovery path. This covers the prerequisite but omits exclusions such as alternatives for reversible deletion or interaction with lock/publish states.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_decisioning_assetDelete Decisioning AssetA
DestructiveIdempotent

Permanently delete a piece of decisioning content and all its revisions.

Something still in use — a rule set or code file a decision references, a category that still holds functions — is refused by Viya. A lookup table that rule sets use is refused here, naming them: Viya would delete it and leave those rules invalid.

NameRequiredDescriptionDefault
asset_idYesThe ID to delete.
asset_typeYesrule_set, decision, segmentation_tree, code_file, value_list, lookup_table, custom_function or function_category.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations' destructiveHint, the description discloses that all revisions are destroyed, that referential-integrity checks cause Viya to refuse the delete in several distinct cases, and that a lookup table referenced by rule sets is rejected with the blocking rule sets named. This is exactly the non-obvious behavior an agent needs before attempting a destructive call.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The destructive scope is front-loaded in the first sentence and the refusal semantics follow. The final sentence is slightly convoluted ('refused here, naming them: Viya would delete it and leave those rules invalid') but every sentence carries distinct information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema available and full schema coverage, the description need not explain return values, and it adequately covers destruction scope and refusal conditions. The remaining gap is how to obtain a valid asset_id and how this differs from the sibling delete tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the asset_type enum enumerates every valid value, so the schema carries parameter meaning on its own. The description adds no syntax, format, or ID-discovery guidance beyond what the schema already documents, making the baseline 3 appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource — permanently delete a piece of decisioning content and all its revisions — which tells an agent exactly what is removed. It does not, however, distinguish this from near-name siblings such as delete_business_ruleset, delete_business_rule, or delete_decision_flow, so the boundary between 'decisioning asset' deletion and those targeted deletes must be inferred.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied: you call this to permanently remove a decisioning asset. The description is rich on when the call will be refused (in-use rule sets, code files, non-empty function categories, referenced lookup tables) but gives no explicit guidance on when to prefer this tool over the more specific delete_* siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_glossary_termDelete Glossary TermA
DestructiveIdempotent

Permanently delete a business term.

The term goes, and with it every assignment to a column that referenced it — the data keeps its columns but loses the documented meaning. Check list_term_assets first: a term with assigned assets is in use.

There is no cascade. A term that has children cannot be deleted at all: the glossary refuses with Cannot delete a term/draft with existing children. Delete the subtree leaf-first — list a term's children with list_glossary_terms(parent_id=...) — or re-parent them with update_glossary_term before deleting this one.

NameRequiredDescriptionDefault
term_idYesThe glossary term UUID.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the destructiveHint and idempotentHint annotations, the description discloses concrete side effects: assignments to columns are removed while columns remain, there is no cascade, and the existence of children is a hard block with an exact error message. This is exactly the behavioral context an agent needs before invoking a destructive tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core action and then organizes caveats in a clear order: impact, precondition check, no-cascade rule, and remediation steps. The longer length is justified because every sentence conveys a distinct, decision-relevant fact for a destructive operation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter destructive tool, the description covers side effects, prerequisites, failure modes, error text, and workarounds. The output schema exists, so return value documentation is not required, and the description leaves no material gap for an agent to invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the only parameter term_id is already described as 'The glossary term UUID.' The description does not add new meaning about how to obtain or format term_id, but it also does not need to; the schema carries the required semantic weight.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence uses a specific verb and resource: 'Permanently delete a business term.' This clearly distinguishes the tool from sibling glossary operations such as delete_glossary_term_type and update_glossary_term, while the rest of the description reinforces that it operates on a term and its assignments.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use and when-not-to-use guidance: check list_term_assets before deleting because a term with assigned assets is in use, and do not attempt deletion when the term has children ('cannot be deleted at all'). It also names actionable alternatives: delete the subtree leaf-first via list_glossary_terms(parent_id=...) or re-parent with update_glossary_term.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_glossary_term_typeDelete Glossary Term TypeA
DestructiveIdempotent

Delete a term type.

Refuses while terms still use the type, because deleting it takes their attribute definitions with it. Check with list_glossary_terms (term_type=) and move or delete those terms first — or pass force if you have already decided.

NameRequiredDescriptionDefault
forceNoDelete even though terms use this type (default false).
term_type_idYesThe term type UUID, or its name.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (destructiveHint=true, readOnlyHint=false), the description discloses a key behavioral consequence: deleting the type takes the attribute definitions of terms using it with it. It also reveals that the tool refuses by default and only proceeds with force, which is not obvious from the annotations alone.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: it states the core action first, then adds necessary caveats and instructions in just three sentences. Every sentence earns its place; there is no redundant content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive tool with two parameters and full schema coverage, the description is complete enough. It explains the refusal behavior, the destructive side effect, the recommended prerequisite check, and the force option. The output schema is available, so return values do not need to be described.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already provides 100% coverage for both parameters, including clear descriptions for term_type_id and force. The description adds context around force (passing it when you have already decided), but it largely duplicates the schema's semantic content rather than introducing new meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with the specific action and resource: 'Delete a term type.' This clearly distinguishes it from sibling tools like delete_glossary_term (which deletes a term, not a term type) and from create/update glossary term type tools. It leaves no ambiguity about what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states when the tool will refuse (while terms still use the type), what to do instead (check with list_glossary_terms and move/delete those terms first), and when to use the force parameter (if you have already decided). This provides actionable guidance and clears up the main decision point for using the tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_reportDelete ReportA
DestructiveIdempotent

Delete a Visual Analytics report and its content.

There is no per-object undo in the report API, so deleting and rebuilding (or copying first) is how you discard an unwanted report. Returns {"status": "deleted", "report_id": ...} (or not_found / delete_failed).

NameRequiredDescriptionDefault
report_idYesThe report id to delete.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as destructive and idempotent. The description adds useful context beyond that: it deletes the report's content, there is no per-object undo, and the API returns specific statuses like not_found and delete_failed. This enriches the behavioral model without contradicting annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core action, followed by only the most decision-relevant behavioral details: no undo, copy-first workaround, and return statuses. Every sentence adds value and nothing is redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter destructive tool, the description covers the scope of deletion, irreversibility, a practical workaround, and expected return states. With annotations providing destructiveness/idempotency and an output schema available, an agent has enough context to invoke this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The sole parameter report_id is already fully described in the input schema with 100% schema description coverage. The description does not add extra meaning to the parameter itself, which is acceptable since the schema provides sufficient semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the specific verb-resource pair: 'Delete a Visual Analytics report and its content.' This aligns with the tool name and distinguishes it from other sibling delete tools (e.g., delete_decision_flow, delete_business_ruleset, delete_glossary_term) by explicitly targeting reports.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear usage context by noting there is no per-object undo, and suggests deleting and rebuilding or copying first as the way to discard an unwanted report. It implies copy_report as an alternative for preservation but does not explicitly name it or define exclusion conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

describe_report_objectsDescribe Report ObjectsA
Read-onlyIdempotent

Discover what a Visual Analytics report can contain — operations and objects.

Call this to learn how to build a report before calling apply_report_operations. It reads a bundled catalog (no network), so it is the cheap way to look up an object's data roles instead of guessing.

NameRequiredDescriptionDefault
categoryNoRestrict the catalog to one category.
operationNoAn operation key (e.g. ``"addData"``, ``"applyDataView"``) for its full shape, example, and notes.
object_typeNoA schema key (e.g. ``"barChart"``, ``"scatterPlot"``) or colloquial alias for its contract and example.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the tool read-only, idempotent, and non-destructive. The description adds useful behavioral context: it reads a bundled catalog with no network access, making it a cheap and reliable lookup. This goes beyond the structured annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: the core purpose appears in the first sentence, and the usage guidance follows in the second. Every sentence earns its place with no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers what the tool does, when to use it, how it behaves, and why it is preferable in this situation. Combined with full schema descriptions and an output schema, nothing essential is missing for an agent to select and invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and each parameter already has a meaningful description with examples. The tool description does not need to restate parameter-level details, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states what the tool does: discover what a Visual Analytics report can contain—operations and objects. It uses a specific verb and resource, and distinguishes itself from apply_report_operations, making its purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says to call this before apply_report_operations to learn how to build a report, and frames it as the cheap way to look up data roles instead of guessing. This gives the agent a clear selection rule relative to a key sibling tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

download_fileDownload FileA
Read-onlyIdempotent

Download file content from the Viya Files Service.

NameRequiredDescriptionDefault
file_idYesID of the file to download.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds that the tool returns file content, but does not disclose additional behavioral details such as response format, size limits, or authentication needs. With annotations present, this is adequate but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, focused sentence with no wasted words. It front-loads the action and clearly states the resource context.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a simple tool with one required parameter, complete schema coverage, rich annotations, and an output schema. The description sufficiently conveys the operation for an agent to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single parameter file_id is already described as 'ID of the file to download.' The description adds no semantic meaning beyond what the schema provides, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Download file content from the Viya Files Service.' This clearly identifies the action and the object, distinguishing it from list_files and upload_file, though it does not explicitly name those alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description offers no guidance on when to use this tool versus alternatives such as list_files or upload_file. There is no mention of exclusions, prerequisites, or conditions under which a different tool should be selected.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

execute_sas_codeExecute Sas CodeA
Destructive

Executes the provided SAS code in the Viya environment and returns information about the completed Job. This will create a job definition for the SAS code, execute it, and then retrieve the results.

IMPORTANT — state persists between calls: the code runs in a reusable compute session that is kept warm and shared across calls (per user), so SAS state — WORK tables, macro variables, and assigned librefs — survives between successive execute_sas_code calls. A re-run can therefore see leftovers from earlier calls (e.g. a check that counts results twice). Pass fresh_session=True (or call reset_compute_session) when the code must start from a clean slate.

Tip: to reach CAS data, prefer libname casuser cas; (or a targeted caslib statement) over caslib _all_ assign; — on tenants with many caslibs the latter floods the log with assignment NOTEs.

NameRequiredDescriptionDefault
sas_codeYesthe SAS code snippet to be executed using the Viya Job Execution API Service
html_resultsNoWhen True (the default), the output is also written as an HTML page, as SAS Data and AI Studio shows it, graphs included, and saved so the person can open it in a browser. The code runs between an ``ods html5`` statement and its close, preceded by ``;*';*";*/;run;quit;`` so that an unterminated statement or quote cannot swallow the close; neither appears in the log. Pass False to submit the code exactly as given.
fresh_sessionNoWhen True, discard any cached compute session first so the code runs with no inherited SAS state (equivalent to calling ``reset_compute_session`` immediately before).

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond annotations by disclosing a major non-obvious behavior: SAS state (WORK tables, macro variables, librefs) persists across calls via a warm per-user session, so re-runs can see leftovers. It also explains the html_results wrapping behavior. This is exactly the behavioral context annotations cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose is front-loaded, the state-persistence warning is called out as IMPORTANT, and the CAS tip closes it out. Everything earns its place, though the CAS log-flooding tip is somewhat tangential to core use and adds length.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need no explanation. The description covers the execution workflow, session/state semantics, the fresh_session escape hatch, and a practical CAS access tip — an agent has everything needed to call this correctly and safely.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema descriptions are already detailed (html_results ODS wrapping, fresh_session discard behavior). The description supports the fresh_session semantics with the state-persistence rationale but adds no new parameter-level detail beyond what the schema provides, so baseline 3 is correct.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Executes the provided SAS code in the Viya environment') and further clarifies the internal workflow (create job definition, execute, retrieve results). This clearly distinguishes it from siblings like submit_batch_job or query_data, which do different unit-of-work things.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit conditions for fresh_session (start from clean slate) and names the alternative reset_compute_session, plus a preference for libname casuser over caslib _all_. It stops short of comparing itself against other code-execution siblings, but the when-to-use/reset guidance is substantive.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

export_reportExport ReportA
Read-onlyIdempotent

Export a Visual Analytics report (or specific report objects) in any format the VA service exposes, via its synchronous export endpoints.

Formats (export_format):

  • package — full report bundle as a .zip (source files, query results, and rendered content); whole report or selected objects.

  • pdf — rendered PDF; whole report or selected objects. Pass rendering overrides (e.g. orientation, paperSize, margin, includeCoverPage) via options.

  • png / svg — image of the report or a single object; image_size is required, e.g. "1200px,800px".

  • csv / tsv / xlsx — the data behind a single report object; exactly one object label is required.

  • summary — the report's text summary.

NameRequiredDescriptionDefault
optionsNoOptional ``pdf`` rendering overrides, passed through as query parameters (e.g. ``{"orientation": "landscape"}``).
report_idYesID of the report.
image_sizeNoRequired for ``png``/``svg``; format ``"<w>px,<h>px"``.
export_formatYesOne of package, pdf, png, svg, csv, tsv, xlsx, summary.
report_objectsNoReport object labels to export. ``package``/``pdf`` accept several; image and data formats accept exactly one; ``summary`` accepts none. Omit to export the whole report where the format allows it.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish readOnly, idempotent, and non-destructive behavior. The description adds further useful behavioral context: it notes synchronous export endpoints, explains what each format produces (e.g., package bundles source files and query results), and documents pass-through options for PDF rendering. This goes beyond the annotations without contradicting them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and then organized into a compact, scannable format list. Every line conveys necessary operational detail, and the bullet structure makes format-specific rules easy to parse without unnecessary prose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, the description could more explicitly state what the caller receives back (e.g., binary file content, download URL, or saved artifact). However, it covers the format-specific input constraints thoroughly and describes the exported artifacts well enough that an agent can invoke the tool correctly for most cases.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already describes all parameters at 100% coverage, and the description substantially enriches that meaning by tying each export_format value to the exact parameter requirements: package/pdf accept multiple objects, png/svg require image_size, csv/tsv/xlsx require exactly one object, and summary accepts none. This is high-value semantic guidance beyond the raw schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('Export a Visual Analytics report') and resource ('report or specific report objects'), and enumerates the supported formats. It clearly differentiates this from siblings like list_reports and get_report, which manage or inspect reports rather than export their content.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly conveys when to use the tool for exporting report content in various formats, and even specifies per-format constraints such as image_size for png/svg and exactly one object for data formats. It does not explicitly name alternative tools or state exclusions, but the export-focused purpose is unambiguous relative to the listed siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_folderFind FolderA
Read-onlyIdempotent

Look up a SAS Content folder and return its ID, URI, name and full path.

Use it to confirm a folder the user named before storing something there, or to turn a path into the folder URI that upload_file and the deployment's MCP_DEFAULT_FOLDER setting take. The tools that create rule sets and decisions accept a path directly, so they do not need this first.

NameRequiredDescriptionDefault
folderYesA folder path such as ``/Public/Content/Decisions``, ``My Folder`` (or a folder below it, ``My Folder/Risk``), a folder ID, or a folder URI (``/folders/folders/<id>``).

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds useful behavioral context about the tool's role as a resolver whose output feeds upload_file or MCP_DEFAULT_FOLDER, but it says nothing about failure behavior when a folder name is ambiguous or absent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences with the purpose front-loaded and no filler; every sentence contributes either the return values, a use case, or an exclusion.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description needn't explain return values, and annotations cover safety. What remains unaddressed is only edge behavior (not-found or multiple-match results), a minor gap for a single-parameter lookup tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the folder parameter already documents all accepted forms (path, folder name, ID, URI). The description only restates the path-to-URI conversion, so it adds little beyond the schema; baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('look up a SAS Content folder') and enumerates the return values (ID, URI, name, full path). It also names the siblings it relates to (upload_file, rule set / decision creation tools), so an agent can place it precisely in the toolset.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives two concrete trigger conditions — confirming a user-named folder before storing something there, and converting a path into a folder URI — plus an explicit when-not: rule set and decision creation tools take a path directly, so this lookup is unnecessary for them. That is a full when/when-not/alternative triad.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_business_ruleGet Business RuleA
Read-onlyIdempotent

Fetch a single rule's definition from a SAS Business Rules rule set.

NameRequiredDescriptionDefault
rule_idYesThe rule UUID.
ruleset_idYesThe parent rule set UUID (not its name — list_business_rulesets returns both).

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description reinforces the read-only nature ('Fetch') but adds no extra behavioral detail such as not-found behavior or version handling, which is acceptable given the annotation coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence that states the action, target, and scope with no filler or repetition. It is concise yet fully informative.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has only two required string parameters, full parameter descriptions, strong safety annotations, and an output schema. The description provides enough context for an agent to select and invoke the tool correctly; no critical information is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%; both parameters have clear descriptions (rule_id is the rule UUID, ruleset_id is the parent ruleset UUID and not its name). The description adds no parameter-level meaning beyond what the schema already provides, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Fetch') and resource ('a single rule's definition') scoped to 'a SAS Business Rules rule set.' This clearly differentiates it from list_business_rules (plural/list) and get_business_ruleset (ruleset-level read).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context: the tool is for retrieving exactly one rule definition from a ruleset. It doesn't explicitly name alternatives like list_business_rules, but the singular 'rule' wording and the ruleset scope make the intended use case evident without ambiguity.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_business_rulesetGet Business RulesetA
Read-onlyIdempotent

Fetch a single SAS Business Rules rule set by ID.

NameRequiredDescriptionDefault
ruleset_idYesThe rule set UUID (not its name — list_business_rulesets returns both).

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is fully covered. The description adds little behavioral context beyond 'single' and 'by ID,' but it does not contradict the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no filler. Every word contributes to stating what the tool does.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter, read-only, idempotent fetch operation with an output schema present and strong annotations, the description plus schema is fully sufficient for an agent to call the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema has 100% description coverage for the single parameter and clearly explains that ruleset_id is a UUID, not a name, and that list_business_rulesets returns both. The description itself adds no additional parameter meaning, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Fetch') with a clear resource ('a single SAS Business Rules rule set') and the retrieval criterion ('by ID'). This distinguishes it from list_business_rulesets (which lists many) and from get_business_rule (which fetches a rule, not a rule set).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is used when you already have the rule set UUID and want a single rule set, and the parameter description notes that list_business_rulesets returns both names and UUIDs. However, the main description does not explicitly state when to use this tool versus alternatives like get_business_rule or list_business_rulesets.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_castable_columnsGet Castable ColumnsA
Read-onlyIdempotent

Get column metadata for a CAS table (names, types, labels, formats).

A missing table returns a structured not_found with the two usual causes (unloaded source table vs session-scoped table) instead of a raw HTTP error.

NameRequiredDescriptionDefault
limitNoMaximum columns to return (default 200).
server_idYesCAS server name or ID.
table_nameYesName of the table.
caslib_nameYesName of the caslib.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds valuable behavioral context by explaining that a missing table returns a structured not_found with the two usual causes instead of a raw HTTP error, which is genuinely useful for an agent handling failures.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded with the core purpose. The first sentence states exactly what the tool does, and the second adds a meaningful error-behavior note. No filler or redundancy is present.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the read-only annotations, fully documented parameters, and presence of an output schema, the description covers the essential operational behavior well, including the missing-table edge case. It could be more complete by naming alternatives or clarifying when to prefer this over the similarly named column/table tools, but nothing critical is missing for calling the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all parameters clearly. The description adds no additional parameter-level meaning beyond framing the operation as column metadata retrieval; it does not explain relationships, formats, limits, or edge cases for server_id, caslib_name, or table_name.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb ('Get'), the resource ('column metadata for a CAS table'), and the specific fields returned ('names, types, labels, formats'). This is more precise than the bare title and distinguishes it from data-returning tools like get_castable_data, though it does not explicitly differentiate from sibling tools such as list_compute_columns.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no explicit guidance on when to use this tool versus alternatives like list_compute_columns, list_castables, or get_castable_info. There are no prerequisites, exclusions, or conditional routing hints; the usage context is only implied by the tool's purpose.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_castable_dataGet Castable DataB
Read-onlyIdempotent

Fetch rows from a CAS table with column names.

NameRequiredDescriptionDefault
limitNoMaximum rows to return (default 100).
startNoRow offset (default 0).
server_idYesCAS server name or ID.
table_nameYesName of the table.
caslib_nameYesName of the caslib.

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds little behavioral context beyond 'Fetch rows,' and does not discuss pagination behavior, limits, or output structure, but it does not contradict annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single concise sentence with no filler or repetition. It front-loads the core action clearly, though it could usefully mention pagination or the distinguishing data-returning nature relative to sibling tools.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has an output schema, comprehensive parameter schema, and supportive annotations, so many operational details are already structured. However, given the large sibling list with similar get_castable and query tools, the description is too sparse to fully disambiguate tool selection.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so every parameter is already documented with type, requirement, and meaning. The description adds no additional parameter-level detail beyond what the schema provides, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Fetch rows from a CAS table with column names.' This clearly indicates the tool retrieves data rather than metadata. It does not explicitly differentiate itself from close siblings like get_castable_columns or query_data, so it falls short of a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description offers no guidance on when to choose this tool over alternatives such as get_castable_columns, get_castable_info, list_castables, or query_data. It does not mention exclusions, prerequisites, or preferred contexts, leaving the selection decision to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_castable_infoGet Castable InfoA
Read-onlyIdempotent

Get metadata for a CAS table (row count, column count, size, etc.).

NameRequiredDescriptionDefault
server_idYesCAS server name or ID.
table_nameYesName of the table.
caslib_nameYesName of the caslib.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description aligns with the annotations (readOnlyHint=true, idempotentHint=true, destructiveHint=false) by presenting a non-destructive read operation. It adds useful behavioral context by specifying the kind of metadata returned, such as row count and size, without contradicting any annotation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, scannable sentence that front-loads the core purpose ('Get metadata') and immediately includes concrete output examples. Every word contributes value, and there is no redundant restating of the tool name or title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only metadata lookup, the description is complete. The annotations declare safety, the schema documents all required parameters, and an output schema exists, so the description does not need to explain return values or side effects.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already provides 100% description coverage for all three parameters (server_id, table_name, caslib_name). The tool description does not add further parameter-level meaning, but the baseline of 3 is appropriate since the schema carries the semantic burden.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Get'), a resource ('metadata for a CAS table'), and concrete examples ('row count, column count, size'). This clearly distinguishes it from sibling tools like get_castable_data or get_castable_columns, which retrieve table contents or column definitions rather than metadata.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use the tool: when you need table-level metadata rather than actual data or column lists. However, it does not explicitly name alternatives like get_castable_columns, get_castable_data, or list_castables, nor does it state when not to use this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_compute_table_dataGet Compute Table DataA
Read-onlyIdempotent

Fetch rows from a table in a SAS library, with column names.

The compute-tier counterpart of get_castable_data: a plain page of rows from libref.table as the session sees it, read through the compute session's data API rather than by running SQL. Values arrive formatted the way SAS displays them (dates as text, numbers with their format applied), which is what a person browsing a table expects; use query_data with target='compute' when you need raw numerics, a WHERE clause, or a join.

Runs in the reusable per-user compute session for the context, so WORK tables from earlier execute_sas_code calls are visible.

NameRequiredDescriptionDefault
limitNoMaximum rows to return (default 100).
startNoRow offset for paging (default 0).
table_nameYesThe table within the library.
library_nameYesThe libref, e.g. ``WORK`` or ``SASHELP``.
compute_context_nameYesName of the compute context (see list_compute_contexts).

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnly, idempotent, and non-destructive, and the description enriches beyond that: it works through the compute session's data API (not SQL), formats values as SAS displays them, and exposes WORK tables from prior execute_sas_code calls. These are behavioral specifics that no annotation carries.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with a concise one-line purpose, then two tightly written paragraphs that earn their place: one differentiates from siblings and states the trade-offs, the other clarifies session semantics. No filler or repeated schema content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only paginated fetch tool with a full input schema, the description is complete: it covers alternative tools, output format behavior ('dates as text, numbers with their format applied'), session visibility, and when to avoid this tool. No missing information an agent would need to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline applies: the input schema already documents all five parameters with descriptions and defaults. The description adds useful session-level context (e.g., what compute_context_name means for visibility of WORK tables), but does not systematically add per-parameter meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Fetch rows from a table in a SAS library, with column names.' It immediately distinguishes itself from siblings: it is the compute-tier counterpart of get_castable_data and not query_data, clarifying exactly what this tool does differently.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage context is explicit: it contrasts with get_castable_data and names query_data with target='compute' as the right choice when raw numerics, a WHERE clause, or a join are needed. It also notes the session-aware nature ('as the session sees it'), which tells an agent precisely when this is the right fetch operation.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_decision_flowGet Decision FlowA
Read-onlyIdempotent

Fetch the current state of a SAS Intelligent Decisioning flow.

NameRequiredDescriptionDefault
decision_idYesThe decision flow UUID (not its name — list_decision_flows returns both).

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, openWorldHint=false, idempotentHint=true, and destructiveHint=false, so the safety profile is well covered. The description's 'Fetch' wording is consistent with these annotations, but it adds little behavioral detail beyond them, such as what exactly the current state includes or whether a missing/invalid decision_id produces a specific error. This is adequate given the annotation coverage, but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is one tight sentence with no filler or redundancy. It front-loads the core action and resource, and every word contributes to understanding what the tool does.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter read-only tool with a full output schema and complete annotations, the description is sufficient for basic invocation. The only slight gap is that it does not clarify the distinction from get_decision_flow_revision or get_decision_flow_code, but the sibling list and parameter hint partially compensate. Overall, nothing essential for calling it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the single parameter is already well documented in the schema: it requires a UUID, explicitly warns against using the name, and points to list_decision_flows for retrieval. The tool description itself adds no additional parameter semantics, so the baseline of 3 applies per the rubric.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Fetch') and a clear resource ('current state of a SAS Intelligent Decisioning flow'), which immediately signals this is a read/detail operation rather than a create, update, delete, list, or code-generation tool. It is distinguishable from siblings like get_decision_flow_code and get_decision_flow_revision by the 'current state' phrasing, though it does not explicitly name those alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit when-to-use or when-not-to-use guidance is present. The parameter description helps by clarifying that decision_id is the UUID (not the name) and points to list_decision_flows for obtaining both, which is useful contextual usage guidance. However, it does not explain how this tool differs from get_decision_flow_code, get_decision_flow_revision, or list_decision_flows in terms of selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_decision_flow_codeGet Decision Flow CodeA
Read-onlyIdempotent

Retrieve the generated DS2 execution code for a decision flow.

NameRequiredDescriptionDefault
decision_idYesThe decision flow UUID (not its name — list_decision_flows returns both).

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so no additional safety disclosure is needed. The description adds no extra behavioral traits such as output shape or error conditions, but it also does not conflict with the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence with no redundancy, front-loading the action and object. Every word contributes meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter read-only tool with an output schema and strong annotations, the description fully identifies the resource. No essential context is missing for an agent to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the single parameter already carries a detailed explanation ('UUID (not its name — list_decision_flows returns both)'). The description adds no parameter-level information, matching the baseline when the schema fully documents parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Retrieve') and names a specific resource ('generated DS2 execution code for a decision flow'). This clearly distinguishes it from siblings like get_decision_flow, which would return the flow definition rather than its compiled code.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description makes the intended use case clear: call this when the generated DS2 code is needed. It does not explicitly name alternatives or state when not to use it, but the resource phrasing is specific enough that an agent is unlikely to confuse it with related decision-flow tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_decision_flow_revisionGet Decision Flow RevisionA
Read-onlyIdempotent

Fetch the content of a specific locked decision revision.

NameRequiredDescriptionDefault
decision_idYesThe decision flow UUID (not its name — list_decision_flows returns both).
revision_idYesThe revision UUID.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is well covered. The description adds useful context by specifying that the revision is 'locked,' which is a relevant behavioral constraint beyond the schema and annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no filler or repetition. Every word adds meaning, and it conveys the essential purpose efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has a simple interface, a complete output schema, and strong annotations, so the description is largely sufficient. The only minor gap is that it does not mention failure scenarios, such as what happens if the revision does not exist or is not locked, but for a straightforward read operation this is not critical.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so both parameters are already fully documented in the schema. The description does not add further parameter-level meaning beyond the generic reference to a 'specific locked decision revision,' so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Fetch' and the resource 'content of a specific locked decision revision.' This distinguishes it from sibling tools like get_decision_flow (which retrieves a flow) and list_decision_flow_revisions (which lists revisions).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is for retrieving a specific locked revision's content but does not explicitly state when to use it over alternatives like list_decision_flow_revisions or get_decision_flow. No when-not-to-use guidance or alternative tool suggestions are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_decisioning_assetGet Decisioning AssetA
Read-onlyIdempotent

Fetch one piece of decisioning content, or one of its revisions, with the folder it is in.

A rule set comes with its rules, a code file with its code, a value list with the entries of its newest version, a lookup table with its versions, the entries of its active one (get_lookup_table pages and filters them) and the rule sets that use it. Content larger than 150,000 characters — a big segmentation tree — is summarised (counts, root variable) instead of returned whole; summary_only asks for the summary of anything.

NameRequiredDescriptionDefault
asset_idYesThe ID (not the name — list_decisioning_assets returns both); a lookup table may also be given by its exact name.
asset_typeYesrule_set, decision, segmentation_tree, code_file, value_list, lookup_table, custom_function or function_category.
revision_idNoA revision to read instead of the current state (for a lookup table: a version ID or label).
summary_onlyNoReturn the summary rather than the full content.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds substantial behavior beyond the annotations: it explains per-asset-type return shapes, revision handling, automatic summarization above 150,000 characters, and the summary_only option. These are important operational details for an agent invoking the tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core action, then uses compact sentences to cover per-type returns and the large-content summarization rule. Every sentence provides useful information without redundant repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With annotations covering safety and idempotency, a full output schema, and complete parameter descriptions, the description supplies the remaining critical context: per-type return behavior, revision semantics, and summarization limits. Nothing material appears missing for correct invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents asset_id, asset_type, revision_id, and summary_only. The description adds useful context about how asset_type affects returned content and how revision_id / summary_only behave, but it does not need to compensate for schema gaps.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: fetch one decisioning asset or revision, including its folder. It further clarifies what is returned for each asset type, which makes the tool distinguishable from siblings such as get_lookup_table and list_decisioning_assets.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is clear from the opening sentence and the parenthetical note that get_lookup_table pages and filters lookup table entries, which is an explicit alternative for that asset type. It does not explicitly cover when to use this versus get_decisioning_asset_code or list_decisioning_asset_revisions, so it falls short of full when/when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_decisioning_asset_codeGet Decisioning Asset CodeB
Read-onlyIdempotent

The DS2 code Viya generates for a rule set, decision or segmentation tree, or a code file's source.

NameRequiredDescriptionDefault
asset_idYesThe ID.
asset_typeYesrule_set, decision, segmentation_tree or code_file.
revision_idNoA revision instead of the current state.

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and destructiveHint=false, so the safety profile is covered. The description adds one genuinely useful nuance beyond them: the DS2 code is *generated* for rule sets/decisions/trees, whereas for code_file it is the file's own source. It says nothing about whether generation happens on demand, can fail, or what a revision lookup changes.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler; the key fact (what code is returned) comes first and every clause contributes.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return shape need not be explained, and annotations carry the safety profile. What is missing for correct invocation is routing context: how this differs from get_decisioning_asset/get_decision_flow_code and how revision_id should be used.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the asset_type enum already enumerates the four values, so restating them in the description adds nothing. The revision_id parameter is not mentioned at all in the description, leaving the 'revision instead of current state' semantics entirely to the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names the concrete resource being returned (the DS2 code Viya generates) and enumerates the source asset kinds, so an agent knows this fetches generated code rather than asset metadata. It is a noun phrase without an explicit verb, and it never names the close sibling get_decisioning_asset (which returns metadata) or get_decision_flow_code, so differentiation is left implicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no statement of when to call this versus get_decisioning_asset, get_decision_flow_code, or list_decisioning_asset_revisions, and no guidance on when to pass revision_id. Usage has to be inferred from the one-line resource description alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_glossary_termGet Glossary TermA
Read-onlyIdempotent

Get one business term in full, with its custom attributes named rather than hashed.

The raw API returns attributes keyed by attribute-definition UUID, which is unreadable on its own. This resolves each key to the label the glossary UI shows and drops the ones left empty, so what comes back is the term as a person would read it. attribute_ids is the raw map, unfiltered — so an attribute the term leaves unset is absent from attributes but present as "" there. The two disagree by design: one says what the term holds, the other what was stored.

Also returns catalog_entity_id — the other id this term has, the one asset relationships point at.

NameRequiredDescriptionDefault
term_idYesThe glossary term UUID (not the catalog entity id — search_glossary_terms returns both).

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the read-only and idempotent annotations, the description reveals the output transformation: attributes are resolved from UUID keys to UI labels, empty attributes are dropped, attribute_ids remains the raw unfiltered map, and the two intentionally disagree. It also explains the separate catalog_entity_id semantic. This is substantial added behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose and then uses two short paragraphs to explain the non-obvious attribute resolution behavior. Every sentence adds necessary information, including the design rationale for the attributes/attribute_ids discrepancy, with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-parameter, read-only, idempotent tool with an output schema, the description covers everything an agent needs to correctly interpret the result: resolved attributes, raw attribute_ids, empty-value semantics, and catalog_entity_id. No critical operational detail is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the parameter description already documents the term_id UUID and its distinction from catalog_entity_id. The tool description adds no further parameter-level meaning, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Get one business term in full', and immediately states a distinguishing behavior — custom attributes are named rather than hashed. This separates it from get_glossary_term_type and the glossary list/search tools without requiring schema inspection.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The first sentence makes the context clear: use this when you need exactly one full term. The parameter schema adds that term_id is the term UUID and notes search_glossary_terms returns both IDs, providing useful disambiguation, though it never explicitly states when not to use this tool or names an alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_glossary_term_typeGet Glossary Term TypeA
Read-onlyIdempotent

Get a term type and the attribute contract its terms must satisfy.

Call this before creating or updating a term: it names every custom attribute, its data type, whether it is required, the exact values a single- or multi-select accepts, and value_format — the one spelling Viya takes for that type, which the API itself documents nowhere. create_glossary_term takes attributes keyed by the label shown here, so this is also the vocabulary to write in.

NameRequiredDescriptionDefault
term_type_idYesThe term type UUID, or its name — list_glossary_term_types returns both.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations, the description reveals the exact contents of the response: every custom attribute, data type, requiredness, allowed values, and value_format, including the caveat that value_format is undocumented in the API. It also explains how the output vocabulary maps to create_glossary_term, which is valuable behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with a one-sentence purpose, followed by a compact but dense usage callout. Every sentence earns its place, and the emphasis on 'before' is prominent.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With a single well-documented parameter, an output schema, and read-only/idempotent annotations, the description supplies the missing contextual piece: why and when to call this before creating or updating a glossary term. No essential information for correct invocation appears absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the schema already explains that term_type_id accepts a UUID or name with list_glossary_term_types returning both. The description adds no further parameter-level detail, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence names a specific verb and resource: get a term type and the attribute contract its terms must satisfy. It clearly differentiates this from sibling list_glossary_term_types by focusing on the detailed contract needed for term creation/updating, not just a list of types.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'Call this before creating or updating a term,' which anchors the primary use case. It does not explicitly state when not to use it or name alternatives like list_glossary_term_types in the tool description, though the schema references that tool for resolving IDs/names.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_job_logGet Job LogA
Read-onlyIdempotent

Retrieve the log of a completed job.

NameRequiredDescriptionDefault
job_idYesID of the job.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is clear. The description adds the 'completed job' pre-condition, which is useful context, but does not disclose additional behaviors such as what happens when the job is still running or whether logs are truncated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, clear sentence with no filler. It front-loads the action and resource, making it immediately scannable for an agent.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter, read-only tool with an output schema and comprehensive annotations, the description is sufficiently complete. The 'completed job' qualifier and simple job_id parameter leave little ambiguity about invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with job_id documented as 'ID of the job.' The description adds only the 'completed job' qualifier and does not elaborate on job_id format or provenance, but with full schema coverage the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear action ('Retrieve') on a specific resource ('the log') with a scope qualifier ('of a completed job'). It is distinct enough from siblings like get_job_status or list_jobs, though it does not explicitly call out the differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the tool is for completed jobs, which gives some usage context. However, it does not explicitly mention when to avoid using it or suggest alternatives such as get_job_status for active jobs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_job_statusGet Job StatusA
Read-onlyIdempotent

Check the status of a submitted job.

NameRequiredDescriptionDefault
job_idYesID of the job.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish readOnlyHint=true, idempotentHint=true, and destructiveHint=false, and the description does not contradict them. The description adds only minimal context that the job was 'submitted' but does not disclose behavior beyond the annotations, such as whether the status reflects completion, failure, or queued state.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single focused sentence with no filler or redundant information. It front-loads the core action and resource clearly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple one-parameter read-only tool with an output schema and strong annotations, the description is complete enough for an agent to select and invoke it correctly. Nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema fully documents job_id as 'ID of the job,' so schema description coverage is 100%. The description adds no additional meaning about the parameter, leaving the schema to carry the burden as expected.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific action and resource: checking the status of a submitted job. It distinguishes itself from sibling tools like cancel_job, get_job_log, and list_jobs, which either perform different actions or return different data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no explicit guidance on when to use this tool versus alternatives such as list_jobs or get_job_log. Usage is only implied by the tool name and the phrase 'submitted job'; there are no decision criteria, exclusions, or alternative routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_lookup_tableGet Lookup TableA
Read-onlyIdempotent

Read a lookup table: its versions, one version's entries and the rule sets that use it.

active_version is the version rules use now. A version's status is developing, production (active, or formerly active) or activating; activationStatus failed with activationError means its publish failed. used_by lists the rule sets that reference the table.

NameRequiredDescriptionDefault
limitNoMaximum entries to return (default 200); ``next_start`` is set when there are more.
startNoIndex of the first entry to return (for paging).
versionNo"current" (the active version, else the newest), "newest", or a version's ID or label.current
key_filterNoOnly entries whose key contains this text.
lookup_tableYesThe lookup table's ID or exact name.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower; the description still adds real context by decoding status values (developing, production, activating) and explaining that activationStatus=failed with activationError means the publish failed. It does not cover paging behavior or permission needs, keeping it short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core purpose, then compact notes on version and status semantics. Dense but every sentence carries information; minor stylistic quote/backtick noise from source formatting.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema exists and annotations carry the safety profile, so the description only needs to frame what is returned and how to read statuses, which it does. Nothing an agent needs to call it correctly appears missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description adds meaning beyond the schema by explaining what the active version is and how to interpret version/status outcomes that the version parameter selects. It does not elaborate on limit/start/key_filter beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (Read) and resource (a lookup table) and enumerates what the read returns: versions, one version's entries, and the rule sets that use it. This clearly separates it from create_lookup_table, update_lookup_table, and activate_lookup_table among the siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains version selection semantics ("active_version is the version rules use now", status values, failed activation), which implies when to pick a version, but never names an alternative tool or states explicit when-to-use vs when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_mas_module_step_signatureGet Mas Module Step SignatureA
Read-onlyIdempotent

Fetch a MAS module step's input/output variable signature.

Call before score_data to know the exact variable names, types, and order to pass as inputs, and what outputs to expect.

NameRequiredDescriptionDefault
step_idNoThe step within the module to inspect (default "execute").execute
module_idYesThe MAS module ID (see ``list_mas_modules``).

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds workflow context (call before score_data) but does not disclose additional behavioral traits such as error conditions or authorization requirements. Given the annotations, this is adequate but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences: the first states the tool's function, the second provides crucial usage context. Every word earns its place, and the key action 'Fetch' is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is a simple read-only introspection with a complete output schema, fully documented parameters, and safety annotations. The description adds the missing workflow context (prerequisite for score_data), making the definition complete for an agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with both module_id and step_id clearly described in the input schema. The description adds no parameter-level detail beyond what the schema already provides, so the baseline score of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb 'Fetch' and resource 'a MAS module step's input/output variable signature', making the core purpose clear. It does not explicitly contrast with sibling tools, but the resource is unique enough among siblings that confusion is unlikely.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly advises calling this tool before 'score_data' and explains what information it provides (variable names, types, order, expected outputs). This is clear when-to-use guidance, though it does not mention when not to use it or list alternative tools for the same need.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_reportGet ReportA
Read-onlyIdempotent

Get a Visual Analytics report's metadata and definition.

NameRequiredDescriptionDefault
report_idYesID of the report.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the safety profile is covered. The description adds no behavioral detail beyond the purpose, such as error conditions or permissions, but for a simple getter this is acceptable.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single focused sentence with no wasted words. It front-loads the action and clearly identifies the resource being retrieved.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a simple one-parameter read-only tool with an output schema and comprehensive annotations. The description is sufficient for an agent to understand what the tool does and invoke it correctly; nothing critical is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with report_id described as 'ID of the report,' so the schema already carries the parameter meaning. The description adds no extra parameter-level detail, making baseline 3 appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Get a Visual Analytics report's metadata and definition.' This distinguishes it from listing or exporting reports, though it does not explicitly differentiate it from similar siblings like get_report_outline, so it falls just short of a top score.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus alternatives such as list_reports, export_report, or get_report_outline. The description only defines what the tool does, leaving the agent to infer the appropriate context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_report_outlineGet Report OutlineA
Read-onlyIdempotent

Read a report's structure: pages → objects with the handles other tools need.

Reduces the stored report definition to a compact outline — per page its internal name and label, per object its name (ve*), label, type, and any text content. Use it to edit an existing report, to recover object names after an apply, or to check what a batch actually produced:

  • object name → the target for relativeToObject/container placement and updateObject;

  • object label → what export_report report_objects takes;

  • page label → the page placement target.

Returns {"status": "ok", "pages": [...], "hint": ...} (or not_found / outline_failed).

NameRequiredDescriptionDefault
report_idYesThe report id to outline.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior. The description adds valuable context beyond those annotations by explaining that it reduces the stored report definition to a compact outline, what fields are returned for pages and objects, and the possible statuses including not_found and outline_failed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description opens with a one-sentence summary, then uses compact bullets for usage scenarios and field mappings. Every sentence adds useful information; there is no filler or repetition of annotation data.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With one well-documented parameter, rich annotations, and an output schema present, the description still adds important context about return values, statuses, and how to use the outline for downstream operations. Nothing critical is missing for an agent to call this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is only one parameter, report_id, and the input schema already describes it at 100% coverage as 'The report id to outline.' The description does not add extra meaning beyond confirming the tool operates on a stored report, so the schema carries the weight here.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: it reads a report's structure and reduces it to a compact outline of pages and objects. It clearly distinguishes itself from sibling report tools by focusing on the handles other tools need, rather than duplicating get_report or export_report.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly lists when to use this tool: to edit an existing report, recover object names after an apply, or check batch output. It even maps output fields to parameters of sibling tools such as relativeToObject/container, updateObject, and export_report's report_objects, providing concrete routing guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

import_glossary_termsImport Glossary TermsA
Destructive

Create many business terms, and their hierarchy, in one call.

Building a hierarchy one term at a time means a call per term and a wait between levels, because a child needs the parent's id from the previous response. This uses the glossary's own bulk import instead: one request for the whole tree, with parents resolved by name rather than by id, so nothing has to be threaded through.

Give each row a name and, for a child, a parent — the name of another row in the same batch, or the path of a term that already exists (levels separated by a backslash). Rows may be given in any order; they are sorted so every parent is created before its children.

Attribute values take the same forms as create_glossary_term — True/False for a boolean, a list for a multi-select — and are validated here, per term type, before anything is sent. So are the term type's required attributes: a row missing one fails inside the job with a message naming only the field, so the batch is refused here instead, before any of it is committed.

The import runs as a job and reports rows individually. A row can fail while the rest succeed, so the result carries created, failed and a failures list naming each bad row and why. Treat a non-empty failures as a partial import: the successful rows are already committed.

The result names the term each row became. terms carries {name, path, term_id, existed} per row, so the next step — assigning an asset, re-parenting, reading one back — needs no lookup. This costs one filtered request per 40 distinct names, not one per term.

Two things the import does that a per-term create does not:

  • A row is written whole. With update_existing the term at that path is replaced, so an attribute the row omits is reset — not left as it was. Without it the existing term is left alone. Either way the job counts the row as successful, so created counts rows the job accepted; new is the count of terms that did not exist before, with already_existed the rest and existed saying which is which per row.

  • Omitted attributes take the term type's default, on new rows as well as replaced ones — the same as creating a term through the API.

NameRequiredDescriptionDefault
termsYesThe rows to create. Each is ``{"name": ..., "parent": ..., "definition": ..., "description": ..., "attributes": {...}}``; ``term_type`` may be given per row to mix types in one batch.
dry_runNoValidate and show what *would* be imported without importing anything: the rows in the order they would be sent, each with its resolved parent path and encoded attributes. Use it to let the person confirm a batch first — in a client that renders interactive views the preview appears as a table with an Import button; elsewhere, call again with ``dry_run=false`` once they agree.
term_typeNoThe term type for rows that do not name one.
timeout_secondsNoHow long to wait for the import job (default 600).
update_existingNoReplace a term that already exists at the same path (default false, which leaves it untouched).

Output Schema

NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes far beyond the annotations, disclosing job-based execution, per-row successes and failures, partial-commit semantics, whole-row replacement with update_existing, attribute reset behavior, and defaults for omitted attributes. This is consistent with destructiveHint=true and adds substantial practical context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every sentence earns its place, with clear section breaks, bolded key behaviors, and a bulleted list for edge cases. It front-loads the core purpose and then systematically covers execution, results, and update semantics without repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity, the description covers the full call flow: parent resolution, ordering, validation, job execution, partial failures, result fields, update behavior, and defaults. The output schema exists to enumerate return shapes, and the description complements it with the semantic details an agent needs to invoke and interpret results correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Even though the schema has 100% coverage, the description enriches parameters meaningfully: parent resolution by name, attribute value forms, per-row term_type overrides, dry_run preview behavior, and update_existing replacement semantics. It clearly explains how the terms array and update_existing behave, which the schema alone would not fully convey.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening line 'Create many business terms, and their hierarchy, in one call' states a specific verb, resource, and scope. The description immediately contrasts this with per-term creation via create_glossary_term, making the tool's distinct purpose unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly explains when to prefer this tool: when building a hierarchy requires multiple calls and waiting for parent IDs. It also describes the alternative workflow and gives concrete guidance for using dry_run to confirm a batch before committing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_business_rulesList Business RulesA
Read-onlyIdempotent

List all rules inside a SAS Business Rules rule set.

NameRequiredDescriptionDefault
limitNoMaximum number of results to return (default 100).
ruleset_idYesThe rule set UUID (not its name — list_business_rulesets returns both).

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is well covered. The description adds rule-set scoping, but the phrase 'all rules' is slightly misleading given the limit parameter, and no extra behavioral context such as pagination or output shape is disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no filler or redundant information. It is concise while still naming the verb, resource, and scope.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list operation with fully documented parameters and an output schema, the description is largely sufficient. The main gaps are the absence of explicit sibling-tool routing and the potentially misleading 'all rules' wording, but these are minor given the rich schema and annotations.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Both limit and ruleset_id are fully described in the input schema with 100% coverage, so the description adds no parameter-level meaning beyond what the schema already provides. The 'all rules' wording does not clarify how limit interacts with the result set.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('List') and a clear resource ('all rules inside a SAS Business Rules rule set'), which distinguishes it from list_business_rulesets and rule-level CRUD tools. It is not a tautology and immediately conveys what the tool does.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage when you need rules within a specific rule set, but it does not explicitly contrast this tool with list_business_rulesets or get_business_rule. No when-not conditions or alternative routing are provided, leaving selection mostly to the tool name and schema note.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_business_ruleset_revisionsList Business Ruleset RevisionsA
Read-onlyIdempotent

List all locked revisions of a rule set.

NameRequiredDescriptionDefault
limitNoMaximum number of results to return (default 20).
ruleset_idYesThe rule set UUID (not its name — list_business_rulesets returns both).

Output Schema

NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already establish read-only, idempotent, and non-destructive behavior, so the description only needs to add semantic scope. The 'locked revisions' qualifier provides useful context beyond the schema, and nothing in the description contradicts the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence with no filler. Every word earns its place by communicating the action, resource, and scope.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple, annotations are rich, parameter schema is fully described, and an output schema exists. The main gap is the lack of explicit sibling differentiation and pagination clarity, but the schema and annotations compensate for most of the missing context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema fully documents ruleset_id and limit. The description adds no parameter-level meaning beyond the schema, which is acceptable but not value-adding at a higher level.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('List') and a clearly defined resource ('locked revisions of a rule set'). It distinguishes this tool from siblings like list_business_rulesets and get_business_ruleset by focusing on revision scope rather than the ruleset itself.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The usage context is implied: an agent would call this when it needs the revision history of a ruleset. However, the description gives no explicit when-to-use guidance or alternative routing, such as using list_business_rulesets for current rulesets or get_business_ruleset for a single ruleset.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_business_rulesetsList Business RulesetsA
Read-onlyIdempotent

List SAS Business Rules rule sets, optionally filtered by name substring.

NameRequiredDescriptionDefault
limitNoMaximum number of results to return (default 20).
filter_nameNoOptional substring to match against rule set names.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already communicate that the tool is read-only, idempotent, and non-destructive, so the safety profile is covered. The description adds the functional behavior of optional name-substring filtering, but it does not disclose any other behavioral traits such as result ordering, pagination behavior, or scope of returned rule sets. This is adequate but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single well-structured sentence. It front-loads the core operation and resource before the optional filtering behavior, and contains no redundant or filler language.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple listing tool with two optional, fully documented parameters, a rich output schema, and annotations covering safety, the description is sufficiently complete. Nothing essential for an agent to select and invoke the tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with both parameters already documented: 'limit' is a maximum result count with a default of 20, and 'filter_name' is an optional substring match. The description's reference to filtering by name substring adds little beyond what the schema already provides, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the operation ('List'), the resource ('SAS Business Rules rule sets'), and an optional filter capability ('by name substring'). This distinguishes it from sibling tools like list_business_rules and list_business_ruleset_revisions by specifying rule sets rather than rules or revisions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The usage context is implied: if you need to list rule sets, this is the tool. However, there is no explicit guidance about when to prefer alternatives, such as list_business_rules for individual rules or list_business_ruleset_revisions for revisions. The tool's name and description make the primary use clear, but exclusions are not stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_caslibsList CaslibsA
Read-onlyIdempotent

List CAS libraries (caslibs) available on a CAS server.

NameRequiredDescriptionDefault
limitNoMaximum number of caslibs to return (default 50).
server_idYesCAS server name or ID (e.g. 'cas-shared-default').

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the description does not need to restate those. It adds a small amount of context by indicating the result is scoped to a CAS server, but it does not describe pagination, ordering, or any other behavioral details beyond the schema and annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no redundancy. It immediately identifies the action and resource without wasting words, which is ideal for agent consumption.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a simple two-parameter read-only listing operation with full schema coverage, rich annotations, and an output schema available. The description, combined with the structured metadata, provides everything an agent needs to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with both server_id and limit already described in the input schema. The tool description does not add additional parameter semantics, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear verb and resource: 'List CAS libraries (caslibs) available on a CAS server.' It clarifies the scope (a specific CAS server) and the resource is distinct from sibling tools like list_cas_servers or list_castables. The use of 'available on a CAS server' reinforces that the server_id parameter is the scope qualifier.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage context is only implied from the purpose: an agent would use this to enumerate caslibs on a given CAS server. There is no explicit guidance about when to choose this over siblings such as list_castables or list_compute_libraries, nor any mention of using list_cas_servers to discover valid server IDs first.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_cas_serversList Cas ServersA
Read-onlyIdempotent

List available CAS servers on the Viya environment.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the operation read-only, idempotent, and non-destructive, so the description does not need to restate safety. It adds the 'available' qualifier, implying some status filtering, but gives no context about authorization, ordering, or result behavior beyond what the output schema likely provides.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence with no redundant filler. It communicates the action, resource, and scope efficiently.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-parameter, read-only list operation with a full output schema and safety annotations, the description provides enough context for an agent to correctly invoke the tool. No additional procedural detail is necessary.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool accepts zero parameters and schema description coverage is 100%, so there are no parameter semantics the description must explain. Baseline for a zero-parameter tool is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('List') with a concrete resource ('available CAS servers') and scopes it to the Viya environment. This distinguishes it from sibling tools like list_caslibs and list_castables, which target different CAS objects.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided about when to call this tool rather than alternatives such as list_compute_contexts or list_caslibs. The description states only the function, not the conditions or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_castablesList CastablesC
Read-onlyIdempotent

List tables in a CAS library.

NameRequiredDescriptionDefault
limitNoMaximum number of tables to return (default 50).
server_idYesCAS server name or ID.
caslib_nameYesName of the caslib.

Output Schema

NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations (readOnlyHint=true, idempotentHint=true, destructiveHint=false) already establish that this is a safe, non-mutating read, so the bar for added value is lower. The description adds no behavioral context beyond the operation itself—no mention of the limit default, pagination, server resolution, or any caveats.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single six-word sentence with the verb front-loaded and zero wasted words. It is efficiently written, though it could have spent a few more words on sibling differentiation without becoming bloated.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a low-complexity read-only tool with complete annotations, full schema coverage, and an output schema, the description covers the essentials of a correct call. The notable gap is selection guidance in a large sibling set with several competing list tools, which the description does nothing to address.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%: server_id, caslib_name, and limit are each documented in the input schema itself. The description adds no parameter-level meaning, but the high-coverage baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb (List), resource (tables), and scope (a CAS library), so the core function is immediately clear. It does not, however, explicitly distinguish itself from sibling table-listing tools such as list_compute_tables or list_source_tables, leaving the differentiation implicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No when-to-use guidance is provided and no alternatives are named. Given siblings like list_caslibs, list_source_tables, and list_compute_tables in the same tool set, the agent receives no help deciding which listing tool fits its scenario.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_compute_columnsList Compute ColumnsA
Read-onlyIdempotent

List the columns of a table in a SAS library within a compute context.

Runs in the reusable per-user compute session for the context.

NameRequiredDescriptionDefault
limitNoMaximum number of columns to return (default 50).
startNoOffset of the first column to return (default 0).
table_nameYesName of the table within the library.
filter_nameNoOptional name filter (substring match).
library_nameYesName of the SAS library/libref (e.g. 'WORK', 'SASHELP').
compute_context_nameYesName of the compute context (see list_compute_contexts).

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds a meaningful behavioral detail beyond the annotations: 'Runs in the reusable per-user compute session for the context.' This tells the agent the operation depends on an existing compute session. The readOnlyHint and destructiveHint already cover safety, and no contradiction exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences earn their place: the first states the action and scope, the second adds execution context. There is no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With a fully described input schema, an output schema, and annotations covering safety, the description is sufficient for this simple listing operation. It adds the key execution context about the compute session, and nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3. The description clarifies the relationship among compute_context_name, library_name, and table_name, but it does not add parameter-level detail beyond what the schema already provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: 'List the columns of a table in a SAS library within a compute context.' This clearly differentiates it from sibling tools like list_compute_tables (tables) and list_compute_libraries (libraries), and the scope is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides context by noting it runs in a reusable per-user compute session, but it does not explicitly say when to use this tool versus alternatives such as get_castable_columns or list_compute_tables. Usage must be inferred from the resource type being listed.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_compute_contextsList Compute ContextsB
Read-onlyIdempotent

List available compute contexts on the Viya environment.

NameRequiredDescriptionDefault
limitNo
startNo
filter_nameNo

Output Schema

NameRequiredDescription
resultYes

TDQS

B3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare the operation read-only, idempotent, and non-destructive, so the safety profile is covered. The description adds the environmental scope 'on the Viya environment' and the word 'available', but does not describe pagination, filtering behavior, or what state or metadata is included for each context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single clear sentence with no filler or redundancy. It is front-loaded with the core action and resource, though it is quite thin and does not use the available space to explain parameters or usage context.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present and all parameters optional, a basic call with defaults is well-supported. However, the description omits parameter semantics and usage guidance, making it incomplete for filter usage or for selecting this tool among many sibling list tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 0%, so the description must compensate, but it says nothing about limit, start, or filter_name. The parameter names are somewhat self-explanatory, yet the agent receives no explicit guidance on valid values, default behavior, or filtering semantics from either the schema or the description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the specific action 'List' on the resource 'compute contexts' and scopes it to 'the Viya environment'. It is not a tautology and is clear enough to distinguish the tool from sibling tools targeting different resources like list_cas_servers or list_compute_libraries, though it does not explicitly contrast with them.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no guidance on when to use this tool versus alternatives. It does not mention sibling tools, exclusion criteria, or scenarios where another list/compute tool would be more appropriate, leaving the agent to infer selection solely from the resource name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_compute_librariesList Compute LibrariesA
Read-onlyIdempotent

List the SAS libraries (librefs) assigned in a compute context.

Runs in the reusable per-user compute session for the context, so it also sees libraries created by prior execute_sas_code calls.

NameRequiredDescriptionDefault
limitNoMaximum number of libraries to return (default 50).
startNoOffset of the first library to return (default 0).
filter_nameNoOptional name filter (substring match).
compute_context_nameYesName of the compute context (see list_compute_contexts).

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and idempotentHint=true, so the safety profile is covered. The description adds valuable behavioral context beyond annotations by explaining that the listing reflects the state of the per-user compute session and includes libraries created by prior execute_sas_code calls. This session-dependent behavior is important for an agent to understand.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded, with the core purpose stated in the first sentence and the important session-context nuance in the second. Every sentence adds value without redundancy or unnecessary explanation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read-only list operation with an output schema, rich annotations, and 100% parameter schema coverage, the description covers the essential behavioral nuance: session persistence and visibility of prior execute_sas_code results. Nothing critical is missing for an agent to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the parameters are already well documented in the schema. The description does not add parameter-level meaning, but the existing schema descriptions for limit, start, filter_name, and compute_context_name are sufficient. This matches the baseline for high schema coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('List') and the resource ('SAS libraries (librefs) assigned in a compute context'), which is specific enough to distinguish it from sibling tools like list_compute_contexts, list_caslibs, and list_compute_tables. It also adds a meaningful scoping detail: the libraries are those visible in the per-user compute session.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context about when this tool is useful, especially noting that it runs in the reusable per-user compute session and sees libraries created by prior execute_sas_code calls. It does not explicitly name alternative tools or state when not to use them, but the compute-session framing implicitly differentiates it from static listings like list_caslibs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_compute_tablesList Compute TablesA
Read-onlyIdempotent

List the tables in a SAS library within a compute context.

These are SAS/Compute tables (e.g. WORK or an assigned libref), distinct from in-memory CAS tables (see list_castables). Runs in the reusable per-user compute session for the context.

NameRequiredDescriptionDefault
limitNoMaximum number of tables to return (default 50).
startNoOffset of the first table to return (default 0).
filter_nameNoOptional name filter (substring match).
library_nameYesName of the SAS library/libref (e.g. 'WORK', 'SASHELP').
compute_context_nameYesName of the compute context (see list_compute_contexts).

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds valuable behavioral context beyond the annotations by explaining that the tool runs in the reusable per-user compute session, which is important for agents to understand session-dependent behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and efficient. The first sentence immediately states the action, and the second paragraph adds the key distinction and execution context without any filler or repetition of schema details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has strong annotations, a fully documented input schema, and an output schema, so the description does not need to explain return values. It covers the key operational context, including the compute session behavior and how this tool differs from CAS table listing, making it complete for an agent to select and invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with each parameter including a meaningful description such as library example 'WORK'/'SASHELP' and the compute context reference. The description reinforces the meaning of library_name and compute_context_name but does not substantially add parameter-level detail beyond the schema, so a baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: listing tables in a SAS library within a compute context. It explicitly differentiates SAS/Compute tables from in-memory CAS tables and points to list_castables as the sibling for that case, making it easy for an agent to distinguish this tool from similar ones.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear usage context by stating that this tool handles SAS/Compute tables, not CAS tables, and explicitly references list_castables as the alternative for CAS tables. It also clarifies that the operation runs in the reusable per-user compute session, which tells the agent when this tool is appropriate.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_decision_flow_revisionsList Decision Flow RevisionsA
Read-onlyIdempotent

List all locked revisions of a decision flow.

NameRequiredDescriptionDefault
limitNoMaximum number of results to return (default 20).
decision_idYesThe decision flow UUID (not its name — list_decision_flows returns both).

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds the meaningful behavioral detail that only locked revisions are returned, not all revisions. It does not mention pagination, ordering, or response shape, but the annotations and output schema relieve some of that burden.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, direct sentence with no filler. It front-loads the action and resource while including the crucial 'locked' qualifier, making it maximally concise without losing meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only list operation, the description plus annotations and a fully documented input schema are sufficient. The output schema presumably describes the returned revisions, so the description does not need to explain return values. An agent has enough context to call the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and both parameters (decision_id and limit) are already explained in the input schema. The description adds no additional semantic detail about the parameters beyond what the schema provides, so the baseline score of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb ('List'), a specific resource ('locked revisions of a decision flow'), and the scope ('all'). This clearly distinguishes it from sibling tools like list_decision_flows, which lists decision flows, and get_decision_flow_revision, which gets a single revision.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The intended use is implied: call this when you need to enumerate locked revisions of a decision flow. However, the description does not explicitly contrast this with get_decision_flow_revision, lock_decision_flow_revision, or list_decision_flows, so an agent must infer when this is the right tool versus an alternative.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_decision_flowsList Decision FlowsA
Read-onlyIdempotent

List SAS Intelligent Decisioning flows, optionally filtered by name substring.

NameRequiredDescriptionDefault
limitNoMaximum number of results to return (default 20).
filter_nameNoOptional substring to match against decision names.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds the filter-by-name behavior, but that is also visible in the schema and does not reveal additional traits like pagination, ordering, or whether revisions are included.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence, ten words, front-loaded with the verb and resource before the optional filter. Every word earns its place, with no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With only two optional parameters, a documented schema, and an output schema, the description covers the essentials for invoking the tool. It loses a point because it does not clarify that this lists top-level flows rather than revisions, which a sibling tool (list_decision_flow_revisions) addresses.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and both parameters have clear descriptions (limit and filter_name). The description's 'filtered by name substring' restates the filter_name schema, adding no new meaning beyond the structured data.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('List'), a specific resource ('SAS Intelligent Decisioning flows'), and an optional filter ('by name substring'). This clearly distinguishes it from siblings like get_decision_flow and list_decision_flow_revisions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies this is the tool for listing decision flows, but it never explicitly contrasts it with alternatives such as get_decision_flow for a single flow or list_decision_flow_revisions for revisions. No when-to-use or when-not-to-use guidance is provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_decisioning_asset_revisionsList Decisioning Asset RevisionsA
Read-onlyIdempotent

List the revisions of a rule set, decision, segmentation tree or code file, newest first.

The newest revision is the working one; every other one is locked.

NameRequiredDescriptionDefault
limitNoMaximum number of revisions (default 20).
asset_idYesThe ID.
asset_typeYesrule_set, decision, segmentation_tree or code_file.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only, idempotent, non-destructive, closed-world behavior, so the safety profile is covered. The description then adds genuinely non-obvious domain semantics: ordering is newest-first, only the newest revision is the working one and all others are locked, which directly informs downstream calls to lock_decisioning_asset_revision.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no filler. The scope statement is front-loaded and the revision-state semantics follow immediately as the next most useful fact.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema and annotations are present, so the description need not explain return shape or safety. It is nearly complete for a listing tool, with only minor omissions such as whether results are paginated beyond limit and how this relates to the per-type revision siblings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, including the enum for asset_type and a default of 20 for limit, so the schema carries parameter meaning. The description adds nothing beyond what the schema states (the asset-type list merely restates the enum), so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource (list revisions) and enumerates the four asset types it covers, which reads as the generic cross-type revision lister versus the type-specific siblings like list_business_ruleset_revisions and list_decision_flow_revisions. It never names those siblings explicitly, so an agent must infer the split.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives implied usage only: you call it to see a revision history, ordered newest first. There is no statement of when to prefer this over the type-specific revision tools, and no prerequisites or exclusion cases are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_decisioning_assetsList Decisioning AssetsA
Read-onlyIdempotent

List SAS Intelligent Decisioning content of one kind, optionally filtered by name.

NameRequiredDescriptionDefault
limitNoMaximum number of results (default 20).
asset_typeYesrule_set, decision, segmentation_tree, code_file, value_list, lookup_table, custom_function or function_category.
filter_nameNoOptional substring of the name.

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, non-destructive and closed-world, so the safety profile is covered. The description adds only that results can be narrowed by name; it says nothing about ordering, truncation at the limit, or whether an empty list is returned for an unknown filter.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler; the scope constraint ('of one kind') and the filter capability come before anything else.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value explanation is not needed, and the input schema is fully described. What is missing is the relationship to the numerous type-specific sibling listers—an agent scanning this catalog has no signal for why it would choose this over list_business_rulesets or list_decision_flows.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the enum values, the default limit of 20, and the nullable substring filter are all documented in the schema. The description merely restates asset_type and filter_name at a high level and never mentions limit, so it adds essentially nothing beyond structured data.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (List) and resource (SAS Intelligent Decisioning content) with the scope constraint that only one asset kind is returned at a time. It does not, however, distinguish itself from the many sibling list tools (list_business_rulesets, list_decision_flows, list_lookup_tables) that appear to be type-specific variants of the same operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Of one kind, optionally filtered by name' implies how the tool is meant to be used, but there is no explicit guidance on when to pick this generic lister over a sibling like list_business_rulesets or list_decision_flows, nor any statement of prerequisites.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_filesList FilesA
Read-onlyIdempotent

List files in the Viya Files Service.

NameRequiredDescriptionDefault
limitNoMaximum files to return (default 50).
filter_nameNoOptional name filter (substring match).

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, and the description does not contradict these. However, the description adds no behavioral context beyond the basic listing action, such as pagination semantics, result ordering, or what subset of files is returned.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded sentence with no filler, no repetition of schema details, and no unnecessary qualifiers. Every word carries meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only list operation with two optional parameters, the description, schema, output schema, and annotations together provide enough factual information to invoke the tool correctly. It does not offer broader context about when to prefer this over sibling file tools, but that gap is more about usage guidance than completeness of the tool definition.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema documents both parameters with clear descriptions: the limit default and the optional substring filter. Since schema description coverage is 100%, the description does not need to compensate, and the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific operation ('List files') and a specific resource scope ('Viya Files Service'), which clearly distinguishes it from sibling list tools such as list_reports or list_jobs. This is a concrete verb-resource pairing rather than a restatement of the title.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit when-to-use or when-not-to-use guidance is given, and no alternative tools are named. The intended use is only implied by the tool name and the one-line description, which is adequate for a unique list operation but leaves selection reasoning entirely to the agent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_glossary_termsList Glossary TermsA
Read-onlyIdempotent

List glossary terms by structure — term type, parent, or name fragment.

The counterpart to search_glossary_terms: exact filters instead of ranked text. Use it to walk the hierarchy (parent_id returns a term's direct children, which is the authoritative parent/child relationship), to inventory one term type, or to page the whole dictionary with no arguments at all.

NameRequiredDescriptionDefault
limitNoMaximum terms to return (default 20).
startNoOffset of the first term (default 0).
parent_idNoReturn only the direct children of this term id.
term_typeNoRestrict to one term type — its UUID or its name.
name_containsNoSubstring match on the term name.
include_draftsNoInclude unpublished drafts (default false — published only).
attribute_filterNoKeep only terms whose attributes match, e.g. ``{"Needs masking": true}`` or ``{"Regions": "EMEA"}``. Clauses are ANDed; a multi-select matches when it *contains* the value. **The glossary cannot filter on attributes server-side**, so this is applied here over pages fetched for the purpose: the result reports how many terms were scanned and whether the scan reached the end. Narrow it with ``term_type`` or ``parent_id`` where you can.
include_attributesNoAlso return each term's custom attributes, named (default false). Free — the listing already carries them.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/idempotent/destructive annotations, the description reveals that attribute filtering is client-side over fetched pages, reports scanned count and scan completion, and that parent_id gives the authoritative parent/child relationship. This is exactly the kind of non-obvious behavior an agent needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two compact paragraphs, front-loaded with the main purpose, followed by routing guidance and a caveat. Every sentence earns its place, and there is no repetition of schema or annotation content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Combined with the fully documented input schema, output schema, and annotations, the description covers purpose, usage, and behavioral caveats. Nothing an agent needs to correctly invoke this read-only list tool is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

All 8 parameters already have clear schema descriptions, so the baseline is 3. The description adds valuable semantics for key parameters, especially the client-side attribute_filter behavior and the authoritative parent_id relationship, justifying one point above baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource, 'List glossary terms by structure — term type, parent, or name fragment,' which immediately conveys what the tool does. It also explicitly distinguishes it from search_glossary_terms, making the purpose unmistakable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description names search_glossary_terms as the counterpart and states the selection principle: exact filters instead of ranked text. It lists concrete use cases — walking the hierarchy via parent_id, inventorying a term type, and paging the full dictionary — so an agent knows exactly when to choose this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_glossary_term_typesList Glossary Term TypesA
Read-onlyIdempotent

List the term types defined in the SAS Business Glossary.

A term type is the template a term is created from: it fixes which custom attributes the term carries and which of them are mandatory. Every term belongs to exactly one, and the choice is immutable after creation — so pick the type before calling create_glossary_term, then read its attribute contract with get_glossary_term_type.

usage_count is how many terms already use the type, which is the quickest way to tell a deployment's working vocabulary from types that were created once and abandoned.

NameRequiredDescriptionDefault
limitNoMaximum term types to return (default 50).
startNoOffset of the first term type (default 0).

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already establish readOnlyHint, idempotentHint, and destructiveHint, so safety is covered. The description adds useful behavioral context by explaining that term types are immutable templates and by clarifying that usage_count reveals how actively a type is used.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with a one-line purpose and every following sentence earns its place by explaining the template concept, the workflow order, or the meaning of usage_count. There is no redundant or filler content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only list tool with two self-documenting parameters, an output schema, and safety annotations, the description is complete. It covers what the tool returns, why the result matters, and how the tool fits into the broader glossary workflow.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema covers both parameters fully: limit and start have descriptions, types, and defaults. The tool description adds no parameter-specific guidance, but the schema already carries the full burden, so the baseline score of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'List the term types defined in the SAS Business Glossary.' It clearly separates term types from related glossary term tools by naming create_glossary_term and get_glossary_term_type, so an agent can distinguish this tool from siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear workflow context: choose a term type before calling create_glossary_term, then inspect its attribute contract with get_glossary_term_type. It does not explicitly state when not to use this tool, but the intended usage is clear enough for an agent to route correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_jobsList JobsA
Read-onlyIdempotent

List recent jobs from the Job Execution service.

NameRequiredDescriptionDefault
limitNoMaximum jobs to return (default 20).

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so safety is covered. The description adds the 'recent jobs' scope and service source, but does not disclose ordering, status filtering, or pagination behavior beyond the schema's limit parameter.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single front-loaded sentence: verb, resource, qualifier, and service. Every word earns its place and there is no redundancy or filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only list tool with one optional parameter, full schema coverage, safety annotations, and an output schema, the description provides enough information for an agent to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the only parameter, limit, is fully documented with a default and meaning. The description adds no parameter details, but none are needed beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('List') and resource ('recent jobs') and names the service ('Job Execution service'). This clearly distinguishes it from sibling tools like get_job_status, cancel_job, and other list_* tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies this tool is for browsing recent jobs, but it does not explicitly state when to use it instead of related tools such as get_job_status or get_job_log. No alternatives or exclusions are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_mas_modulesList Mas ModulesA
Read-onlyIdempotent

List published scoring models and decisions (MAS modules).

NameRequiredDescriptionDefault
limitNoMaximum modules to return (default 50).

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds the 'published' scoping, which is useful, but it does not describe pagination, return format, or any other behavioral traits beyond what the schema and annotations provide.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that is front-loaded with the action and resource, and every word earns its place. There is no filler or redundant restatement of the tool name.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only list operation with one optional parameter, a full output schema, and strong annotations, the description is largely complete. The main gap is the lack of explicit differentiation from closely related list tools, but this is not critical for a straightforward listing operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the only parameter 'limit' is already well documented in the schema with its default and meaning. The tool description adds no additional parameter-level semantics, so the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states a specific action ('List') and a specific resource ('published scoring models and decisions (MAS modules)'). It is distinguishable from generic list tools, though it does not explicitly name sibling alternatives such as list_ml_projects or list_decision_flows.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The intended use is implied: use this tool when you need to enumerate published MAS modules. However, the description gives no explicit guidance about when to prefer this over similar list tools, nor any exclusions or alternative routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_ml_projectsList Ml ProjectsB
Read-onlyIdempotent

List AutoML pipeline automation projects.

NameRequiredDescriptionDefault
limitNoMaximum projects to return (default 50).

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the description need not repeat them. The description adds no behavioral context beyond the resource type, such as default limit behavior or whether results are paged, but it aligns with the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single focused sentence with no filler or repetition of the title. It could add slightly more context, but for a simple list tool it remains appropriately sized.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool has one optional parameter documented in the schema, a rich output schema, and safety annotations, the description provides enough to invoke the tool. The only material gap is lack of usage context relative to sibling project/model tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The single parameter 'limit' is fully described in the input schema, including its default value and meaning. The description adds no parameter information, but with 100% schema coverage the schema carries the burden sufficiently.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description specifies the verb 'List' and a concrete resource, 'AutoML pipeline automation projects,' which distinguishes it from unrelated sibling list tools. It stops short of explicitly differentiating from similar ML-related tools like list_registered_models, but the resource is specific enough for basic selection.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool or how it relates to alternatives. No mention of using it before create_ml_project or run_ml_project, nor any exclusion such as 'use list_registered_models for models.' The agent must infer usage from the name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_publishing_destinationsList Publishing DestinationsB
Read-onlyIdempotent

List available publishing destinations.

NameRequiredDescriptionDefault
limitNoMaximum destinations to return (default 50).
startNoRow offset (default 0).
filter_nameNoOptional filter for destination names.

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description contributes only the vague qualifier 'available' and does not clarify scope, ordering, or permissions, but it also does not contradict the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise, with the action and resource front-loaded and no filler words. It is slightly too terse to add meaningful context beyond the title, but there is no unnecessary prose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With a complete input schema, strong read-only/idempotent annotations, and an output schema available, the description does not need to repeat return-value or safety details. The main gap is explaining what counts as an 'available' publishing destination, but this is a low-complexity tool and the surrounding structured metadata carries most of the burden.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all three parameters (limit, start, filter_name) are already documented with defaults. The description adds no extra meaning about how these parameters interact or what filtering entails.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly names a specific action (List) and resource (publishing destinations), making the basic operation unambiguous. It does not explicitly differentiate among the many list_* sibling tools, but the resource name is distinct enough to avoid direct confusion.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to use this tool versus alternatives, nor any connection to related publishing workflows or sibling publish_* tools. The agent must infer usage entirely from the tool name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_registered_modelsList Registered ModelsB
Read-onlyIdempotent

List models in the Model Repository.

NameRequiredDescriptionDefault
limitNoMaximum models to return (default 50).

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds the location ('Model Repository') but discloses no additional behavioral traits such as pagination, ordering, or side effects.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence with no filler. It is front-loaded and appropriately sized for a simple list operation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

This is a simple read-only list tool with one optional, fully documented parameter, an output schema, and safety annotations. The description is sufficient to understand the operation, though it could have added a note about the optional limit or how it differs from related list tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema describes the only parameter 'limit' fully with a default and description, so schema coverage is 100%. The tool description adds no parameter-specific meaning, which is acceptable because the schema already carries that burden.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear verb ('List') and a specific resource ('models in the Model Repository'), so an agent can understand the basic operation. It does not explicitly distinguish itself from sibling list tools such as list_ml_projects, but the 'registered models' resource is specific enough.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no guidance about when to choose this tool over alternatives or any prerequisites/exclusions. It merely states the action, leaving the agent to infer usage from the name and siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_reportsList ReportsB
Read-onlyIdempotent

List Visual Analytics reports.

NameRequiredDescriptionDefault
limitNoMaximum reports to return (default 50).
filter_nameNoOptional name filter (substring match).

Output Schema

NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, so the read-only safety profile is fully covered. The description adds no extra behavioral context (e.g., access scope, ordering, pagination), but it does not contradict the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence with no redundant words. It is minimal, though it skips information that might be useful; still, this is concise under-specification rather than verbosity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple, parameters are fully documented in the schema, an output schema exists, and annotations cover side-effect safety. The main missing element is usage guidance relative to sibling report tools, but that gap is already reflected in usage_guidelines. The description is adequate for a safe read-only call, though not rich.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%: both 'limit' and 'filter_name' have explicit descriptions in the schema. The tool description itself adds no parameter meaning beyond that, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb ('List') and a named resource class ('Visual Analytics reports'). This clearly distinguishes from siblings such as get_report, export_report, create_report, and other list_* tools that target different resource types.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance on when to choose list_reports over sibling tools like get_report, export_report, or describe_report_objects. The description is purely descriptive and leaves selection entirely to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_source_tablesList Source TablesA
Read-onlyIdempotent

List source tables that are NOT yet loaded into memory in a CAS library.

These are the candidates for promote_table_to_memory — tables that exist on the caslib's data source but are not in CAS memory yet.

NameRequiredDescriptionDefault
limitNoMaximum number of tables to return (default 50).
server_idYesCAS server name or ID.
caslib_nameYesName of the caslib.

Output Schema

NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already convey readOnly, idempotent, and non-destructive behavior. The description adds useful semantic context beyond annotations: these are source tables not yet in memory, intended as promotion candidates. No contradictions with annotations exist.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no wasted words. It front-loads the core action and scope, then provides the purpose and context in the second sentence.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only listing tool with a complete input schema and an output schema present, the description covers the essential selection criteria and downstream use case. Nothing needed for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the input schema already documents all three parameters. The description adds no parameter-specific detail, but it does not need to because the schema fully covers semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: 'List source tables that are NOT yet loaded into memory in a CAS library.' It clearly distinguishes this from sibling tools like list_castables by focusing on tables that exist on the caslib's data source but are not in CAS memory.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly frames these tables as 'the candidates for promote_table_to_memory,' giving the agent a clear reason to call this tool. It defines the exact inclusion criteria, though it does not explicitly name alternative tools or state when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_table_termsList Table TermsA
Read-onlyIdempotent

List the business terms assigned to a table's columns.

The reverse of list_term_assets, and the fastest way to judge whether a table is governed: it reports each column's term together with the term's own definition, so a caller can read what a cryptically named column actually holds.

Terms come from glossaryTermAsset relationships, so a column with no term here has genuinely never been assigned one — the catalog does not guess from column names.

NameRequiredDescriptionDefault
table_nameNoTable name, if the URI is not known. Rejected as ambiguous when more than one table matches.
max_columnsNoMaximum columns to inspect (default 200).
resource_uriNoThe table's source URI (preferred) — catalog_search returns it on every hit.
assigned_onlyNoReturn only columns that carry a term (default true). Set false to see the unassigned columns too.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/idempotent annotations, the description reveals that terms come from 'glossaryTermAsset' relationships and that a column with no term has 'genuinely never been assigned one' — the catalog does not guess from column names. That prevents a caller from over-interpreting an empty result.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three purposeful sentences: the first states what it does, the second positions it among siblings and characterizes its value, and the third explains the data-source semantics. No filler or repetition of schema content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read-only list with four optional parameters, full schema descriptions, annotations, and an output schema, the description covers the behavioral and data-source nuance an agent needs. Nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Input schema coverage is 100% and all four parameters have their own descriptions, so the baseline of 3 applies. The tool description adds no parameter-level detail, but it does not need to because the schema carries that burden.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'List the business terms assigned to a table's columns.' It also differentiates from the sibling list_term_assets by calling itself 'the reverse' and explains the return value: each column's term plus the term's definition.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states the canonical alternative ('The reverse of list_term_assets') and a concrete use case: 'the fastest way to judge whether a table is governed.' This gives an agent enough routing information without needing to open either tool's schema.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_term_assetsList Term AssetsA
Read-onlyIdempotent

List the data assets a business term is attached to — the columns that mean it.

The authoritative answer to "where is this term actually used?", read from the glossaryTermAsset relationships rather than inferred from names. Each entry names the column and the table it belongs to.

An empty result means the term is assigned to nothing, which is not the same as no matching column existing — assign_glossary_term is what creates the link. For a looser, name-based sweep, catalog_search accepts the Column.term:"<term name>" facet on the datasets index, which returns matching tables without resolving columns.

NameRequiredDescriptionDefault
limitNoMaximum assets to return in one call (default 100, ceiling 500 — the catalog's page size).
startNoOffset of the first asset returned (default 0). ``count`` in the result is the term's **total** asset count, so to read every asset of a heavily used term, call again with ``start`` = ``next_start`` until ``truncated`` is false.
term_idNoThe glossary term UUID.
term_nameNoExact term name, if the id is not known. One of the two is required.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already mark this as read-only, idempotent, and non-destructive. The description adds valuable behavioral context beyond that: results are read from glossaryTermAsset relationships, each entry names column and table, and an empty result has distinct semantics ('assigned to nothing') rather than meaning no matching column exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core purpose, then adds relationship semantics, edge-case meaning, and a concrete alternative in a compact, well-structured form. Every sentence earns its place and no content is redundant with the schema or annotations.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the rich annotations, fully described parameters, and presence of an output schema, the description provides what is missing: the conceptual model, the meaning of empty results, and how to select between this tool and catalog_search. Nothing an agent needs to call it correctly is left out.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and parameter descriptions are already thorough, covering defaults, ceiling, pagination via next_start/truncated, and the requirement that one of term_id/term_name be supplied. The tool description does not add parameter-level meaning beyond what the schema provides, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource ('List the data assets a business term is attached to — the columns that mean it') and clarifies it is the authoritative relationship-based answer, not a name inference. This clearly distinguishes it from related glossary/catalog tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly states when to use this tool ('authoritative answer to where is this term actually used?') and when not to, directing the agent to catalog_search with a specific facet for a looser name-based sweep. It also clarifies the empty-result edge case and names assign_glossary_term as the operation that creates the link.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lock_business_ruleset_revisionLock Business Ruleset RevisionA

Lock the current state of a rule set as an immutable revision.

Decision steps reference a specific rule set revision (versionId), not the live working copy, so a revision must exist before wiring a rule set into a decision flow — call again after editing rules if a decision needs to pick up the changes.

Viya locks the revision that was current and opens the next one: the result describes that new working revision, as before, and locked_revision the frozen one — use its id as the versionId for a reference that later edits cannot change.

The revision-creation request replaces the rule set's full content from the body sent, so this fetches the rule set with its rules included (application/vnd.sas.business.rule.set.integral+json) and resends them — omitting them would wipe the live rule set's rules, not just the new revision.

NameRequiredDescriptionDefault
ruleset_idYesThe rule set UUID (not its name — list_business_rulesets returns both).
revision_typeNo"minor" for iterative changes, "major" for a significant/approved milestone (default "minor").minor

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations: explains the fetch-and-resend mechanism, warns that omitting integral content would wipe the live rule set's rules, and clarifies that the result describes the new working revision while locked_revision is the frozen one. This is the kind of side-effect disclosure that destructiveHint: false alone would not convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core action and precondition are front-loaded, and each paragraph carries distinct information. It is somewhat long at four paragraphs, but the length is justified by the non-obvious fetch-and-resend warning; minor tightening is possible.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers the required precondition, the destructive-if-mishandled implementation detail, and how to consume the result (locked_revision.id as versionId). With an output schema present and 100% param coverage, there is nothing material an agent needs that is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both parameters already carry descriptions of ruleset_id and revision_type. The description adds conceptual value by framing the locked_revision id as the versionId to use downstream, but it adds no new detail on the parameters themselves; baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource: lock the current state of a rule set as an immutable revision. The resource ('rule set') distinguishes it from sibling siblings lock_decision_flow_revision and lock_decisioning_asset_revision without ambiguity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly states the precondition (a revision must exist before wiring a rule set into a decision flow) and the repeat condition (call again after editing rules if the decision must pick up changes). That is concrete when-to-use guidance rather than a vague context note.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lock_decision_flow_revisionLock Decision Flow RevisionA

Lock the current state of a decision flow as an immutable revision.

Call after a successful create/update to freeze the approved state as a point-in-time snapshot referenceable by publish_decision_flow. Viya locks the revision that was current and opens the next one: the result describes that new working revision, as before, and locked_revision the frozen one.

NameRequiredDescriptionDefault
decision_idYesThe decision flow UUID (not its name — list_decision_flows returns both).

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond the annotations by explaining the state machine: Viya locks the current revision and opens the next one, with the result describing the new working revision and locked_revision the frozen one. This is consistent with readOnlyHint=false and idempotentHint=false, and tells the agent exactly what mutation occurs and what the outcome represents.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core action is front-loaded in the first sentence, followed by a compact explanation of when to call and what the result contains. Slightly verbose in the final clause ('as before') but no sentence is wasted.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With a single fully documented parameter, an output schema, and annotations covering the safety profile, the description supplies everything an agent needs to invoke it correctly: the trigger, the locked/next-revision behavior, and the downstream publish relationship.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema itself already clarifies that decision_id is a UUID rather than a name. The description adds no additional parameter semantics, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb plus resource ('Lock the current state of a decision flow as an immutable revision') and explains the resulting snapshot semantics. It names publish_decision_flow as the consumer, but does not distinguish itself explicitly from the analogous lock_decisioning_asset_revision or lock_business_ruleset_revision siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Call after a successful create/update to freeze the approved state' provides a concrete trigger condition, and naming publish_decision_flow as the downstream consumer clarifies the ordering. It stops short of stating when not to call or what happens if invoked on an already-locked state.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

lock_decisioning_asset_revisionLock Decisioning Asset RevisionA

Freeze the current state of a rule set, decision, segmentation tree or code file as a locked revision.

Viya locks the revision that was current and opens the next one for editing (1.0 is locked, 1.1 is open). locked_revision is the frozen state: reference it from a decision step or publish it. Later edits go to working_revision and do not change what was locked.

NameRequiredDescriptionDefault
asset_idYesThe ID.
asset_typeYesrule_set, decision, segmentation_tree or code_file.
revision_typeNo"minor" for iterative changes, "major" for an approved milestone.minor

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description adds substantial behavioral context beyond the annotations: Viya locks the current revision, opens the next one, and later edits go to working_revision without changing the locked state. It also gives a concrete version example (1.0 locked, 1.1 open). This is exactly the kind of state-transition and immutability information an agent needs for a mutation tool, and it does not contradict the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the action, then explains the revision lifecycle with no wasted sentences. The parenthetical version example and the locked_revision/working_revision distinction earn their place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For correct invocation, the description is largely complete: it explains the locking effect, the version transition, and the immutability of the locked revision, and the output schema covers return values. It stops short of describing prerequisites such as whether a current revision must exist, and it does not clarify selection against overlapping lock siblings.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents asset_id, asset_type, and revision_type. The description reiterates the asset types but does not explain revision_type's minor/major semantics beyond what the schema provides. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Freeze the current state of a rule set, decision, segmentation tree or code file as a locked revision.' It clearly identifies the asset types and the locking action, but it does not distinguish this generic lock tool from siblings such as lock_business_ruleset_revision or lock_decision_flow_revision.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the locking action and the enumerated asset types, and the description explains that the locked revision can be referenced or published. However, it gives no explicit when-to-use/when-not-to-use guidance and does not route the agent between this tool and the specialized lock tools in the sibling list.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

promote_table_to_memoryPromote Table To MemoryA
Idempotent

Load a source table into CAS memory at global scope (visible to all sessions).

Loads the table from its caslib data source and promotes it to global scope via the casManagement updateTableState API. Idempotent: if the table is already loaded in global scope it is left untouched. Use list_source_tables to discover unloaded tables that can be promoted.

NameRequiredDescriptionDefault
server_idYesCAS server name or ID.
table_nameYesTable to load and promote.
caslib_nameYesCaslib containing the table.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate readOnlyHint=false and idempotentHint=true. The description adds valuable details: the table is promoted to global scope, the operation uses updateTableState, and the tool is idempotent, leaving already-loaded global tables untouched. This is useful behavior beyond what the annotations alone convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and front-loaded, with the main purpose stated in the first sentence. The follow-up sentences add essential details about the API, idempotency, and discovery via list_source_tables without unnecessary fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a three-parameter tool with a fully documented schema and an output schema, the description covers the operation, scope, idempotency, and how to find candidate tables. Nothing essential is missing for an agent to select and invoke this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with each parameter clearly described as server_id, caslib_name, and table_name. The description reinforces the role of table_name and caslib context but does not need to add more because the schema is already complete.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states the specific action: load a source table into CAS memory at global scope. It also explains the underlying API and explicitly points to list_source_tables for discovering unloaded tables, which differentiates this from sibling tools like list_castables or list_source_tables.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives clear context for when to use the tool by explaining it promotes tables to global scope and is idempotent. It explicitly recommends list_source_tables to discover promotable tables, which provides a usage path, though it does not explicitly state when to prefer alternatives over this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

publish_decision_flowPublish Decision FlowA

Publish a locked decision revision to a Micro Analytic Score (MAS) destination.

Required before score_data can execute the decision — MAS runs published modules, not decision flows directly. Requires the DS2 code generation service to be healthy for this decision's rule sets; an error mentioning rule set code generation is an environment-level issue, not a bad payload.

Publishing is asynchronous and the resulting MAS module ID is server-generated — it is NOT publish_name. This polls the publish job (properties.masModules[0].jobUri) until it reaches a terminal state and returns the real moduleId alongside the publish record, so the result is directly usable with get_mas_module_step_signature/score_data without a separate lookup via list_mas_modules.

The code is generated for MAS, as SAS Intelligent Decisioning does when it publishes, so lookup tables are read from MAS. Unlike a module the Intelligent Decisioning UI publishes, whose inputs end in an underscore (credit_score_), the module's inputs keep the decision's variable names.

NameRequiredDescriptionDefault
decision_idYesThe decision flow UUID (not its name — list_decision_flows returns both).
revision_idYesThe locked revision UUID (see ``lock_decision_flow_revision``).
poll_timeoutNoMax seconds to wait for the publish job to reach a terminal state before giving up (default 60.0).
publish_nameYesThe published name shown in Model Publish (not the MAS module ID — see above).
destination_nameNoThe configured MAS publishing destination (default "maslocal").maslocal

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare mutation/async safety (readOnly=false, idempotent=false). The description adds substantial value: async polling behavior, server-generated module ID distinct from publish_name, environment-level error diagnosis for rule-set codegen, and MAS-side lookup table reads. Strong beyond-annotation disclosure, though the exact terminal-state/error return shape is left to the output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action in the first sentence, then behavior details. Fairly long and dense with parenthetical caveats, but each paragraph carries useful distinction (score_data prerequisite, polling, input naming). Minor redundancy around publish_name/module ID.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given a mutation tool with an output schema and full annotation coverage, the description supplies the prerequisite chain, async polling semantics, module-ID distinction, and environment-error guidance. Nothing critical for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, so baseline is 3. The description still adds meaning: it clarifies publish_name is the Model Publish name and NOT the MAS module ID, and clarifies that decision_id is a UUID (not a name). That reinforces/extends schema intent without exceeding it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource+precondition: 'Publish a locked decision revision to a MAS destination.' This distinguishes it from publishing siblings (publish_ml_champion_model) and from consumers like score_data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly says it is required before score_data can execute, that the revision must be locked, and that the returned moduleId is usable directly with get_mas_module_step_signature/score_data rather than via list_mas_modules. Clear when-to-use and alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

publish_ml_champion_modelPublish Ml Champion ModelB
Destructive

Publish the champion model from an AutoML pipeline automation project to the Model Repository.

NameRequiredDescriptionDefault
project_idYesID of the ML pipeline automation project.
destination_nameYesName of the destination to publish to.

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true and idempotentHint=false, so the mutating nature is known. The description adds context by specifying the source and destination, but it does not explain whether publishing overwrites an existing champion model, creates a new version, or has side effects beyond the publish operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, focused sentence that front-loads the key action and destination. There is no filler or repetition, and every phrase contributes meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With two well-documented parameters, an output schema, and annotations, the definition is structurally adequate. However, it lacks important context about the champion model lifecycle, the relationship to 'register_ml_champion_model', and what happens if a model already exists at the destination. This leaves an agent uncertain about preconditions and side effects.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and both required parameters are already documented clearly. The description reinforces that 'project_id' is the AutoML pipeline project and 'destination_name' is the publish target, but it adds no additional semantic or constraint information beyond what the schema provides.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific action ('publish'), a specific object ('champion model'), and a specific destination ('Model Repository'). It is clear what the tool does. However, it does not distinguish itself from the closely named sibling tool 'register_ml_champion_model', so an agent may not know which to choose based on the description alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no guidance about when to use this tool versus alternatives such as 'register_ml_champion_model' or 'run_ml_project'. It also does not mention prerequisites like a completed AutoML project run or the need to check publishing destinations beforehand. Usage context is only implied, not stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

query_dataQuery DataA

Run a FedSQL SELECT against CAS or compute data and return the rows.

One SQL surface over both storage tiers, so exploring a caslib table and a SAS library table use the same tool and the same dialect. The query runs in the reusable compute session; nothing is persisted — the result is materialised into session scratch, read back, and dropped.

Pick the tier with target — it selects the namespace, and the two cannot be mixed in one statement (a caslib table and a libref table cannot be joined; stage one side first with execute_sas_code):

  • target='cas' (default) — qualify as caslib.table (e.g. Public.HMEQ); see list_caslibs / list_castables.

  • target='compute' — qualify as libref.table (e.g. WORK.SALES); see list_compute_libraries / list_compute_tables. Concatenated librefs — several directories under one name, which is what SASHELP and MAPS are — are invisible to FedSQL, because its BASE driver maps one schema to one directory. Copy such a table into WORK first (data work.cars; set sashelp.cars; run;) and query WORK.CARS.

Dialect notes (FedSQL, not PROC SQL): joins (inner/left/right/full/ cross), subqueries, UNION, GROUP BY/HAVING/ORDER BY, and scalar functions work. There is no WITH/CTE — use a derived table (select ...) "t" — and no MERGE; express a merge as a join (a full join with COALESCE gives upsert semantics). Double-quote identifiers that are reserved words or contain spaces; SAS name literals ('x'n) are not FedSQL.

Row capping is done by this tool, not by your SQL: any LIMIT you write is ignored in favour of limit (a malformed LIMIT is silently discarded by CAS and would return the whole table). Add ORDER BY for stable paging.

NameRequiredDescriptionDefault
limitNoMaximum rows to return, 1..10000 (default 100).
queryYesA single FedSQL SELECT statement. DDL/DML is refused — this tool only reads rows.
startNoRow offset for paging (default 0).
targetNoWhich tier the identifiers refer to — ``cas`` (default) or ``compute``.cas
create_view_nameNoIf set, the result includes ``create_view_sql`` — the ``CREATE VIEW <name> AS <query>`` text for this query. It is returned for you to run yourself, never executed here.
compute_context_nameNoCompute context to run in; defaults to the server's configured execution context.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses behavior far beyond the annotations: queries run in the reusable compute session, results are materialised into session scratch, read back, and dropped, and nothing is persisted. It also reveals tool-side row capping ('any LIMIT you write is ignored'), silent handling of malformed LIMITs, refusal of DDL/DML, and that 'create_view_name' is never executed. These details add rich behavioral context and do not contradict the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long, but it is dense and every section earns its place: purpose, tier selection, dialect constraints, and row-capping behavior. Bold headings, short paragraphs, and a front-loaded 'target' decision make the large amount of necessary information scannable and appropriately structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with six parameters and a complex FedSQL surface, the description covers query constraints, tier behavior, paging, non-persistence, and dialect limitations. Since an output schema exists, the return-value format is already handled elsewhere. Nothing needed for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Although the schema already documents all six parameters, the description adds significant meaning beyond it: target qualification examples for both tiers, the fact that SQL LIMIT is ignored in favor of the 'limit' parameter, and that 'create_view_name' returns SQL for the agent to execute itself rather than executing it. This is exactly the kind of parameter-level insight an agent needs to call the tool correctly.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence states a specific verb and resource: 'Run a FedSQL SELECT against CAS or compute data and return the rows.' It clearly distinguishes the tool from siblings by explaining the two storage tiers and pointing to the relevant list tools for each namespace. This gives an agent an unambiguous idea of what the tool does and how it differs from other data-access tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells the agent to select the tier with 'target', explains that the two tiers cannot be mixed, and directs staging one side with 'execute_sas_code'. It also gives concrete when-not-to-use conditions: concatenated librefs like SASHELP are invisible to FedSQL and must be copied into WORK first, and MERGE/WITH are unavailable with explicit alternatives. This is strong, actionable usage guidance with named alternatives.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

register_ml_champion_modelRegister Ml Champion ModelB

Register the champion model from an AutoML pipeline automation project to the Model Repository.

NameRequiredDescriptionDefault
project_idYesID of the ML pipeline automation project.

Output Schema

NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations indicate this is not read-only and not idempotent, so this is a side-effecting operation. The description says 'Register' and names the destination, which is consistent with those annotations but does not disclose whether an existing model would be overwritten, whether a champion must already exist, or what versioning behavior applies. It adds minimal behavioral context beyond the annotations but does not contradict them.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that states the action, source, and destination with no filler. Every phrase contributes meaning, and the core action is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With only one parameter, full schema coverage, and an output schema present, the description covers the essential information needed to invoke the tool. It could be more complete by addressing preconditions (e.g., project must have a champion) and by clarifying the relationship to 'publish_ml_champion_model', but these gaps are relatively minor for an otherwise simple tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has full coverage (100%) and describes 'project_id' as the ID of the ML pipeline automation project. The description adds no additional parameter-level detail beyond what the schema already provides, so the baseline score of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Register') with a clear resource ('champion model'), a source ('AutoML pipeline automation project'), and a destination ('Model Repository'). This goes beyond a tautology. However, there is no explicit distinction from the similarly named sibling 'publish_ml_champion_model', so it doesn't fully differentiate within the sibling set.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives, notably the sibling 'publish_ml_champion_model'. No workflows, preconditions, or exclusions are mentioned. The context 'from an AutoML pipeline automation project' implies a scenario but does not explicitly state when registration is preferred over publishing or other model management operations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

reset_compute_sessionReset Compute SessionA
DestructiveIdempotent

Reset (delete) the cached compute session for a compute context.

The server keeps one reusable SAS compute session per user and compute context so repeat calls skip the slow session spin-up; SAS state (WORK tables, macro variables, assigned librefs) therefore persists across execute_sas_code and list_compute_* calls. Call this to discard that state — the next compute tool call transparently creates a fresh session.

NameRequiredDescriptionDefault
compute_context_nameNoCompute context whose session to reset. Defaults to the server's configured execution context (the one ``execute_sas_code`` uses).

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint and idempotentHint, and the description adds concrete detail on what is destroyed (cached session, SAS state) and what happens after (next compute call creates a fresh session transparently). This goes beyond the annotations and clarifies the non-obvious session-reuse behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three concise sentences: the one-line action, the rationale, and the consequence. Every sentence contributes, and the core action is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple tool with one optional parameter, full schema coverage, and an output schema, the description explains the session lifecycle, why reset may be needed, and what happens afterward. Nothing critical for calling it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%; the schema already fully describes compute_context_name, including its default behavior. The description adds no parameter-specific info, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific action ('Reset (delete)') on a specific resource ('cached compute session for a compute context'). It clearly distinguishes itself from sibling tools by explaining it discards state rather than executing code or listing artifacts.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Describes when to call it: when you want to discard persisted SAS state (WORK tables, macro variables, librefs) that otherwise carries across execute_sas_code and list_compute_* calls. It doesn't name alternatives (there are none for resetting), but the context is clear enough; a 5 would require an explicit exclusions sentence.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

run_ml_projectRun Ml ProjectC

Run an AutoML pipeline automation project.

NameRequiredDescriptionDefault
project_idYesID of the project to run.

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations are all false (readOnlyHint, idempotentHint, etc.), so they convey little about side effects, and the description adds nothing further. For an action that runs an ML project, an agent would need to know whether execution is asynchronous, whether it consumes compute resources, and whether repeated runs are safe; none of this is disclosed. The description therefore provides no behavioral transparency beyond the minimal structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with no filler, making it easy to scan. The wording is slightly redundant ('AutoML pipeline automation project') but the length is appropriate for the tool's simplicity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

While an output schema exists, so return values are presumably defined, the description is too thin for an action-oriented tool. It omits critical context such as whether running the project starts an asynchronous job, how to monitor or cancel it, and whether any prerequisites exist. This makes the tool incomplete for an agent deciding whether and how to invoke it.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%: the single parameter project_id is documented as 'ID of the project to run.' The description adds no additional parameter context, such as how to find valid project IDs or any required format. Per the baseline for high schema coverage, this is acceptable but not enhanced.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description specifies the action 'Run' and the resource 'an AutoML pipeline automation project,' which clearly indicates this tool executes a project rather than creating or listing it. However, the phrase 'AutoML pipeline automation project' is somewhat jargon-heavy and doesn't clarify what 'running' entails (e.g., starting a job, triggering a pipeline), preventing a top score.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided about when to use this tool versus its siblings, such as list_ml_projects or create_ml_project. The description does not mention prerequisites (e.g., project must already exist) or how to obtain a project_id. This leaves the agent to infer sequencing and alternatives on its own.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

score_dataScore DataA

Score data against a published model or decision (MAS module).

A decision published from the SAS Intelligent Decisioning UI names its inputs with a trailing underscore (credit_score_); the plain names are accepted and mapped, and the result's inputs_renamed says so. (publish_decision_flow keeps the plain names.)

NameRequiredDescriptionDefault
step_idYesStep ID within the module (usually 'score' or 'execute').
module_idYesMAS module ID.
input_dataYesDictionary of input variable name-value pairs.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare non-read-only, non-idempotent, non-destructive, closed-world behavior. The description adds genuinely useful context beyond that: decisions published from the UI use trailing-underscore input names, plain names are auto-mapped, and the result reports this via inputs_renamed. It stops short of covering error or failure behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core purpose is front-loaded in one sentence, with the naming caveat as a short follow-up. No filler, though the parenthetical about publish_decision_flow is slightly terse and could be clearer.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be explained, and all three parameters are documented. For a non-idempotent scoring call the definition is nearly complete, missing only explicit preconditions (module must be published/active) and failure-mode hints.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, and the description earns an extra point by explaining how input_data variable names are handled (trailing-underscore mapping, with inputs_renamed reporting the remap) – real meaning beyond the schema's generic 'variable name-value pairs'.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb and resource ('Score data against a published model or decision') and scopes it to MAS modules, which is more than a restatement of the name. It only lightly distinguishes itself from publishing/validation siblings via the parenthetical about publish_decision_flow, so it falls short of full sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The usage context is implied – you score against an already-published model or decision – and the input-naming note hints at a precondition. However, there is no explicit when-to-use/when-not or a direct pointer to alternatives like get_mas_module_step_signature for inspecting expected inputs before scoring.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_glossary_termsSearch Glossary TermsA
Read-onlyIdempotent

Free-text search of the business glossary — the way in when you know a word, not an id.

Runs against the SAS Data Governance catalog's terms index, so it is ranked and matches definitions as well as names, unlike list_glossary_terms' exact structural filters. Supports the catalog grammar: wildcards (rev*), field constraints (Name:revenue, Status:Published) and + to require a word.

Each hit carries both identifiers — term_id for every other glossary tool, catalog_entity_id for catalog relationships — plus assigned_asset_count, so you can tell whether a term is actually in use before spending a call on list_term_assets. A term with a count of 0 exists in the dictionary and is attached to no data.

NameRequiredDescriptionDefault
limitNoMaximum hits to return (default 20).
queryYesSearch text. ``*`` matches every term.
startNoOffset of the first hit (default 0).
include_attributesNoAlso return each hit's custom attributes, named (default false). The search index does not carry them, so this costs one extra batched call per 40 hits; leave it off when the names and definitions are all you need.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare read-only/idempotent, so the bar is met; the description goes further by disclosing that results are ranked, that hits carry both term_id and catalog_entity_id, the meaning of assigned_asset_count=0, and the real cost of include_attributes (one extra batched call per 40 hits). That is genuine behavioral context beyond the annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the purpose and the sibling contrast, then progressively deeper detail (grammar, hit contents, cost). Paragraph breaks do real work and no sentence is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present the description needn't document returns, yet it still adds the discriminating details an agent needs (grammar, dual identifiers, usage count, attribute-fetch cost). Nothing required to call or interpret this tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so baseline is 3; the description adds query syntax the schema omits — wildcards (rev*), field constraints (Name:revenue, Status:Published) and '+' for required words. It doesn't re-explain limit/start, which the schema already covers.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('free-text search of the business glossary') and immediately differentiates from the sibling list_glossary_terms by contrasting ranked, definition-matching search against 'exact structural filters'. An agent can pick between them without opening either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly frames when to use it ('the way in when you know a word, not an id'), names the alternative (list_glossary_terms) and the condition that selects it, and adds a downstream routing hint: use assigned_asset_count before spending a call on list_term_assets. Both when-to-use and when-not-to-use are covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

submit_batch_jobSubmit Batch JobA
Destructive

Submit a SAS job for asynchronous execution via the Job Execution service.

NameRequiredDescriptionDefault
job_nameNoOptional descriptive name for the job.
sas_codeYesSAS code to execute.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate the operation is not read-only, is destructive, is not idempotent, and has open-world effects. The description adds the asynchronous execution detail, but does not disclose additional behavioral traits such as what persists, how to track the job, or side effects beyond the annotation summary.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single, front-loaded sentence contains the verb, resource, execution mode, and service context with no wasted words. It is concise without losing essential meaning.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of an output schema, complete parameter documentation, and annotations covering safety semantics, the description is sufficient for invocation. It clearly communicates asynchronous execution, which is the main behavioral context an agent needs to properly use the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the description adds no additional meaning for the 'sas_code' or 'job_name' parameters beyond what the schema already documents. The baseline of 3 applies because the schema fully carries the parameter documentation burden.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('submit'), a resource ('SAS job'), and a key characteristic ('asynchronous execution') that distinguishes it from sibling tools like execute_sas_code. Despite not naming a sibling, the async qualifier makes the tool's intent unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly implies this is for asynchronous execution, which gives an agent context for when to choose it over synchronous alternatives. However, it does not explicitly state when not to use it or name alternative tools such as execute_sas_code.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

unassign_glossary_termUnassign Glossary TermA
DestructiveIdempotent

Remove a business term's assignment from a table column.

Deletes only the link: the term and the column both survive. Use delete_glossary_term to remove the term from the dictionary itself.

NameRequiredDescriptionDefault
term_idNoThe glossary term UUID.
term_nameNoExact term name, if the id is not known. One of the two is required.
table_nameNoTable name, if the URI is not known.
column_nameYesThe column to detach the term from (case-insensitive).
resource_uriNoThe table's source URI (preferred).

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already carry destructiveHint=true, but the description adds the key nuance: 'Deletes only the link: the term and the column both survive.' This tells the agent exactly what is destroyed and what is preserved, which is precisely the kind of context annotations cannot express.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences with no filler; the core action is front-loaded, the behavioral caveat follows immediately, and the alternative is given in one clause.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given full schema coverage, an output schema, and annotations covering read/write/idempotence/destruction, the description covers purpose, side effects, and the relevant sibling. Nothing needed to call the tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all five parameters. The description itself adds no parameter-level detail beyond naming the target column, meeting the baseline but not exceeding it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Remove a business term's assignment from a table column.' It also distinguishes itself from the sibling delete_glossary_term by clarifying 'the term and the column both survive.'

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly names the alternative: 'Use delete_glossary_term to remove the term from the dictionary itself.' This tells the agent when to use this tool versus the destructive sibling and implies the normal-scope use case for this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_business_ruleUpdate Business RuleC
DestructiveIdempotent

Update an existing rule inside a SAS Business Rules rule set.

NameRequiredDescriptionDefault
nameYesRule name (max 30 chars).
actionsYesList of assignment/return/lookupValue actions to perform when matched.
rule_idYesThe specific rule UUID to update.
conditionsYesList of conditions (multiple conditions AND together), including ``lookup`` conditions (see create_business_rule).
ruleset_idYesThe parent rule set UUID (not its name — list_business_rulesets returns both).
conditionalYes"if" starts a new independent rule chain, "elseif" continues the previous rule's chain, "or" ORs into it.
rule_fired_tracking_enabledYesWhether to record when this rule fires.

Output Schema

NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare destructiveHint=true, idempotentHint=true, and readOnlyHint=false, so the safety profile is covered. The description adds nothing beyond that: it never says the call replaces the whole rule definition (all 7 params are required), nor mentions locking, revision creation, or validation side effects that matter for a destructive update.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One tight sentence with no filler and the resource is front-loaded. It is efficient, though the brevity contributes to the missing-behavior gaps noted elsewhere.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive, 7-required-parameter update inside a locked-revision workflow, the description omits the full-replacement semantics and the locking/prerequisite step. An output schema exists so return values need no explanation, but the operational context an agent needs to call this correctly is absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already explains each parameter (rule UUID, ruleset UUID not name, conditional semantics, condition/action lists). The description adds no parameter-level meaning beyond that, which is the baseline 3 case.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Update an existing rule inside a SAS Business Rules rule set'), which is clear enough to distinguish it from create_business_rule and update_business_ruleset by resource granularity. It does not explicitly contrast with those siblings, but the resource is unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no guidance on when to choose this over update_business_ruleset or create_business_rule, and no prerequisites are mentioned — notably that a rule set revision likely must be locked first (siblings lock_business_ruleset_revision / lock_decisioning_asset_revision exist). The agent must infer all of this.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_business_rulesetUpdate Business RulesetA
DestructiveIdempotent

Update an existing SAS Business Rules rule set's name/description/signature.

Changing the signature can invalidate existing rules that reference removed variables — check with get_business_ruleset first if unsure.

The rule set stays in its folder. One that is in no folder (created before folders were required) is filed into folder, or the default folder. The result's folder says where the rule set is.

NameRequiredDescriptionDefault
nameYesRule set name (max 30 chars).
folderNoOnly used when the rule set is in no folder yet: a folder path, ``My Folder``, a folder ID or a folder URI to file it in.
signatureYesInput/output/inOut variables the rules operate on.
ruleset_idYesThe existing rule set UUID (not its name — list_business_rulesets returns both).
descriptionNoOptional description.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations by naming the concrete destructive consequence: changing the signature can invalidate existing rules that reference removed variables. It also discloses the folder side effect — an unfiled rule set gets filed into the given or default folder, and the returned 'folder' reports where it landed — which the destructiveHint annotation alone would never convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the operation in the first sentence, then devotes short paragraphs to the risk and folder behavior — every sentence carries information. The folder paragraph is slightly longer than needed and could be tightened, but nothing is redundant.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive mutation with an output schema and full annotation coverage, the description supplies what structured fields cannot: the invalidation risk, the folder-filing rule, and where to verify current state before calling. The one remaining ambiguity — whether a revision lock is a prerequisite — is a minor gap against an otherwise complete picture.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description earns an extra point by explaining the semantic consequence of the 'signature' parameter (invalidating dependent rules) and the conditional nature of 'folder' (only applies when the rule set has no folder yet, with a default fallback). It adds little for ruleset_id or name, which the schema already handles well.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (update) and resource (an existing SAS Business Rules rule set) plus exactly which fields are mutable (name/description/signature). The word 'existing' plus the sibling set (create_business_ruleset, get_business_ruleset, delete_business_ruleset) makes the operation unambiguous without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly routes the agent to get_business_ruleset first when the signature change is risky, naming both the alternative and the condition. It does not cover other selection questions, such as whether a revision lock is required before updating (the sibling lock_business_ruleset_revision is never mentioned), so it stops short of full when/when-not coverage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_code_fileUpdate Code FileA
DestructiveIdempotent

Change a code file's working revision: its code, name, description or signature types.

New code makes Viya read the signature again. Lock a revision first (lock_decisioning_asset_revision) to keep the current state.

NameRequiredDescriptionDefault
codeNoNew code.
nameNoNew name.
folderNoOnly used for a code file that is in no folder yet.
signatureNoTypes and descriptions (needed for Python, see create_code_file).
descriptionNoNew description.
code_file_idYesThe code file ID.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare this as a destructive, idempotent mutation. The description adds meaningful behavior beyond annotations: new code causes Viya to re-read the signature, and locking a revision preserves the current state. It does not detail permissions or rollback behavior, but the added operational context is useful.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two short, front-loaded sentences with no wasted text. The core action comes first, followed by the key behavioral note and prerequisite.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With full schema coverage, an output schema, and annotations covering safety and idempotency, the description supplies the remaining critical context: the working-revision scope, signature re-read behavior, and locking prerequisite. An agent has enough information to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all six parameters. The description lists most mutable fields and notes that new code affects signature reading, but it does not add syntax or format detail beyond the schema. Baseline 3 is appropriate when the schema carries parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: changing a code file's working revision. It also names the exact mutable fields (code, name, description, signature types), so an agent can distinguish this from create_code_file and unrelated update tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives a clear prerequisite for preserving current state: lock a revision first via lock_decisioning_asset_revision. It implies this is the tool for updating an existing code file, but does not explicitly contrast when to use create_code_file or update_custom_function instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_custom_functionUpdate Custom FunctionA
DestructiveIdempotent

Change a custom function's code, description or category; new code is checked to compile first.

Every rule set that calls the function uses the new code from its next code generation.

NameRequiredDescriptionDefault
codeNoNew DS2 method.
categoryNoMove it to this category (name or ID).
descriptionNoNew description.
function_idYesThe function ID.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds meaningful context beyond annotations: new code is compile-checked, and every calling rule set will use the new code from its next generation. This reveals side effects and validation behavior. Annotations already cover destructive and idempotent hints, so this is good additional value.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two well-structured sentences: the first front-loads the action and key behavior (compile check), the second adds essential propagation context. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers what changes, the compile check, and downstream effect, which are the critical behavioral facts for a destructive mutation. With annotations and an output schema handling safety and return values, only minor gaps (e.g., permission requirements) remain.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents each parameter (function_id, code, category, description). The description does not add syntax or format details beyond what the schema provides; baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (change) and resource (custom function's code, description, category), distinguishing it from create/validate siblings. However, it does not explicitly name alternatives or clarify when to use this versus validate_custom_function.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides context about compilation checking and propagation effect, but offers no explicit guidance on when to use this tool versus siblings like validate_custom_function or create_custom_function. No exclusions or prerequisite conditions are mentioned.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_decision_flowUpdate Decision FlowA
DestructiveIdempotent

Update an existing SAS Intelligent Decisioning flow.

Pass ALL steps (existing + new), as steps or rule_set_steps — the full flow is replaced on update, it is not a partial patch.

The decision stays in its folder. One that is in no folder (created before folders were required) is filed into folder, or the default folder. The result's folder says where the decision is.

NameRequiredDescriptionDefault
nameYesDecision name (max 60 chars).
stepsNoThe whole flow, every step kind — assignments, models, branches, conditions, rule sets, trees, code files, sub-decisions; ``create_decision_flow`` describes each, with an example.
folderNoOnly used when the decision is in no folder yet: a folder path, ``My Folder``, a folder ID or a folder URI to file it in.
signatureYesFlow-level input/output variables.
decision_idYesThe existing decision flow UUID (not its name — list_decision_flows returns both).
descriptionNoOptional description.
rule_set_stepsNoOrdered list of rule set steps (see ``create_decision_flow`` for the shape).
add_missing_variablesNoWith ``steps``, add a decision variable for every step term none matches (default true; see ``create_decision_flow``).

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true and idempotentHint=true, so the safety profile is covered; the description adds the essential detail of what is destroyed (the entire step list is overwritten) and the folder side effect for legacy folderless decisions. It does not mention revision-locking requirements or concurrency behavior, which would be the remaining behavioral gap for a destructive mutation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three tight paragraphs, front-loaded with the operation and the non-obvious full-replacement constraint before the folder edge case. Every sentence carries a constraint an agent could otherwise get wrong.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need no explanation, and the note about the result's 'folder' field is a nice touch. For an eight-parameter destructive update it is nearly complete; the notable omission is any mention of revision locking or permission prerequisites.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description earns an extra point by emphasizing the semantics that matter most — that 'steps' must carry existing plus new steps, and that 'folder' is only consulted when the decision currently has no folder. It does not add anything on 'signature' or 'add_missing_variables' beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource — 'Update an existing SAS Intelligent Decisioning flow' — which cleanly separates it from create_decision_flow and the read siblings (get_decision_flow, list_decision_flows). It does not name those siblings explicitly, but 'existing' plus the replacement semantics make the intent unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The critical usage rule is stated up front: pass ALL steps because the flow is fully replaced, not patched. It also defers step-shape detail to create_decision_flow, implicitly routing the agent there for construction. What's missing is when an agent should prefer this over delete+create, or prerequisites such as locking a revision (a lock_decision_flow_revision sibling exists).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_glossary_termUpdate Glossary TermA
DestructiveIdempotent

Update a business term's text, parent or custom attributes — and publish a draft.

The glossary API replaces the whole term on update, so this reads the current one first and merges your changes into it: omitting an argument leaves that field alone rather than blanking it. attributes merges the same way, per attribute — pass only the ones you are changing, and set one to "" to clear it. A boolean is the exception: the glossary has no empty boolean and rejects "", so set it to True/False rather than trying to clear it.

Because the whole term is rewritten, every attribute the type marks required must hold a value — including ones made required after this term was created. That is checked before the call, and reported by name.

A term's type cannot be changed after creation. Its parent can: pass parent_id to move it, or "" to make it a root term.

A draft is a different resource. A term left unpublished by create_glossary_term(publish=false) can be read and deleted at the ordinary path, but not written there — the service answers a plain PUT on a draft with a 404. This routes the write to the draft instead, so editing one works; and publish then promotes it to a published term, which nothing else here could do. Publishing a term that is already published is reported, not attempted: there is no draft to promote and the service answers that with a 404 too.

NameRequiredDescriptionDefault
nameNoNew name (unique among siblings, max 100 characters).
labelNoNew display label.
publishNoPublish the term if it is still a draft (default false). Pass it on its own to publish without changing anything else.
term_idYesThe glossary term UUID.
parent_idNoMove the term under a different parent, or ``""`` to make it a root term. A term cannot be its own ancestor.
attributesNoCustom attributes to change, keyed by label. Same value forms as create_glossary_term — booleans as True/False, multi-select as a list.
definitionNoNew definition.
descriptionNoNew description, max 1000 characters.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description goes well beyond the annotations by disclosing whole-term replacement with merge semantics, field preservation when omitted, per-attribute merging with "" clearing, the boolean exception, required-attribute validation, type immutability, parent movability, and draft 404 handling. This is rich, accurate behavioral context with no contradiction against readOnlyHint=false, destructiveHint=true, or idempotentHint=true.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every paragraph earns its place: merge behavior, required-attribute risk, type/parent rules, and draft routing are each separate hazards an agent must understand. The summary sentence front-loads the core purpose before the deeper behavioral details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given eight parameters, full schema coverage, and an output schema, the description covers the non-obvious behaviors needed to call the tool safely: draft 404s, publish behavior, required attribute enforcement, type immutability, and merge semantics. Nothing essential for correct invocation is left unexplained.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already defines each parameter's basic meaning. The description adds operational semantics beyond the schema: omitting arguments leaves fields untouched, attributes merge per attribute and can be cleared with "", booleans cannot be cleared, and publish can be passed alone. This supplements rather than duplicates the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Update a business term's text, parent or custom attributes — and publish a draft.' This clearly distinguishes the tool from glossary creation, deletion, and assignment siblings by focusing on mutating an existing term.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit draft-related usage context, naming create_glossary_term(publish=false) and explaining that this tool routes the write to a draft and can promote it with publish. It does not explicitly enumerate all alternatives such as assign/unassign_glossary_term, but the draft and publish guidance makes the primary selection criteria clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_glossary_term_typeUpdate Glossary Term TypeA
DestructiveIdempotent

Change a term type: rename it, or add, edit and remove its attributes.

Attributes are matched to the existing ones by label, and an edit keeps that attribute's identifier — which matters more than it looks, because every term's stored values are filed under it. An attribute the caller does not mention is left alone; a label that does not exist yet is added.

To rename one, give its attribute_id alongside the new label. Matching by label alone cannot express a rename: the new label matches nothing, so the attribute is added afresh under a new identifier and every term's value stays behind under the old one, no longer readable as that attribute. get_glossary_term_type returns the id of each.

Making an attribute required applies to terms created afterwards and to every later edit of the ones already there: an update rewrites the whole term, so older terms must be given a value for it before they can be saved again. update_glossary_term reports that by name.

NameRequiredDescriptionDefault
nameNoNew name.
labelNoNew display name.
attributesNoAttributes to add or change, same shape as ``create_glossary_term_type``, plus an optional ``attribute_id`` naming which existing attribute the spec is — required to rename one. Omitted attributes survive.
descriptionNoNew description.
term_type_idYesThe term type UUID, or its name.
remove_attributesNoLabels to drop from the type. Terms keep the stored value, but under an identifier nothing names any more, so it stops being readable as that attribute.
allow_custom_attributesNoWhether terms may add their own.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already declare destructiveHint=true and idempotentHint=true, and the description richly expands on both: exact matching by label, preservation of attribute identifiers, the consequences of renaming via label only, untouched attributes remaining as-is, and the rule that required applies to new terms and later edits. This goes well beyond what annotations alone communicate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long but every sentence earns its place by explaining non-obvious behavior or a consequence that affects invocation. The bolded callouts for rename and required attributes make critical guidance easy to find, and there is no filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with this complexity, the description covers the important edge cases, cross-tool dependencies, and storage semantics. It explains what happens to existing terms when attributes change, how old values become inaccessible, and which companion tools report relevant information. An output schema exists, so return-value documentation is not required here.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds substantial meaning beyond the schema: the critical distinction between label and attribute_id for renames, how omitted attributes are preserved, and how remove_attributes makes stored values unreadable rather than deleted. These details materially change how an agent should populate parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: "Change a term type" and then enumerates the concrete operations: rename, add/edit/remove attributes. This clearly distinguishes it from sibling tools like create_glossary_term_type and get_glossary_term_type.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear operational context, including when attribute_id is required for renames and how get_glossary_term_type can supply it. It also references update_glossary_term for the downstream effect of required attributes. It does not explicitly state "use this instead of create_glossary_term_type for existing types," but the context makes that clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_lookup_tableUpdate Lookup TableA
Destructive

Change a lookup table's entries, column labels, name or description.

Entry changes go to the newest version while it is still being developed. An active version is never changed: a new version is started from it, with its entries, and the changes go there. Rules keep using the active version until the new one is activated — pass activate to do that in the same call.

set_entries adds keys and overwrites the values of existing ones; remove_keys deletes keys (keys that are not there are reported in not_found); replace_entries replaces every entry instead.

NameRequiredDescriptionDefault
nameNoNew name.
folderNoOnly used for a lookup table that is in no folder yet.
activateNoPublish the changed version right away (default false).
key_labelNoNew name of the key column.
descriptionNoNew description.
remove_keysNoKeys to delete.
set_entriesNoEntries to add or overwrite: ``{"key": "value"}`` or a list of ``{"key", "value"}`` objects.
value_labelNoNew name of the value column.
lookup_tableYesThe lookup table's ID or exact name.
wait_secondsNoHow long to wait for activation to finish (max 300).
replace_entriesNoThe complete new entries (not with set_entries or remove_keys).

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Adds substantial behavior beyond the annotations: active versions are immutable, changes create a new version seeded with existing entries, rules continue using the active version until activation, and removal of missing keys is reported in `not_found`. This is exactly the kind of consequence disclosure a destructive, non-idempotent mutation needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the mutation surface, then versioning semantics, then per-parameter behavior; every paragraph carries information. Slightly long, but no sentence is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 11-parameter destructive mutation with an output schema present, the description supplies the versioning model, activation path, and entry-operation semantics an agent needs to call it correctly without guessing about side effects.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3; the description earns more by clarifying the interaction rules between the entry parameters — set_entries adds/overwrites, remove_keys deletes and reports misses, replace_entries replaces everything, and the three are mutually exclusive. It does not elaborate on wait_seconds or the folder edge case, which the schema already covers.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (change/update) and the exact resources affected: entries, column labels, name and description of a lookup table. It is distinguishable from get_lookup_table and create_lookup_table, but it never names the closest sibling (activate_lookup_table) even though it replicates part of its behavior via the `activate` flag.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explains when entry changes land on the draft version versus starting a new version from the active one, and tells the agent to pass `activate` to publish in the same call rather than making a separate activation request. No explicit when-not guidance or naming of alternative tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_segmentation_treeUpdate Segmentation TreeA
DestructiveIdempotent

Change a segmentation tree's working revision: only the parts given are replaced.

node replaces the whole node structure and outcomes the whole outcome list. The tree stays in its folder; one in no folder is filed into folder or the default folder.

NameRequiredDescriptionDefault
nameNoNew name.
nodeNoNew root node (see create_segmentation_tree).
folderNoOnly used for a tree that is in no folder yet.
tree_idYesThe tree ID.
matricesNoNew matrices.
outcomesNoNew outcomes.
signatureNoNew signature (all variables).
code_filesNoNew internal code files.
descriptionNoNew description.
boolean_expressionsNoNew boolean expressions.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With annotations already marking the tool as destructive and idempotent, the description adds meaningful behavioral detail: only supplied parts are replaced, node and outcomes replace whole structures, and folder filing is conditional. It does not mention locking, permissions, or concurrency prerequisites, so it falls short of a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three short, front-loaded sentences with no wasted language. The main purpose comes first, followed by important replacement and folder semantics.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 10-parameter mutation tool with annotations, full schema coverage, and an output schema, the description covers the key behavioral risks: partial replacement and whole replacement of node/outcomes. It does not address locking or prerequisite workflow, but those are not clearly required by the available structured fields.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description adds value beyond the terse schema descriptions by explaining whole-structure replacement for node and outcomes and by clarifying that folder is only used for trees not yet in a folder.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: "Change a segmentation tree's working revision." It also clarifies the scope by saying only provided parts are replaced, which distinguishes it from creation tools. However, it does not explicitly name the sibling create_segmentation_tree as the alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by "working revision" and the replacement semantics, but the description does not explicitly say when to choose this over create_segmentation_tree or create_segmentation_tree_from_table. It does provide a useful conditional for folder behavior, but no broader when/when-not guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_value_list_entriesUpdate Value List EntriesA
DestructiveIdempotent

Replace the entries of a value list's newest version.

A version already in production is left alone: a new version holds the entries instead.

NameRequiredDescriptionDefault
entriesYesThe complete new entries, as strings or ``{"key", "label"}`` objects.
value_list_idYesThe value list ID.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructiveHint=true and idempotentHint=true. The description adds genuinely useful behavior beyond that: the production version is preserved and a new version is created instead, which substantially changes how an agent should reason about the destructive flag. It stops short of saying whether the new version needs publishing before taking effect.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences, front-loaded with the action and followed by the one piece of non-obvious behavior. Nothing is wasted and nothing important is buried.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With a full schema and an output schema present, the description covers the main thing an agent cannot infer: the versioning side effect. It could still clarify whether the new version is live immediately or requires a publish step, but overall it is complete enough to call the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with both parameters documented, including the accepted string-or-{key,label} entry format. The description adds no parameter detail beyond the schema, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Replace the entries of a value list's newest version.' This clearly separates it from create_value_list or update_lookup_table, but it doesn't name any sibling explicitly. The scope (newest version only) is precise.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the versioning rule: use this to change entries, and the tool handles version creation for you. There is no explicit when-to-use versus when-to-use-something-else guidance and no named alternative among the many sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upload_dataUpload DataA

Upload a data file into a CAS table — read by the server, not the model.

Provide the data by reference through exactly one of:

  • file_path — the server reads the file off its own disk (in stdio mode that's your machine). Disable with ALLOW_LOCAL_FILE_UPLOAD=false.

  • url — the server fetches it over HTTP.

Either way the bytes are read server-side and never pass through the calling model's context window. Sources larger than MAX_UPLOAD_BYTES (default 100 MiB — SAS Viya's own default file-upload limit) are refused. To create a small table you are building inline (no file or URL), use the upload_inline_data tool instead.

The casManagement uploadTable endpoint only accepts an uploaded file (multipart form-data) and has no URL parameter, so url is fetched and sent on as the multipart file part.

Formats. Per the uploadTable API: csv, xls, xlsx (single sheet), sas7bdat, sashdat; tsv is csv with a tab delimiter. parquet is not accepted and is rejected up front with guidance (load via a path-based caslib + promote_table_to_memory, or convert to csv/sas7bdat). The format is auto-detected from the file_path/url extension; pass data_format to override (needed for URLs with no clean suffix).

NameRequiredDescriptionDefault
urlNoHTTP(S) URL the server fetches the file from.
file_pathNoPath to a data file the server reads directly from disk.
server_idYesCAS server name or ID.
sheet_nameNoFor Excel sources, the worksheet to import (first sheet by default).
table_nameYesName for the new table.
caslib_nameYesTarget caslib name.
data_formatNoOverride format detection. One of csv, tsv, xls, xlsx, sas7bdat, sashdat (aliases: excel→xlsx, tab→tsv, sas→sas7bdat).
contains_header_rowNoWhether the first row holds column names — applies to csv/tsv/Excel (default True).

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations already indicate a non-read-only, non-idempotent mutation, but the description adds substantial behavior beyond that: server-side reading, sources larger than MAX_UPLOAD_BYTES being refused, the endpoint's lack of a URL parameter requiring a multipart fetch, and parquet being rejected up front. No contradiction with annotations exists.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is detailed but tightly organized: a front-loaded summary, clearly separated source options, a size/security constraint, an explicit sibling alternative, an implementation note, and a bolded formats section. Every sentence adds operational information; nothing is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 8 parameters, 3 required, an output schema, and multiple source/format edge cases, this description is exceptionally complete. It covers source selection, format limitations, size limits, rejection behavior, sibling routing, and server-side data handling — everything an agent needs to select and invoke the tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents every parameter. The description adds real value by explaining the exactly-one constraint between file_path and url, the server-side semantics of each, the data_format override use case, and size-limit behavior. It doesn't enrich every parameter (e.g., contains_header_row, sheet_name), but the schema already covers those adequately.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'Upload a data file into a CAS table.' It also clarifies a key distinguishing trait — the bytes are read by the server, not by the model — and explicitly contrasts with upload_inline_data. This makes the tool easy to tell apart from siblings like upload_file, upload_inline_data, and promote_table_to_memory.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit when-to-use guidance: provide data via exactly one of file_path or url, with conditions for each. It also names the alternative upload_inline_data for small inline tables and gives fallback guidance for parquet via promote_table_to_memory. This is model-actionable routing guidance, not vague context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upload_fileUpload FileA

Upload a file to the Viya Files Service, optionally into a Content folder.

Provide the file content through exactly one of:

  • content — inline text (the original behaviour; text files only).

  • file_path — a path the server reads directly from its own disk (in stdio mode that's your machine). Handles binary files (xlsx, zip, images) untouched. Disable with ALLOW_LOCAL_FILE_UPLOAD=false.

  • url — an HTTP(S) URL the server fetches the file from. Also binary-safe.

file_path and url sources larger than MAX_UPLOAD_BYTES (default 100 MiB — SAS Viya's own default file-upload limit) are refused.

parent_folder_uri files the upload into a Content folder (e.g. /folders/folders/{folderId}) — the location %include/filesrvc ingestion and other folder-scoped consumers need. Without it the file lands unfiled under the caller's user context.

NameRequiredDescriptionDefault
urlNoHTTP(S) URL the server fetches the file from.
contentNoFile content as an inline string (small text files).
file_nameYesName for the file.
file_pathNoPath to a file the server reads directly from disk.
content_typeNoMIME type. Defaults to ``text/plain`` for ``content``, else guessed from ``file_name`` (``application/octet-stream`` when unguessable).
parent_folder_uriNoTarget folder URI (``/folders/folders/{id}``); get one from list_files or the Folders service.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already indicate this is not read-only, and the description adds meaningful behavioral detail: exactly one source must be provided, file_path and url have a size limit, file_path reads from the server's own disk, and unfiled uploads land under the caller's user context. No contradiction with annotations; it enriches them with operational constraints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is longer than average, but every paragraph earns its place given three mutually exclusive input modes and a folder-scoping option. The key target statement is front-loaded, and bullet-like formatting makes the modes and their constraints easy to scan. No filler or redundant restatement of the tool title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has six parameters, three input modes, a configuration-dependent limit, and folder-scoping behavior, and the description covers all of these adequately. The presence of an output schema means return-value details do not need to be explained. Nothing essential for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema descriptions already cover all six parameters at 100%, giving a solid baseline. The description adds value beyond the schema by stating the exactly-one-of constraint, the MAX_UPLOAD_BYTES limitation for file_path and url, and the folder-scoping role of parent_folder_uri. This is meaningful semantic enrichment rather than mere repetition.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'Upload a file to the Viya Files Service'. It also clarifies optional Content-folder scoping, which helps distinguish it from broader data-upload tools like upload_data or upload_inline_data. The title alone would be vague, but the description adds a precise target and storage context.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides clear guidance on when to use each input mode: content for text, file_path for binary files read from server disk, and url for binary-safe HTTP fetching. It also explains when parent_folder_uri is needed for folder-scoped consumers. It does not explicitly name sibling alternatives or say when not to use this tool, so it stops short of a 5.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

upload_inline_dataUpload Inline DataA

Create a small CAS table from inline delimited text passed as a string.

Use this only for tiny, hand-built tables — a lookup/mapping table the model constructs on the fly, or a quick test table — because the whole payload travels through the model's context as a tool argument. For anything larger, or any file you already have, use upload_data (file_path/url), which reads the bytes server-side instead.

Text formats only: csv (default) or tsv (tab-separated). For binary formats (Excel, sas7bdat, sashdat) use upload_data.

NameRequiredDescriptionDefault
dataYesThe delimited text, including the header row.
server_idYesCAS server name or ID.
table_nameYesName for the new table.
caslib_nameYesTarget caslib name.
data_formatNo'csv' (default) or 'tsv' (alias 'tab').csv
contains_header_rowNoWhether the first row holds column names (default True).

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations carry only generic false hints, so the description adds meaningful behavior: creation, the context-payload cost of inline data, and the server-side alternative for upload_data. It does not discuss overwrite or idempotency behavior in detail, but idempotentHint=false and the create semantics partly cover that.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core action, then uses two short paragraphs for usage boundaries and format constraints. Every sentence earns its place; no filler or repetition of schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a straightforward create-from-string tool with a fully documented 6-parameter schema and output schema present, the description supplies enough context to invoke it correctly and avoid the wrong sibling. No important operational gap remains.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, and the description does not need to restate parameters. It adds minor context about csv/tsv text formats and inline string payload, but parameter-level meaning is already fully documented in the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

First sentence states a specific action and resource: 'Create a small CAS table from inline delimited text passed as a string.' The note that this is for tiny hand-built tables and mentions upload_data as the file-based counterpart clearly distinguishes it from sibling tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Description explicitly scopes usage: use only for tiny hand-built tables, and directs larger/file cases to upload_data, which reads bytes server-side. It also states text formats only and directs binary formats to upload_data.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

validate_custom_functionValidate Custom FunctionA
Idempotent

Compile a DS2 custom function without saving it, and return its errors.

NameRequiredDescriptionDefault
codeYesThe DS2 method.
categoryNoOptional category (name or ID) to validate against.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare idempotent=true, destructive=false and (somewhat oddly) readOnlyHint=false, so the safety profile is largely covered. The description adds the important behavioral fact that compilation does not persist anything and that errors are the return signal, which is real value beyond the annotations. It does not explain whether code is executed in a sandbox or what happens on a successful compile.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence, front-loaded with the action and resource, with the non-persistence qualifier immediately attached and zero filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description need not describe return values, and the 'return its errors' phrasing is enough orientation. For a two-parameter tool this is nearly complete; only the scope of 'category' and the boundary against validate_decision_expression remain implicit.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so both parameters are already documented, and the description adds nothing about them. The meaning of 'category' (name or ID, scoping the validation) is only conveyed by the schema, which is acceptable at this coverage level but earns no extra credit.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (compile/validate) and resource (DS2 custom function) and adds the key qualifier 'without saving it,' which separates it from create_custom_function and update_custom_function. It does not name the closely related validate_decision_expression sibling, so full sibling differentiation is incomplete.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'without saving it' implies the use case (checking code before persisting), but there is no explicit when-to-use statement, no prerequisites, and no pointer to validate_decision_expression for non-DS2 expressions. Usage is inferable rather than stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

validate_decision_expressionValidate Decision ExpressionA
Idempotent

Check that a DS2 expression compiles: a rule condition or action, a branch or a condition step.

The expression may use the variables in signature, DS2 functions and custom functions. Returns valid and the compiler's error and warning lines. A variable the signature does not declare is a warning (DS2 creates it), not an error.

NameRequiredDescriptionDefault
signatureNoThe variables it uses, ``[{"name", "dataType", "direction"}]``.
expressionYesThe expression, e.g. ``risk_band(credit_score) = 'LOW'``.

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes beyond the annotations by disclosing what comes back (a `valid` flag plus compiler error and warning lines) and the key semantic rule that undeclared variables produce warnings, since DS2 auto-creates them. It does not explain the non-obvious readOnlyHint=false on what appears to be a pure check, leaving a small gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four short sentences, front-loaded with the core action and followed by scope, return contents, and the one semantic caveat an agent could get wrong. No filler and nothing repeated from the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present the description needn't enumerate return fields, and annotations cover the safety profile, so the definition is nearly complete. The remaining hole is the unexplained non-read-only annotation, which an agent might misinterpret as a mutating operation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds real meaning: `signature` defines the variables the expression is allowed to reference, and referencing anything outside it is a warning rather than a failure. That consequence is not derivable from the schema's one-line parameter description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb (validate/compile-check) applied to a precise resource (a DS2 expression), with the concrete contexts spelled out: rule condition or action, branch, condition step. This separates it from the sibling validate_custom_function, which validates a different artifact type.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description makes clear this is a pre-flight compile check for expressions and names the places expressions live (conditions, actions, branches, steps), so an agent knows the context of use. It stops short of stating when not to use it or explicitly routing to validate_custom_function for non-expression artifacts.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 29 tool updatesv1.19.0
    • Addedactivate_lookup_table
    • Addedcopy_decisioning_asset
    • Changedcreate_business_rule2 fields changed
      • changedInput schema / properties / actions / description
        Previous value: -"List of actions, each ``{\"type\": \"assignment\"|\"return\",\n\"term\": {\"name\", \"dataType\", \"direction\"}, \"expression\"}``."New value: +"List of actions, each ``{\"type\": \"assignment\"|\"return\",\n\"term\": {\"name\", \"dataType\", \"direction\"}, \"expression\"}``, or\n``{\"type\": \"lookupValue\", \"term\": {...}, \"expression\": \"<key>\",\n\"lookup\": \"<lookup table name or ID>\"}`` — assigns the value the\nlookup table stores for the key the expression evaluates to."
      • changedInput schema / properties / conditions / description
        Previous value: -"List of conditions (multiple conditions AND together),\neach ``{\"type\": \"complex\", \"expression\", \"term\": {\"name\",\n\"dataType\", \"direction\"}}``."New value: +"List of conditions (multiple conditions AND together),\neach ``{\"type\": \"complex\", \"expression\", \"term\": {\"name\",\n\"dataType\", \"direction\"}}``, or ``{\"type\": \"lookup\", \"term\":\n{...}, \"lookup\": \"<lookup table name or ID>\"}`` — true when the\nterm's value is a key of the lookup table."
    • Changedcreate_business_ruleset1 field changed
      • addedInput schema / properties / folder
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Where to store the rule set: a folder path such as\n``/Public/Content/Decisions``, ``My Folder`` (or a folder below\nit, ``My Folder/Risk``), a folder ID, or a folder URI\n(``/folders/folders/<id>``). Omit to use the default folder."
        +}
    • Addedcreate_code_file
    • Addedcreate_custom_function
    • Changedcreate_decision_flow8 fields changed
      • addedInput schema / properties / add_missing_variables
        Added value: +{
        +  "default": true,
        +  "description": "With ``steps``, add a decision variable for every\nstep term none matches (default true): Intelligent Decisioning\nvalidates a step only when all its terms are mapped. The result's\n``steps_report.variables_added`` lists them.",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / folder
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Where to store the decision: a folder path such as\n``/Public/Content/Decisions``, ``My Folder`` (or a folder below\nit, ``My Folder/Risk``), a folder ID, or a folder URI\n(``/folders/folders/<id>``). Omit to use the default folder."
        +}
      • addedInput schema / properties / rule_set_steps / anyOf
        Added value: +[
        +  {
        +    "items": {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / rule_set_steps / default
        Added value: +null
      • removedInput schema / properties / rule_set_steps / items
        Removed value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}
      • removedInput schema / properties / rule_set_steps / type
        Removed value: -"array"
      • addedInput schema / properties / steps
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "additionalProperties": true,
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "The flow, in order — any step kind (see above): ``rule_set``,\n``segmentation_tree``, ``code_file``, ``decision`` (a sub-decision),\n``model``, ``assignment``, ``condition`` or ``branch``. ``revision``\ndefaults to the newest locked revision (one is locked if there is\nnone); \"working\" uses the editable one. Mappings default to\nsame-named decision variables; ``{\"step term\": \"decision variable\"}``\nrenames. The result's ``steps_report`` lists the revisions used,\nthe variables added and any step input nothing maps to."
        +}
      • changedInput schema / required
        Previous value: -[
        -  "name",
        -  "signature",
        -  "rule_set_steps"
        -]New value: +[
        +  "name",
        +  "signature"
        +]
    • Addedcreate_lookup_table
    • Addedcreate_segmentation_tree
    • Addedcreate_segmentation_tree_from_table
    • Addedcreate_value_list
    • Addeddelete_decisioning_asset
    • Addedfind_folder
    • Addedget_decisioning_asset
    • Addedget_decisioning_asset_code
    • Addedget_lookup_table
    • Addedlist_decisioning_asset_revisions
    • Addedlist_decisioning_assets
    • Addedlock_decisioning_asset_revision
    • Changedupdate_business_rule2 fields changed
      • changedInput schema / properties / actions / description
        Previous value: -"List of assignment/return actions to perform when matched."New value: +"List of assignment/return/lookupValue actions to perform when matched."
      • changedInput schema / properties / conditions / description
        Previous value: -"List of conditions (multiple conditions AND together)."New value: +"List of conditions (multiple conditions AND together),\nincluding ``lookup`` conditions (see create_business_rule)."
    • Changedupdate_business_ruleset1 field changed
      • addedInput schema / properties / folder
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Only used when the rule set is in no folder yet: a folder\npath, ``My Folder``, a folder ID or a folder URI to file it in."
        +}
    • Addedupdate_code_file
    • Addedupdate_custom_function
    • Changedupdate_decision_flow8 fields changed
      • addedInput schema / properties / add_missing_variables
        Added value: +{
        +  "default": true,
        +  "description": "With ``steps``, add a decision variable for every\nstep term none matches (default true; see ``create_decision_flow``).",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / folder
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Only used when the decision is in no folder yet: a folder\npath, ``My Folder``, a folder ID or a folder URI to file it in."
        +}
      • addedInput schema / properties / rule_set_steps / anyOf
        Added value: +[
        +  {
        +    "items": {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / rule_set_steps / default
        Added value: +null
      • removedInput schema / properties / rule_set_steps / items
        Removed value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}
      • removedInput schema / properties / rule_set_steps / type
        Removed value: -"array"
      • addedInput schema / properties / steps
        Added value: +{
        +  "anyOf": [
        +    {
        +      "items": {
        +        "additionalProperties": true,
        +        "type": "object"
        +      },
        +      "type": "array"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "The whole flow, every step kind — assignments, models,\nbranches, conditions, rule sets, trees, code files, sub-decisions;\n``create_decision_flow`` describes each, with an example."
        +}
      • changedInput schema / required
        Previous value: -[
        -  "decision_id",
        -  "name",
        -  "signature",
        -  "rule_set_steps"
        -]New value: +[
        +  "decision_id",
        +  "name",
        +  "signature"
        +]
    • Addedupdate_lookup_table
    • Addedupdate_segmentation_tree
    • Addedupdate_value_list_entries
    • Addedvalidate_custom_function
    • Addedvalidate_decision_expression
  2. 2 tool updatesv1.18.0
    • Changedapply_report_operations2 fields changed
      • changedInput schema / properties / result_report_name / description
        Previous value: -"Save-as — apply the operations to a NEW report\nwith this name, leaving the source report untouched (atomic\ntemplate instantiation; pairs with ``changeData``)."New value: +"Save-as name for the new report."
      • addedInput schema / properties / save_as
        Added value: +{
        +  "default": false,
        +  "description": "False (default) edits the report in place. True applies the\noperations to a NEW report instead, leaving the source untouched\n(atomic template instantiation; pairs with ``changeData``), named\nby ``result_report_name`` and/or placed by ``result_folder`` — at\nleast one is required. This flag alone decides the mode: a\n``result_report_name`` or ``result_folder`` given while it is\nFalse is refused rather than acted on, so the source can never\nbe edited or cloned by surprise. Blank values count as not given.",
        +  "type": "boolean"
        +}
    • Changedexecute_sas_code1 field changed
      • addedInput schema / properties / html_results
        Added value: +{
        +  "default": true,
        +  "description": "When True (the default), the output is also written\nas an HTML page, as SAS Data and AI Studio shows it, graphs\nincluded, and\nsaved so the person can open it in a browser. The code runs\nbetween an ``ods html5`` statement and its close, preceded by\n``;*';*\";*/;run;quit;`` so that an unterminated statement or\nquote cannot swallow the close; neither appears in the log.\nPass False to submit the code exactly as given.",
        +  "type": "boolean"
        +}
  3. 2 tool updatesv1.15.0
    • Addedget_compute_table_data
    • Changedimport_glossary_terms1 field changed
      • addedInput schema / properties / dry_run
        Added value: +{
        +  "default": false,
        +  "description": "Validate and show what *would* be imported without\nimporting anything: the rows in the order they would be sent,\neach with its resolved parent path and encoded attributes.\nUse it to let the person confirm a batch first — in a client\nthat renders interactive views the preview appears as a table\nwith an Import button; elsewhere, call again with\n``dry_run=false`` once they agree.",
        +  "type": "boolean"
        +}
  4. 16 tool updatesv1.14.0
    • Addedassign_glossary_term
    • Addedcreate_glossary_term
    • Addedcreate_glossary_term_type
    • Addeddelete_glossary_term
    • Addeddelete_glossary_term_type
    • Addedget_glossary_term
    • Addedget_glossary_term_type
    • Addedimport_glossary_terms
    • Addedlist_glossary_term_types
    • Addedlist_glossary_terms
    • Addedlist_table_terms
    • Addedlist_term_assets
    • Addedsearch_glossary_terms
    • Addedunassign_glossary_term
    • Addedupdate_glossary_term
    • Addedupdate_glossary_term_type
  5. 1 tool updatev1.8.0
    • Addedquery_data
  6. 30 tool updatesv1.7.0
    • Addedapply_report_operations
    • Addedcopy_report
    • Changedcreate_business_rule1 field changed
      • changedInput schema / properties / ruleset_id / description
        Previous value: -"The rule set UUID to add the rule to."New value: +"The rule set UUID to add the rule to (not its name — list_business_rulesets returns both)."
    • Addedcreate_report
    • Changeddelete_business_rule1 field changed
      • changedInput schema / properties / ruleset_id / description
        Previous value: -"The parent rule set UUID."New value: +"The parent rule set UUID (not its name — list_business_rulesets returns both)."
    • Changeddelete_business_ruleset1 field changed
      • changedInput schema / properties / ruleset_id / description
        Previous value: -"The rule set UUID to delete."New value: +"The rule set UUID to delete (not its name — list_business_rulesets returns both)."
    • Changeddelete_decision_flow1 field changed
      • changedInput schema / properties / decision_id / description
        Previous value: -"The decision flow UUID to delete."New value: +"The decision flow UUID to delete (not its name — list_decision_flows returns both)."
    • Addeddelete_report
    • Addeddescribe_report_objects
    • Changedexecute_sas_code1 field changed
      • addedInput schema / properties / fresh_session
        Added value: +{
        +  "default": false,
        +  "description": "When True, discard any cached compute session first\nso the code runs with no inherited SAS state (equivalent to\ncalling ``reset_compute_session`` immediately before).",
        +  "type": "boolean"
        +}
    • Changedget_business_rule1 field changed
      • changedInput schema / properties / ruleset_id / description
        Previous value: -"The parent rule set UUID."New value: +"The parent rule set UUID (not its name — list_business_rulesets returns both)."
    • Changedget_business_ruleset1 field changed
      • changedInput schema / properties / ruleset_id / description
        Previous value: -"The rule set UUID."New value: +"The rule set UUID (not its name — list_business_rulesets returns both)."
    • Changedget_castable_columns3 fields changed
      • addedOutput schema / properties / result / anyOf
        Added value: +[
        +  {
        +    "items": {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "additionalProperties": true,
        +    "type": "object"
        +  }
        +]
      • removedOutput schema / properties / result / items
        Removed value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}
      • removedOutput schema / properties / result / type
        Removed value: -"array"
    • Changedget_decision_flow1 field changed
      • changedInput schema / properties / decision_id / description
        Previous value: -"The decision flow UUID."New value: +"The decision flow UUID (not its name — list_decision_flows returns both)."
    • Changedget_decision_flow_code1 field changed
      • changedInput schema / properties / decision_id / description
        Previous value: -"The decision flow UUID."New value: +"The decision flow UUID (not its name — list_decision_flows returns both)."
    • Changedget_decision_flow_revision1 field changed
      • changedInput schema / properties / decision_id / description
        Previous value: -"The decision flow UUID."New value: +"The decision flow UUID (not its name — list_decision_flows returns both)."
    • Changedget_mas_module_step_signature1 field changed
      • changedInput schema / properties / module_id / description
        Previous value: -"The MAS module ID (see ``list_models_and_decisions``)."New value: +"The MAS module ID (see ``list_mas_modules``)."
    • Addedget_report_outline
    • Changedlist_business_rules1 field changed
      • changedInput schema / properties / ruleset_id / description
        Previous value: -"The rule set UUID."New value: +"The rule set UUID (not its name — list_business_rulesets returns both)."
    • Changedlist_business_ruleset_revisions1 field changed
      • changedInput schema / properties / ruleset_id / description
        Previous value: -"The rule set UUID."New value: +"The rule set UUID (not its name — list_business_rulesets returns both)."
    • Changedlist_decision_flow_revisions1 field changed
      • changedInput schema / properties / decision_id / description
        Previous value: -"The decision flow UUID."New value: +"The decision flow UUID (not its name — list_decision_flows returns both)."
    • Addedlist_mas_modules
    • Removedlist_models_and_decisions
    • Changedlock_business_ruleset_revision1 field changed
      • changedInput schema / properties / ruleset_id / description
        Previous value: -"The rule set UUID."New value: +"The rule set UUID (not its name — list_business_rulesets returns both)."
    • Changedlock_decision_flow_revision1 field changed
      • changedInput schema / properties / decision_id / description
        Previous value: -"The decision flow UUID."New value: +"The decision flow UUID (not its name — list_decision_flows returns both)."
    • Changedpublish_decision_flow1 field changed
      • changedInput schema / properties / decision_id / description
        Previous value: -"The decision flow UUID."New value: +"The decision flow UUID (not its name — list_decision_flows returns both)."
    • Changedupdate_business_rule1 field changed
      • changedInput schema / properties / ruleset_id / description
        Previous value: -"The parent rule set UUID."New value: +"The parent rule set UUID (not its name — list_business_rulesets returns both)."
    • Changedupdate_business_ruleset1 field changed
      • changedInput schema / properties / ruleset_id / description
        Previous value: -"The existing rule set UUID."New value: +"The existing rule set UUID (not its name — list_business_rulesets returns both)."
    • Changedupdate_decision_flow1 field changed
      • changedInput schema / properties / decision_id / description
        Previous value: -"The existing decision flow UUID."New value: +"The existing decision flow UUID (not its name — list_decision_flows returns both)."
    • Changedupload_file12 fields changed
      • addedInput schema / properties / content / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / content / default
        Added value: +null
      • changedInput schema / properties / content / description
        Previous value: -"File content as a string."New value: +"File content as an inline string (small text files)."
      • removedInput schema / properties / content / type
        Removed value: -"string"
      • addedInput schema / properties / content_type / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / content_type / default
        Previous value: -"text/plain"New value: +null
      • changedInput schema / properties / content_type / description
        Previous value: -"MIME type (default 'text/plain')."New value: +"MIME type. Defaults to ``text/plain`` for ``content``,\nelse guessed from ``file_name`` (``application/octet-stream``\nwhen unguessable)."
      • removedInput schema / properties / content_type / type
        Removed value: -"string"
      • addedInput schema / properties / file_path
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Path to a file the server reads directly from disk."
        +}
      • addedInput schema / properties / parent_folder_uri
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Target folder URI (``/folders/folders/{id}``);\nget one from list_files or the Folders service."
        +}
      • addedInput schema / properties / url
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "HTTP(S) URL the server fetches the file from."
        +}
      • changedInput schema / required
        Previous value: -[
        -  "file_name",
        -  "content"
        -]New value: +[
        +  "file_name"
        +]
  7. 23 tool updatesv1.5.0
    • Addedcreate_business_rule
    • Addedcreate_business_ruleset
    • Addedcreate_decision_flow
    • Addeddelete_business_rule
    • Addeddelete_business_ruleset
    • Addeddelete_decision_flow
    • Addedget_business_rule
    • Addedget_business_ruleset
    • Addedget_decision_flow
    • Addedget_decision_flow_code
    • Addedget_decision_flow_revision
    • Addedget_mas_module_step_signature
    • Addedlist_business_rules
    • Addedlist_business_ruleset_revisions
    • Addedlist_business_rulesets
    • Addedlist_decision_flow_revisions
    • Addedlist_decision_flows
    • Addedlock_business_ruleset_revision
    • Addedlock_decision_flow_revision
    • Addedpublish_decision_flow
    • Addedupdate_business_rule
    • Addedupdate_business_ruleset
    • Addedupdate_decision_flow
  8. 16 tool updatesv1.2.1
    • Addedcatalog_download_table_profile
    • Addedcatalog_find_instance
    • Addedcatalog_get_adhoc_analysis
    • Addedcatalog_get_agent_history
    • Addedcatalog_list_agents
    • Addedcatalog_run_adhoc_analysis
    • Addedcatalog_run_agent
    • Addedcatalog_search
    • Addedcatalog_search_helper
    • Addedexport_report
    • Removedget_report_image
    • Addedlist_publishing_destinations
    • Addedpublish_ml_champion_model
    • Addedregister_ml_champion_model
    • Changedupload_data7 fields changed
      • addedInput schema / properties / contains_header_row
        Added value: +{
        +  "default": true,
        +  "description": "Whether the first row holds column names — applies\nto csv/tsv/Excel (default True).",
        +  "type": "boolean"
        +}
      • removedInput schema / properties / csv_data
        Removed value: -{
        -  "description": "CSV-formatted data string (including header row).",
        -  "type": "string"
        -}
      • addedInput schema / properties / data_format
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Override format detection. One of csv, tsv, xls, xlsx,\nsas7bdat, sashdat (aliases: excel→xlsx, tab→tsv, sas→sas7bdat)."
        +}
      • addedInput schema / properties / file_path
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Path to a data file the server reads directly from disk."
        +}
      • addedInput schema / properties / sheet_name
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "For Excel sources, the worksheet to import (first sheet by default)."
        +}
      • addedInput schema / properties / url
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "HTTP(S) URL the server fetches the file from."
        +}
      • changedInput schema / required
        Previous value: -[
        -  "server_id",
        -  "caslib_name",
        -  "table_name",
        -  "csv_data"
        -]New value: +[
        +  "server_id",
        +  "caslib_name",
        +  "table_name"
        +]
    • Addedupload_inline_data
  9. 19 tool updatesv1.2.0
    • Changedcreate_ml_project5 fields changed
      • addedInput schema / properties / caslib_name
        Added value: +{
        +  "description": "Caslib containing the training table.",
        +  "type": "string"
        +}
      • removedInput schema / properties / data_table_uri
        Removed value: -{
        -  "description": "URI of the training data table (e.g. '/dataTables/dataSources/cas~fs~cas-shared-default~fs~Public/tables/HMEQ').",
        -  "type": "string"
        -}
      • addedInput schema / properties / server_id
        Added value: +{
        +  "default": "cas-shared-default",
        +  "description": "CAS server name or ID (default 'cas-shared-default').",
        +  "type": "string"
        +}
      • addedInput schema / properties / table_name
        Added value: +{
        +  "description": "Name of the (loaded, global) training table.",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "project_name",
        -  "data_table_uri",
        -  "target_variable"
        -]New value: +[
        +  "project_name",
        +  "caslib_name",
        +  "table_name",
        +  "target_variable"
        +]
    • Changedexecute_sas_code1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": {
        +    "type": "string"
        +  },
        +  "type": "object"
        +}
    • Changedget_castable_columns2 fields changed
      • addedOutput schema / properties / result / items / additionalProperties
        Added value: +true
      • addedOutput schema / properties / result / items / type
        Added value: +"object"
    • Changedlist_cas_servers2 fields changed
      • addedOutput schema / properties / result / items / additionalProperties
        Added value: +true
      • addedOutput schema / properties / result / items / type
        Added value: +"object"
    • Changedlist_caslibs2 fields changed
      • addedOutput schema / properties / result / items / additionalProperties
        Added value: +true
      • addedOutput schema / properties / result / items / type
        Added value: +"object"
    • Changedlist_castables2 fields changed
      • addedOutput schema / properties / result / items / additionalProperties
        Added value: +true
      • addedOutput schema / properties / result / items / type
        Added value: +"object"
    • Addedlist_compute_columns
    • Addedlist_compute_contexts
    • Addedlist_compute_libraries
    • Addedlist_compute_tables
    • Changedlist_files2 fields changed
      • addedOutput schema / properties / result / items / additionalProperties
        Added value: +true
      • addedOutput schema / properties / result / items / type
        Added value: +"object"
    • Changedlist_jobs2 fields changed
      • addedOutput schema / properties / result / items / additionalProperties
        Added value: +true
      • addedOutput schema / properties / result / items / type
        Added value: +"object"
    • Changedlist_ml_projects2 fields changed
      • addedOutput schema / properties / result / items / additionalProperties
        Added value: +true
      • addedOutput schema / properties / result / items / type
        Added value: +"object"
    • Changedlist_models_and_decisions2 fields changed
      • addedOutput schema / properties / result / items / additionalProperties
        Added value: +true
      • addedOutput schema / properties / result / items / type
        Added value: +"object"
    • Changedlist_registered_models2 fields changed
      • addedOutput schema / properties / result / items / additionalProperties
        Added value: +true
      • addedOutput schema / properties / result / items / type
        Added value: +"object"
    • Changedlist_reports2 fields changed
      • addedOutput schema / properties / result / items / additionalProperties
        Added value: +true
      • addedOutput schema / properties / result / items / type
        Added value: +"object"
    • Addedlist_source_tables
    • Changedpromote_table_to_memory1 field changed
      • changedInput schema / properties / table_name / description
        Previous value: -"Table to promote."New value: +"Table to load and promote."
    • Addedreset_compute_session
  10. 26 tool updatesv0.1.0
    • First observedcancel_job
    • First observedcreate_ml_project
    • First observeddownload_file
    • First observedexecute_sas_code
    • First observedget_castable_columns
    • First observedget_castable_data
    • First observedget_castable_info
    • First observedget_job_log
    • First observedget_job_status
    • First observedget_report
    • First observedget_report_image
    • First observedlist_cas_servers
    • First observedlist_caslibs
    • First observedlist_castables
    • First observedlist_files
    • First observedlist_jobs
    • First observedlist_ml_projects
    • First observedlist_models_and_decisions
    • First observedlist_registered_models
    • First observedlist_reports
    • First observedpromote_table_to_memory
    • First observedrun_ml_project
    • First observedscore_data
    • First observedsubmit_batch_job
    • First observedupload_data
    • First observedupload_file

TDQS

A3.5/5.0

Scored across 115 tools

Disambiguation3/5

Many tools are clearly separated by domain and action, but the generic decisioning tools overlap substantially with the business-rules-specific tools (list/get/delete/lock/revision variants), and register_ml_champion_model vs publish_ml_champion_model is easy to confuse. The detailed descriptions help, but the set still presents multiple valid-looking paths for the same underlying operations.

Naming Consistency5/5

Tool names consistently use snake_case verb_noun patterns such as list_*, get_*, create_*, update_*, delete_*, validate_*, and publish_*. Domain prefixes like catalog_ and names like catalog_search_helper are predictable variations rather than a break in convention.

Tool Count1/5

At 115 tools, this is far beyond the 50+ threshold where tool selection becomes a serious burden. Even for a broad SAS Viya platform, this surface is large enough that it should be split into multiple scoped servers or tool groups.

Completeness4/5

Coverage is very broad: decisioning, business rules, MAS scoring, reports, jobs, AutoML/model repository, glossary/catalog, CAS/compute data, files, and uploads all have meaningful lifecycle operations. Minor gaps remain, such as file deletion, CAS table deletion, sparse model-repository operations beyond listing/register/publish, and some revision getters.

Maintenance

ActivityActive
ResponsivenessSlow

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables secure cloud-based execution of code across 14+ programming languages within a sandboxed environment. It supports file management, standard input/output handling, and automatic generation of visual artifacts like plots and charts.
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables secure remote command execution and bidirectional file transfers on SSH servers through the Model Context Protocol. It features robust security controls including command whitelisting, credential isolation, and support for multiple SSH connection profiles.
    1,646 npm
    989
    ISC