SAS MCP Server
OfficialThe SAS MCP Server enables AI models to interact with a SAS Viya environment, executing SAS code and managing data, reports, jobs, and machine learning workflows.
Code Execution
Execute SAS code snippets and retrieve results (log and listing output)
Data Discovery (CAS Management)
List available CAS servers, caslibs, and tables
List source tables not yet loaded into memory
Get table metadata (row count, column count, size)
Get column metadata (names, types, labels, formats)
Fetch sample rows from a CAS table
Data Operations & Files
Upload CSV data into a CAS table
Promote a CAS table to global scope
List, upload, and download files in the Viya Files Service
Reports & Visualization
List Visual Analytics reports
Get report metadata and definition
Render a report section as an image (PNG or SVG)
Batch Jobs
Submit SAS jobs for asynchronous execution
Check status, list recent/running jobs, cancel a job, or retrieve its log
Model Management & Scoring
List, create, and run AutoML pipeline automation projects
List models in the Model Repository
List published scoring models and decisions (MAS modules)
Score data against a published model or decision
Prompt Templates (code generation & analysis)
Analyze SAS logs for errors with root-cause explanations
Generate data profiling, data quality, and statistical workflow code
Review, optimize, and explain SAS code block-by-block
Build production-quality SAS macros and ODS/PROC REPORT output
Enables GitHub Copilot to interact with SAS Viya, allowing AI-assisted SAS code development, execution, and analytics workflows.
Click on "Install 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
87 tools across 10 selectable tiers, spanning the Analytics Life Cycle on SAS Viya
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 — 50 of the 87 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.
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
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
get_glossary_term: One term in full, with its custom attributes named rather than hashed
list_glossary_term_types / get_glossary_term_type: The term types available, and the attribute contract a term of that type must satisfy — call the latter before authoring
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: Change a term's text or attributes. Merges onto the current term, so omitted fields are left alone rather than blanked
delete_glossary_term: Permanently delete a term and every assignment that referenced it
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
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 87 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
75 toolsapply_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?
The description discloses behavior beyond the annotations (destructiveHint=true) by detailing atomic application, validation before HTTP calls, ETag optimistic-concurrency with retry, write-once placement/dataRoles, auto-naming and auto-sizing, and the save-as behavior to avoid destructive edits. It also explicitly states 'the whole batch is applied atomically (all succeed or nothing changes).' This is far more than annotations provide and is transparent about mutations.
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?
Despite its length, the description is well-structured with clear sections: an opening shorthand of usage, operation keys, layout & titles specifics, validation and concurrency behavior. Every sentence carries purpose—no fluff. It is front-loaded with the core verb and resource, and the technical details are organized logically for an agent to parse quickly.
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 complexity of this tool (multiple operation types, layout rules, validation logic), the description is exceptionally complete. It covers operational invocation, validation guarantees, concurrency handling, and the output options (dry_run, result_report_name for save-as, response_format). It also references output verification via export_report and provides a comprehensive example. The presence of the output schema further reduces the need for result-format discussion, but the description still addresses all needed 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?
The schema description coverage is 100% and the schema is rich, but the description adds even more semantic depth: it explains the operations array structure with an example, clarifies layout and placement options with concrete JSON snippets, and describes constraints like 'relativeToObject' against existing objects and the write-once rule. This exceeds the schema's role descriptions and gives crucial contextual 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 states a specific verb+resource (apply operations to a report) and accurately characterizes the tool as the 'authoring workhorse' for adding pages, objects, parameters, and swapping data sources. It distinguishes itself from sibling tools like create_report, describe_report_objects, and get_report_outline by clearly scoping its role in the batch modification 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 explicitly says 'This is how you add pages, add objects... set parameters, and swap data sources,' and gives detailed operational patterns. It provides when-to-use and when-not-to-use (e.g., page/report headers accept ONLY control objects, same-batch forward references fail). It names complementary tools (describe_report_objects, get_castable_columns, get_report_outline, export_report) and explains their roles for contextual layering.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
cancel_jobCDestructiveIdempotent
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?
The annotations already declare destructiveHint=true and idempotentHint=true, so the description is not required to state those. However, it adds no additional behavioral context, such as what happens if the job is not running, whether cancellation is reversible, or any side effects. It merely repeats the tool's purpose without enriching the user's understanding.
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 (one short sentence), but it provides little information beyond the tool's name. While it is front-loaded and has no wasted words, it lacks any substantive elaboration that would make it more useful to an agent. It is appropriately short for a simple tool but is under-specified.
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 one parameter, full schema coverage, an output schema, and annotations covering safety (destructive, idempotent), the description is adequate but minimal. It does not address edge cases like attempting to cancel a non-running or already-completed job, which could be important for an agent. Overall, it is sufficient for a basic cancel operation but lacks completeness in explaining behavior under all 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 schema description coverage is 100% for the only parameter (job_id), which is clearly documented as 'ID of the job to cancel.' The description itself adds no extra meaning beyond what the schema already provides, so it meets the baseline but does not exceed 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?
The description clearly states a specific action ('Cancel') on a specific resource ('a running job'). It is unambiguous and differentiates from sibling tools like 'get_job_status' or 'list_jobs'. However, it does not specify the scope or types of jobs, which keeps it from being 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 provides no guidance on when to use this tool versus alternatives, no mention of prerequisites, and no exclusions (e.g., cannot cancel completed jobs). It simply states the action without any contextual usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
catalog_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?
The description discloses the exact behavior: it returns a CSV of column metadata and profile, or if not profiled, a recommendation for adhoc analysis. This aligns with the annotations (`readOnlyHint: true`, `destructiveHint: false`, `idempotentHint: true`) and adds detail about the conditional output, which is transparent about side effects (none).
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 succinct, with no redundant information. It is well-structured in three sentences, covering purpose, fallback behavior, and parameter usage. It avoids verbosity while providing necessary 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?
Given the existence of an output schema (not shown), the description adequately covers the main functionality and edge case (unprofiled table). It explains the two possible outputs and the parameter resolution logic, which is sufficient for most use 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 description clarifies the relationship between `instance_id` and `resource_uri`, stating they are alternatives and that `instance_id` takes precedence. This adds meaning beyond the schema descriptions, which already cover the basic purpose of each 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 description clearly states the tool's function: 'Download a catalog table's data dictionary and profile as CSV.' It explicitly distinguishes it from related tools by describing the fallback behavior when a profile is not yet available, recommending `catalog_run_adhoc_analysis`.
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 explains when to use this tool versus an alternative: when the table is not profiled, it returns a recommendation to run `catalog_run_adhoc_analysis`. It also clarifies how to identify the table (via `instance_id` or `resource_uri`), giving precedence rules. However, it does not explicitly state general scenarios for choosing this over other catalog-related tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
catalog_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 readOnly, idempotent, and non-destructive behavior, so the description does not contradict them. It adds value by detailing the returned information (analysisTimeStamp, informationPrivacy, nlpTerms, etc.), which goes beyond the safety annotations and clarifies the tool's side-effect-free nature.
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 free of unnecessary fluff. It covers purpose, usage context, and output details in a clear, logical flow, using backticks for code identifiers. Every sentence contributes value, and the length is appropriate for the information conveyed.
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?
Since there is no output schema provided, the description compensates by explicitly listing the returned fields (id, analysisTimeStamp, informationPrivacy, nlpTerms, nlpTags, mostImportantFields). It also situates the tool within a workflow (before catalog_download_table_profile), making the overall context complete enough for an agent to use 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?
The input schema already describes the resource_uri parameter, achieving 100% coverage. The description augments this by explaining the origin of the URI (from a search hit or CAS table path) and its role in the lookup, which adds practical context beyond the schema's generic 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 clearly states the tool's function: 'Resolve the catalog instance for a source-asset URI.' It differentiates from sibling tools like catalog_search by specifying that it operates on an existing resource URI, and it lists the specific output (id and profile attributes).
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 to use this tool: when you already have a resource URI (from a search hit or CAS table path) and need to obtain the instance id and profile attributes before calling catalog_download_table_profile. It also contrasts with catalog_search, which is for finding assets by free text/facets, providing clear usage boundaries.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
catalog_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?
Annotations indicate a read-only, idempotent, non-destructive operation. The description adds crucial behavioral nuance about the timing lag—that terminal status does not guarantee data availability—and explains the added fields (profile_ready and information_privacy), which is valuable context beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is slightly longer than minimal but front-loads the purpose and then explains the polling nuance and readiness gates. Each sentence earns its place, though it could be tightened slightly without losing essential detail.
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 an output schema exists, the description does not need to detail return values. It thoroughly covers the behavioral context, the exact feedback loop (polling until ready), and cross-references the related download tool, making it complete for a polling/status 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 sole parameter 'job_id' is fully described in the input schema (100% coverage), and its origin from 'catalog_run_adhoc_analysis' is also mentioned in the schema. The description does not add additional parameter-specific meaning, 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 clearly states it retrieves the status of an ad-hoc analysis job and additionally reports profile readiness. It distinguishes itself from sibling tools like 'get_job_status' by focusing on the ad-hoc analysis context and the readiness flag, making it 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?
Explicit guidance is given: the job reaching terminal status is insufficient, and users should poll until 'profile_ready' is true before downloading. It also references the same gate used by 'catalog_download_table_profile', providing a clear when to use this tool versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
catalog_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 valuable behavioral context beyond annotations by disclosing what each record reports (run status + metadata counts for tables enumerated/added/updated/removed), which tells the agent it's a pure history viewer. It also explains the functional relationship to catalog_run_agent. No contradictions 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 description is two tightly written sentences with zero filler. The first sentence states the core purpose; the second explains what the output contains and how to apply it. Every sentence earns its place, and the most important information (what the tool does) 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 a comprehensive output schema present, the description doesn't need to detail return values. Annotations fully cover the safety profile (read-only, idempotent, non-destructive). The description adds the functional context — what the history reveals (status and metadata changes) and how to use it (confirming catalog_run_agent runs). For a simple history-retrieval tool, this is 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 coverage is 100%, with all three parameters (limit, start, agent_id) documented in the schema itself. The description adds minimal parameter detail beyond schema — it implicitly references agent_id via the catalog_run_agent relationship but doesn't explain limit/start semantics. The schema already handles parameter documentation, so the baseline-3 score 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 starts with a specific verb+resource combination: 'Get the execution history of a catalog agent's runs' — clearly stating what the tool does. It distinguishes itself from sibling tools like catalog_run_agent (which executes runs) and catalog_list_agents (which lists agents) by focusing on history retrieval. The first sentence alone fully captures the tool's purpose.
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 ties usage to a concrete use case: 'so you can confirm a run started by catalog_run_agent finished and what it changed.' This names the initiating sibling tool and explains when the output is relevant. However, it doesn't explicitly state when NOT to use it or mention alternatives (e.g., get_job_status for async job tracking), leaving some room for improvement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
catalog_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 declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is established. The description adds context by explaining what agents are and their relationship to runs, but could also mention filtering/pagination details. However, given the annotation coverage, it's still solid.
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?
Description is brief, front-loaded with the main action, and adds only essential detail about what agents are and related tools. No wasted sentences.
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 complexity is moderate (3 optional params, output schema present), the description is sufficient. It explains the tool's purpose, guides usage with related tools, but could slightly enhance with mention of typical use case (e.g., listing during planning). However, with output schema available and annotations covering safety, it's quite 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%, with each parameter well-described (limit, start, filter_name). The description adds the conceptual context that agents crawl sources, but doesn't add further parameter semantics beyond what schema already provides. 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 tool lists SAS Information Catalog discovery agents and explains what agents do (crawl data sources, collect metadata). It goes beyond the name to describe the resource and its role, and it distinguishes itself from related sibling tools by referencing the run and history 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 provides explicit usage context: agents are used to crawl sources, and it direct users to `catalog_run_agent` to start one and `catalog_get_agent_history` to see results. It effectively tells the agent when to use this tool for listing agents, not for running or examining 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_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?
The description clearly discloses the asynchronous behavior: the job runs asynchronously, may take time, and requires polling with the returned id. It also describes what the job produces (data dictionary, column statistics, quality metrics) and the effect of the NLP parameters on asset metadata. With no annotations provided, this is solid behavioral transparency.
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 in the first sentenceholaWhat is the function of the first paragraph? It explains the job result and async behavior, and second paragraph explains NLP params. Two concise paragraphs, each earning their place—no fluff. Slightly verbose in the middle with the bracket list, but acceptable.
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 explains the job lifecycle (submit, poll), references related tools, and clarifies the side effects of NLP parameters. The schema already documents parameters fully, and the output is a job id which is implicitly referenced. Complexity is moderate (async, multiple boolean params), and the description covers it well, though it could mention expected job duration or error handling.
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 around 88% (7 of 8 params described in schema; resource_uri has a detailed example, the three booleans have detailed descriptions, name/description/provider are straightforward). The description adds crucial semantics for the three NLP booleans: they are enabled by default and drive informationPrivacy, nlpTags, etc., and explains when to disable them. This adds meaning beyond what the schema's terse descriptions ('default True') provide.
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 tool's purpose: submitting an ad-hoc profiling job for a catalog table, with a specific verb ('Submit') and resource ('table in the catalog'). It distinguishes itself from sibling `catalog_download_table_profile` by noting the job computes what that tool returns, and from `catalog_get_adhoc_analysis` by mentioning the job id polling for completion.
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 to use the tool: to submit an ad-hoc profiling job, and how it fits with siblings (`catalog_download_table_profile` returns what this job computes; `catalog_get_adhoc_analysis` is polled with the job id). It also gives guidance on when to disable NLP parameters (plain profile only). It doesn't explicitly say when NOT to use it, but the context is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
catalog_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?
Beyond the annotations (all false), it discloses asynchronous execution, background result application, and the limitation of not stopping a run, which are critical behavioral details.
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 with no redundant information, effectively conveying purpose and constraints.
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 schema and output schema existence, the description provides sufficient context: what it does, how it behaves, and what it does not do. No major gaps.
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 agent_id is fully described in the schema, and the description adds context by referencing catalog_list_agents for identification. Coverage is 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 tool starts a catalog discovery agent run, with specific action (crawl data source, populate/refresh metadata) and distinguishes from sibling tools like cancel or get 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 notes asynchronous behavior and that it cannot stop a run, implying when to use. However, it does not explicitly mention alternatives or provide a direct 'use this when' statement, though the sibling context clarifies.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
catalog_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?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint false, so safety profile is clear. Description adds value by explaining that it returns resource_uri for acting on live assets, that attributes map includes typical metadata fields, and that query uses a specific grammar with wildcards and facets. It doesn't mention pagination behavior beyond limit/start params, but those are in schema, so fine.
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?
Well-structured with clear sections: purpose in first line, then details on hits, then query grammar. No fluff; every sentence adds useful information. Grammar examples are compact and helpful.
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 (search grammar, facets, connections to other tools), the description is thorough. It covers the search syntax, uses examples, mentions the helper tool, and explains the return structure (resource_uri and attributes). Output schema exists so return values don't need expansion.
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%, all 4 params have descriptions. Description adds significant meaning by explaining the query grammar in detail (wildcards, facets, ranges, combinations), and mentions that `limit` should be used to control hits. It also notes `*` matches all names, which isn't in schema. Though params are fully described in schema, the description enriches understanding of the `query` param especially.
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 it searches the SAS Information Catalog for assets, enumerates asset types, and distinguishes its scope from tools like get_report or get_castable_data by explaining it finds assets without knowing server/library. It distinguishes from sibling tools like catalog_find_instance and catalog_search_helper, and explicitly mentions the resource_uri that connects to other 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?
Provides explicit when-to-use guidance: use when you don't know the server/library first. It also references a sibling tool `catalog_search_helper` to discover valid facets, giving an alternative for discovering query terms. Clear exclusions implied since other tools handle specific asset operations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
catalog_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 assert readOnlyHint=true, idempotentHint=true, destructiveHint=false. The description only states that it lists facets or values, which is read-only by definition. It adds no further behavioral context (e.g., limits, paging) beyond what annotations suffice. It doesn't contradict annotations, but also doesn't provide extra value. Given annotations cover the safety profile, a 3 is appropriate.
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 (about 4 sentences), with a clear opening sentence that sums up the purpose. It proceeds to explain the two usage modes and ends with the practical outcome. No superfluous text, every line has value. Excellent structure.
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 only three parameters, all documented in schema, and an output schema provided, the description is fairly complete. It explains the primary two modes (list facets vs list values) and ties to catalog_search queries. It doesn't cover the 'limit' and 'query' details in the description, but they are fully described in the schema. The tool's simplicity and having output schema we have, the description is sufficient. Minor deduction for not mentioning how query interacts with values/facets more specifically, but overall 4.
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 already describes all three parameters with 100% coverage, so high baseline. The description adds context for the facet parameter (calling with no facet vs with a facet name) and clarifies that values are 'suggested/valid' values, which enriches the schema's dry description. It also explains the query parameter as an optional filter, matching the schema. This adds meaning beyond the schema, especially for facet's dual behavior, so 4 is justified.
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 tool's purpose: 'list facets, or values for one facet' and explicitly ties it to catalog_search. It distinguishes from sibling tools like catalog_find_instance by referencing catalog_search queries and saying
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 explicit usage instructions: calling with no facet lists facets; calling with a facet name gets values. It also tells the user to use the results to build precise catalog_search queries, indicating when it's appropriate (before a search). Does not explicitly mention when not to use or alternatives, but the context is clear enough. Slight deduction for not naming the alternative (like using catalog_search directly), but the intent is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
copy_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?
With annotations readOnlyHint=false and destructiveHint=true, the description adds context that copying creates a new report without modifying the original, and it describes the return payload. It does not elaborate on permissions or other side effects, but the annotations already provide safety hints, so this is adequate.
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, two sentences, with no redundant content. It effectively conveys the purpose, usage context, and return format without unnecessary elaboration.
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 is complete for this simple copy tool: it states what it does, when to use it, and what it returns. The annotations and schema descriptions cover the remaining context, so 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?
The input schema already has descriptions for all four parameters (name, folder, report_id, on_conflict), so the description does not add further parameter details. The description does mention the return structure but that is output-related, not parameter semantics. Thus 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 clearly states the tool copies a Visual Analytics report and returns the new copy's id. It is specific and distinguishes from sibling tools like create_report, delete_report, and export_report by focusing on the copy operation and its typical use cases.
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 explicit use cases (tailoring reports, copy-and-replace pattern) and references the companion tool apply_report_operations for the replace step. However, it does not explicitly mention when not to use this tool or alternative tools, so it falls just short of a perfect score.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_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 indicate this is a write operation (readOnlyHint: false) and non-idempotent, but the description adds crucial behavioral details: the API's lenience with incomplete expressions and the DS2 code generation issue, plus boolean comparison requirements. These go beyond the schema annotations to warn the agent about subtle API behavior, but could be even more explicit about side effects (e.g., does it overwrite or append?).
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, front-loaded with the purpose, and uses detailed but necessary examples for expression syntax. Every sentence adds value: first sentence defines the action, second explains the expression nuance, third addresses a specific edge case (boolean variables). 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?
Given there's an output schema (not shown but flagged), the description focuses on inputs and behavior. With 6 required parameters and complex expression requirements, the description covers the critical usage details (expression syntax, boolean comparisons). It lacks a note on error cases (e.g., what happens if ruleset doesn't exist) but the annotations and schema cover the basics. For a write tool without idempotency, this is reasonably 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 coverage is 100%, so the baseline is 3, but the description adds significant value by explaining the 'conditional' parameter semantics ('if' starts a new chain, 'elseif' continues) and the ruleset_id disambiguation (not by name). The syntax notes about expressions directly complement the conditions/actions fields. This is above the baseline because it clarifies meaning that the schema alone doesn't 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 description clearly states the action: create a new rule inside an existing SAS Business Rules rule set, with high specificity about the rule set context. It distinguishes itself from sibling tools like create_business_ruleset (which creates the rule set, not a rule) and update_business_rule/delete_business_rule by focusing on creation within an existing 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 clear context on when to use this tool (when you need to add a rule to an existing rule set) and even includes important usage notes about variable name syntax and boolean comparisons. However, it doesn't explicitly mention when NOT to use it or point to alternatives for related operations (like updating or deleting rules).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_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 are generic (all false), so the description carries the burden of behavioral disclosure. It adds the critical fact that an empty rule set is unusable and requires subsequent population, which goes beyond annotation hints. While it doesn't describe side effects like permissions or response behavior, this is sufficient for a create 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 exceptionally concise, consisting of two sentences that front-load the purpose and immediately follow with a crucial usage constraint. No redundant or wasteful 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?
With an output schema and simple parameters, the description provides necessary context including the dependency on create_business_rule. It is complete for its intended purpose, though it could mention error cases or prerequisites if any existed.
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 parameters. The description adds no additional parameter-specific semantics beyond the schema, which is acceptable per baseline expectations.
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 'Create' and specific resource 'SAS Business Rules rule set', distinguishing it from sibling tools like list, update, and delete. The added note about rules needing population further clarifies its distinct role.
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 that a rule set without rules cannot be used in a decision flow and advises following up with create_business_rule, providing a clear workflow hint. It does not explicitly state when NOT to use it or list alternatives, but the guidance is practical and contextual.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_decision_flowA
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 are all false (readOnlyHint=false, destructiveHint=false), indicating this is a mutation operation but not destructive. The description adds context about the creation process (chaining rule set steps) and references lock_business_ruleset_revision for versioning, which is useful. It doesn't detail side effects (e.g., what happens to existing revisions), but given annotations are all false, 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, concise sentence that front-loads the core purpose. It avoids redundancy and is appropriately sized for the tool's complexity.
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?
Despite having a detailed schema (100% coverage) and an output schema, the description correctly explains the core workflow (chaining steps) and references a related tool (lock_business_ruleset_revision). For a creation tool with a rich schema, this is sufficient. It could mention relationships to other tools like update or publish, but the schema covers most operational details.
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 description coverage is 100%, with each parameter having a detailed description. The description adds minimal value over the schema, as it only rephrases the 'rule_set_steps' concept. The schema already explains the structure of signature and rule_set_steps parameters, so the description doesn't add significant extra 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 clearly states the tool's purpose with a specific verb ('Create') and resource ('SAS Intelligent Decisioning flow'), and specifies the chaining of rule set steps. It distinguishes itself from sibling tools like create_business_ruleset and update_decision_flow by focusing on the flow creation with step chaining.
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 it (to create a decision flow) but does not explicitly state when not to use it or mention alternatives. However, the context of sibling tools (e.g., update_decision_flow for modifications, publish_decision_flow for publishing) provides clear usage context. Lacks explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_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?
Annotations already indicate it's not read-only (readOnlyHint=false), so the description need not repeat that. It adds context about the verification step ('This tool verifies that first and returns an actionable error otherwise') and explains the URI construction from server_id/caslib_name/table_name. This goes beyond annotations and helps the agent understand side effects and dependencies.
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 tightly worded, with the core purpose stated first, followed by essential prerequisites and guidance. There is no fluff; every sentence contributes value. The structure is clear and front-loaded, making it easy to scan.
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 complexity (9 params) and the existence of an output schema, the description covers the critical aspects: prerequisites (table in global scope), verification behavior, and URI construction. It doesn't need to explain return values since an output schema exists. The description is complete for the agent to understand when to use it and what it does.
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 all parameters have descriptions. The description adds extra meaning by explaining that the training table must be loaded globally and that the URI is built from server_id/caslib_name/table_name, which clarifies the relationship between those parameters. This added context goes 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 clearly states the action: 'Create a new AutoML pipeline automation project from a CAS table.' It specifies the resource (CAS table) and the purpose (AutoML pipeline automation), and it distinguishes itself from sibling tools like run_ml_project (running a project) and list_ml_projects (listing). This is a specific verb+resource pair with clear 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 provides explicit prerequisites: 'The training table must already be loaded into CAS memory at **global** scope.' It even names alternative tools for preparation: 'use promote_table_to_memory to load + promote a source table, and list_source_tables to find one.' This gives clear when-to-use and when-not-to-use guidance, and points to alternatives for those prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_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?
Beyond the destructiveHint annotation, the description discloses non-obvious behaviors: the atomic creation with operations, the risk of leaving an empty report behind if later edits fail, VA prepending an empty default Page 1, and the result's verify_hint. These details meaningfully exceed what the 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 front-loaded with the main purpose and each sentence earns its place by adding actionable detail: return payload, atomicity rationale, follow-up editing, and export verification caveat. It is dense but not 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 mutating report-creation tool with four parameters, the description covers the full workflow: create, identify what was created, edit later, and verify output. It also includes a non-obvious export caveat, while structured annotations and output schema cover the remaining 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?
The schema already covers all four parameters at 100% coverage, which provides the baseline. The description adds value by explaining that operations uses the same shape as apply_report_operations, is applied atomically at creation, and that describe_report_objects should be consulted for formats.
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 Visual Analytics report') and states that the returned id is for further edits. It also distinguishes the empty-shell creation mode from the atomic full-build mode, which separates this tool from siblings like apply_report_operations and copy_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 gives clear workflow guidance: pass operations to build the whole report atomically at creation, then feed the returned id to apply_report_operations for further edits. It also tells the agent to verify page-by-page with export_report due to the prepended default Page 1. It does not explicitly enumerate alternatives like copy_report, but the context is strong.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_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 mark destructiveHint=true, readOnlyHint=false, and idempotentHint=true. The description adds the important context that the deletion is permanent/irreversible and scopes the deletion to a rule rather than the parent rule set. 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?
Single, front-loaded sentence states the verb, object, and scope with no filler or repetition. Every word 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 destructive operation, the combination of annotations, complete parameter documentation, output schema, and the 'permanently' qualifier provides adequate context. It could mention prerequisites such as revision locking, but this is not explicitly required and would be speculative.
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 parameters are already well documented (rule_id as the rule UUID and ruleset_id as parent UUID, with name/id clarification). The prose description adds no additional parameter-level meaning, so 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?
Description uses a specific verb 'delete' with an explicit resource: 'a rule from a SAS Business Rules rule set.' It clearly differentiates from sibling delete_business_ruleset and other delete tools by naming the exact object and scope.
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?
Clear context: use this to permanently delete a rule within a ruleset. It does not explicitly list alternatives or exclusions (e.g., delete_business_ruleset for the whole ruleset), but the resource scope is unambiguous and implies the correct situation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_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 declare destructiveHint: true and idempotentHint: true, but the description adds value by explaining that deletion fails if the rule set is still referenced, which is not in the annotations. This gives the agent crucial behavioral context. No contradiction with annotations; in fact, it reinforces destructiveHint.
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, the second provides a critical usage condition. No wasted words. Could arguably be more concise, but it's efficient and 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?
Given the simplicity of the tool (one parameter), the description is sufficiently complete. It covers purpose, usage condition, and parameter semantics. Output schema exists, so return details aren't needed. For a delete operation with clear annotations, this is adequate and near-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% for the single parameter 'ruleset_id', with the description noting it's a UUID and not a name, and referencing list_business_rulesets for retrieval. This adds value beyond the schema's type information by clarifying the identifier format and how to obtain 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?
The description clearly states the action: 'Permanently delete a SAS Business Rules rule set.' It specifies the resource (rule set) and the scope (permanently). It distinguishes from sibling tools like delete_business_rule and delete_decision_flow by focusing on rule set deletion.
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 explicit usage guidance: 'Only call this once the rule set is confirmed unused by any decision flow.' It implies when to use (after confirmation) and warns about failure if still referenced. It doesn't explicitly mention alternatives, but the sibling context includes list_business_rulesets to confirm usage, which is implied. No explicit exclusions, but the condition is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_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?
The description adds the important behavioral label 'Permanently delete,' reinforcing irreversible destruction beyond the annotations' destructiveHint=true. It does not elaborate on effects on published/locked revisions, but the core destructive outcome 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 one short, front-loaded sentence with no filler or redundancy. Every word contributes to the core purpose and consequence.
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 destructive tool with strong annotations and an output schema, the description sufficiently communicates the critical information. Minor additional context about what happens to published or locked variants could be useful, but the core deletion use case is realistically 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?
The input schema already provides full 100% coverage for the single parameter, including the meaning 'UUID to delete' and the clarification that it is not the name. The tool description itself adds no parameter semantics beyond what the schema already supplies.
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 ('delete') and the specific resource ('a SAS Intelligent Decisioning flow'), and it is distinguishable from sibling delete tools targeting other resources. It stops short of a 5 because it does not explicitly differentiate this operation from related decision-flow operations such as publishing or locking.
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 usage is implied by the action 'delete' but the description gives no explicit when-to-use or when-not-to-use guidance, nor does it name alternatives. The schema's mention that list_decision_flows can provide the UUID is useful, but it is operational detail rather than usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_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?
Although annotations already indicate destructive and idempotent behavior, the description adds crucial context: 'There is no per-object undo in the report API.' This explains irreversibility beyond just a destructive hint and also discloses the response format, which is not fully captured by the annotations. No contradictions with annotations are present.
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: two sentences that state the core action, the key behavioral caveat, and the return values. It is front-loaded and every word adds value, with no redundant information.
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 operation with one parameter, the description covers all essential aspects: what is deleted, the irreversibility, the copy alternative, and the response payload. The output schema exists and handles return details, so no additional completeness gaps are evident.
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% coverage for the single required parameter report_id, with a clear description. The tool description adds no additional meaning or format details beyond what the schema already 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 starts with 'Delete a Visual Analytics report and its content', using a specific verb and resource, clearly distinguishing it from sibling tools like copy_report or create_report. It also clarifies the scope (report plus its content), leaving no ambiguity about what action is performed.
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 to use this tool: 'deleting and rebuilding (or copying first) is how you discard an unwanted report.' It also implies the alternative of copying first as a safeguard, and warns about the lack of undo, providing clear guidance for a destructive operation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
describe_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 readOnly, idempotent, and non-destructive behavior. The description adds valuable context beyond those hints: it 'reads a bundled catalog (no network),' so it is a low-cost operation with no external side effects. This explains why the tool is safe and cheap to call repeatedly.
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, front-loaded with the core purpose and followed immediately by usage guidance and a cost note. Every sentence earns its place; there is no filler or repetition of schema or annotation 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 tool's low complexity, full schema coverage, and strong annotations, the description is complete: it states what the tool does, when to use it, what it reads, why it is cheap, and how it relates to apply_report_operations. The presence of an output schema also removes the need to describe return values.
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 in the schema, including examples and purpose. The tool description does not add parameter-specific semantics, but it does provide helpful framing by mentioning 'object's data roles' and catalog categories. Baseline 3 is appropriate because the schema 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 opens with a clear, specific statement: 'Discover what a Visual Analytics report can contain — operations and objects.' It explicitly names the consumer of this knowledge ('before calling apply_report_operations'), which distinguishes this tool from its siblings by stating its role as a preparatory discovery step.
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 usage guidance: 'Call this to learn how to build a report before calling apply_report_operations.' It also positions the tool as the cheap, offline alternative to guessing at data roles, making it clear when an agent should prefer this lookup over trial and error.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
download_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?
The annotations already declare readOnlyHint, idempotentHint, and non-destructive behavior, so the description does not need to restate those. The phrase 'Download file content' adds slight behavioral context about the operation, but no additional detail about errors, format, or authorization is provided 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, concise sentence with no filler or redundant information. It is perfectly sized 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?
For a simple read-only download tool with one well-described parameter, clear annotations, and an output schema, the description is fully sufficient. It tells the agent exactly what the tool does and leaves structured details to 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?
The schema already covers 100% of parameter semantics with a clear description ('ID of the file to download'). The tool description adds no extra meaning beyond what the schema provides, which fits the baseline high-coverage case.
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 ('Download') and identifies the resource ('file content' from 'Viya Files Service'), clearly distinguishing it from sibling tools like list_files and upload_file. It unambiguously states 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 this tool is used to retrieve file content, which is clear for a single-purpose download tool. However, it does not explicitly state when to use it over alternatives or mention any preconditions such as file existence or access permissions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
execute_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 goes beyond the destructiveHint annotation by explaining the persistent compute session behavior, leftover state risks, and the CAS libname preference. This is critical behavioral context that an agent would otherwise not know, 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 description is well-structured with a clear purpose sentence, process explanation, a highlighted IMPORTANT warning, and a useful tip. It is a bit lengthy but every sentence contributes meaningful information, so it earns a high score.
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 and destructiveHint annotation, the description covers the tool's purpose, process, side effects (state persistence), and includes practical usage advice. It is fully complete 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?
The input schema already provides 100% coverage for both parameters. The description adds value by explaining the practical implications of fresh_session in the context of state persistence, effectively enriching the parameter semantics 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 clearly states the tool executes SAS code in the Viya environment and returns job information, outlining the process (create job definition, execute, retrieve results). This specifically distinguishes it from siblings like submit_batch_job, which likely handles batch submission 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?
The description provides clear guidance on when to pass fresh_session=True versus using reset_compute_session, and gives a practical CAS tip. It does not explicitly contrast with submit_batch_job or other execution alternatives, but the state-persistence warning effectively guides when a clean slate is needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_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 declare readOnlyHint=true and idempotentHint=true, which the description aligns with by describing a synchronous, read-only export operation. It adds useful details about format-specific constraints (e.g., image_size required for png/svg, exactly one object for data formats) and that it uses synchronous endpoints. These go 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 well-structured with a clear opening sentence, a bulleted list of formats with associated requirements, and 'Note' lines for parameter constraints. Every sentence provides necessary information without redundancy. It is concise for the complexity it covers, and front-loads the core purpose before detailing formats.
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 should clarify what the tool returns. It mentions 'export endpoints' and formats like 'package' as a .zip, but doesn't explicitly state the response type (e.g., binary content vs. download URL). It covers most operational details, making it highly usable, but this one omission prevents a perfect score.
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 covers all five parameters with descriptions, but the tool description significantly enriches meaning by explaining how each format affects parameter usage (e.g., options for PDF overrides, report_objects constraints per format, image_size format). This adds value beyond the schema's individual field descriptions, clarifying the combined 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 tool's purpose: 'Export a Visual Analytics report (or specific report objects) in any format the VA service exposes'. It specifies the verb (export), the resource (report), and the scope (whole report or specific objects), and lists all supported formats. It distinguishes itself from siblings like copy_report or get_report by focusing on export in various formats.
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 detailed context on when to use each format (e.g., 'csv' requires exactly one object, 'png' requires image_size), and implies export for downloading data rather than on-screen viewing. However, it doesn't explicitly mention alternatives like get_report or download_file for comparison, but the format-specific requirements serve as clear use-case guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_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 state readOnlyHint=true and destructiveHint=false, so the description doesn't need to cover safety. The description adds that it's a 'single rule's definition' but doesn't disclose what happens if not found or if it returns null. With annotations providing the read-only profile, 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?
One sentence, to the point, no filler. Structure is optimal for a single-purpose 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?
There is an output schema, so description need not detail return values. For a simple fetch with two parameters and high schema coverage, the description is complete enough. Minor gap: doesn't mention how to get the rule_id (probably from list_business_rules), but that's not required.
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 high (100%), so schema already defines both parameters. The description adds no extra meaning beyond the schema, but it's consistent. Baselines 3 for high coverage 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?
Clear verb 'Fetch' + specific resource 'rule's definition from a SAS Business Rules rule set'. Distinguishes from siblings like list_business_rules (which lists many) and get_business_ruleset (which fetches the whole ruleset). The singular intent is explicit.
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?
Clear context of fetching a single rule's definition, and the parameter 'ruleset_id' notes it's the parent rule set UUID. However, it doesn't explicitly when to use versus alternatives like list_business_rules or get_business_ruleset, though the name implies it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_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?
The annotations thoroughly declare the safety profile (readOnlyHint=true, idempotentHint=true, destructiveHint=false), matching the description's 'Fetch' semantics—no contradiction. However, the description adds no behavior details beyond what annotations already declare (e.g., not-found handling, auth requirements, or rate limits). Given the strong annotation coverage, the bar is lower, and the description neither undercuts nor enriches it.
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 9-word sentence. Every word contributes: the verb, the resource, and the identifier scope. No fluff, no repetition of the tool name, and no wasted characters.
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 single-parameter read operation with a supplied output schema, the description is nearly sufficient. Sibling differentiation via the parameter annotation is helpful. The only gap is the lack of explicit not-found/error behavior, but given the tool's simplicity, full annotation coverage, and presence of an output schema, this is a minor miss.
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 claims 100% parameter coverage, and the ruleset_id parameter description is genuinely informative: it identifies the expected format (UUID), explicitly states what it is not (a name), and cross-references list_business_rulesets as the source of the ID. Per the rubric, high schema coverage earns a 3 baseline; the useful cross-reference and format clarification push it to a 4. Only the lack of any additional meaning contributed by the tool description itself prevents a 5.
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 'Fetch a single SAS Business Rules rule set by ID' uses a specific verb (Fetch), a specific resource ('SAS Business Rules rule set'), and the identification method ('by ID'). This precisely distinguishes it from sibling list_fetch operations and clearly communicates the singular-fetch scope.
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 itself does not provide explicit when-to-use guidance or exclusions relative to alternatives. However, the parameter description adds valuable disambiguation: it clarifies that a UUID is required (not a name) and points to list_business_rulesets as the source of both, which implicitly differentiates this get-by-ID pattern from the list tool. Explicit usage heuristics would have scored higher.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_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=true and idempotentHint=true, and the description adds valuable behavioral context beyond that: missing tables return a structured not_found with two specific causes instead of a raw HTTP error. This informs the agent about error handling and edge cases.
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 efficient sentences: the first states the core purpose and output, the second adds a targeted edge-case behavior. Every word earns its place with no 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 read-only metadata tool with rich annotations, a complete input schema, and an output schema, the description provides purpose, output shape, and key error behavior. It lacks explicit comparison with sibling tools, but the name and content are sufficient for correct 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?
The input schema covers 100% of parameters with clear descriptions, so the description does not need to add parameter-level detail. It neither repeats nor expands on the schema, but the schema is sufficient, supporting 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 states a specific verb ('Get') and resource ('column metadata for a CAS table') and enumerates the exact output fields (names, types, labels, formats). This clearly distinguishes it from sibling tools like get_castable_data or get_castable_info.
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 is implied by the descriptive name and the stated purpose, but there is no explicit guidance on when to use this tool versus alternatives such as list_compute_columns or get_castable_info. The error-behavior note is useful but does not address tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_castable_dataARead-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 agent knows it is a safe read operation. The description adds little beyond 'fetch rows', but it does imply a read-only behavior. Given annotations carry the safety profile, the description adds minimal extra behavioral context, so a 3 is appropriate.
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. It front-loads the purpose and includes a useful detail about column names. Every word 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?
Given the output schema exists and annotations are present, the description is sufficient for a simple data retrieval tool. It could mention pagination or row limits, but the schema already covers that. The tool is straightforward, so the description is adequately 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?
The schema description coverage is 100%, meaning parameters are well-described in the schema (e.g., limit, start, server_id, table_name, caslib_name). The description adds no additional parameter meaning beyond 'with column names' which is not directly tied to a parameter. Since schema covers parameters fully, baseline 3 is 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 'Fetch rows from a CAS table with column names' clearly states the action (fetch rows) and resource (a CAS table), and hints at the result including column names. While it doesn't explicitly differentiate from sibling tools, the name and description align with table data retrieval, distinguishing it from list_castables or get_castable_columns which list 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 the tool is for retrieving table data but does not explicitly state when to use it over siblings like list_castables, get_castable_columns, or query_data. No guidance on use cases or exclusions is provided. Since the name and description are clear, the usage context is implied but not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_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?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, covering the safety profile. The description adds the types of metadata returned (row count, column count, size), which slightly extends beyond the annotations. However, it doesn't describe error behavior, permissions, or other edge cases; given annotations handle safety, a 3 is appropriate.
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-front-loaded sentence with no filler. It efficiently states what the tool does and gives examples of returned metadata. Zero 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?
The tool has a simple signature (3 required parameters), good annotations, and an output schema that presumably details the metadata fields. The description sufficiently conveys the return concept (row count, column count, size) without over-explaining. It doesn't mention prerequisites or error cases, but for this low-complexity read operation, it's largely 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 each parameter is already documented in the input schema. The description does not add any extra semantics beyond what the schema provides (e.g., it doesn't hint at how parameters are used). Per rubric, baseline 3 applies when schema does the heavy lifting.
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 ('Get metadata') and a clear resource ('a CAS table'), listing concrete examples (row count, column count, size). It clearly distinguishes from siblings like list_castables (lists tables) and get_castable_columns (gets columns) by focusing on table-level 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 usage: it's for a single named table, not for listing. It doesn't explicitly say when not to use it or name alternatives, but the context is clear from the wording. No exclusions are stated, but that's acceptable for a straightforward read tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_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 provide readOnlyHint=true, idempotentHint=true, and destructiveHint=false, which fully cover the safety profile. The description adds the 'current state' context, but does not disclose any behavioral traits like response format or pagination. With annotations handling the safety, the description adds some value but not substantial 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 a single sentence that is concise and to the point, with no wasted words. It front-loads the purpose and is appropriately sized for a simple fetch 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?
Given the low complexity (1 parameter, output schema present, annotations comprehensive), the description is reasonably complete. It says what the tool does and the schema covers parameters. The output schema exists, so return values are covered. The only minor gap is lack of explicit guidance on usage scenarios, but overall it is adequate.
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; the parameter 'decision_id' is described as 'The decision flow UUID (not its name — list_decision_flows returns both).' This adds meaning beyond the schema by clarifying the format and providing a cross-reference to another tool. The description mentions 'flow' but not the parameter explicitly, so the schema does the heavy lifting, yet the additional note about UUID vs name is helpful.
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 function: 'Fetch the current state of a SAS Intelligent Decisioning flow.' This is a specific verb ('fetch') and resource ('decision flow'). It distinguishes from siblings like 'get_decision_flow_code' and 'list_decision_flows' by focusing on 'current state', but doesn't explicitly compare to 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 does not provide explicit when-to-use or when-not-to-use guidance. It implies that it's used to retrieve a flow's current state, but doesn't contrast with related tools like 'get_decision_flow_revision' or 'list_decision_flows'. The sibling list offers a clear context, but the description itself lacks direct guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_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 the description does not need to restate safety. It adds context that the returned artifact is generated DS2 execution code, but does not disclose additional behavioral traits such as whether the code depends on a published revision or whether retrieval can fail.
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 states the exact action and resource economically, making it easy to scan.
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, idempotent retrieval tool with one well-documented parameter and an output schema available, the description is sufficiently complete. It clearly names the resource being retrieved and is consistent with annotations, though a note about how the generated code relates to decision flow revisions could add further value.
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 provides 100% coverage for the single parameter, including the clarification that decision_id is a UUID and not a name. The description adds no further parameter semantics beyond what the schema already documents, so it meets the baseline for schema-heavy parameter 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 uses a specific verb ('Retrieve') and clearly identifies the resource ('generated DS2 execution code for a decision flow'). It distinguishes itself from sibling tools like get_decision_flow and get_decision_flow_revision by focusing specifically on the generated execution code, not metadata or revision details.
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 the generated DS2 execution code for a decision flow is needed, but it does not explicitly state when to choose this over related tools such as get_decision_flow or get_decision_flow_revision. No exclusions or alternative usage guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_decision_flow_revisionBRead-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 the tool as read-only, idempotent, and non-destructive. The description's use of 'Fetch' is consistent with this, but it adds no extra behavioral details beyond what 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, concise sentence with no unnecessary words or fluff. It directly states the tool's action and target.
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 tells what the tool does but does not explain the meaning of 'locked' or any prerequisites, nor does it clarify what 'content' includes. Given the output schema exists, return details are not needed, but the description could be more complete about the nature of the revision.
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 fully describes both parameters (decision_id and revision_id) with clear explanations. The description does not add any additional meaning or context for these 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 clearly states the tool fetches the content of a specific locked decision revision, distinguishing it from sibling tools like get_decision_flow that retrieve the flow itself or list_decision_flow_revisions that list 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 no information about when to use this tool versus alternatives, such as when a locked revision is needed or how it differs from other retrieval functions. No usage context is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_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: true, idempotentHint: true, and destructiveHint: false, covering the operation's safety profile. The description adds the behavioral constraint that the job must be completed, which is not in the annotations. It does not describe what happens if the job is not completed, but the additional context is valuable 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 that clearly states the action and object. There is no redundant information, fluff, or unnecessary detail. Every word 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 simple tool with one parameter and an output schema, the description is nearly complete. It identifies the purpose, the prerequisite of a completed job, and the safety profile via annotations. Minor gaps (e.g., behavior when job is not completed, or content of the log) are largely covered by the output schema and the simple nature of the 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, job_id, is described as 'ID of the job.' The tool description itself does not elaborate on this parameter, but since the schema fully documents it, the baseline of 3 applies. The description adds no extra semantic 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 uses a specific verb 'Retrieve' and identifies the resource as 'the log of a completed job'. This clearly distinguishes it from siblings like get_job_status (status vs. log) and list_jobs (list vs. single log). The phrase 'completed job' adds specificity beyond a generic '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 implies the tool is for completed jobs only, providing a conditional usage context. However, it does not mention alternatives or explicitly state when not to use it (e.g., for running jobs use get_job_status). The guidance is only implicit, not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_job_statusBRead-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 declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description adds no behavioral details beyond the basic 'check' action, such as what statuses might be returned or how it handles non-existent job IDs. It does not contradict annotations, but adds minimal value.
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, efficient sentence with no unnecessary words. It is front-loaded with the key action and resource, making it quick to scan.
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 getter with an output schema present and annotations covering safety, the description is minimal but adequate. However, given the presence of sibling tools like get_job_log and list_jobs, a bit more context on return values or status categories could improve completeness. It is neither under-specified nor over-specified for a basic 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% for job_id, and the parameter is simple. The description does not add any extra meaning (e.g., how to obtain the job_id, format, or relationship to submit_batch_job output). It meets the baseline but does not go beyond 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?
The description clearly states the action (check) and the resource (status of a submitted job). It distinguishes from siblings like list_jobs (listing all jobs) and get_job_log (retrieving logs), but does not elaborate on the nature of the status or return values, so it is clear but not fully distinctive.
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 on when to use this tool versus alternatives. The description does not mention when to call it (e.g., after submission, to poll progress) or when to prefer list_jobs or get_job_log. Usage context is entirely absent.
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_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?
The description adds valuable context about the return content (variable signature details) beyond the annotations. It does not contradict the read-only, idempotent, and non-destructive 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 concise sentences that deliver the essential information without redundancy. The structure is clear and front-loaded with the core 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?
The description sufficiently explains what the tool does and why it is useful, given there is no output schema to describe. It covers the key aspects needed to understand when and how to use 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?
The schema descriptions for step_id and module_id are already informative. The tool description does not add extra meaning to the parameters beyond the schema's own 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?
Clearly states the action ('Fetch') and the resource ('MAS module step's input/output variable signature'). The mention of being called before score_data distinguishes its specific use case 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?
Explicitly instructs to call before score_data and explains the rationale (to know variable names, types, order, and expected outputs). This provides clear usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_reportBRead-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 destructiveHint, covering the safety profile. The description adds that it returns 'metadata and definition', which gives a bit more insight into the response content, but it does not disclose any additional behaviors such as error handling, permissions, or output details. Since annotations handle safety, the description adds limited but non-trivial context, so a 3 is appropriate.
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, compact sentence that immediately captures the core function. There is zero redundancy, and it is front-loaded with the action verb. Every word contributes meaning, making it an exemplary concise description.
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 simplicity (one parameter), the presence of an output schema, and the strong annotations, the description is complete enough for an agent to understand what the tool does. It clearly states the purpose and relies on schema/annotations for technical details. It does not discuss edge cases or error behavior, but for a read-only getter with output schema, this is sufficient. A 4 is appropriate.
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 description covers 100% of the only parameter (report_id) with 'ID of the report.' The tool description does not add any additional semantics for the parameter, relying entirely on the schema. Given the high coverage, a baseline of 3 is warranted, and the description does not go beyond that.
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 verb 'Get' and the resource 'a Visual Analytics report's metadata and definition', which clearly identifies the tool's action and target. While it doesn't explicitly differentiate from siblings like 'get_report_outline' or 'describe_report_objects', the phrase 'metadata and definition' adds specificity that helps distinguish it. It is clear, but not strongly contrastive with 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 does not provide any guidance on when to use this tool versus alternatives. It simply states what it does without mentioning conditions, prerequisites, or exclusions. There is no reference to sibling tools or use cases where another tool would be more appropriate, leaving the agent without explicit usage direction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_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 declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the baseline is low. The description adds valuable behavioral context: it reduces the stored report to a compact outline, mentions possible return statuses (ok, not_found, outline_failed), and explains the output structure. This goes beyond the annotations and helps the agent understand the tool's 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 several sentences long but well-structured with a clear primary purpose, usage examples, and return format. Each bullet adds specific value (mapping to other tools). It is slightly longer than necessary but avoids redundancy and is front-loaded with the core 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?
Given the tool's simplicity (one parameter, read-only, idempotent), the description is complete: it explains the purpose, what the output contains, how to use it with other tools, and error conditions. The output schema is not shown but the description explicitly mentions the return structure and statuses, so 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% for the single required parameter report_id, and the schema description states 'The report id to outline.' The description does not add further detail about the parameter beyond what the schema already provides. Since the parameter is simple and unambiguous, 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 explicitly states the tool reads a report's structure (pages → objects) and provides the handles needed by other tools. It clearly distinguishes itself from siblings like get_report (full report) and describe_report_objects, and explains the compact outline nature.
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 explicit use cases: to edit an existing report, recover object names after an apply, or check batch results. It also maps the returned fields to specific parameters of other tools (e.g., object name → relativeToObject, label → export_report's report_objects, page label → page placement), giving clear guidance on when to use this tool versus alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_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 the operation readOnly, idempotent, and non-destructive. The description adds the scope ('inside a rule set') but includes no behavioral details such as pagination, result ordering, or the meaning of 'all' relative to the 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 sentence, front-loaded with the key action and resource, with 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?
The tool is simple and has output schema plus strong annotations, but the phrase 'all rules' is undermined by the limit parameter (default 100) and no mention of pagination. This is a meaningful gap for a list operation, preventing a higher score.
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 ruleset_id and limit already described. The description does not add further parameter semantics 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 tool lists rules within a SAS Business Rules rule set, using a specific verb and resource. It distinguishes itself from siblings like list_business_rulesets (lists rule sets) and get_business_rule (retrieves a single 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 intended usage is implied: call with a ruleset_id to enumerate its rules. However, there is no explicit guidance on when to choose this over alternatives like get_business_rule or list_business_rulesets, nor any exclusion criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_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?
The description discloses that only locked revisions are listed, a key behavioral detail not captured by annotations. Annotations already mark it as read-only and idempotent, so the added context about locked revisions is valuable and non-contradictory.
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 zero filler. It is front-loaded and efficient, conveying all necessary information without waste.
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 list operation with an output schema present, this description is sufficient. It identifies the core purpose and relies on the schema for field details. It could optionally mention ordering or pagination nuances, but that is not critical given the output 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?
The input schema provides comprehensive descriptions for both parameters (ruleset_id and limit), covering 100% of parameters. The description adds no extra parameter details, but the schema already supplies needed context, 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 clearly states the action (list) and the resource (locked revisions of a rule set), distinguishing it from sibling tools like list_business_rulesets or get_business_ruleset. It is specific and 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?
There is no guidance on when to use this tool versus alternatives. It does not mention that it is appropriate after lock_business_ruleset_revision or how it differs from listing all revisions. Usage context is implied but not explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_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 declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds the substring-filter behavior, but that is also present in the schema. It does not disclose other behavioral traits like pagination, ordering, or result scope beyond what the schema/annotations already 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?
A single, front-loaded sentence that immediately states the action and resource. No filler or redundant text; every word 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 simple list tool with a strong output schema and comprehensive annotations, this description is sufficient. It identifies the resource and filter capability. Slight gap: it could clarify that results are a summary list (not full rule-set definitions), but the output schema likely handles that.
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' are fully described with defaults and types. The description only repeats the substring filter concept without adding new meaning, so the 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 uses a specific verb ('List'), a clear resource ('SAS Business Rules rule sets'), and a scope qualifier ('optionally filtered by name substring'). This distinguishes it from siblings like list_business_rules (different resource) and get_business_ruleset (singular retrieval).
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 enumeration with an optional name filter, but it does not explicitly state when to use this tool versus alternatives such as list_business_rules or get_business_ruleset. There are no exclusions or direct comparisons, so guidance is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_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?
The annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. However, the description adds no extra behavioral context such as pagination behavior, default limit interaction, or error handling. Given the annotations, this is acceptable but not additive.
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 primary action and resource, achieving maximum clarity with minimal verbiage.
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 listing tool, the description is sufficient. The output schema and parameter descriptions cover return values and parameter details. However, it could optionally mention that it is a read-only operation or that the limit parameter controls response size, though these are already covered by annotations and 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?
The input schema already provides full descriptions for both parameters (server_id and limit), covering 100% of parameter semantics. The tool description adds nothing 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 clearly states the action ('List') and resource ('CAS libraries (caslibs)') with a specific scope ('available on a CAS server'). It distinguishes from sibling tools like list_compute_libraries or list_castables by focusing on caslibs, 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?
No guidance is provided on when to choose this tool over alternatives such as list_cas_servers or list_compute_libraries. The description implies usage for listing caslibs but does not mention exclusions, alternate tools, or prerequisite conditions like server availability.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_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 readOnlyHint=true and destructiveHint=false, so the safety profile is established. The description itself does not add behavioral context beyond the action of listing; it does not mention pagination, ordering, or any side effects. Given the annotations cover the core safety aspects, a score of 3 is appropriate.
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 redundant words. It is front-loaded with the action and resource, making it immediately clear and 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?
For a simple list operation with no parameters and comprehensive annotations, the description fully captures the tool's functionality. The presence of an output schema is mentioned in context but not detailed, which is not a deficiency for such a straightforward listing 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 tool has zero parameters, and the input schema confirms an empty object. As per calibration, a baseline of 4 is warranted when there are no parameters, and the description does not need to explain any parameter details.
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 the specific verb 'List' with the resource 'available CAS servers' and clarifies the context 'on the Viya environment.' This clearly distinguishes it from sibling tools like list_compute_contexts or list_caslibs, which target different object types. It is not a tautology since it adds 'available' and the environment scope.
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 such as list_compute_contexts or list_caslibs. It lacks any mention of scenarios, prerequisites, or exclusions, leaving the agent to infer usage 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_castablesARead-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?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, and the description is consistent with a read-only listing operation. The description adds only the CAS-library scope and no additional behavioral detail such as pagination, permission requirements, or whether only in-memory tables are 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 or redundant information. Every word contributes to stating the tool's 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?
With an output schema present and annotations covering the safety profile, the description is mostly sufficient for a simple listing tool. However, it leaves some contextual ambiguity around how this tool relates to sibling list tools such as list_compute_tables and list_source_tables.
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 all three parameters (server_id, caslib_name, limit) with 100% coverage, so the description does not need to compensate. The description adds no parameter-level meaning 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 uses a specific verb ('List') and resource ('tables') scoped to 'a CAS library,' making the core operation clear. However, it does not distinguish this from sibling tools like list_compute_tables or list_source_tables, so it stops 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 intended use is implied: use this tool to list tables in a CAS library. However, there is no explicit guidance about when to choose this over alternatives such as list_compute_tables or list_source_tables, and no exclusions or prerequisites are mentioned.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_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?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the description need not repeat safety. It adds the behavioral detail about the reusable per-user compute session, which is useful for understanding execution environment. No contradictions; no additional disclosure needed for a simple read-only 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 two sentences: the first states the primary purpose, the second provides execution context. No wasted words, front-loaded with the core action, and perfectly sized 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?
Given the rich schema (100% parameter coverage), strong annotations (read-only/idempotent), and presence of an output schema, the description is sufficient. It covers the essential operation and compute-session context. It could mention pagination behavior, but the schema's 'limit' and 'start' parameters already capture that, and output schema handles return values.
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 (limit, start, table_name, filter_name, library_name, compute_context_name) clearly described. The tool description does not add semantic detail beyond the schema, which is the baseline 3 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 clearly states the action: 'List the columns of a table in a SAS library within a compute context.' This identifies the specific resource (table columns), the scope (compute context), and distinguishes it from sibling tools like list_compute_tables or get_castable_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 adds context with 'Runs in the reusable per-user compute session for the context,' which helps the agent understand when this tool is appropriate (compute sessions) and implies it is not for CAS tables. It does not explicitly name alternatives or exclusions, but the context is clear enough for a read-only list operation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_compute_contextsCRead-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 readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds only a trivial scope ('Viya environment') and does not mention pagination behavior implied by limit/start parameters or filtering via filter_name. Since annotations carry the main behavioral disclosure, a 3 is appropriate; the description 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 concise sentence with no wasted words, front-loading the action and resource. However, it is likely under-specified for the given complex tool, but conciseness itself is efficient. The lack of additional context is more a completeness issue, so this dimension gets a 4.
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?
Despite having an output schema and thorough annotations, the description lacks critical context: no explanation of what a compute context is, no usage guidance, no parameter semantics, and no mention of pagination or filtering. The tool is simple, but an agent cannot determine when to invoke it or how to use the optional parameters without more detail. This is insufficient for accurate 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 0%, so the description must compensate for the three parameters (limit, start, filter_name). It provides no meaning beyond the schema's default values, making it impossible for an agent to understand the semantics of filter_name or pagination parameters. This is a significant omission, warranting a score of 1.
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 'List' and the resource 'compute contexts' with an environment scope ('Viya'). It distinguishes from sibling tools like list_compute_libraries or list_compute_tables because the resource is different, though it doesn't explicitly explain what a compute context is or how it differs from those 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?
No explicit guidance is given about when to use this tool versus alternatives. The description simply states the action without any context about typical use cases, prerequisites, or exclusions. There is no mention of alternative tools for listing different compute-related resources.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_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 indicate read-only, idempotent, non-destructive behavior. The description adds useful context about the reusable session and visibility of prior execute_sas_code calls, enhancing transparency.
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, focused sentences with no redundant information. Well-structured and directly relevant.
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 core purpose and session behavior, but lacks details about return format or possible errors; however, for a simple list operation, it is sufficiently 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?
The schema provides full descriptions for all four parameters (100% coverage), so the description adds no extra parameter meaning. 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 that the tool lists SAS libraries (librefs) for a compute context, distinguishing it from sibling tools like list_compute_contexts or list_caslibs.
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 listing libraries within a compute session and notes it runs in the reusable per-user session, but does not explicitly contrast with alternatives 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_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, idempotentHint, and destructiveHint, covering the safety profile. The description adds valuable context by noting it 'Runs in the reusable per-user compute session for the context,' which explains the execution environment beyond what annotations 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 two sentences, front-loaded with the core purpose, and includes only essential distinctions and context. Every sentence earns its place with no 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?
With an output schema and annotations present, the description sufficiently covers purpose, scope, and execution environment. It does not need to explain return values or parameters because the schema and output schema already capture those details. This is a complete description for a listing 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 schema covers 100% of parameters with descriptions including examples like 'WORK' and 'SASHELP'. The description adds no extra parameter semantics beyond referencing WORK as a libref, which is already present in the schema. Baseline of 3 is appropriate given 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 tool's function: 'List the tables in a SAS library within a compute context.' It specifies the resource type (SAS/Compute tables) and explicitly distinguishes from in-memory CAS tables by referencing list_castables, which differentiates 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?
It provides an explicit alternative ('see list_castables') and clarifies the distinction between SAS/Compute and CAS tables. This direct when-not guidance helps the agent choose the correct tool. The mention of the reusable per-user compute session further contextualizes usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_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 read-only, idempotent, and non-destructive behavior, and the description does not contradict them. It adds the 'locked revisions' scope, but it makes a broad claim of 'all' without clarifying pagination or the limit default of 20, which is a behavioral gap.
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 repeated schema information. 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 tool is simple, safe, and backed by a complete schema and output schema, so the one-line description is mostly sufficient. The main remaining gap is that 'all' is not fully aligned with the limit parameter, and no pagination behavior is mentioned.
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%, with decision_id and limit already well-described in the input schema. The tool description adds no extra parameter-level meaning beyond what the schema provides, so this is at the 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 'List all locked revisions of a decision flow' uses a specific verb and resource, and the 'locked revisions' qualifier distinguishes this from listing decision flows or getting a single revision. It is clear and 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 no explicit 'when to use' or alternative-tool guidance, such as 'use get_decision_flow_revision for a specific revision' or 'use lock_decision_flow_revision to create a locked revision.' The use case is only implied by the tool's name and phrasing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_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, so safety behavior is covered. The description adds the substring filter behavior, which is a useful extra. However, it does not disclose additional behavioral details such as ordering, pagination behavior, or access-scoping constraints, so it adds only modest value 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 that directly states the action, resource, and optional modifier. Every word contributes value; 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?
Given the tool's simplicity, the 100% parameter schema coverage, the presence of an output schema, and effective annotations, the description is sufficient. It captures the core purpose and optional filtering without needing to explain return values or parameter details that are already structured.
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% with both parameters (limit and filter_name) already documented with clear descriptions. The description's mention of 'filtered by name substring' merely reaffirms the schema's filter_name semantics without adding new information or clarifying format, case sensitivity, or edge cases.
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 resource ('SAS Intelligent Decisioning flows') and the action ('List'), plus an optional filtering capability. This distinguishes it from sibling tools like list_jobs and list_business_rulesets, making the purpose immediately 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 implies when to use the tool (when you need to enumerate decision flows, optionally filtered by name), but it does not explicitly state alternatives or when not to use it. There is no mention of related tools like get_decision_flow or list_decision_flow_revisions for more targeted needs, so usage guidance is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_filesBRead-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?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is known. The description adds no extra behavioral context (e.g., pagination, sorting, full response details) beyond the bare action, offering little value beyond 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. It is immediately clear and efficiently conveys the essential 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?
Given the output schema exists, return values need not be explained. The tool has only two optional parameters and the annotations cover safety, so this simple description is adequate, though it could mention the default limit or filter semantics for completeness.
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%, with both parameters (limit and filter_name) fully described in the schema. The tool description adds no extra meaning about parameters, so a 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 'List' and the resource 'files in the Viya Files Service', which distinguishes it from sibling tools for other resources (e.g., list_jobs, list_reports). It is specific and 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?
There is no guidance on when to use this tool versus alternatives, no exclusions or context about file-specific scenarios. The description simply states what it does without any usage instructions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_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 the safety profile is covered. The description adds the 'recent' scope and service source, but leaves 'recent' undefined and does not mention ordering or pagination 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 a single sentence that is front-loaded with the verb and resource, contains no filler, and is appropriately sized for a simple list 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 simple one-parameter list tool with an output schema and strong annotations, the description is mostly adequate. However, 'recent' is vague, and there is no mention of whether jobs are scoped to the current user or workspace, or how results are ordered.
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 'limit' parameter is already well-described in the input schema. The description adds no additional parameter semantics 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 uses a specific verb ('List') with a clear resource ('jobs') and service context ('Job Execution service'). It distinguishes itself from sibling tools like get_job_status and get_job_log by being the collection-listing operation.
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 a list of recent jobs is needed, but it does not explicitly state when to prefer this tool over alternatives such as get_job_status or get_job_log. No exclusions or alternative tool references are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_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 indicate a read-only, idempotent, non-destructive operation. The description adds the 'published' state scope, which is useful, but it does not describe pagination behavior, ordering, visibility limits, or what precisely is included in a module's data. It goes slightly beyond the annotations without being exhaustive.
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, compact sentence that front-loads the operation and resource. Every word contributes to understanding the tool's scope, and there is no repetitive 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?
This is a simple listing tool with one optional parameter, a complete input schema, an output schema, and annotations that fully describe its safe behavior. The description's explicit mention of 'published' adds the key business context needed for selection, making the overall package complete enough for reliable 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?
The only parameter, limit, is fully documented in the input schema with type, default, and a clear description. Since schema description coverage is 100%, the description does not need to add much; it adds no redundant or conflicting parameter information.
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 the specific verb 'List' with a clearly defined resource: 'published scoring models and decisions (MAS modules).' This distinguishes it from other list tools in the sibling set, such as list_jobs and list_reports, by naming both the content type and publishment state.
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 the use case—listing MAS modules that are published—but it does not explicitly explain when to choose this over related sibling tools like list_registered_models, list_ml_projects, or list_decision_flows. There are no exclusionary guidelines or alternative tool references.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_ml_projectsARead-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=true, idempotentHint=true, and destructiveHint=false, so the agent knows it is safe. The description adds no extra behavioral context beyond the basic listing, but it is consistent 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 description is a single, concise sentence that is front-loaded with the action and resource. No unnecessary 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?
For a simple list tool with one optional parameter, an output schema, and comprehensive safety annotations, the description is complete enough. No additional context is needed.
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% with one parameter 'limit' that has a clear description and default. The description does not add any additional parameter semantics 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 clearly states the verb 'List' and the specific resource 'AutoML pipeline automation projects', which distinguishes it from other list tools like list_jobs and 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?
No guidance is provided on when to use this tool versus alternatives, and no exclusion or context is given beyond the basic listing operation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_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 safe read-only profile is covered. The description adds only the notion of 'available' destinations, but does not disclose pagination behavior, return shape, or other behavioral details beyond the schema.
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 short sentence, 'List available publishing destinations,' which is directly front-loaded and contains no filler. It is appropriately sized for the simple read-only 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?
Given three optional pagination/filter parameters, strong annotations, and an output schema, the one-line purpose is mostly sufficient for agent selection and invocation. However, it does not clarify what makes a destination 'available' or provide decision context relative to other publishing/list tools, leaving minor gaps.
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%: limit, start, and filter_name each have descriptions, so the schema carries the parameter semantics. The description contributes no additional parameter detail and does not explain how 'available' interacts with filter_name, so the 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 uses a specific verb ('List') and a specific resource ('publishing destinations'), clearly stating the operation. It is distinct from sibling list tools by subject matter, though it does not elaborate on the meaning of 'available' or distinguish against a closely related tool.
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 invoke this tool instead of other list tools (e.g., list_reports, list_jobs) or whether pagination/filtering should be preferred. The use case is only implied by the tool name and resource, so the agent receives no explicit decision criteria.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_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 description is not required to repeat these. The description 'List models' is consistent with a safe, idempotent read operation. It adds no extra behavioral context (e.g., about pagination or result ordering), but given the strong annotation coverage, the minimal description meets the baseline.
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 wasted words. It is appropriately sized for a simple list operation and front-loads the action and resource. No unnecessary elaboration.
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, a well-documented parameter schema, and comprehensive annotations, the description is adequate but not rich. It does not clarify what constitutes a 'registered model' versus other model states (e.g., champion models) or whether any implicit scoping exists. However, for a simple list operation, the essentials are covered, so it is minimally 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?
There is only one parameter (limit) and the schema fully describes it with default and meaning (100% coverage). The tool description adds nothing beyond the schema, so the baseline score of 3 applies. It neither clarifies nor obscures the 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 description 'List models in the Model Repository' clearly states the action (list) and the resource (models in the Model Repository). It is specific enough to distinguish from sibling tools like list_jobs or list_ml_projects by naming the resource type. However, it does not explicitly differentiate it from other model-related listing tools, but the resource name is sufficient.
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, such as other listing tools or model-specific actions like register_ml_champion_model. There is no mention of prerequisites, filters, or typical use cases. Without any contextual hints, an agent may not know when this is the appropriate choice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_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, and destructiveHint=false, so the safety profile is covered. The description adds no additional behavioral details beyond the basic listing function, but it does not contradict the annotations; it remains neutral with minimal added value.
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, short sentence with no redundant words. It is appropriately concise and front-loaded, providing the essential purpose without any 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?
Given that there is an output schema and the input schema is fully documented, the description does not need to explain return values or parameters. However, the tool is part of a large sibling group and the lack of differentiation or usage context leaves the description minimally adequate but not complete for an agent to fully understand its role relative to other 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 100%, with both parameters ('limit' and 'filter_name') well-described in the schema. The description adds no extra meaning 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 states 'List Visual Analytics reports' with a clear verb and resource. However, it does not differentiate from siblings like 'get_report' or other list tools; the tool name itself is clear but the description lacks additional context on what distinct functionality or scope it covers.
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_jobs' or 'list_ml_projects'. The description implies it is for listing reports, but does not mention any context, prerequisites, or exclusions, offering no usage guidance beyond the obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_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?
With readOnlyHint=true and idempotentHint=true annotations already present, the bar for description-only behavioral disclosure is lower. The description adds the key detail: it returns only source tables not yet in CAS memory and that they are the raw set for promote_table_to_memory. No contradiction with annotations (consistent with read-only, non-destructive). It could optionally mention error behavior for a bad caslib, but the behavioral core is covered.
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 tight, two-sentence description with zero wasted words. It front-loads the core purpose in the first line, then immediately connects it to the downstream tool. Fully 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?
Given the tool's simplicity and the presence of a full output schema plus annotations, the description is complete for the agent to select and invoke it. A minor deduction for not explicitly describing the 'limit' semantics beyond the schema, but overall it's a well-rounded, sufficient description.
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% — all three parameters are well-documented in the schema (e.g., 'Maximum number of tables to return (default 50)'). The description accurately sets up the domain (CAS library, caslib) but adds no new parameter-specific detail beyond the schema. Baseline 3 is correct 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?
Purpose is explicitly stated with a specific verb+resource: 'List source tables that are NOT yet loaded into memory in a CAS library.' The critical qualifier 'NOT yet loaded into memory' separates it from sibling tools like list_castables or list_compute_tables. It clearly identifies the exact resource (source tables in a caslib) and the specific state (pre-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 declares this is 'the candidates for promote_table_to_memory,' which is the key guidance for a user to know when this is the right tool. It could be a 5 but doesn't explicitly say 'use X for in-memory tables instead' or name an alternative by its full tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lock_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?
Annotations only indicate this is a non-read-only, non-destructive, non-idempotent operation. The description goes much further by revealing that the request replaces the rule set's full content, requiring a fetch-and-resend pattern, and explicitly warns that omitting rules would wipe the live rule set. This is critical behavioral disclosure beyond what 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 concise and well-structured, starting with the core purpose, then explaining context, and finally providing a critical implementation warning. Every sentence adds value, and the three short paragraphs are easy to scan.
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 complex and potentially risky behavior (replacing full content), and the description fully covers how to use it correctly, why revisions are needed, and what pitfalls to avoid. An output schema exists, so return value details are not needed. The description is complete for its complexity.
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 schema already explains both parameters (ruleset_id is a UUID, revision_type is minor/major). The description adds no extra parameter-specific meaning beyond what the schema provides, though the warning about the body content relates to how parameters should be used.
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 ('Lock') and resource ('current state of a rule set as an immutable revision'), clearly distinguishing this tool from siblings like lock_decision_flow_revision. It also explains the purpose of revisions in decision flows, making the tool's role 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 states when to use the tool ('before wiring a rule set into a decision flow') and when to call again ('after editing rules'). It also warns about the risk of omitting rules. However, it does not explicitly mention alternatives or when not to use it, so it falls 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.
lock_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?
The description conveys that the tool makes the state immutable and creates a snapshot, which is a key behavioral trait not fully captured by the annotations. It doesn't mention reversibility or idempotency, but the term 'immutable' implies a non-reversible freeze.
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, no redundancy, and directly conveys the purpose and usage. It is efficiently structured with a clear action statement followed by a contextual instruction.
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 parameter, the description is complete: it explains what it does, when to use it, and how it relates to the publishing step. The existence of an output schema (not shown) suggests return details are handled elsewhere, so no gap is apparent.
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 decision_id is already well-documented in the schema (UUID, not name, with reference to list_decision_flows). The tool description adds no further semantic detail 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 tool's action (lock), the object (decision flow), and the result (immutable revision). It is distinct from sibling tools like create, update, or publish by focusing on freezing a state.
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 call after a successful create/update, and explains the purpose of creating a point-in-time snapshot for later publishing. This gives a clear when-to-use context without ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
promote_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?
The description adds important behavioral context beyond the annotations: it mentions the tool is idempotent (which aligns with the idempotentHint annotation), but also explains the specific scope (global visibility to all sessions) and that it uses the casManagement updateTableState API. It discloses that it loads from a caslib data source, which is a state-changing operation. The annotations already indicate readOnlyHint=false and destructiveHint=false, but the description provides additional context about the global scope and idempotency behavior, which is valuable.
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, consisting of three short sentences that front-load the main purpose, then explain the mechanism and idempotency, and finally provide a hint for discovery. No unnecessary words. Well-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?
Given the tool complexity (no nested objects, 3 required params, has output schema, and annotations), the description is quite complete. It explains the scope, idempotency, and suggests a complementary tool for discovery. However, it doesn't mention any potential errors or if the operation requires special permissions, but given the output schema exists and annotations cover basic safety, this is adequate.
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 describes all three parameters with reasonable descriptions (server_id, table_name, caslib_name). The description does not add further detail about the parameters beyond what the schema provides, but it does clarify that the table is loaded from a caslib and promoted to global scope. Since schema coverage is 100%, the schema does the heavy lifting, and the description adds little extra semantic value.
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 tool loads a source table into CAS memory at global scope, using a specific API, and differentiates from siblings like list_source_tables and get_castable_info. It specifies the resource (source table) and the action (load/promote). The purpose is unambiguous and distinct.
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 that it loads from a caslib data source, promotes to global scope, and mentions idempotency. It explicitly suggests using list_source_tables to discover unloaded tables, providing some usage context. However, it doesn't explicitly state when not to use this tool compared to other options like upload_data or query_data, but does recommend the discovery tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
publish_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?
Discloses key behavioral traits beyond annotations: asynchronous publishing, polling the publish job until terminal state, server-generated module ID (not publish_name), and that rule set code generation errors are environment-level. These details add significant context that annotations alone do not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is structured into four focused segments: purpose, prerequisite, async behavior, and error guidance. Every sentence provides useful information without fluff, and the key purpose 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 an output schema present, the description covers the operational lifecycle (prerequisite, async polling, return integration with downstream tools), error interpretation, and the key conceptual pitfall about module ID vs publish_name. It is complete for a complex publish 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?
Input schema covers all 5 parameters with descriptions, so baseline is 3. The description adds meaningful clarification about publish_name not being the MAS module ID and the returned moduleId being the real one, plus the polling behavior via jobUri. This extra semantic context elevates the score.
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+destination: 'Publish a locked decision revision to a Micro Analytic Score (MAS) destination.' This clearly identifies the action and distinguishes it from sibling tools like list_mas_modules (listing) and score_data (scoring).
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 states when to use this tool: 'Required before score_data can execute the decision — MAS runs published modules, not decision flows directly.' It also tells the agent it can avoid a separate lookup via list_mas_modules, and provides troubleshooting for environment-level errors, giving clear context vs alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
publish_ml_champion_modelADestructive
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 include destructiveHint: true, so the description must add context about destructive behavior. The description does not mention any side effects, permissions, or irreversibility. It only states the action, which is not misleading but misses an opportunity to elaborate on what 'publish' entails beyond the annotation. This is a moderate gap given the destructive hint.
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, no fluff, front-loads the verb 'Publish' and the object. Every word is meaningful.
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 a destructive annotation and an output schema (which likely describes the published model details), the description is minimally viable. It tells the agent what it does, but lacks details on preconditions (e.g., that the champion model exists), or potential failures. The output schema covers return values, so that's not an issue, but the description could be more helpful with context about the pipeline automation project requirement.
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. The description adds no further semantic detail beyond 'project_id' and 'destination_name', so it does not elevate beyond the baseline. The name 'destination_name' is somewhat ambiguous, but the schema clarifies it as 'Name of the destination to publish to.' No additional clarification is offered.
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 ('Publish the champion model') and the resource ('from an AutoML pipeline automation project to the Model Repository'). It distinguishes from sibling tools like register_ml_champion_model and publish_decision_flow, though it doesn't explicitly differentiate between those, but the specific 'champion model' and 'Model Repository' make the purpose clear.
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. The context implies it is used after an AutoML project has a champion model, likely after run_ml_project. It doesn't mention alternatives or prerequisites, but the purpose is clear enough for an agent to infer.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_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?
Although annotations are all false, the description fully discloses behavior beyond structured fields: it states 'nothing is persisted—the result is materialised into session scratch, read back, and dropped,' explicitly refuses DDL/DML, and explains that a malformed LIMIT is silently discarded by CAS and that create_view_sql is never executed here. This is comprehensive transparency that exceeds what annotations alone 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 long but every sentence earns its place, using bold headings for tier selection and dialect notes. It front-loads the core purpose, then progressively adds necessary nuance without fluff. Markdown formatting aids scanning, and the structure mirrors the user's decision flow (which tier, what dialect, how paging works).
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 tool spanning two storage tiers with a non-standard dialect, the description covers all critical aspects: tier selection, identifier qualification, dialect unsupported features (CTE, MERGE), concatenated libref invisibility, row capping, and stable paging. Given the existing output schema, this is exceptionally 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 coverage is 100%, but the description adds substantial meaning: target is explained with namespace distinctions and examples, limit behavior is clarified (the tool enforces it, SQL LIMIT is ignored), and create_view_name is detailed as returning SQL text rather than executing. This goes far beyond the schema's short 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 precise verb-resource statement: 'Run a FedSQL SELECT against CAS or compute data and return the rows.' It immediately clarifies it handles both storage tiers with a single SQL surface, which distinguishes it from sibling tools like list_castables or execute_sas_code. The scope is unambiguous and unique.
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 explicit tier-selection guidance via 'target' with concrete qualification examples (Public.HMEQ, WORK.SALES). It details when NOT to use it (concatenated librefs like SASHELP/MAPS) and instructs to copy to WORK first, even suggesting alternative tool execute_sas_code for staging. Also covers dialect limitations (no CTE, no MERGE) and row-capping behavior, making usage conditions crystal clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
register_ml_champion_modelA
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 a write operation (readOnlyHint=false) and non-destructive (destructiveHint=false), but the description does not add behavioral context such as whether existing models are overwritten, whether permissions are needed, or what happens if the champion model doesn't exist. With annotations present, the bar is lower, but the description adds minimal beyond the basic action. It is not misleading and 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 that conveys the essential information without any fluff. It is front-loaded and every word adds value, making it efficient for an agent to parse.
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 with one parameter, and the description adequately conveys the core function. Since an output schema exists (though not shown), return values are documented elsewhere. The description is complete for the action, though it could have mentioned the need for a champion model in the project, but that is a minor omission given the tool's simplicity.
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 project_id is fully described in the schema (coverage 100%). The description does not elaborate on the parameter beyond its schema description, nor does it clarify any nuances like required project state or relationship to the champion model. Since schema coverage is complete, a 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 action: 'Register the champion model' and specifies the source ('from an AutoML pipeline automation project') and destination ('to the Model Repository'). It uses a specific verb and resource, making the tool's purpose unambiguous. While it doesn't explicitly contrast with sibling 'publish_ml_champion_model', the distinct action 'register' is clear 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 provides no guidance on when to use this tool versus alternatives like publish_ml_champion_model or other registration/publishing tools. It does not mention prerequisites, scenarios, or exclusions. The user is left to infer when to register vs. publish, which is insufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reset_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?
Beyond the annotations (destructiveHint, idempotentHint), the description adds valuable behavioral context: the server keeps a reusable session per user/context, state persists across execute_sas_code and list_compute_* calls, and the next call transparently creates a fresh session. This explains the consequences of resetting 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 four sentences, front-loaded with the action, then providing necessary context about the session reuse model and the effect of calling reset. Every sentence contributes meaning without 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 tool has a single optional parameter, well-documented in the schema, and an output schema exists (per context signals). The description fully explains the tool's purpose, the persistence behavior, and the consequence of resetting, making it complete for an agent to decide when 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?
The schema already fully describes the only parameter (compute_context_name) with 100% coverage, including its default behavior. The tool description does not add any parameter-specific details, 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 opens with a specific verb+resource: "Reset (delete) the cached compute session for a compute context." It clearly distinguishes this tool from its siblings by explaining it discards persisted SAS session state, which is unique among the listed compute-related 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 explains when to use the tool: "Call this to discard that state" after detailing the persistence mechanism. It provides clear context about the session caching behavior and the effect on subsequent calls, but it does not explicitly name alternative tools or state when not to use it. However, the usage context is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
run_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 only indicate that the tool is not read-only, idempotent, or destructive; the description adds no additional behavioral context. It does not disclose whether running a project is asynchronous, whether it creates a job, or what side effects it may have on the project.
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. It is concise, though slightly too terse to provide useful operational 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?
Although an output schema exists, the description omits important context such as whether the run is asynchronous, whether it submits a job, and how it relates to get_job_status or cancel_job. For a tool that likely triggers a pipeline, this is incomplete.
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 fully documents the single parameter project_id as 'ID of the project to run,' so the description adds no extra meaning beyond the schema. This meets 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 uses a specific verb ('Run') and resource ('AutoML pipeline automation project'), which distinguishes it from create_ml_project and list_ml_projects. However, it does not clarify what 'run' entails, such as whether it starts an asynchronous job or executes synchronously.
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 like submit_batch_job, execute_sas_code, or create_ml_project. It also does not mention prerequisites or follow-up actions such as checking job status.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
score_dataA
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 are all false, so they do not convey a clear safety or side-effect profile. The description does not disclose whether scoring triggers a remote execution, creates a job, or produces side effects. 'Score data' implies an inference operation, but with readOnlyHint=false the agent cannot confidently assume no state changes.
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. It states the action, target, and domain efficiently, earning every word.
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?
Although the parameter schema is complete and an output schema exists, the tool description is too thin for a compute-oriented operation. It does not mention how to discover required module_id and step_id values via sibling tools like list_mas_modules or get_mas_module_step_signature, nor does it describe execution semantics or potential side effects. The description leaves important workflow context implicit.
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 three parameters, providing a baseline of 3. The description adds useful semantic framing by specifying that module_id refers to a published model or decision and that input_data is the data being scored, which goes beyond the schema's generic 'MAS module ID' wording.
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') with a clear resource ('data against a published model or decision (MAS module)'). It distinguishes this tool from siblings like list_mas_modules and get_mas_module_step_signature by stating the actual scoring action.
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 data needs to be scored against a published MAS model or decision, but it does not provide explicit when-to-use/when-not-to-use guidance or reference alternatives. The 'MAS module' qualifier gives some context, but the agent must infer prerequisites like module_id and step_id discovery.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
submit_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 communicate that this is a non-read-only, destructive, non-idempotent operation. The description adds useful context about asynchronous execution and the Job Execution service, but it does not disclose the potential side effects of executing arbitrary SAS code or any lifecycle implications.
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 a front-loaded verb and no wasted words. It delivers the essential information immediately.
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 2-parameter tool with an output schema and annotations, the description is adequate: it states what the tool does and how it executes. It could optionally mention tracking via get_job_status or cancel_job, but those sibling tools make lifecycle management discoverable, so the description is nearly 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 both parameters (sas_code and job_name) are already documented in the schema. The description itself adds no parameter-level semantics, earning a 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 uses a specific verb 'Submit' with a clear resource ('a SAS job') and explicit mode ('asynchronous execution via the Job Execution service'). This distinguishes it from sibling tools like execute_sas_code, which likely runs synchronously.
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 tool is for asynchronous job submission, which is useful context for when to use it versus execute_sas_code. However, it does not explicitly state when not to use it or name alternatives, so it stops short of full guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_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?
Annotations already declare destructiveHint=true and idempotentHint=true, so the safety profile is known. The description adds no additional behavioral context (e.g., that the update overwrites the entire rule or requires all fields to be provided). Given the annotations cover the essential traits, the description is adequate but does not enrich understanding beyond 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, concise sentence with no redundancy. It is front-loaded with the core action and resource, and every word contributes to the meaning, achieving maximum efficiency.
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 moderate complexity (7 required parameters) and the presence of a detailed input schema plus an output schema, the description is sufficient. It specifies the resource type and operation, and the schema covers parameter semantics. It does not explain edge cases or prerequisites, but the schema and annotations provide adequate context for a simple update 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% for all 7 parameters, so the schema alone clearly documents each field. The tool description does not provide any additional parameter-level meaning or context, matching the baseline of 3 for high coverage without extra 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 uses a specific verb ('Update') and clearly identifies the resource ('existing rule inside a SAS Business Rules rule set'), aligning with the tool's name and distinguishing it from sibling operations like create or delete. It is unambiguous and specific.
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 for updating an existing rule, and the tool name plus required rule_id and ruleset_id make the context clear. It does not explicitly mention alternatives or exclusions, but the purpose is evident from the wording and sibling tools, meeting the criteria for clear context without explicit exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_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?
Despite annotations already indicating destructiveHint and readOnlyHint false, the description adds specific behavioral details: changing the signature can invalidate existing rules that reference removed variables. It also recommends a pre-check via get_business_ruleset, which clarifies the potential side effects beyond generic destructiveness. This is valuable extra context that the annotations do not convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is exceptionally concise, with a single purpose statement followed by a focused caution. Every sentence earns its place, and the warning is front-loaded after the purpose. There is no redundant text or unnecessary detail, making it easy to scan and comprehend.
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 mutation potential (destructiveHint true), the complex signature behavior, and the presence of a full output schema (not shown but indicated), the description covers all necessary aspects: it states the purpose, warns about risks, and advises a safeguard. The schema handles parameter details, so the description only needs to highlight the critical side-effect, which it does effectively.
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% coverage for all four parameters, with detailed descriptions for each. The description does not add extra semantic meaning beyond what the schema provides; it only mentions the signature's role in invalidation, which is more behavioral than parameter-specific. Thus, 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 the tool updates an existing SAS Business Rules rule set's name/description/signature, using a specific verb and resource. It distinguishes from siblings like create_business_ruleset, list_business_rulesets, and delete_business_ruleset by clearly implying modification of an existing entity.
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 contextual warning about signature changes invalidating rules and suggests checking the current ruleset with get_business_ruleset first. This offers guidance on safe usage, though it does not explicitly compare with alternatives or state when not to use it. The caution implicitly advises against blind updates, but the main usage context (updating an existing ruleset) is obvious.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_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 mark the operation as destructive and idempotent; the description adds the crucial behavioral detail that the entire flow is replaced, not partially patched. This goes beyond what readOnlyHint/destructiveHint 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?
Two tightly written sentences: the first states purpose, the second delivers the critical usage warning. No filler or redundant restatement of the 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?
Given the annotations, 100% schema coverage, and presence of an output schema, the description is largely sufficient. It explains the one non-obvious destructive behavior. It could optionally reference lock_decision_flow_revision or how to fetch existing steps, but this is not necessary for correct 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%, so the baseline is 3. The description adds meaningful parameter-level guidance for rule_set_steps by requiring all steps (existing + new) and explaining the full-replacement semantics, which is not evident from the schema 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 uses a specific verb ('Update') with a specific resource ('existing SAS Intelligent Decisioning flow'), and the word 'existing' clearly distinguishes it from creation tools. The full-replacement warning further sharpens the tool's scope.
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 clearly conveys that this tool updates an existing flow and must be given all rule set steps because the update is a full replacement. It does not explicitly name alternatives like create_decision_flow, but the 'existing' phrasing and full-replacement caveat provide clear contextual guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_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 description discloses that data is read server-side and never passes through the model context, and it explains the file size limitation. It also details how the URL parameter is handled by the underlying casManagement uploadTable endpoint (fetched and sent as multipart), which goes beyond the annotations and provides comprehensive behavioral transparency.
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 with clear paragraphs and bullet points, and every sentence provides necessary information. Although somewhat long, it avoids fluff, and the small amount of repetition (e.g., 'read by the server') is used for emphasis rather than redundancy. It is well-organized and efficiently communicates all key aspects.
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, the description appropriately focuses on input and behavior rather than return values. It covers all operational aspects—data sources, file size limits, format handling, and guidance for alternative tools—making it complete for the tool's intended use.
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 description adds significant meaning to each parameter beyond the schema descriptions. It explains the file_path semantics in stdio mode, the need for data_format override for URLs without clean suffixes, and clarifies that contains_header_row applies to csv/tsv/Excel. This enrichment makes parameter usage much clearer than the schema 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 clearly states that the tool uploads a data file into a CAS table and explicitly contrasts it with upload_inline_data for small inline tables. It specifies the two data sources (file_path and URL) and clarifies that data is read server-side, making the tool's purpose unambiguous and distinct 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?
The description provides explicit when-to-use guidance by recommending upload_inline_data for small inline tables and offering handling advice for unsupported parquet formats. It also mentions file size limits (MAX_UPLOAD_BYTES) and the need for data_format override in specific cases, giving clear conditions for appropriate usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_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?
The description adds transparency about server-side behavior (reads from disk, fetches URL, handles binary files) and configuration flags. It does not contradict the annotations (readOnlyHint=false, etc.). Since annotations already exist, this extra context is valuable but not exhaustive, earning a 4.
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 with bullet points, but it is verbose and repeats much of the schema content. The bullet lists are helpful, but the text could be more concise without losing clarity.
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 all essential usage aspects: content sources, target folder, constraints, and configuration sensitivity. Since an output schema exists, return values are not explained, which is acceptable. The description is complete enough for an agent to use 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 description repeats parameter descriptions, but it adds meaningful context: clarifies that file_path is server-side, url is fetched, content is inline, and parent_folder_uri is a target folder. It also mentions size limits and binary safety, enriching 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 clearly states the tool uploads a file to the Viya Files Service, optionally into a Content folder, and specifies three input methods. This is specific and distinguishes from siblings like upload_data or upload_inline_data by focusing on file-based uploads.
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 when to use each input method (content for inline text, file_path for server disk, url for remote) and notes constraints like size limits and the ALLOW_LOCAL_FILE_UPLOAD flag. However, it does not explicitly contrast with sibling upload tools, so guidance on tool selection is implicit rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
upload_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?
All annotation hints are false, so the description carries the full informational burden. It adds valuable behavioral context: the payload-cost implication ('whole payload travels through the model's context'), the text-only constraint with explicit format list, and the architectural distinction that upload_data 'reads the bytes server-side.' It doesn't cover duplicate-name behavior on table creation, but the context it does add goes well beyond the schema.
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?
Four sentences, perfectly front-loaded with purpose, each subsequent sentence earning its place. The second and third sentences work together to define the boundary with upload_data without redundancy. Zero filler 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?
For a 6-parameter creation tool with an output schema, the description is remarkably complete: it covers use-case boundaries, performance/size implications, supported formats, and fallback paths. The presence of an output schema covers return values, so the description need not explain them. No significant gaps.
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 baseline is 3. The description reinforces the data parameter's size sensitivity (hinting why a small inline string is appropriate) and echoes the data_format values (csv/tsv). However, it does not add meaningfully new parameter-level insight the schema descriptions don't already convey, so 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+mechanism: 'Create a small CAS table from inline delimited text passed as a string.' It clearly identifies the resource (CAS table), the input mechanism (inline delimited text), and scopes it as 'small,' which distinguishes it from sibling upload_data. The qualifier 'small' also pre-empts misuse.
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?
Excellent explicit guidance: '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.' It gives concrete when-to-use examples (lookup tables, test tables), the underlying reason (context size), and explicitly names the alternative tool and why: 'For anything larger, or any file you already have, use upload_data (file_path/url), which reads the bytes server-side instead.'
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. Dates show when Glama detected each change.
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
Each tool targets a distinct resource-action within clear domains (jobs, CAS data, compute, files, reports, catalog, business rules, decision flows, ML). Despite 75 tools, there is no overlap; e.g., get_job_status vs get_job_log, list_castables vs list_compute_tables are clearly separated.
All tools use a consistent snake_case verb_noun pattern (e.g., list_caslibs, get_castable_columns, create_decision_flow, delete_report). No mixing of styles like camelCase or inconsistent verb choices.
75 tools far exceeds the 25+ threshold for 'too many' per the rubric. While the breadth of SAS Viya services justifies a large surface, this count is excessive for an MCP server and increases cognitive load.
The tool set provides comprehensive lifecycle coverage across major SAS Viya services: job execution, compute sessions, CAS data, files, reports, business rules, decision flows, ML projects, and catalog. Minor gaps like missing file deletion or CAS table removal exist, but core workflows are well-covered.
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
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.
Execute code in 8 languages (Python, JS, TS, Go, Java, C++, C, Bash) in gVisor sandboxes.
Query, browse, and automate OmegaAI workspaces from any MCP client. Streamable HTTP with OAuth 2.0.
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.1,321830ISC
- AlicenseNot gradedqualityDmaintenanceEnables AI to execute RPA applications and workflows through the Model Context Protocol, supporting both local and cloud modes.141MIT
- AlicenseNot gradedqualityDmaintenanceExecutes Python code with safety constraints and manages Python packages through the Model Context Protocol.153MIT
Appeared in Searches
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/sassoftware/sas-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server