SAS MCP Server
OfficialThis server is an MCP gateway to SAS Viya that lets an AI agent execute SAS code, explore and manage data, build reports, run batch jobs, train and deploy AutoML models, manage decisioning/business rules, and author a business glossary — all through natural-language tool calls.
Execute SAS code in a reusable compute session with persistent state (
execute_sas_code,reset_compute_session), and submit async batch jobs with status/log retrieval.Discover data across the Information Catalog (search, profiling, agents), CAS servers/caslibs/tables, and compute libraries/tables.
Query and fetch data via FedSQL over CAS or compute (
query_data), sample rows from CAS/compute tables, and inspect table/column metadata.Upload and manage files/data — server-side file uploads (local path or URL) into CAS or the Files Service, inline small tables, and promote source tables to CAS memory.
Create and manage Visual Analytics reports — list/get/export/delete reports, build reports with native VA operations (
apply_report_operations), copy reports, and inspect report structure.Run and manage batch jobs — submit SAS jobs, check status, list, cancel, and fetch logs.
Automated Machine Learning — create/run AutoML projects, register/publish champion models to the Model Repository.
Model management & scoring — list registered models, publishing destinations, MAS modules, inspect step signatures, and score data against published models/decisions.
SAS Intelligent Decisioning — build rule sets and rules, create decision flows, lock revisions, publish flows to MAS, and retrieve generated DS2 code.
Business Glossary authoring — search/list/get/create/update/import/delete glossary terms, manage term types, and assign/unassign terms to table columns.
Interactive views for data grids, SAS logs, and glossary editing/import in supporting MCP clients.
Enables GitHub Copilot to interact with SAS Viya, allowing AI-assisted SAS code development, execution, and analytics workflows.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@SAS MCP Serverrun a SAS program to summarize sales data by region"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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
92 tools across 10 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:
From REST APIs to AI Agents: Why the SAS Viya MCP Server Matters
Connecting GitHub Copilot to SAS Viya with the SAS Viya MCP Server
Bring Your Own Key: SAS Viya MCP Server with GitHub Copilot CLI
Connecting Claude Code CLI to SAS Viya with the SAS Viya MCP Server
Getting Started
Prerequisites
Required
SAS Viya environment with compute service
Setup the Viya environment for MCP
See configuration.md
Optional
Docker: refer to container setup
Kubernetes: sample manifests (Contour or nginx) and a Helm chart in deploy/
Installation
Clone the repository:
git clone <repository-url>
cd sas-mcp-serverInstall dependencies
uv syncNOTE: 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.
Usage
Configure environment variables:
cp .env.sample .envEdit .env and set
VIYA_ENDPOINT=https://your-viya-server.comStart the MCP server (see Choosing a deployment mode below):
Option A: HTTP mode (pre-run the server, connect from MCP client)
uv run appThe 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-loginBoth 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:latestOr 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-serverAvailable 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 releaseedge— tip ofmain(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 | 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 | 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 |
MCP client config | Point client to | Client runs | Point client to | Point client to |
Quick guidance:
Starting out or exploring? Use stdio — one
sas-viya auth loginCodeoruv 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.
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~/.sastoken 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 (SAS Intelligent Decisioning) |
8 | Workbench (Execute Code Only) |
9 | Business Glossary (SAS Data Governance) |
# Example: expose only compute/discovery/data-ops and reporting
MCP_TIERS=0-3 uv run appRead-only mode
Set MCP_READ_ONLY=true to expose only tools that neither change server-side state nor cause server-side work — 51 of the 92 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 appThe 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 |
| Run arbitrary code — can perform any operation, including deletes |
| Start server-side jobs and leave run records, though they return data |
| Mutates CAS in-memory state |
| 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 |
| exactly the read-only set above — one table, so what a client is told and what |
| tools that can remove or overwrite existing state: arbitrary code ( |
| reads, the |
| only tools that can reach beyond Viya: arbitrary code and the upload tools' |
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 |
| 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 |
| Colour-coded |
Glossary term editor |
| 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 |
| 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 |
| With |
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. Clients that render views today include Claude (web, desktop and mobile), ChatGPT, Microsoft 365 Copilot, VS Code with GitHub Copilot, Cursor and Goose. 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.
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). 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
Information Catalog (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 aresource_uriyou 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_searchqueries.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, andmostImportantFields.catalog_get_adhoc_analysis: Poll a profiling job and cross-check the target instance, reporting
profile_readyonce 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_idorresource_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
SELECTagainst CAS or compute data and get the rows back — one SQL surface over both storage tiers. Pick the tier withtarget(casforcaslib.table,computeforlibref.table); joins, subqueries, aggregation, andUNIONall work, and the row cap is applied server-side by the tool (aLIMITyou write is ignored, since a malformed one is silently discarded by CAS). Optionally returns the query asCREATE VIEWtext 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) orurl(the server fetches it and converts it to the multipart upload the endpoint requires). Ingests the formats the casManagementuploadTableAPI accepts — csv, tsv (csv + tab delimiter), xls, xlsx (single sheet), sas7bdat, sashdat — auto-detected from the extension or set withdata_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 ofcontent(inline text),file_path(read server-side, binary-safe — xlsx, zip, images — gated byALLOW_LOCAL_FILE_UPLOAD), orurl(server-side fetch)download_file: Download file content
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, orsummary. Text formats come back inline,pngas 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 likekpiresolve),category=to filter, oroperation=for one operation's full shape —operation="addData"documentsdataItems(column renames, SAS formats, aggregations, geography classification). Backs theapply_report_operationsloop.create_report: Create a Visual Analytics report and return its id. Optionally pass an
operationsarray 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 withaddPage'stitlefield (a text band at the top of the page body — VA headers are controls-only); title every chart at add time viaoptions.object.title; arrange objects with placement —page,relativeToObject(left/right/top/bottom for columns, rows, and grids),container(group into astandardContainer), orreport(new_pagecreates-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), supportsdry_run, handles the ETag concurrency handshake, and — withresult_report_name/result_folder— applies the batch save-as to a new report, leaving the source untouched. 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
namefor placement/updateObjecttargets,labelforexport_report, pagelabelfor page placement).copy_report: Copy a report to a new one (optionally renaming/refoldering). Pairs with a
changeDataoperation 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
Tier 7 — Decisioning (SAS Intelligent Decisioning)
Build and manage SAS Intelligent Decisioning rule sets and decision flows end to end, then publish a flow to Micro Analytic Score (MAS) so score_data can execute it.
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)
Tier 8 — Workbench (Execute Code Only)
execute_sas_code: Execute SAS code snippets and retrieve execution results (log and listing output). 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) andcatalog_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 uselist_glossary_terms: Exact structural listing — by term type, by parent (the authoritative hierarchy), or by name fragment.
include_attributesreturns each term's attribute values (free — the listing already carries them), andattribute_filterkeeps 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 scannedget_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 laterimport_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_idof 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, soupdate_existingreplaces the term at that path rather than merging into it.dry_run=trueshows the resolved rows without importing — the interactive view turns that into a table with an Import buttonupdate_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_idmoves it in the hierarchy, andpublishpromotes a draft. A draft is a separate resource in the API, so this routes the write accordingly — editing one otherwise fails with a bare 404delete_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_idalongside 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.
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, orhttps://<host>/mcpfor a deployed server) shows a landing page instead of a bare401: 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 genericmcp.jsonclients — with the deployment's real URL already filled in. Only a plain browserGET(Accept: text/html) is answered this way; MCP clients andcurlsee exactly what they saw before. The page is unauthenticated and shows deployment shape only (never user data); administrators can turn it off withMCP_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", "app-stdio"],
"cwd": "${workspaceFolder}"
}
}
}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", "app-stdio"],
"cwd": "/path/to/sas-mcp-server",
"timeout": 60000
}
}
}Note: The
timeoutfield (in milliseconds) is important — SAS Viya API calls can take longer than the Gemini CLI default of 10 seconds. A value of60000(60s) is recommended. Setcwdto the absolute path of yoursas-mcp-servercheckout.
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:
Injects a required
goalparameter into every tool's schema, asking the model to state in one sentence why it chose that tool for the current request. Thegoalis stripped from the arguments before the real tool runs, so tools never see it.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_hashfor retry analysis), result, status, error, latency, and the calling client'sclient_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 carriestool_status/is_tool_error/tool_message/failed_operation_index— so tool-level failure rates are analyzable in every mode. Arun_startheader record (transport, pid, server version, result mode, and an optionalCOLLECTION_RUN_TAGlabel 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 whichsession_idis 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, andclient_name/client_versionare the only thing separating them — two users on the same client software share onerun_idand oneseqcounter, which is an accepted limitation of dropping the session key, not something a per-processCOLLECTION_LOG_PATHcan fix (that splits by process, the axisrun_idalready 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_startTool 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/alwaysmodes — 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
goalfield grows thetools/listschema 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 thegoalsentence. 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 keepsCOLLECTION_LOG_BACKUPS(default 3) rotated files, so on-disk growth is bounded.
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.shvs. runningpytestdirectly — pick by platform.run_tests.shis 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 orcmd, use theuv run python -m pytest …commands shown under each mode below. They are cross-platform, do the same test selection, and need no setup beyonduv 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 PowerShellThis 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 platformPassing credentials on the command line (wrapper only):
./run_tests.sh --integration \
--endpoint https://your-viya-server.com \
--username youruser \
--password yourpasswordWith 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 platformThe pytest marker is
integration, notintegration-only.--integration-onlyis a flag of therun_tests.shwrapper; the underlying pytest marker is justintegration. Runningpytest -m "integration-only"matches no marker and silently deselects all tests (0 selected). Use-m integration.Why
--no-cov?pytest.inienforces a 90% coverage floor that only the full unit suite reaches. An integration-only run exercises far less code (~65%), so without--no-covpytest exits non-zero with a coverage failure even though every selected test passed.run_tests.sh --integration-onlyadds--no-covfor 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 92 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 Information Catalog 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 gistGitHub 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 |
| Payload assertions for all 75 Tier 0-8 tools (URL paths, JSON body, query params, headers) plus error-path coverage |
| End-to-end workflow tests against a real Viya instance |
| Unit tests for the generic Viya REST helpers in |
| Unit tests for Viya compute session and job orchestration |
| Unit tests for the HTTP auth middleware, health route, and token getter |
| Unit tests for configuration loading |
| Unit tests for |
| Unit tests for the |
| Unit tests for stdio token resolution and the device-code flow |
| Unit tests for the |
| 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.
Dependency | License |
Python | |
FastMCP | |
uvicorn | |
starlette | |
httpx |
Available Tools
92 toolsapply_report_operationsApply Report OperationsADestructive
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
addPageatitle(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 exceptstandardContainer, 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 —
relativeToObjectwithleft/right/top/bottom(geometric) orbefore/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 (updateObjectchanges options only).Read structure back anytime with
get_report_outline; verify visually withexport_reportpage-by-page (seeverify_hintin 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.
| Name | Required | Description | Default |
|---|---|---|---|
| dry_run | No | Validate and return the normalized payload (plus any soft warnings about missing common roles) without writing anything. | |
| report_id | Yes | Target report id (from ``create_report`` or ``list_reports``). | |
| operations | Yes | Ordered 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_folder | No | Save-as target folder URI; omit for My Folder. | |
| response_format | No | ``concise`` (default) returns the created page/object/ data-source names+labels; ``detailed`` also echoes the full VA response. | concise |
| result_report_name | No | Save-as — apply the operations to a NEW report with this name, leaving the source report untouched (atomic template instantiation; pairs with ``changeData``). | |
| result_name_conflict | No | Save-as name-conflict policy — ``rename`` (default), ``abort``, or ``replace``. | rename |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as destructive/non-readonly, and the description goes well beyond them: atomic all-or-nothing application, full pre-validation before any HTTP call, ETag optimistic-concurrency with one transparent retry, auto-naming/auto-sizing, write-once placement/dataRoles, and same-batch forward-reference failure. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is long, but it is front-loaded with the core purpose and organized into labeled bullets with concrete examples. Every section earns its place given the breadth of operation types and layout rules; only minor trimming might help an agent parse it faster.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex mutation tool, it covers validation behavior, atomicity, concurrency handling, layout placement rules, header restrictions, multi-page batching, save-as behavior, and verification workflow. With an output schema present, nothing an agent needs to call this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, yet the description still adds indispensable meaning: the list of valid operation keys, a concrete addObject example, layout/title recipes, save-as atomic template instantiation paired with changeData, conflict policy semantics, and the dry_run validation value. This greatly exceeds what the input schema alone conveys.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb and resource ('Apply an ordered batch of operations to a report') and immediately positions it as 'the authoring workhorse' for adding pages/objects, setting parameters, and swapping data sources. This clearly separates it from read-only report tools and report creation/copy siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly states when to use the tool ('This is how you add pages...') and routes the agent to supporting tools such as describe_report_objects and get_castable_columns. It also tells the agent to read structure via get_report_outline and verify via export_report, but it does not give explicit when-not-to-use exclusions against create_report/copy_report.
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 TermAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| term_id | No | The glossary term UUID. | |
| term_name | No | Exact term name, if the id is not known. One of the two is required. | |
| table_name | No | Table name, if the URI is not known. | |
| column_name | Yes | The column to assign the term to (case-insensitive). | |
| resource_uri | No | The table's source URI (preferred). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 JobADestructiveIdempotent
Cancel a running job.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | ID of the job to cancel. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 ProfileARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| level | No | Detail level — 'dataDictionaryAndProfile' (default; columns + profile), 'detailedMetrics' (full per-column metrics), or 'dataDictionary' (column metadata only). | dataDictionaryAndProfile |
| instance_id | No | Catalog instance id of the table (the ``id`` from a catalog_search hit). | |
| resource_uri | No | Source 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
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 InstanceARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| resource_uri | Yes | Source URI of the asset (e.g. '/dataTables/dataSources/cas~fs~.../tables/MYTABLE'). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 AnalysisARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | The analysis job id returned by catalog_run_adhoc_analysis. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 HistoryARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum run records to return (default 20). | |
| start | No | Offset of the first record (default 0). | |
| agent_id | Yes | ID of the agent (see catalog_list_agents). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 AgentsARead-onlyIdempotent
List SAS Information Catalog 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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum agents to return (default 50). | |
| start | No | Offset of the first agent (default 0). | |
| filter_name | No | Optional name filter (substring match). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this as read-only, idempotent, and non-destructive, so the safety profile is covered. The description adds useful domain behavior by explaining that agents discover assets and collect metadata into the catalog, and it clarifies that run outputs are accessed elsewhere.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, front-loaded with the core purpose, and every sentence contributes context: what the tool lists, what an agent does, and which sibling tools handle related actions. There is no filler or repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the output schema, full parameter schema coverage, and annotations that confirm a safe read-only operation, the description is complete for its complexity. It also situates the tool within the agent workflow, so an agent can correctly decide when to call it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
All three parameters have descriptions in the input schema, including defaults and the substring-match behavior for filter_name. The description does not add additional parameter-level meaning, but since schema coverage is 100%, 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.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb and object: 'List SAS Information Catalog discovery agents,' making the tool's purpose immediately clear. It also distinguishes the tool from its siblings by explaining that agents crawl data sources, while catalog_run_agent and catalog_get_agent_history are for starting agents and viewing results respectively.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly routes the agent to related actions: 'Use catalog_run_agent to start one and catalog_get_agent_history to see what a run produced.' This tells the agent when to use alternatives, implying that this tool is for viewing the configured agent list rather than running or inspecting run history.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | A name for the analysis job. | |
| provider | No | Job provider (default 'TABLE-BOT'). | TABLE-BOT |
| description | No | Optional description for the job. | |
| resource_uri | Yes | Source URI of the table to analyze (the ``resource_uri`` from a catalog_search hit, e.g. '/dataTables/dataSources/cas~fs~.../tables/MYTABLE'). | |
| resource_type | No | Catalog 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_sentiment | No | Score sentiment on text columns (default True). | |
| identify_language | No | Detect each text column's language (default True). | |
| get_nlp_semantic_id | No | Derive semantic types / privacy classification (informationPrivacy, nlpTerms, nlpTags) (default True). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| agent_id | Yes | ID of the agent to run (see catalog_list_agents). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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_searchCatalog SearchARead-onlyIdempotent
Search the SAS Information Catalog for assets (tables, columns, reports, ...).
The catalog is a metadata index across the whole Viya environment, so this
finds assets without needing to know their server/library first. Each hit
includes the asset's resource_uri — the URI you can hand to the matching
tool (e.g. get_report, get_castable_data) to act on the live asset — and an
attributes map with whatever metadata the catalog holds for it (commonly
library, rowCount, columnCount, completenessPercent,
reviewStatus, informationPrivacy, and analysisTimeStamp).
The query uses the SAS catalog search grammar:
Free text matches names, with wildcards
*(0+ chars) and?(1 char):cust*.Facets constrain fields, e.g.
AssetType:Report,Name:sales,Library.name:PUBLIC,Column.informationPrivacy:Sensitive.Ranges
DateModified:[2024-01-01 TO 2024-12-31]and+to require a term. Combine freely:AssetType:"CAS Table" +Name:cust*. Usecatalog_search_helperto discover valid facet names and values.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum hits to return (default 20). | |
| query | Yes | The catalog search query (see grammar above). Use ``*`` to match all names. | |
| start | No | Offset of the first hit (default 0). | |
| indices | No | Comma-separated index name(s) to search (default 'catalog'). | catalog |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even with annotations declaring readOnlyHint, idempotentHint, and destructiveHint, the description adds substantial behavioral context: it explains that each hit includes a resource_uri and an attributes map with common metadata keys, and it details the catalog search grammar with examples. This goes well beyond the structured annotations and tells the agent what to expect from results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every section earns its place: a one-sentence purpose, a return-value explanation, and a compact bulleted grammar guide with concrete examples. It is front-loaded with the most important scoping information and ends with a practical pointer to catalog_search_helper, with no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a search tool with a non-trivial query grammar, the description is complete: it explains when to use it, what results look like, how to interpret resource_uri, and how to learn valid facets. The output schema is reportedly present, and the description covers the return shape anyway, so an agent has everything needed to call and consume the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so parameters like limit, start, and indices are already documented. The description adds significant meaning for the query parameter by specifying the search grammar, wildcards, facets, ranges, and combination syntax, which is essential for correct invocation. This raises it above the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 ('Search the SAS Information Catalog for assets') and immediately distinguishes itself from siblings by explaining it is a metadata index across the whole Viya environment that finds assets without knowing the server/library first. It also clarifies how results connect to other tools via resource_uri, making the tool's role in the ecosystem unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 this tool: when you need to find assets without knowing their server or library, or when you want to discover assets by name, facets, or ranges. It also points to catalog_search_helper for discovering valid facet names and values. It does not explicitly state when not to use it versus list_* tools, but the 'whole Viya environment' distinction implies the boundary.
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 HelperARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| facet | No | Facet name to get suggested values for (e.g. 'AssetType'). If omitted, returns the list of available facets instead. | |
| limit | No | Maximum entries to return (default 50). | |
| query | No | Optional filter — when listing facets, matches facet names; when listing values, matches value prefixes. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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_reportCopy ReportADestructive
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": ...}.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Optional name for the copy (``resultReportName``); omit to let Viya name it. | |
| folder | No | Optional target folder URI (``resultFolder``); omit for the caller's My Folder. | |
| report_id | Yes | The source report id to copy. | |
| on_conflict | No | Name-conflict policy — ``rename`` (default), ``abort``, or ``replace``. | rename |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Rule name (max 30 chars). | |
| actions | Yes | List of actions, each ``{"type": "assignment"|"return", "term": {"name", "dataType", "direction"}, "expression"}``. | |
| conditions | Yes | List of conditions (multiple conditions AND together), each ``{"type": "complex", "expression", "term": {"name", "dataType", "direction"}}``. | |
| ruleset_id | Yes | The rule set UUID to add the rule to (not its name — list_business_rulesets returns both). | |
| conditional | Yes | "if" starts a new independent rule chain, "elseif" continues the previous rule's chain, "or" ORs into it. | |
| rule_fired_tracking_enabled | Yes | Whether to record when this rule fires. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only signal readOnlyHint=false, so the description carries the burden of explaining important behavior. It warns that the API accepts malformed expressions that generate broken DS2 code and specifies how boolean variables must be compared, giving the agent actionable knowledge 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the core operation. The following sentences each add valuable prerequisite or expression-format information without repeating schema content or including filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a fully described input schema and the presence of an output schema, the description covers the key prerequisites, conditional evaluation context, and the non-obvious expression pitfalls. It could mention revision locking or side effects, but this is a minor gap for a create tool with rich structured metadata.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents all 6 parameters, so the baseline is 3. The description adds expression-level constraints not present in the schema property descriptions: variable names must be included as left operands, and boolean values must use = 0/= 1. This directly improves the agent's ability to construct valid conditions and actions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Create a new rule inside an existing SAS Business Rules rule set,' which clearly identifies the verb, resource, and container. It effectively distinguishes this tool from the sibling create_business_ruleset tool and from the update/get/delete business rule tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'inside an existing ... rule set' establishes a clear prerequisite and tells the agent this tool is for adding to an existing rule set rather than creating one. It does not explicitly name an alternative like create_business_ruleset, but the context is sufficient for correct routing.
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.
A rule set with no rules cannot be used in a decision flow — follow up
with create_business_rule to populate it.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Rule set name (max 30 chars). | |
| signature | Yes | Input/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. | |
| description | No | Optional description. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only indicate non-read-only, non-idempotent, non-destructive; the description adds the key behavioral constraint that an empty rule set is unusable in a decision flow, which is not in the schema and useful for planning follow-up. It does not address duplicate-name behavior, but this is a minor gap given 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler; the first states the purpose and the second an important constraint and next step. Very efficient and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema and fully documented parameters, the description provides the workflow caveat an agent needs to sequence create_business_rule afterward. It could be slightly more explicit about alternative tools, but for a simple create operation it is complete enough.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and includes full details for name, signature, and description. The tool description adds no parameter-specific semantics, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the action ('Create a new') and the resource ('SAS Business Rules rule set') unambiguously. The follow-up mention of create_business_rule reinforces that this tool creates the container rather than the rules, distinguishing it from the sibling create_business_rule.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context: use this to create an empty rule set, then populate it with create_business_rule. It does not explicitly state when to prefer update_business_ruleset or delete_business_ruleset, but the workflow cue is sufficient for a create tool.
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 FlowB
Create a new SAS Intelligent Decisioning flow chaining rule set steps.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Decision name (max 60 chars). | |
| signature | Yes | Flow-level input/output variables, each ``{"name", "direction", "dataType"}`` — direction input or output; dataType string, decimal, integer, date, datetime, boolean. | |
| description | No | Optional description. | |
| rule_set_steps | Yes | Ordered 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. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide only negative hints (not read-only, not idempotent, not destructive), so the description carries the burden of behavioral context. It discloses that a resource is created and that it chains rule set steps, but it omits side effects, whether the flow is created in a draft state, and what happens on validation failure. This is minimal 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single front-loaded sentence with no filler or redundancy. It loses one point because 'chaining rule set steps' is grammatically awkward and could be clearer, but it remains appropriately concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The parameter schema is complete, and an output schema exists, so return values need not be documented. However, the description alone gives no usage context or prerequisites; the tool is usable only because the schema carries the detail. This is adequate but not complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 all four parameters. The description adds no parameter-level detail beyond the schema, yielding the baseline score of 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific action and resource: 'Create a new SAS Intelligent Decisioning flow.' It also identifies the defining behavior, 'chaining rule set steps,' which distinguishes this creation tool from related siblings like update_decision_flow, list_decision_flows, and create_business_ruleset.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance about when to use this tool versus update_decision_flow or list_decision_flows. The phrase 'Create a new' implies it is for new flows only, but no alternatives, 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.
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 rejectedtime —
"15:41:28Z"; seconds and theZare 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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Term name, max 100 characters, no backslashes. | |
| label | No | Display name, if it should differ from ``name``. | |
| publish | No | Publish immediately (default true). False leaves a draft, which ``update_glossary_term(publish=true)`` promotes later. | |
| parent_id | No | Parent term id, to nest this term in the hierarchy. | |
| term_type | Yes | The term type — its UUID or its name. Immutable afterwards. | |
| attributes | No | Custom attributes keyed by label, e.g. ``{"Scope": "Group", "Used in Risk": True, "Regions": ["EMEA", "APAC"]}``. | |
| definition | No | What the term means. The field users read; worth filling in. | |
| description | No | Short overview, max 1000 characters. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 textsingle-select,multi-select— needallowed_valuesboolean,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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Term type name, unique across the deployment. | |
| label | No | Display name. Defaults to *name* — the API leaves it empty rather than defaulting it, which shows as a blank in the UI. | |
| attributes | No | The attribute definitions, e.g. ``[{"label": "Scope", "type": "single-select", "allowed_values": ["Local", "Group"], "required": true}]``. | |
| description | No | What terms of this type are for. | |
| allow_custom_attributes | No | Let individual terms add attributes beyond these (default false). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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_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.
| Name | Required | Description | Default |
|---|---|---|---|
| auto_run | No | Whether to automatically run pipelines after creation (default True). | |
| server_id | No | CAS server name or ID (default 'cas-shared-default'). | cas-shared-default |
| table_name | Yes | Name of the (loaded, global) training table. | |
| caslib_name | Yes | Caslib containing the training table. | |
| description | No | Optional project description. | |
| project_name | Yes | Name for the project. | |
| prediction_type | No | 'binary', 'interval', or 'nominal' (default 'binary'). | binary |
| target_variable | Yes | Name of the target/response variable. | |
| target_event_level | No | Target event level for binary/nominal classification (default '1'). | 1 |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 ReportADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Report name (``resultReportName``). Must be unique in the folder unless ``on_conflict`` resolves it. | |
| folder | No | Optional target folder URI (``resultFolder``); omit for the caller's My Folder. | |
| operations | No | Optional 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_conflict | No | Name-conflict policy — ``rename`` (default), ``abort``, or ``replace``. | rename |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
delete_business_ruleDelete Business RuleADestructiveIdempotent
Permanently delete a rule from a SAS Business Rules rule set.
| Name | Required | Description | Default |
|---|---|---|---|
| rule_id | Yes | The rule UUID to delete. | |
| ruleset_id | Yes | The parent rule set UUID (not its name — list_business_rulesets returns both). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 RulesetADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| ruleset_id | Yes | The rule set UUID to delete (not its name — list_business_rulesets returns both). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 FlowADestructiveIdempotent
Permanently delete a SAS Intelligent Decisioning flow.
| Name | Required | Description | Default |
|---|---|---|---|
| decision_id | Yes | The decision flow UUID to delete (not its name — list_decision_flows returns both). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_glossary_termDelete Glossary TermADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| term_id | Yes | The glossary term UUID. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 TypeADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| force | No | Delete even though terms use this type (default false). | |
| term_type_id | Yes | The term type UUID, or its name. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 ReportADestructiveIdempotent
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).
| Name | Required | Description | Default |
|---|---|---|---|
| report_id | Yes | The report id to delete. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 ObjectsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| category | No | Restrict the catalog to one category. | |
| operation | No | An operation key (e.g. ``"addData"``, ``"applyDataView"``) for its full shape, example, and notes. | |
| object_type | No | A schema key (e.g. ``"barChart"``, ``"scatterPlot"``) or colloquial alias for its contract and example. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 FileARead-onlyIdempotent
Download file content from the Viya Files Service.
| Name | Required | Description | Default |
|---|---|---|---|
| file_id | Yes | ID of the file to download. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 CodeADestructive
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.
| Name | Required | Description | Default |
|---|---|---|---|
| sas_code | Yes | the SAS code snippet to be executed using the Viya Job Execution API Service | |
| fresh_session | No | When 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
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses state persistence across calls, the creation and execution of a job definition, and the concrete risk of leftover session state causing double-counting on re-runs. This goes well beyond the annotations' destructiveHint and readOnlyHint flags, surfacing a non-obvious behavioral trap that could otherwise lead an agent to produce incorrect results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with a one-sentence purpose, then uses clearly marked IMPORTANT and Tip sections for operational guidance. Each paragraph earns its place: the state-persistence warning prevents a real failure mode, and the CAS tip saves an agent from avoidable log noise. There is no padding or repetition beyond the concise actionable restatement of the clean-session remedy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool that runs arbitrary SAS code, the description covers the core action, the session-persistence failure mode, the clean-slate remedy, the job-definition lifecycle, and a practical CAS data-access recommendation. An output schema exists to document return values, and both parameters are fully described, so no critical invocation detail is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents both parameters at 100% coverage. The description adds meaningful context for fresh_session by explaining the shared warm compute session and explicitly linking fresh_session=True to reset_compute_session, which helps an agent decide when to use the parameter. It does not add syntax-level detail for sas_code, but the schema description is already sufficient there.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a clear verb (Executes), direct object (provided SAS code), environment (Viya), and outcome (returns information about the completed Job). It does not explicitly contrast with siblings like submit_batch_job or query_data, so an agent may need to infer selection from the name and schema rather than being told, but the core action is unmistakable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The IMPORTANT note gives concrete usage guidance: pass fresh_session=True when code must start clean, and mentions reset_compute_session as an equivalent alternative. It also offers a practical CAS data-access preference over caslib _all_ assign. However, it never states when to choose execute_sas_code over execution/data siblings such as submit_batch_job or query_data, so explicit exclusions are absent.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_reportExport ReportARead-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) viaoptions.png/svg— image of the report or a single object;image_sizeis 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.
| Name | Required | Description | Default |
|---|---|---|---|
| options | No | Optional ``pdf`` rendering overrides, passed through as query parameters (e.g. ``{"orientation": "landscape"}``). | |
| report_id | Yes | ID of the report. | |
| image_size | No | Required for ``png``/``svg``; format ``"<w>px,<h>px"``. | |
| export_format | Yes | One of package, pdf, png, svg, csv, tsv, xlsx, summary. | |
| report_objects | No | Report 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
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.
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.
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.
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.
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.
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.
get_business_ruleGet Business RuleARead-onlyIdempotent
Fetch a single rule's definition from a SAS Business Rules rule set.
| Name | Required | Description | Default |
|---|---|---|---|
| rule_id | Yes | The rule UUID. | |
| ruleset_id | Yes | The parent rule set UUID (not its name — list_business_rulesets returns both). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 RulesetARead-onlyIdempotent
Fetch a single SAS Business Rules rule set by ID.
| Name | Required | Description | Default |
|---|---|---|---|
| ruleset_id | Yes | The rule set UUID (not its name — list_business_rulesets returns both). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 ColumnsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum columns to return (default 200). | |
| server_id | Yes | CAS server name or ID. | |
| table_name | Yes | Name of the table. | |
| caslib_name | Yes | Name of the caslib. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 DataBRead-onlyIdempotent
Fetch rows from a CAS table with column names.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum rows to return (default 100). | |
| start | No | Row offset (default 0). | |
| server_id | Yes | CAS server name or ID. | |
| table_name | Yes | Name of the table. | |
| caslib_name | Yes | Name of the caslib. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 InfoARead-onlyIdempotent
Get metadata for a CAS table (row count, column count, size, etc.).
| Name | Required | Description | Default |
|---|---|---|---|
| server_id | Yes | CAS server name or ID. | |
| table_name | Yes | Name of the table. | |
| caslib_name | Yes | Name of the caslib. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 DataARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum rows to return (default 100). | |
| start | No | Row offset for paging (default 0). | |
| table_name | Yes | The table within the library. | |
| library_name | Yes | The libref, e.g. ``WORK`` or ``SASHELP``. | |
| compute_context_name | Yes | Name of the compute context (see list_compute_contexts). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 FlowARead-onlyIdempotent
Fetch the current state of a SAS Intelligent Decisioning flow.
| Name | Required | Description | Default |
|---|---|---|---|
| decision_id | Yes | The decision flow UUID (not its name — list_decision_flows returns both). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 CodeARead-onlyIdempotent
Retrieve the generated DS2 execution code for a decision flow.
| Name | Required | Description | Default |
|---|---|---|---|
| decision_id | Yes | The decision flow UUID (not its name — list_decision_flows returns both). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 RevisionARead-onlyIdempotent
Fetch the content of a specific locked decision revision.
| Name | Required | Description | Default |
|---|---|---|---|
| decision_id | Yes | The decision flow UUID (not its name — list_decision_flows returns both). | |
| revision_id | Yes | The revision UUID. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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_glossary_termGet Glossary TermARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| term_id | Yes | The glossary term UUID (not the catalog entity id — search_glossary_terms returns both). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 TypeARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| term_type_id | Yes | The term type UUID, or its name — list_glossary_term_types returns both. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 LogARead-onlyIdempotent
Retrieve the log of a completed job.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | ID of the job. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 StatusARead-onlyIdempotent
Check the status of a submitted job.
| Name | Required | Description | Default |
|---|---|---|---|
| job_id | Yes | ID of the job. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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_mas_module_step_signatureGet Mas Module Step SignatureARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| step_id | No | The step within the module to inspect (default "execute"). | execute |
| module_id | Yes | The MAS module ID (see ``list_mas_modules``). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 ReportARead-onlyIdempotent
Get a Visual Analytics report's metadata and definition.
| Name | Required | Description | Default |
|---|---|---|---|
| report_id | Yes | ID of the report. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 OutlineARead-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 forrelativeToObject/containerplacement andupdateObject;object
label→ whatexport_reportreport_objectstakes;page
label→ thepageplacement target.
Returns {"status": "ok", "pages": [...], "hint": ...} (or
not_found / outline_failed).
| Name | Required | Description | Default |
|---|---|---|---|
| report_id | Yes | The report id to outline. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 TermsADestructive
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_existingthe 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, socreatedcounts rows the job accepted;newis the count of terms that did not exist before, withalready_existedthe rest andexistedsaying 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.
| Name | Required | Description | Default |
|---|---|---|---|
| terms | Yes | The rows to create. Each is ``{"name": ..., "parent": ..., "definition": ..., "description": ..., "attributes": {...}}``; ``term_type`` may be given per row to mix types in one batch. | |
| dry_run | No | Validate 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_type | No | The term type for rows that do not name one. | |
| timeout_seconds | No | How long to wait for the import job (default 600). | |
| update_existing | No | Replace a term that already exists at the same path (default false, which leaves it untouched). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 RulesARead-onlyIdempotent
List all rules inside a SAS Business Rules rule set.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return (default 100). | |
| ruleset_id | Yes | The rule set UUID (not its name — list_business_rulesets returns both). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 RevisionsARead-onlyIdempotent
List all locked revisions of a rule set.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return (default 20). | |
| ruleset_id | Yes | The rule set UUID (not its name — list_business_rulesets returns both). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 RulesetsARead-onlyIdempotent
List SAS Business Rules rule sets, optionally filtered by name substring.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return (default 20). | |
| filter_name | No | Optional substring to match against rule set names. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 CaslibsARead-onlyIdempotent
List CAS libraries (caslibs) available on a CAS server.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of caslibs to return (default 50). | |
| server_id | Yes | CAS server name or ID (e.g. 'cas-shared-default'). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 ServersARead-onlyIdempotent
List available CAS servers on the Viya environment.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 CastablesCRead-onlyIdempotent
List tables in a CAS library.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of tables to return (default 50). | |
| server_id | Yes | CAS server name or ID. | |
| caslib_name | Yes | Name of the caslib. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 ColumnsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of columns to return (default 50). | |
| start | No | Offset of the first column to return (default 0). | |
| table_name | Yes | Name of the table within the library. | |
| filter_name | No | Optional name filter (substring match). | |
| library_name | Yes | Name of the SAS library/libref (e.g. 'WORK', 'SASHELP'). | |
| compute_context_name | Yes | Name of the compute context (see list_compute_contexts). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 ContextsBRead-onlyIdempotent
List available compute contexts on the Viya environment.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| start | No | ||
| filter_name | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 LibrariesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of libraries to return (default 50). | |
| start | No | Offset of the first library to return (default 0). | |
| filter_name | No | Optional name filter (substring match). | |
| compute_context_name | Yes | Name of the compute context (see list_compute_contexts). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 TablesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of tables to return (default 50). | |
| start | No | Offset of the first table to return (default 0). | |
| filter_name | No | Optional name filter (substring match). | |
| library_name | Yes | Name of the SAS library/libref (e.g. 'WORK', 'SASHELP'). | |
| compute_context_name | Yes | Name of the compute context (see list_compute_contexts). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 RevisionsARead-onlyIdempotent
List all locked revisions of a decision flow.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return (default 20). | |
| decision_id | Yes | The decision flow UUID (not its name — list_decision_flows returns both). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 FlowsARead-onlyIdempotent
List SAS Intelligent Decisioning flows, optionally filtered by name substring.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return (default 20). | |
| filter_name | No | Optional substring to match against decision names. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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_filesList FilesARead-onlyIdempotent
List files in the Viya Files Service.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum files to return (default 50). | |
| filter_name | No | Optional name filter (substring match). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 TermsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum terms to return (default 20). | |
| start | No | Offset of the first term (default 0). | |
| parent_id | No | Return only the direct children of this term id. | |
| term_type | No | Restrict to one term type — its UUID or its name. | |
| name_contains | No | Substring match on the term name. | |
| include_drafts | No | Include unpublished drafts (default false — published only). | |
| attribute_filter | No | Keep 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_attributes | No | Also return each term's custom attributes, named (default false). Free — the listing already carries them. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 TypesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum term types to return (default 50). | |
| start | No | Offset of the first term type (default 0). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 JobsARead-onlyIdempotent
List recent jobs from the Job Execution service.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum jobs to return (default 20). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 ModulesARead-onlyIdempotent
List published scoring models and decisions (MAS modules).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum modules to return (default 50). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 ProjectsBRead-onlyIdempotent
List AutoML pipeline automation projects.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum projects to return (default 50). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 DestinationsBRead-onlyIdempotent
List available publishing destinations.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum destinations to return (default 50). | |
| start | No | Row offset (default 0). | |
| filter_name | No | Optional filter for destination names. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 ModelsBRead-onlyIdempotent
List models in the Model Repository.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum models to return (default 50). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 ReportsBRead-onlyIdempotent
List Visual Analytics reports.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum reports to return (default 50). | |
| filter_name | No | Optional name filter (substring match). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 TablesARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of tables to return (default 50). | |
| server_id | Yes | CAS server name or ID. | |
| caslib_name | Yes | Name of the caslib. |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
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.
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.
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.
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.
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.
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 TermsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| table_name | No | Table name, if the URI is not known. Rejected as ambiguous when more than one table matches. | |
| max_columns | No | Maximum columns to inspect (default 200). | |
| resource_uri | No | The table's source URI (preferred) — catalog_search returns it on every hit. | |
| assigned_only | No | Return only columns that carry a term (default true). Set false to see the unassigned columns too. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 AssetsARead-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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum assets to return in one call (default 100, ceiling 500 — the catalog's page size). | |
| start | No | Offset 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_id | No | The glossary term UUID. | |
| term_name | No | Exact term name, if the id is not known. One of the two is required. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| ruleset_id | Yes | The rule set UUID (not its name — list_business_rulesets returns both). | |
| revision_type | No | "minor" for iterative changes, "major" for a significant/approved milestone (default "minor"). | minor |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses critical behavior: the revision-creation request replaces the full rule set content, the tool fetches the integral representation and resends it, and omitting rules would wipe live rules. It also explains why decision steps use versionId rather than the live copy. This is rich, non-obvious 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is organized into three focused paragraphs, each earning its place: definition, workflow timing, and a critical behavioral warning. It is front-loaded with the core purpose and contains no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the prerequisite (revision must exist), when to call again, the full-content replacement behavior, and the risk of wiping live rules. Since an output schema exists, return-value details aren't needed in the description, leaving no significant gap for an agent to call this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already documents ruleset_id as the UUID (not the name) and revision_type as minor/major. The description doesn't add additional parameter-level 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.
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: 'Lock the current state of a rule set as an immutable revision.' It clearly identifies the tool's action and object, and distinguishes it from the sibling lock_decision_flow_revision by focusing on rule set revisions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides strong contextual guidance: a revision must exist before wiring a rule set into a decision flow, and users should call again after editing rules to pick up changes. It doesn't explicitly name alternative tools or state when not to use it, but the workflow context is clear.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| decision_id | Yes | The decision flow UUID (not its name — list_decision_flows returns both). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are sparse (readOnlyHint=false, idempotentHint=false, destructiveHint=false). The description adds meaningful behavioral context by stating the action 'freeze[s]' the current state as an 'immutable revision', implying a non-destructive but state-changing operation. 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded. The first sentence states the core action and result, and the second sentence provides the lifecycle context. Every sentence earns its place with no redundancy or filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a low-complexity tool with one required parameter, a fully documented schema, and an output schema present. The description supplies the key sequencing detail (after create/update, before publish) and enough behavioral context 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.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the input schema already fully documents the single decision_id parameter. The description does not add parameter-specific meaning beyond what the schema 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.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Lock'), the resource ('current state of a decision flow'), and the outcome ('immutable revision'). It also orients the agent within the revision lifecycle by noting the snapshot is 'referenceable by publish_decision_flow', distinguishing it from publishing, listing, or deleting revisions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit timing guidance: 'Call after a successful create/update'. It also explains why this step matters by saying the revision is 'referenceable by publish_decision_flow'. It does not explicitly mention when not to use it or name alternatives such as lock_business_ruleset_revision, but the decision-flow scope makes the use case clear.
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 MemoryAIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| server_id | Yes | CAS server name or ID. | |
| table_name | Yes | Table to load and promote. | |
| caslib_name | Yes | Caslib containing the table. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| decision_id | Yes | The decision flow UUID (not its name — list_decision_flows returns both). | |
| revision_id | Yes | The locked revision UUID (see ``lock_decision_flow_revision``). | |
| poll_timeout | No | Max seconds to wait for the publish job to reach a terminal state before giving up (default 60.0). | |
| publish_name | Yes | The published name shown in Model Publish (not the MAS module ID — see above). | |
| destination_name | No | The configured MAS publishing destination (default "maslocal"). | maslocal |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses critical behavioral traits beyond annotations: publishing is asynchronous, the module ID is server-generated and not publish_name, the tool polls the publish job until terminal state, and it returns the real moduleId for direct downstream use. It also notes a service-health dependency for DS2 code generation, which is useful operational context. No contradiction with the 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is structured in three focused paragraphs: what it does, when it is required, and how the async behavior works. Every sentence carries distinct information, and the most important facts are front-loaded. 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.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with five parameters, an output schema, and a non-trivial async publish flow, the description covers prerequisites, environment dependencies, result behavior, and downstream tool integration. It provides enough context for an agent to invoke it correctly and interpret the response without additional lookup.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
While the input schema has 100% coverage, the description adds meaningful semantic context by emphasizing that publish_name is NOT the MAS module ID and that decision_id is a UUID, not a name. It also clarifies that revision_id must be a locked revision, which is not fully captured in the schema descriptions alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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: 'Publish a locked decision revision to a Micro Analytic Score (MAS) destination.' It clearly distinguishes the tool from siblings by explaining that MAS runs published modules, not decision flows directly, and explicitly connects to score_data and list_mas_modules.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description states when this tool is required ('Required before score_data can execute the decision') and gives an explicit alternative: the result is usable without a separate lookup via list_mas_modules. It also clarifies that an error about rule set code generation is environment-level, not a payload issue, which helps the agent decide whether to retry or escalate.
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 ModelBDestructive
Publish the champion model from an AutoML pipeline automation project to the Model Repository.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | ID of the ML pipeline automation project. | |
| destination_name | Yes | Name of the destination to publish to. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 ascaslib.table(e.g.Public.HMEQ); see list_caslibs / list_castables.target='compute'— qualify aslibref.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 queryWORK.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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum rows to return, 1..10000 (default 100). | |
| query | Yes | A single FedSQL SELECT statement. DDL/DML is refused — this tool only reads rows. | |
| start | No | Row offset for paging (default 0). | |
| target | No | Which tier the identifiers refer to — ``cas`` (default) or ``compute``. | cas |
| create_view_name | No | If 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_name | No | Compute context to run in; defaults to the server's configured execution context. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | ID of the ML pipeline automation project. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 SessionADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| compute_context_name | No | Compute context whose session to reset. Defaults to the server's configured execution context (the one ``execute_sas_code`` uses). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| project_id | Yes | ID of the project to run. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 DataB
Score data against a published model or decision (MAS module).
| Name | Required | Description | Default |
|---|---|---|---|
| step_id | Yes | Step ID within the module (usually 'score' or 'execute'). | |
| module_id | Yes | MAS module ID. | |
| input_data | Yes | Dictionary of input variable name-value pairs. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations provide little positive behavioral signal since readOnlyHint, idempotentHint, and destructiveHint are all false. The description adds no behavioral detail beyond the core scoring action: it does not clarify whether the operation persists results, executes synchronously, or has side effects. No contradiction exists, but the description does not meaningfully supplement 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no wasted words. Every phrase, including 'published' and 'MAS module', carries meaningful selection context, making it an efficiently structured definition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The input and output schemas are complete, and the description supplies the key published-MAS-module context. However, for a scoring tool with a required step_id and flexible input_data, an agent would benefit from guidance on discovering the correct module step signature and how to obtain module_id in practice.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 only the 'published' qualifier and MAS context, which helps map module_id to a published model or decision, but it does not explain step_id or the structure of input_data beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Score') and a clear resource ('data against a published model or decision (MAS module)'), which conveys the core operation well. It is distinguishable from siblings like run_ml_project or execute_sas_code because it targets published MAS models/decisions, though it does not explicitly name or exclude any sibling alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies the main use case: scoring data against a published model or decision within a MAS module. However, it provides no explicit guidance about when not to use this tool, prerequisites for the published model/decision, or how it compares with related tools such as run_ml_project or get_mas_module_step_signature.
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 TermsARead-onlyIdempotent
Free-text search of the business glossary — the way in when you know a word, not an id.
Runs against the Information 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.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum hits to return (default 20). | |
| query | Yes | Search text. ``*`` matches every term. | |
| start | No | Offset of the first hit (default 0). | |
| include_attributes | No | Also 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
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly and idempotent annotations, the description reveals search semantics: ranked matching against the terms index covering definitions as well as names, supported catalog grammar, and the dual identifier plus asset-count behavior of each hit. It also discloses the extra batched call cost of include_attributes, which 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is organized into three dense paragraphs: a clear opening hook, grammar details in the middle, and return-value value at the end. Markdown formatting and front-loaded use case make it easy for an agent to skim and extract the key decision points.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a fully described schema and an output schema present, the description covers the remaining critical context: ranking, matching scope, catalog grammar, identifier semantics, and the cost tradeoff of include_attributes. An agent has everything it needs to decide when to call this tool and how to set parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 adds real value by explaining query grammar (wildcards, field constraints, required-word operator) and the performance cost of include_attributes. It does not further enrich limit or start, but those are already self-explanatory in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
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 ('free-text search of the business glossary') and a precise use case ('when you know a word, not an id'). It also distinguishes itself from list_glossary_terms by contrasting ranked free-text search against exact structural filters.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly frames itself as the correct entry point for word-based lookup and names list_glossary_terms as the alternative for exact structural filtering. It also gives actionable decision guidance: use assigned_asset_count to decide whether to spend a call on list_term_assets, and leave include_attributes off when names and definitions are sufficient.
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 JobADestructive
Submit a SAS job for asynchronous execution via the Job Execution service.
| Name | Required | Description | Default |
|---|---|---|---|
| job_name | No | Optional descriptive name for the job. | |
| sas_code | Yes | SAS code to execute. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 TermADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| term_id | No | The glossary term UUID. | |
| term_name | No | Exact term name, if the id is not known. One of the two is required. | |
| table_name | No | Table name, if the URI is not known. | |
| column_name | Yes | The column to detach the term from (case-insensitive). | |
| resource_uri | No | The table's source URI (preferred). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 RuleADestructiveIdempotent
Update an existing rule inside a SAS Business Rules rule set.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Rule name (max 30 chars). | |
| actions | Yes | List of assignment/return actions to perform when matched. | |
| rule_id | Yes | The specific rule UUID to update. | |
| conditions | Yes | List of conditions (multiple conditions AND together). | |
| ruleset_id | Yes | The parent rule set UUID (not its name — list_business_rulesets returns both). | |
| conditional | Yes | "if" starts a new independent rule chain, "elseif" continues the previous rule's chain, "or" ORs into it. | |
| rule_fired_tracking_enabled | Yes | Whether to record when this rule fires. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already indicate this is destructive and not read-only, and the description does not contradict that. However, the description adds no behavioral context beyond the annotations—it does not clarify that the update likely replaces the entire rule definition, whether the revision must be locked, or what the impact of the update is. With annotations present, the bar is lower, but no extra transparency is provided.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
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 effectively front-loads the core purpose and every word contributes to the meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The schema and output schema cover most parameter and return-value details, and the description correctly identifies the operation and domain. However, the description is terse and does not mention full-replacement behavior, required prerequisites, or locking considerations, leaving an adequate but incomplete picture for the agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, and the schema already provides useful parameter detail such as 'ruleset_id' being a UUID, not a name, and the semantics of the 'conditional' field. The description adds no additional parameter-level meaning, 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.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('update'), a specific resource ('existing rule'), and a domain ('SAS Business Rules rule set'). This clearly communicates the tool's function and easily distinguishes it from sibling tools like create_business_rule, delete_business_rule, and get_business_rule.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies when to use this tool: when modifying an existing rule. However, it does not explicitly state when to prefer this over creating, deleting, or fetching a rule, nor does it mention any preconditions such as locking the ruleset revision. This is adequate but relies on inference.
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 RulesetADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Rule set name (max 30 chars). | |
| signature | Yes | Input/output/inOut variables the rules operate on. | |
| ruleset_id | Yes | The existing rule set UUID (not its name — list_business_rulesets returns both). | |
| description | No | Optional description. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate this is not read-only and is potentially destructive. The description adds valuable behavioral context beyond that by warning that changing the signature can invalidate existing rules referencing removed variables, and suggests a preflight check. This is meaningful, non-obvious behavior that helps an agent anticipate consequences.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded: the first sentence states the action and target, and the second sentence adds a critical caution. There is no fluff or repetition, and the warning earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The input schema, annotations, and output schema already cover most call mechanics, and the warning about signature invalidation adds important operational context. It could be slightly stronger by explicitly mentioning any revision-lock prerequisite implied by sibling tools like lock_business_ruleset_revision, but overall it is adequately complete for an agent to understand the tool's purpose and risks.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 ruleset_id, name, signature, and description. The description mentions the fields at a high level but does not need to add further semantic detail; the warning about signature effects is a behavioral note rather than parameter syntax.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Update') and names the exact resource ('existing SAS Business Rules rule set') plus the affected fields: name/description/signature. This clearly distinguishes it from related sibling tools like update_business_rule, delete_business_ruleset, and get_business_ruleset.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
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 this tool and includes a useful precondition: check get_business_ruleset first if unsure about signature changes. It does not explicitly list when-not-to-use or contrast with update_business_rule, but the resource scoping is strong enough to make the primary use case obvious.
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 FlowADestructiveIdempotent
Update an existing SAS Intelligent Decisioning flow.
Pass ALL rule set steps (existing + new) — the full flow is replaced on update, it is not a partial patch.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Decision name (max 60 chars). | |
| signature | Yes | Flow-level input/output variables. | |
| decision_id | Yes | The existing decision flow UUID (not its name — list_decision_flows returns both). | |
| description | No | Optional description. | |
| rule_set_steps | Yes | Ordered list of rule set steps (see ``create_decision_flow`` for the shape). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already signal destructive and idempotent behavior, so the bar is lower. The description adds the crucial detail that the full flow is replaced and this is not a partial patch, which is meaningful behavioral context beyond the structured annotations. It does not cover prerequisites such as locking, but the core replace-vs-patch behavior 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences with no filler. The essential warning about full replacement is front-loaded and immediately informs the caller's main risk when invoking the tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 5-parameter update tool with an output schema and informative annotations, the description covers the most important operational concern: full replacement. It does not mention prerequisites like locking or fetching current steps, but the description is adequate for an agent to invoke it correctly and avoid the primary mistake.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
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 by clarifying that rule_set_steps must include both existing and new steps, which is a critical semantic constraint not fully captured by the schema's reference to create_decision_flow for shape.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states a specific verb and resource: 'Update an existing SAS Intelligent Decisioning flow.' It adds the key replacement semantics, which clearly separates it from create_decision_flow, get_decision_flow, and delete_decision_flow.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly tells callers to pass ALL rule set steps because the update replaces the whole flow rather than patching it. This is actionable when-to-use guidance. It does not name alternative tools explicitly, but 'existing' versus 'new' implies the create/update distinction.
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 TermADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New name (unique among siblings, max 100 characters). | |
| label | No | New display label. | |
| publish | No | Publish the term if it is still a draft (default false). Pass it on its own to publish without changing anything else. | |
| term_id | Yes | The glossary term UUID. | |
| parent_id | No | Move the term under a different parent, or ``""`` to make it a root term. A term cannot be its own ancestor. | |
| attributes | No | Custom attributes to change, keyed by label. Same value forms as create_glossary_term — booleans as True/False, multi-select as a list. | |
| definition | No | New definition. | |
| description | No | New description, max 1000 characters. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 TypeADestructiveIdempotent
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.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | New name. | |
| label | No | New display name. | |
| attributes | No | Attributes 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. | |
| description | No | New description. | |
| term_type_id | Yes | The term type UUID, or its name. | |
| remove_attributes | No | Labels 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_attributes | No | Whether terms may add their own. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
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 withALLOW_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).
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | HTTP(S) URL the server fetches the file from. | |
| file_path | No | Path to a data file the server reads directly from disk. | |
| server_id | Yes | CAS server name or ID. | |
| sheet_name | No | For Excel sources, the worksheet to import (first sheet by default). | |
| table_name | Yes | Name for the new table. | |
| caslib_name | Yes | Target caslib name. | |
| data_format | No | Override format detection. One of csv, tsv, xls, xlsx, sas7bdat, sashdat (aliases: excel→xlsx, tab→tsv, sas→sas7bdat). | |
| contains_header_row | No | Whether the first row holds column names — applies to csv/tsv/Excel (default True). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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 withALLOW_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.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | HTTP(S) URL the server fetches the file from. | |
| content | No | File content as an inline string (small text files). | |
| file_name | Yes | Name for the file. | |
| file_path | No | Path to a file the server reads directly from disk. | |
| content_type | No | MIME type. Defaults to ``text/plain`` for ``content``, else guessed from ``file_name`` (``application/octet-stream`` when unguessable). | |
| parent_folder_uri | No | Target folder URI (``/folders/folders/{id}``); get one from list_files or the Folders service. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
| Name | Required | Description | Default |
|---|---|---|---|
| data | Yes | The delimited text, including the header row. | |
| server_id | Yes | CAS server name or ID. | |
| table_name | Yes | Name for the new table. | |
| caslib_name | Yes | Target caslib name. | |
| data_format | No | 'csv' (default) or 'tsv' (alias 'tab'). | csv |
| contains_header_row | No | Whether the first row holds column names (default True). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
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.
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.
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.
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.
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.
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.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
v1.15.0- Added
get_compute_table_data - Changed
import_glossary_terms1 field changed- added
Input schema / properties / dry_runAdded 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" +}
16 tool updates
v1.14.0- Added
assign_glossary_term - Added
create_glossary_term - Added
create_glossary_term_type - Added
delete_glossary_term - Added
delete_glossary_term_type - Added
get_glossary_term - Added
get_glossary_term_type - Added
import_glossary_terms - Added
list_glossary_term_types - Added
list_glossary_terms - Added
list_table_terms - Added
list_term_assets - Added
search_glossary_terms - Added
unassign_glossary_term - Added
update_glossary_term - Added
update_glossary_term_type
1 tool update
v1.8.0- Added
query_data
30 tool updates
v1.7.0- Added
apply_report_operations - Added
copy_report - Changed
create_business_rule1 field changed- changed
Input schema / properties / ruleset_id / descriptionPrevious 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)."
- Added
create_report - Changed
delete_business_rule1 field changed- changed
Input schema / properties / ruleset_id / descriptionPrevious value: -"The parent rule set UUID."New value: +"The parent rule set UUID (not its name — list_business_rulesets returns both)."
- Changed
delete_business_ruleset1 field changed- changed
Input schema / properties / ruleset_id / descriptionPrevious value: -"The rule set UUID to delete."New value: +"The rule set UUID to delete (not its name — list_business_rulesets returns both)."
- Changed
delete_decision_flow1 field changed- changed
Input schema / properties / decision_id / descriptionPrevious value: -"The decision flow UUID to delete."New value: +"The decision flow UUID to delete (not its name — list_decision_flows returns both)."
- Added
delete_report - Added
describe_report_objects - Changed
execute_sas_code1 field changed- added
Input schema / properties / fresh_sessionAdded 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" +}
- Changed
get_business_rule1 field changed- changed
Input schema / properties / ruleset_id / descriptionPrevious value: -"The parent rule set UUID."New value: +"The parent rule set UUID (not its name — list_business_rulesets returns both)."
- Changed
get_business_ruleset1 field changed- changed
Input schema / properties / ruleset_id / descriptionPrevious value: -"The rule set UUID."New value: +"The rule set UUID (not its name — list_business_rulesets returns both)."
- Changed
get_castable_columns3 fields changed- added
Output schema / properties / result / anyOfAdded value: +[ + { + "items": { + "additionalProperties": true, + "type": "object" + }, + "type": "array" + }, + { + "additionalProperties": true, + "type": "object" + } +] - removed
Output schema / properties / result / itemsRemoved value: -{ - "additionalProperties": true, - "type": "object" -} - removed
Output schema / properties / result / typeRemoved value: -"array"
- Changed
get_decision_flow1 field changed- changed
Input schema / properties / decision_id / descriptionPrevious value: -"The decision flow UUID."New value: +"The decision flow UUID (not its name — list_decision_flows returns both)."
- Changed
get_decision_flow_code1 field changed- changed
Input schema / properties / decision_id / descriptionPrevious value: -"The decision flow UUID."New value: +"The decision flow UUID (not its name — list_decision_flows returns both)."
- Changed
get_decision_flow_revision1 field changed- changed
Input schema / properties / decision_id / descriptionPrevious value: -"The decision flow UUID."New value: +"The decision flow UUID (not its name — list_decision_flows returns both)."
- Changed
get_mas_module_step_signature1 field changed- changed
Input schema / properties / module_id / descriptionPrevious value: -"The MAS module ID (see ``list_models_and_decisions``)."New value: +"The MAS module ID (see ``list_mas_modules``)."
- Added
get_report_outline - Changed
list_business_rules1 field changed- changed
Input schema / properties / ruleset_id / descriptionPrevious value: -"The rule set UUID."New value: +"The rule set UUID (not its name — list_business_rulesets returns both)."
- Changed
list_business_ruleset_revisions1 field changed- changed
Input schema / properties / ruleset_id / descriptionPrevious value: -"The rule set UUID."New value: +"The rule set UUID (not its name — list_business_rulesets returns both)."
- Changed
list_decision_flow_revisions1 field changed- changed
Input schema / properties / decision_id / descriptionPrevious value: -"The decision flow UUID."New value: +"The decision flow UUID (not its name — list_decision_flows returns both)."
- Added
list_mas_modules - Removed
list_models_and_decisions - Changed
lock_business_ruleset_revision1 field changed- changed
Input schema / properties / ruleset_id / descriptionPrevious value: -"The rule set UUID."New value: +"The rule set UUID (not its name — list_business_rulesets returns both)."
- Changed
lock_decision_flow_revision1 field changed- changed
Input schema / properties / decision_id / descriptionPrevious value: -"The decision flow UUID."New value: +"The decision flow UUID (not its name — list_decision_flows returns both)."
- Changed
publish_decision_flow1 field changed- changed
Input schema / properties / decision_id / descriptionPrevious value: -"The decision flow UUID."New value: +"The decision flow UUID (not its name — list_decision_flows returns both)."
- Changed
update_business_rule1 field changed- changed
Input schema / properties / ruleset_id / descriptionPrevious value: -"The parent rule set UUID."New value: +"The parent rule set UUID (not its name — list_business_rulesets returns both)."
- Changed
update_business_ruleset1 field changed- changed
Input schema / properties / ruleset_id / descriptionPrevious value: -"The existing rule set UUID."New value: +"The existing rule set UUID (not its name — list_business_rulesets returns both)."
- Changed
update_decision_flow1 field changed- changed
Input schema / properties / decision_id / descriptionPrevious value: -"The existing decision flow UUID."New value: +"The existing decision flow UUID (not its name — list_decision_flows returns both)."
- Changed
upload_file12 fields changed- added
Input schema / properties / content / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - added
Input schema / properties / content / defaultAdded value: +null - changed
Input schema / properties / content / descriptionPrevious value: -"File content as a string."New value: +"File content as an inline string (small text files)." - removed
Input schema / properties / content / typeRemoved value: -"string" - added
Input schema / properties / content_type / anyOfAdded value: +[ + { + "type": "string" + }, + { + "type": "null" + } +] - changed
Input schema / properties / content_type / defaultPrevious value: -"text/plain"New value: +null - changed
Input schema / properties / content_type / descriptionPrevious 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)." - removed
Input schema / properties / content_type / typeRemoved value: -"string" - added
Input schema / properties / file_pathAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Path to a file the server reads directly from disk." +} - added
Input schema / properties / parent_folder_uriAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Target folder URI (``/folders/folders/{id}``);\nget one from list_files or the Folders service." +} - added
Input schema / properties / urlAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "HTTP(S) URL the server fetches the file from." +} - changed
Input schema / requiredPrevious value: -[ - "file_name", - "content" -]New value: +[ + "file_name" +]
23 tool updates
v1.5.0- Added
create_business_rule - Added
create_business_ruleset - Added
create_decision_flow - Added
delete_business_rule - Added
delete_business_ruleset - Added
delete_decision_flow - Added
get_business_rule - Added
get_business_ruleset - Added
get_decision_flow - Added
get_decision_flow_code - Added
get_decision_flow_revision - Added
get_mas_module_step_signature - Added
list_business_rules - Added
list_business_ruleset_revisions - Added
list_business_rulesets - Added
list_decision_flow_revisions - Added
list_decision_flows - Added
lock_business_ruleset_revision - Added
lock_decision_flow_revision - Added
publish_decision_flow - Added
update_business_rule - Added
update_business_ruleset - Added
update_decision_flow
16 tool updates
v1.2.1- Added
catalog_download_table_profile - Added
catalog_find_instance - Added
catalog_get_adhoc_analysis - Added
catalog_get_agent_history - Added
catalog_list_agents - Added
catalog_run_adhoc_analysis - Added
catalog_run_agent - Added
catalog_search - Added
catalog_search_helper - Added
export_report - Removed
get_report_image - Added
list_publishing_destinations - Added
publish_ml_champion_model - Added
register_ml_champion_model - Changed
upload_data7 fields changed- added
Input schema / properties / contains_header_rowAdded value: +{ + "default": true, + "description": "Whether the first row holds column names — applies\nto csv/tsv/Excel (default True).", + "type": "boolean" +} - removed
Input schema / properties / csv_dataRemoved value: -{ - "description": "CSV-formatted data string (including header row).", - "type": "string" -} - added
Input schema / properties / data_formatAdded 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)." +} - added
Input schema / properties / file_pathAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "Path to a data file the server reads directly from disk." +} - added
Input schema / properties / sheet_nameAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "For Excel sources, the worksheet to import (first sheet by default)." +} - added
Input schema / properties / urlAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "description": "HTTP(S) URL the server fetches the file from." +} - changed
Input schema / requiredPrevious value: -[ - "server_id", - "caslib_name", - "table_name", - "csv_data" -]New value: +[ + "server_id", + "caslib_name", + "table_name" +]
- Added
upload_inline_data
19 tool updates
v1.2.0- Changed
create_ml_project5 fields changed- added
Input schema / properties / caslib_nameAdded value: +{ + "description": "Caslib containing the training table.", + "type": "string" +} - removed
Input schema / properties / data_table_uriRemoved value: -{ - "description": "URI of the training data table (e.g. '/dataTables/dataSources/cas~fs~cas-shared-default~fs~Public/tables/HMEQ').", - "type": "string" -} - added
Input schema / properties / server_idAdded value: +{ + "default": "cas-shared-default", + "description": "CAS server name or ID (default 'cas-shared-default').", + "type": "string" +} - added
Input schema / properties / table_nameAdded value: +{ + "description": "Name of the (loaded, global) training table.", + "type": "string" +} - changed
Input schema / requiredPrevious value: -[ - "project_name", - "data_table_uri", - "target_variable" -]New value: +[ + "project_name", + "caslib_name", + "table_name", + "target_variable" +]
- Changed
execute_sas_code1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": { + "type": "string" + }, + "type": "object" +}
- Changed
get_castable_columns2 fields changed- added
Output schema / properties / result / items / additionalPropertiesAdded value: +true - added
Output schema / properties / result / items / typeAdded value: +"object"
- Changed
list_cas_servers2 fields changed- added
Output schema / properties / result / items / additionalPropertiesAdded value: +true - added
Output schema / properties / result / items / typeAdded value: +"object"
- Changed
list_caslibs2 fields changed- added
Output schema / properties / result / items / additionalPropertiesAdded value: +true - added
Output schema / properties / result / items / typeAdded value: +"object"
- Changed
list_castables2 fields changed- added
Output schema / properties / result / items / additionalPropertiesAdded value: +true - added
Output schema / properties / result / items / typeAdded value: +"object"
- Added
list_compute_columns - Added
list_compute_contexts - Added
list_compute_libraries - Added
list_compute_tables - Changed
list_files2 fields changed- added
Output schema / properties / result / items / additionalPropertiesAdded value: +true - added
Output schema / properties / result / items / typeAdded value: +"object"
- Changed
list_jobs2 fields changed- added
Output schema / properties / result / items / additionalPropertiesAdded value: +true - added
Output schema / properties / result / items / typeAdded value: +"object"
- Changed
list_ml_projects2 fields changed- added
Output schema / properties / result / items / additionalPropertiesAdded value: +true - added
Output schema / properties / result / items / typeAdded value: +"object"
- Changed
list_models_and_decisions2 fields changed- added
Output schema / properties / result / items / additionalPropertiesAdded value: +true - added
Output schema / properties / result / items / typeAdded value: +"object"
- Changed
list_registered_models2 fields changed- added
Output schema / properties / result / items / additionalPropertiesAdded value: +true - added
Output schema / properties / result / items / typeAdded value: +"object"
- Changed
list_reports2 fields changed- added
Output schema / properties / result / items / additionalPropertiesAdded value: +true - added
Output schema / properties / result / items / typeAdded value: +"object"
- Added
list_source_tables - Changed
promote_table_to_memory1 field changed- changed
Input schema / properties / table_name / descriptionPrevious value: -"Table to promote."New value: +"Table to load and promote."
- Added
reset_compute_session
26 tool updates
v0.1.0- First observed
cancel_job - First observed
create_ml_project - First observed
download_file - First observed
execute_sas_code - First observed
get_castable_columns - First observed
get_castable_data - First observed
get_castable_info - First observed
get_job_log - First observed
get_job_status - First observed
get_report - First observed
get_report_image - First observed
list_cas_servers - First observed
list_caslibs - First observed
list_castables - First observed
list_files - First observed
list_jobs - First observed
list_ml_projects - First observed
list_models_and_decisions - First observed
list_registered_models - First observed
list_reports - First observed
promote_table_to_memory - First observed
run_ml_project - First observed
score_data - First observed
submit_batch_job - First observed
upload_data - First observed
upload_file
TDQS
Scored across 92 tools
Each tool targets a distinct resource and action, with near-zero ambiguity even in dense areas. Overlapping data-access tools (query_data, get_castable_data, get_compute_table_data, execute_sas_code) are precisely differentiated and even cross-reference each other in descriptions. Catalog search vs glossary search, and upload_data vs upload_inline_data vs upload_file, all have clear boundaries.
The dominant verb_noun pattern (list_*, get_*, create_*, update_*, delete_*, lock_*, publish_*) is followed consistently within each domain, and CRUD families are easy to predict. The only deviation is the catalog_* group, which inverts the convention by placing the domain prefix first (catalog_search, catalog_run_agent) rather than as the object noun.
At 92 tools, the surface is far beyond the ideal range and well past the 25+ threshold for heaviness; it would take an agent many calls just to enumerate candidates. That said, the count is defensible: the server spans roughly a dozen genuinely distinct SAS Viya domains (rules, decision flows, CAS, compute, reports, catalog, glossary, ML), each of which is reasonably scoped on its own.
Every major domain has a closed lifecycle: full CRUD plus revisions and locking for business rules and decision flows, complete glossary management including term types and assignments, and report authoring with copy/delete/export. Minor gaps exist — CAS table alteration/removal is absent and MAS module management is read-only — but finding a table, scoring it, or tracing a governed term all have no dead ends.
Maintenance
Related MCP Connectors
Governed data discovery, exact queries, decisions, simulations, and runtime utilities over MCP.
Remote MCP for 1,500+ APIs. Vault-managed credentials; OAuth or API key. Search, load, and execute.
Query, browse, and automate OmegaAI workspaces from any MCP client. Streamable HTTP with OAuth 2.0.
Build, validate, deploy — HTTP APIs, cron jobs, webhooks and MCP tools — from your AI client. Air Pipe MCP token as a bearer credential, e.g. 'Authorization: Bearer <token>'. Create one at https://app.airpipe.io/
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables 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
- AlicenseNot gradedqualityAmaintenanceEnables 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.4,268 npm871ISC
- AlicenseNot gradedqualityCmaintenanceEnables AI to execute RPA applications and workflows through the Model Context Protocol, supporting both local and cloud modes.5 npm1MIT
- AlicenseNot gradedqualityDmaintenanceExecutes Python code with safety constraints and manages Python packages through the Model Context Protocol.7 npm3MIT