Skip to main content
Glama
sassoftware

SAS MCP Server

Official
by sassoftware

SAS Viya MCP Server

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

Features

  • 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:

Getting Started

Prerequisites

Installation

  1. Clone the repository:

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

uv sync

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

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

Usage

  1. Configure environment variables:

cp .env.sample .env

Edit .env and set

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

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

uv run app

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

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

Authenticate once. Two equivalent options:

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

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

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

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

Option C: Docker / Podman (containerized deployment)

Pull the pre-built image from GitHub Container Registry:

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

Or build locally from source:

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

Available image tags:

  • latest — most recent tagged release

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

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

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

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

Programmatic clients with a pre-existing Viya token

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

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

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

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

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

Choosing a deployment mode

HTTP

Stdio

Docker

Kubernetes

How it runs

Long-running server you start separately

MCP client spawns it on demand

Containerized HTTP server

Containerized, behind an ingress

Authentication

OAuth2 PKCE flow (browser popup)

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

OAuth2 PKCE flow (browser popup)

PKCE and/or raw Viya bearer token

Best for

Multi-user or shared setups; production-like environments

Single-user local development; quick experimentation

Team deployments; CI/CD; environments without Python installed

Shared/organisational deployments alongside Viya

Requires

Python + uv

Python + uv (+ optional sas-viya CLI)

Docker or Podman only

A cluster, an ingress controller, a TLS secret

Credentials stored?

No — user authenticates interactively

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

No — user authenticates interactively

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

MCP client config

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

Client runs uv run app-stdio

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

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

Quick guidance:

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

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

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

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

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

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

Limiting exposed tools (tiers)

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

Tier

Group

0

Compute Contexts & Code Execution

1

Data Discovery

2

Data Operations & Files

3

Reports & Visualization

4

Batch Jobs & Async Execution

5

Automated Machine Learning

6

Model Management & Scoring

7

Decisioning (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 app

Read-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 app

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

Withheld

Why

execute_sas_code, submit_batch_job

Run arbitrary code — can perform any operation, including deletes

score_data, catalog_run_agent, catalog_run_adhoc_analysis

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

promote_table_to_memory

Mutates CAS in-memory state

cancel_job, reset_compute_session

Destroy something the caller owns

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

Tool annotations (what clients are told)

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

Hint

Derived from

readOnlyHint

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

destructiveHint

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

idempotentHint

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

openWorldHint

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

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

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 a resource_uri you can hand to the matching tool (e.g. get_report, get_castable_data).

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

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

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

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

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

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

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

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

CAS data (in-memory):

  • list_cas_servers: List available CAS servers

  • list_caslibs: List CAS libraries on a server

  • list_castables: List tables in a CAS library

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

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

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

  • get_castable_data: Fetch sample rows from a CAS table

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

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

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

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

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

Tier 2 — Data Operations & Files

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

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

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

  • list_files: List files in the Viya Files Service

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

  • download_file: Download file content

Tier 3 — Reports & Visualization

  • list_reports: List Visual Analytics reports

  • get_report: Get report metadata and definition

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

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

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

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

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

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

  • delete_report: Delete a report and its content.

Tier 4 — Batch Jobs & Async Execution

  • submit_batch_job: Submit a SAS job for async execution

  • get_job_status: Check job state

  • list_jobs: List recent/running jobs

  • cancel_job: Cancel a running job

  • get_job_log: Retrieve job log

Tier 5 — Automated Machine Learning

  • list_ml_projects: List AutoML projects

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

  • run_ml_project: Run pipeline automation

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

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

Tier 6 — Model Management & Scoring

  • list_registered_models: List models in repository

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

  • list_mas_modules: List published MAS modules

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

  • score_data: Score data against a published model or decision

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) and catalog_entity_id (catalog) — so you never have to work out which one you are holding.

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

Dictionary:

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

  • list_glossary_terms: Exact structural listing — by term type, by parent (the authoritative hierarchy), or by name fragment

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

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

HTTP mode (requires uv run app running separately):

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

Stdio mode (starts the server on demand):

{
    "servers": {
        "sas-execution-mcp": {
            "command": "uv",
            "args": ["run", "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 timeout field (in milliseconds) is important — SAS Viya API calls can take longer than the Gemini CLI default of 10 seconds. A value of 60000 (60s) is recommended. Set cwd to the absolute path of your sas-mcp-server checkout.

Example

Execute SAS code through the MCP tool:

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

proc print data=work.students;
run;

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

Collection Mode (Usage Telemetry)

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

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

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

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

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

When enabled it does two things:

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

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

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

Enabling it

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

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

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

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

Performance impact

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

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

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

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

Testing

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

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

Running Unit Tests

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

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

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

Running Integration Tests

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

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

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

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

Passing credentials on the command line (wrapper only):

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

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

Integration tests only (skip unit tests):

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

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

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

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

Every one of the 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 gist

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

Test Structure

File

Description

tests/test_tool_payloads.py

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

tests/test_integration.py

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

tests/test_tools.py

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

tests/test_viya_utils.py

Unit tests for Viya compute session and job orchestration

tests/test_mcp_server.py

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

tests/test_config.py

Unit tests for configuration loading

tests/test_config_oauth.py

Unit tests for PermissiveOAuthProxy raw-bearer handling

tests/test_auth_login.py

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

tests/test_stdio_server.py

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

tests/test_env.py

Unit tests for the env_bool helper

tests/test_prompts.py

Unit tests for prompt template rendering

Contributing

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

License & Attribution

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

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

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

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

Third-Party Dependencies

This project requires the following dependencies.

Available Tools

75 tools
apply_report_operationsA
Destructive

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

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

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

Layout & titles (see describe_report_objectsplacement / layout_recipes for details):

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

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

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

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

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

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

ParametersJSON Schema
NameRequiredDescriptionDefault
dry_runNoValidate and return the normalized payload (plus any soft warnings about missing common roles) without writing anything.
report_idYesTarget report id (from ``create_report`` or ``list_reports``).
operationsYesOrdered native operations array. Example element: ``{"addObject": {"object": {"barChart": {"dataSource": "CARS", "dataRoles": {"category": "Origin", "measures": ["MSRP"]}, "options": {"object": {"title": "MSRP by Origin"}}}}, "placement": {"page": {"target": "Overview"}}}}``.
result_folderNoSave-as target folder URI; omit for My Folder.
response_formatNo``concise`` (default) returns the created page/object/ data-source names+labels; ``detailed`` also echoes the full VA response.concise
result_report_nameNoSave-as — apply the operations to a NEW report with this name, leaving the source report untouched (atomic template instantiation; pairs with ``changeData``).
result_name_conflictNoSave-as name-conflict policy — ``rename`` (default), ``abort``, or ``replace``.rename

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

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

The description discloses behavior 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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_jobC
DestructiveIdempotent

Cancel a running job.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYesID of the job to cancel.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

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

The annotations 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.

Conciseness3/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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

The description clearly states a specific action ('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.

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives, 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_profileA
Read-onlyIdempotent

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

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

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

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

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

The 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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_instanceA
Read-onlyIdempotent

Resolve the catalog instance for a source-asset URI.

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

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

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already declare 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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_analysisA
Read-onlyIdempotent

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

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

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYesThe analysis job id returned by catalog_run_adhoc_analysis.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_historyA
Read-onlyIdempotent

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

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

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

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds 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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_agentsA
Read-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.

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

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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

Schema description coverage is 100%, with each parameter 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.

Purpose5/5

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.

Usage Guidelines5/5

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.

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

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

The 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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

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

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior5/5

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

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_search_helperA
Read-onlyIdempotent

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

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

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

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_reportA
Destructive

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

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

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

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

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

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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

Schema coverage is 100%, so the baseline is 3, but the description adds 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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesRule set name (max 30 chars).
signatureYesInput/output/inOut variables the rules operate on, each ``{"name", "dataType", "direction"}`` — dataType one of string, decimal, integer, date, datetime, dataGrid, boolean, any; direction one of input, output, inOut.
descriptionNoOptional description.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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

Schema description coverage is 100%, so the schema fully documents 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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesDecision name (max 60 chars).
signatureYesFlow-level input/output variables, each ``{"name", "direction", "dataType"}`` — direction input or output; dataType string, decimal, integer, date, datetime, boolean.
descriptionNoOptional description.
rule_set_stepsYesOrdered 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

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

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

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior4/5

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

Annotations already 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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_reportA
Destructive

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

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

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

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

Beyond the destructiveHint 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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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

The description opens with a specific verb and resource ('Create a 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.

Usage Guidelines4/5

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

The description gives clear workflow guidance: 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_ruleA
DestructiveIdempotent

Permanently delete a rule from a SAS Business Rules rule set.

ParametersJSON Schema
NameRequiredDescriptionDefault
rule_idYesThe rule UUID to delete.
ruleset_idYesThe parent rule set UUID (not its name — list_business_rulesets returns both).

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_rulesetA
DestructiveIdempotent

Permanently delete a SAS Business Rules rule set.

Only call this once the rule set is confirmed unused by any decision flow — deleting a rule set still referenced by a decision fails.

ParametersJSON Schema
NameRequiredDescriptionDefault
ruleset_idYesThe rule set UUID to delete (not its name — list_business_rulesets returns both).

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare 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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_flowA
DestructiveIdempotent

Permanently delete a SAS Intelligent Decisioning flow.

ParametersJSON Schema
NameRequiredDescriptionDefault
decision_idYesThe decision flow UUID to delete (not its name — list_decision_flows returns both).

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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_reportA
DestructiveIdempotent

Delete a Visual Analytics report and its content.

There is no per-object undo in the report API, so deleting and rebuilding (or copying first) is how you discard an unwanted report. Returns {"status": "deleted", "report_id": ...} (or not_found / delete_failed).

ParametersJSON Schema
NameRequiredDescriptionDefault
report_idYesThe report id to delete.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_objectsA
Read-onlyIdempotent

Discover what a Visual Analytics report can contain — operations and objects.

Call this to learn how to build a report before calling apply_report_operations. It reads a bundled catalog (no network), so it is the cheap way to look up an object's data roles instead of guessing.

ParametersJSON Schema
NameRequiredDescriptionDefault
categoryNoRestrict the catalog to one category.
operationNoAn operation key (e.g. ``"addData"``, ``"applyDataView"``) for its full shape, example, and notes.
object_typeNoA schema key (e.g. ``"barChart"``, ``"scatterPlot"``) or colloquial alias for its contract and example.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.7/5.0
Behavior5/5

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

Annotations already declare 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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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

Schema description coverage is 100%, and each parameter already has a meaningful description 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.

Purpose5/5

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.

Usage Guidelines5/5

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_fileA
Read-onlyIdempotent

Download file content from the Viya Files Service.

ParametersJSON Schema
NameRequiredDescriptionDefault
file_idYesID of the file to download.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness5/5

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

For a simple read-only 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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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

The description implies this tool is 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_codeA
Destructive

Executes the provided SAS code in the Viya environment and returns information about the completed Job. This will create a job definition for the SAS code, execute it, and then retrieve the results.

IMPORTANT — state persists between calls: the code runs in a reusable compute session that is kept warm and shared across calls (per user), so SAS state — WORK tables, macro variables, and assigned librefs — survives between successive execute_sas_code calls. A re-run can therefore see leftovers from earlier calls (e.g. a check that counts results twice). Pass fresh_session=True (or call reset_compute_session) when the code must start from a clean slate.

Tip: to reach CAS data, prefer libname casuser cas; (or a targeted caslib statement) over caslib _all_ assign; — on tenants with many caslibs the latter floods the log with assignment NOTEs.

ParametersJSON Schema
NameRequiredDescriptionDefault
sas_codeYesthe SAS code snippet to be executed using the Viya Job Execution API Service
fresh_sessionNoWhen True, discard any cached compute session first so the code runs with no inherited SAS state (equivalent to calling ``reset_compute_session`` immediately before).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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

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.

Conciseness4/5

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.

Completeness5/5

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

Given the presence of an output schema 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.

Parameters4/5

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

The input schema already provides 100% coverage for both parameters. 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.

Purpose5/5

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.

Usage Guidelines4/5

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_reportA
Read-onlyIdempotent

Export a Visual Analytics report (or specific report objects) in any format the VA service exposes, via its synchronous export endpoints.

Formats (export_format):

  • package — full report bundle as a .zip (source files, query results, and rendered content); whole report or selected objects.

  • pdf — rendered PDF; whole report or selected objects. Pass rendering overrides (e.g. orientation, paperSize, margin, includeCoverPage) via options.

  • png / svg — image of the report or a single object; image_size is required, e.g. "1200px,800px".

  • csv / tsv / xlsx — the data behind a single report object; exactly one object label is required.

  • summary — the report's text summary.

ParametersJSON Schema
NameRequiredDescriptionDefault
optionsNoOptional ``pdf`` rendering overrides, passed through as query parameters (e.g. ``{"orientation": "landscape"}``).
report_idYesID of the report.
image_sizeNoRequired for ``png``/``svg``; format ``"<w>px,<h>px"``.
export_formatYesOne of package, pdf, png, svg, csv, tsv, xlsx, summary.
report_objectsNoReport object labels to export. ``package``/``pdf`` accept several; image and data formats accept exactly one; ``summary`` accepts none. Omit to export the whole report where the format allows it.

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already 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.

Conciseness5/5

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.

Completeness4/5

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

Given no output schema, the description 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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_ruleA
Read-onlyIdempotent

Fetch a single rule's definition from a SAS Business Rules rule set.

ParametersJSON Schema
NameRequiredDescriptionDefault
rule_idYesThe rule UUID.
ruleset_idYesThe parent rule set UUID (not its name — list_business_rulesets returns both).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

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

Annotations already 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_rulesetA
Read-onlyIdempotent

Fetch a single SAS Business Rules rule set by ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
ruleset_idYesThe rule set UUID (not its name — list_business_rulesets returns both).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_columnsA
Read-onlyIdempotent

Get column metadata for a CAS table (names, types, labels, formats).

A missing table returns a structured not_found with the two usual causes (unloaded source table vs session-scoped table) instead of a raw HTTP error.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum columns to return (default 200).
server_idYesCAS server name or ID.
table_nameYesName of the table.
caslib_nameYesName of the caslib.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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

The description states a specific verb ('Get') 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.

Usage Guidelines3/5

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_dataA
Read-onlyIdempotent

Fetch rows from a CAS table with column names.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum rows to return (default 100).
startNoRow offset (default 0).
server_idYesCAS server name or ID.
table_nameYesName of the table.
caslib_nameYesName of the caslib.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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

The description implies the tool is for retrieving 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_infoA
Read-onlyIdempotent

Get metadata for a CAS table (row count, column count, size, etc.).

ParametersJSON Schema
NameRequiredDescriptionDefault
server_idYesCAS server name or ID.
table_nameYesName of the table.
caslib_nameYesName of the caslib.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

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

Annotations already 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.

Conciseness5/5

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.

Completeness4/5

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

The tool has a simple 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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_flowA
Read-onlyIdempotent

Fetch the current state of a SAS Intelligent Decisioning flow.

ParametersJSON Schema
NameRequiredDescriptionDefault
decision_idYesThe decision flow UUID (not its name — list_decision_flows returns both).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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_codeA
Read-onlyIdempotent

Retrieve the generated DS2 execution code for a decision flow.

ParametersJSON Schema
NameRequiredDescriptionDefault
decision_idYesThe decision flow UUID (not its name — list_decision_flows returns both).

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, 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.

Conciseness5/5

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

The description is a single, front-loaded sentence with no filler or redundant information. It 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.

Completeness4/5

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

For a simple, read-only, 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.

Parameters3/5

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.

Purpose5/5

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

The description uses a specific verb ('Retrieve') and 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.

Usage Guidelines3/5

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

The description implies the tool is used when 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_revisionB
Read-onlyIdempotent

Fetch the content of a specific locked decision revision.

ParametersJSON Schema
NameRequiredDescriptionDefault
decision_idYesThe decision flow UUID (not its name — list_decision_flows returns both).
revision_idYesThe revision UUID.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already declare 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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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_logA
Read-onlyIdempotent

Retrieve the log of a completed job.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYesID of the job.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare readOnlyHint: true, idempotentHint: true, and destructiveHint: false, 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.

Conciseness5/5

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.

Completeness4/5

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

For a simple tool with one 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.

Parameters3/5

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

Schema description coverage is 100% and the only parameter, 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.

Purpose5/5

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

The description uses a specific verb 'Retrieve' and 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.

Usage Guidelines3/5

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

The description implies the tool is for completed jobs 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_statusB
Read-onlyIdempotent

Check the status of a submitted job.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_idYesID of the job.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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_signatureA
Read-onlyIdempotent

Fetch a MAS module step's input/output variable signature.

Call before score_data to know the exact variable names, types, and order to pass as inputs, and what outputs to expect.

ParametersJSON Schema
NameRequiredDescriptionDefault
step_idNoThe step within the module to inspect (default "execute").execute
module_idYesThe MAS module ID (see ``list_mas_modules``).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_reportB
Read-onlyIdempotent

Get a Visual Analytics report's metadata and definition.

ParametersJSON Schema
NameRequiredDescriptionDefault
report_idYesID of the report.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.4/5.0
Behavior3/5

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

Annotations 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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_outlineA
Read-onlyIdempotent

Read a report's structure: pages → objects with the handles other tools need.

Reduces the stored report definition to a compact outline — per page its internal name and label, per object its name (ve*), label, type, and any text content. Use it to edit an existing report, to recover object names after an apply, or to check what a batch actually produced:

  • object name → the target for relativeToObject/container placement and updateObject;

  • object label → what export_report report_objects takes;

  • page label → the page placement target.

Returns {"status": "ok", "pages": [...], "hint": ...} (or not_found / outline_failed).

ParametersJSON Schema
NameRequiredDescriptionDefault
report_idYesThe report id to outline.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.6/5.0
Behavior5/5

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

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_rulesA
Read-onlyIdempotent

List all rules inside a SAS Business Rules rule set.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of results to return (default 100).
ruleset_idYesThe rule set UUID (not its name — list_business_rulesets returns both).

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare 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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_revisionsA
Read-onlyIdempotent

List all locked revisions of a rule set.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of results to return (default 20).
ruleset_idYesThe rule set UUID (not its name — list_business_rulesets returns both).

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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

The description clearly states the action (list) and the resource (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.

Usage Guidelines2/5

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

There is no guidance on when to use this tool versus alternatives. 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_rulesetsA
Read-onlyIdempotent

List SAS Business Rules rule sets, optionally filtered by name substring.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of results to return (default 20).
filter_nameNoOptional substring to match against rule set names.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds the 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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

Schema description coverage is 100% — both 'limit' and 'filter_name' 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.

Purpose5/5

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

The description uses a specific verb ('List'), 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.

Usage Guidelines3/5

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_caslibsA
Read-onlyIdempotent

List CAS libraries (caslibs) available on a CAS server.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of caslibs to return (default 50).
server_idYesCAS server name or ID (e.g. 'cas-shared-default').

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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

The description is a single, clear sentence with no filler. It front-loads the 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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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

The description clearly states the action ('List') and 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.

Usage Guidelines2/5

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_serversA
Read-onlyIdempotent

List available CAS servers on the Viya environment.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true 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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives 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_castablesA
Read-onlyIdempotent

List tables in a CAS library.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of tables to return (default 50).
server_idYesCAS server name or ID.
caslib_nameYesName of the caslib.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=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.

Conciseness5/5

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

The description is a single, front-loaded sentence with no filler or redundant information. 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.

Completeness4/5

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

With an output schema present and 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.

Parameters3/5

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.

Purpose4/5

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

The description uses a specific verb ('List') and resource ('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.

Usage Guidelines3/5

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

The intended use is implied: use this tool 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_columnsA
Read-onlyIdempotent

List the columns of a table in a SAS library within a compute context.

Runs in the reusable per-user compute session for the context.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of columns to return (default 50).
startNoOffset of the first column to return (default 0).
table_nameYesName of the table within the library.
filter_nameNoOptional name filter (substring match).
library_nameYesName of the SAS library/libref (e.g. 'WORK', 'SASHELP').
compute_context_nameYesName of the compute context (see list_compute_contexts).

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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

Schema description coverage is 100%, with each parameter (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.

Purpose5/5

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

The description clearly states the action: 'List 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.

Usage Guidelines4/5

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_contextsC
Read-onlyIdempotent

List available compute contexts on the Viya environment.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
startNo
filter_nameNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.7/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering the safety profile. The description adds 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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters1/5

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

Schema description coverage is 0%, so the description must compensate 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.

Purpose4/5

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.

Usage Guidelines2/5

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_librariesA
Read-onlyIdempotent

List the SAS libraries (librefs) assigned in a compute context.

Runs in the reusable per-user compute session for the context, so it also sees libraries created by prior execute_sas_code calls.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of libraries to return (default 50).
startNoOffset of the first library to return (default 0).
filter_nameNoOptional name filter (substring match).
compute_context_nameYesName of the compute context (see list_compute_contexts).

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_tablesA
Read-onlyIdempotent

List the tables in a SAS library within a compute context.

These are SAS/Compute tables (e.g. WORK or an assigned libref), distinct from in-memory CAS tables (see list_castables). Runs in the reusable per-user compute session for the context.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of tables to return (default 50).
startNoOffset of the first table to return (default 0).
filter_nameNoOptional name filter (substring match).
library_nameYesName of the SAS library/libref (e.g. 'WORK', 'SASHELP').
compute_context_nameYesName of the compute context (see list_compute_contexts).

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, 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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_revisionsA
Read-onlyIdempotent

List all locked revisions of a decision flow.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of results to return (default 20).
decision_idYesThe decision flow UUID (not its name — list_decision_flows returns both).

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare 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.

Conciseness5/5

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

The description is a single, front-loaded sentence with no filler or 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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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_flowsA
Read-onlyIdempotent

List SAS Intelligent Decisioning flows, optionally filtered by name substring.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of results to return (default 20).
filter_nameNoOptional substring to match against decision names.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so 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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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

The description implies when to use the tool (when you need 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_filesB
Read-onlyIdempotent

List files in the Viya Files Service.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum files to return (default 50).
filter_nameNoOptional name filter (substring match).

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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

There is no guidance on when to use this tool versus alternatives, 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_jobsA
Read-onlyIdempotent

List recent jobs from the Job Execution service.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum jobs to return (default 20).

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is 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.

Conciseness5/5

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

The description is a single sentence that is front-loaded with the 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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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

The description uses a specific verb ('List') with a 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.

Usage Guidelines3/5

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_modulesA
Read-onlyIdempotent

List published scoring models and decisions (MAS modules).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum modules to return (default 50).

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.9/5.0
Behavior3/5

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

Annotations already 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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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_projectsA
Read-onlyIdempotent

List AutoML pipeline automation projects.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum projects to return (default 50).

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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_destinationsB
Read-onlyIdempotent

List available publishing destinations.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum destinations to return (default 50).
startNoRow offset (default 0).
filter_nameNoOptional filter for destination names.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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

The description uses a specific verb ('List') and a 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.

Usage Guidelines2/5

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

No guidance is provided about when to 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_modelsB
Read-onlyIdempotent

List models in the Model Repository.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum models to return (default 50).

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=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.

Conciseness5/5

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.

Completeness3/5

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

Given the presence of an output schema, 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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives, 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_reportsB
Read-onlyIdempotent

List Visual Analytics reports.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum reports to return (default 50).
filter_nameNoOptional name filter (substring match).

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3/5.0
Behavior3/5

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

Annotations already declare 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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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

Schema description coverage is 100%, with both parameters ('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.

Purpose3/5

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.

Usage Guidelines2/5

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

There is no guidance on when to use this tool versus alternatives such as 'list_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_tablesA
Read-onlyIdempotent

List source tables that are NOT yet loaded into memory in a CAS library.

These are the candidates for promote_table_to_memory — tables that exist on the caslib's data source but are not in CAS memory yet.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of tables to return (default 50).
server_idYesCAS server name or ID.
caslib_nameYesName of the caslib.

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.2/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
ruleset_idYesThe rule set UUID (not its name — list_business_rulesets returns both).
revision_typeNo"minor" for iterative changes, "major" for a significant/approved milestone (default "minor").minor

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

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

Annotations 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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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

Schema description coverage is 100%, so the baseline is 3. The 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.

Purpose5/5

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

The description opens with a specific verb ('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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
decision_idYesThe decision flow UUID (not its name — list_decision_flows returns both).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

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.

Conciseness5/5

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.

Completeness5/5

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

For a simple tool with one 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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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_memoryA
Idempotent

Load a source table into CAS memory at global scope (visible to all sessions).

Loads the table from its caslib data source and promotes it to global scope via the casManagement updateTableState API. Idempotent: if the table is already loaded in global scope it is left untouched. Use list_source_tables to discover unloaded tables that can be promoted.

ParametersJSON Schema
NameRequiredDescriptionDefault
server_idYesCAS server name or ID.
table_nameYesTable to load and promote.
caslib_nameYesCaslib containing the table.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
decision_idYesThe decision flow UUID (not its name — list_decision_flows returns both).
revision_idYesThe locked revision UUID (see ``lock_decision_flow_revision``).
poll_timeoutNoMax seconds to wait for the publish job to reach a terminal state before giving up (default 60.0).
publish_nameYesThe published name shown in Model Publish (not the MAS module ID — see above).
destination_nameNoThe configured MAS publishing destination (default "maslocal").maslocal

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.9/5.0
Behavior5/5

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

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.

Conciseness5/5

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.

Completeness5/5

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

With an output schema present, the description 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.

Parameters4/5

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.

Purpose5/5

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

The description opens with a specific verb+resource+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.

Usage Guidelines5/5

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_modelA
Destructive

Publish the champion model from an AutoML pipeline automation project to the Model Repository.

ParametersJSON Schema
NameRequiredDescriptionDefault
project_idYesID of the ML pipeline automation project.
destination_nameYesName of the destination to publish to.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

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

Annotations 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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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

Schema description coverage is 100% and both parameters have clear descriptions. 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.

Purpose4/5

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.

Usage Guidelines3/5

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

No explicit when-to-use or when-not-to-use guidance. 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 as caslib.table (e.g. Public.HMEQ); see list_caslibs / list_castables.

  • target='compute' — qualify as libref.table (e.g. WORK.SALES); see list_compute_libraries / list_compute_tables. Concatenated librefs — several directories under one name, which is what SASHELP and MAPS are — are invisible to FedSQL, because its BASE driver maps one schema to one directory. Copy such a table into WORK first (data work.cars; set sashelp.cars; run;) and query WORK.CARS.

Dialect notes (FedSQL, not PROC SQL): joins (inner/left/right/full/ cross), subqueries, UNION, GROUP BY/HAVING/ORDER BY, and scalar functions work. There is no WITH/CTE — use a derived table (select ...) "t" — and no MERGE; express a merge as a join (a full join with COALESCE gives upsert semantics). Double-quote identifiers that are reserved words or contain spaces; SAS name literals ('x'n) are not FedSQL.

Row capping is done by this tool, not by your SQL: any LIMIT you write is ignored in favour of limit (a malformed LIMIT is silently discarded by CAS and would return the whole table). Add ORDER BY for stable paging.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum rows to return, 1..10000 (default 100).
queryYesA single FedSQL SELECT statement. DDL/DML is refused — this tool only reads rows.
startNoRow offset for paging (default 0).
targetNoWhich tier the identifiers refer to — ``cas`` (default) or ``compute``.cas
create_view_nameNoIf set, the result includes ``create_view_sql`` — the ``CREATE VIEW <name> AS <query>`` text for this query. It is returned for you to run yourself, never executed here.
compute_context_nameNoCompute context to run in; defaults to the server's configured execution context.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
project_idYesID of the ML pipeline automation project.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

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

Annotations 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines2/5

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

The description provides no guidance on when to use this tool versus alternatives 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_sessionA
DestructiveIdempotent

Reset (delete) the cached compute session for a compute context.

The server keeps one reusable SAS compute session per user and compute context so repeat calls skip the slow session spin-up; SAS state (WORK tables, macro variables, assigned librefs) therefore persists across execute_sas_code and list_compute_* calls. Call this to discard that state — the next compute tool call transparently creates a fresh session.

ParametersJSON Schema
NameRequiredDescriptionDefault
compute_context_nameNoCompute context whose session to reset. Defaults to the server's configured execution context (the one ``execute_sas_code`` uses).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

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

Beyond the annotations (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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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

The description opens with a specific verb+resource: "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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
project_idYesID of the project to run.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

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

The annotations 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.

Conciseness4/5

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

The description is a single front-loaded sentence with no filler or repetition. 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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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

There is no guidance on when to use this tool versus alternatives 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).

ParametersJSON Schema
NameRequiredDescriptionDefault
step_idYesStep ID within the module (usually 'score' or 'execute').
module_idYesMAS module ID.
input_dataYesDictionary of input variable name-value pairs.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines3/5

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

The description implies the tool is used when 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_jobA
Destructive

Submit a SAS job for asynchronous execution via the Job Execution service.

ParametersJSON Schema
NameRequiredDescriptionDefault
job_nameNoOptional descriptive name for the job.
sas_codeYesSAS code to execute.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

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

Annotations already 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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

Schema description coverage is 100%, so both parameters (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.

Purpose5/5

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.

Usage Guidelines4/5

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_ruleA
DestructiveIdempotent

Update an existing rule inside a SAS Business Rules rule set.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesRule name (max 30 chars).
actionsYesList of assignment/return actions to perform when matched.
rule_idYesThe specific rule UUID to update.
conditionsYesList of conditions (multiple conditions AND together).
ruleset_idYesThe parent rule set UUID (not its name — list_business_rulesets returns both).
conditionalYes"if" starts a new independent rule chain, "elseif" continues the previous rule's chain, "or" ORs into it.
rule_fired_tracking_enabledYesWhether to record when this rule fires.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior3/5

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

Annotations already 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_rulesetA
DestructiveIdempotent

Update an existing SAS Business Rules rule set's name/description/signature.

Changing the signature can invalidate existing rules that reference removed variables — check with get_business_ruleset first if unsure.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesRule set name (max 30 chars).
signatureYesInput/output/inOut variables the rules operate on.
ruleset_idYesThe existing rule set UUID (not its name — list_business_rulesets returns both).
descriptionNoOptional description.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior5/5

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

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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_flowA
DestructiveIdempotent

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesDecision name (max 60 chars).
signatureYesFlow-level input/output variables.
decision_idYesThe existing decision flow UUID (not its name — list_decision_flows returns both).
descriptionNoOptional description.
rule_set_stepsYesOrdered list of rule set steps (see ``create_decision_flow`` for the shape).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

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

Annotations already 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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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

Schema description coverage is 100%, so the baseline is 3. The description adds 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.

Purpose5/5

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.

Usage Guidelines4/5

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 with ALLOW_LOCAL_FILE_UPLOAD=false.

  • url — the server fetches it over HTTP.

Either way the bytes are read server-side and never pass through the calling model's context window. Sources larger than MAX_UPLOAD_BYTES (default 100 MiB — SAS Viya's own default file-upload limit) are refused. To create a small table you are building inline (no file or URL), use the upload_inline_data tool instead.

The casManagement uploadTable endpoint only accepts an uploaded file (multipart form-data) and has no URL parameter, so url is fetched and sent on as the multipart file part.

Formats. Per the uploadTable API: csv, xls, xlsx (single sheet), sas7bdat, sashdat; tsv is csv with a tab delimiter. parquet is not accepted and is rejected up front with guidance (load via a path-based caslib + promote_table_to_memory, or convert to csv/sas7bdat). The format is auto-detected from the file_path/url extension; pass data_format to override (needed for URLs with no clean suffix).

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoHTTP(S) URL the server fetches the file from.
file_pathNoPath to a data file the server reads directly from disk.
server_idYesCAS server name or ID.
sheet_nameNoFor Excel sources, the worksheet to import (first sheet by default).
table_nameYesName for the new table.
caslib_nameYesTarget caslib name.
data_formatNoOverride format detection. One of csv, tsv, xls, xlsx, sas7bdat, sashdat (aliases: excel→xlsx, tab→tsv, sas→sas7bdat).
contains_header_rowNoWhether the first row holds column names — applies to csv/tsv/Excel (default True).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A5/5.0
Behavior5/5

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

The description discloses 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.

Conciseness5/5

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.

Completeness5/5

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

Given the presence of an output schema, 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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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 with ALLOW_LOCAL_FILE_UPLOAD=false.

  • url — an HTTP(S) URL the server fetches the file from. Also binary-safe.

file_path and url sources larger than MAX_UPLOAD_BYTES (default 100 MiB — SAS Viya's own default file-upload limit) are refused.

parent_folder_uri files the upload into a Content folder (e.g. /folders/folders/{folderId}) — the location %include/filesrvc ingestion and other folder-scoped consumers need. Without it the file lands unfiled under the caller's user context.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlNoHTTP(S) URL the server fetches the file from.
contentNoFile content as an inline string (small text files).
file_nameYesName for the file.
file_pathNoPath to a file the server reads directly from disk.
content_typeNoMIME type. Defaults to ``text/plain`` for ``content``, else guessed from ``file_name`` (``application/octet-stream`` when unguessable).
parent_folder_uriNoTarget folder URI (``/folders/folders/{id}``); get one from list_files or the Folders service.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.2/5.0
Behavior4/5

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

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.

Conciseness3/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
dataYesThe delimited text, including the header row.
server_idYesCAS server name or ID.
table_nameYesName for the new table.
caslib_nameYesTarget caslib name.
data_formatNo'csv' (default) or 'tsv' (alias 'tab').csv
contains_header_rowNoWhether the first row holds column names (default True).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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

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.

Conciseness5/5

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.

Completeness5/5

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

For a 6-parameter creation tool with an output schema, the description 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.

Parameters3/5

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.

Purpose5/5

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

The description opens with a specific verb+resource+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.

Usage Guidelines5/5

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. 1 tool updatev1.8.0
    • Addedquery_data
  2. 30 tool updatesv1.7.0
    • Addedapply_report_operations
    • Addedcopy_report
    • Changedcreate_business_rule1 field changed
      • changedInput schema / properties / ruleset_id / description
        Previous value: -"The rule set UUID to add the rule to."New value: +"The rule set UUID to add the rule to (not its name — list_business_rulesets returns both)."
    • Addedcreate_report
    • Changeddelete_business_rule1 field changed
      • changedInput schema / properties / ruleset_id / description
        Previous value: -"The parent rule set UUID."New value: +"The parent rule set UUID (not its name — list_business_rulesets returns both)."
    • Changeddelete_business_ruleset1 field changed
      • changedInput schema / properties / ruleset_id / description
        Previous value: -"The rule set UUID to delete."New value: +"The rule set UUID to delete (not its name — list_business_rulesets returns both)."
    • Changeddelete_decision_flow1 field changed
      • changedInput schema / properties / decision_id / description
        Previous value: -"The decision flow UUID to delete."New value: +"The decision flow UUID to delete (not its name — list_decision_flows returns both)."
    • Addeddelete_report
    • Addeddescribe_report_objects
    • Changedexecute_sas_code1 field changed
      • addedInput schema / properties / fresh_session
        Added value: +{
        +  "default": false,
        +  "description": "When True, discard any cached compute session first\nso the code runs with no inherited SAS state (equivalent to\ncalling ``reset_compute_session`` immediately before).",
        +  "type": "boolean"
        +}
    • Changedget_business_rule1 field changed
      • changedInput schema / properties / ruleset_id / description
        Previous value: -"The parent rule set UUID."New value: +"The parent rule set UUID (not its name — list_business_rulesets returns both)."
    • Changedget_business_ruleset1 field changed
      • changedInput schema / properties / ruleset_id / description
        Previous value: -"The rule set UUID."New value: +"The rule set UUID (not its name — list_business_rulesets returns both)."
    • Changedget_castable_columns3 fields changed
      • addedOutput schema / properties / result / anyOf
        Added value: +[
        +  {
        +    "items": {
        +      "additionalProperties": true,
        +      "type": "object"
        +    },
        +    "type": "array"
        +  },
        +  {
        +    "additionalProperties": true,
        +    "type": "object"
        +  }
        +]
      • removedOutput schema / properties / result / items
        Removed value: -{
        -  "additionalProperties": true,
        -  "type": "object"
        -}
      • removedOutput schema / properties / result / type
        Removed value: -"array"
    • Changedget_decision_flow1 field changed
      • changedInput schema / properties / decision_id / description
        Previous value: -"The decision flow UUID."New value: +"The decision flow UUID (not its name — list_decision_flows returns both)."
    • Changedget_decision_flow_code1 field changed
      • changedInput schema / properties / decision_id / description
        Previous value: -"The decision flow UUID."New value: +"The decision flow UUID (not its name — list_decision_flows returns both)."
    • Changedget_decision_flow_revision1 field changed
      • changedInput schema / properties / decision_id / description
        Previous value: -"The decision flow UUID."New value: +"The decision flow UUID (not its name — list_decision_flows returns both)."
    • Changedget_mas_module_step_signature1 field changed
      • changedInput schema / properties / module_id / description
        Previous value: -"The MAS module ID (see ``list_models_and_decisions``)."New value: +"The MAS module ID (see ``list_mas_modules``)."
    • Addedget_report_outline
    • Changedlist_business_rules1 field changed
      • changedInput schema / properties / ruleset_id / description
        Previous value: -"The rule set UUID."New value: +"The rule set UUID (not its name — list_business_rulesets returns both)."
    • Changedlist_business_ruleset_revisions1 field changed
      • changedInput schema / properties / ruleset_id / description
        Previous value: -"The rule set UUID."New value: +"The rule set UUID (not its name — list_business_rulesets returns both)."
    • Changedlist_decision_flow_revisions1 field changed
      • changedInput schema / properties / decision_id / description
        Previous value: -"The decision flow UUID."New value: +"The decision flow UUID (not its name — list_decision_flows returns both)."
    • Addedlist_mas_modules
    • Removedlist_models_and_decisions
    • Changedlock_business_ruleset_revision1 field changed
      • changedInput schema / properties / ruleset_id / description
        Previous value: -"The rule set UUID."New value: +"The rule set UUID (not its name — list_business_rulesets returns both)."
    • Changedlock_decision_flow_revision1 field changed
      • changedInput schema / properties / decision_id / description
        Previous value: -"The decision flow UUID."New value: +"The decision flow UUID (not its name — list_decision_flows returns both)."
    • Changedpublish_decision_flow1 field changed
      • changedInput schema / properties / decision_id / description
        Previous value: -"The decision flow UUID."New value: +"The decision flow UUID (not its name — list_decision_flows returns both)."
    • Changedupdate_business_rule1 field changed
      • changedInput schema / properties / ruleset_id / description
        Previous value: -"The parent rule set UUID."New value: +"The parent rule set UUID (not its name — list_business_rulesets returns both)."
    • Changedupdate_business_ruleset1 field changed
      • changedInput schema / properties / ruleset_id / description
        Previous value: -"The existing rule set UUID."New value: +"The existing rule set UUID (not its name — list_business_rulesets returns both)."
    • Changedupdate_decision_flow1 field changed
      • changedInput schema / properties / decision_id / description
        Previous value: -"The existing decision flow UUID."New value: +"The existing decision flow UUID (not its name — list_decision_flows returns both)."
    • Changedupload_file12 fields changed
      • addedInput schema / properties / content / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • addedInput schema / properties / content / default
        Added value: +null
      • changedInput schema / properties / content / description
        Previous value: -"File content as a string."New value: +"File content as an inline string (small text files)."
      • removedInput schema / properties / content / type
        Removed value: -"string"
      • addedInput schema / properties / content_type / anyOf
        Added value: +[
        +  {
        +    "type": "string"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / content_type / default
        Previous value: -"text/plain"New value: +null
      • changedInput schema / properties / content_type / description
        Previous value: -"MIME type (default 'text/plain')."New value: +"MIME type. Defaults to ``text/plain`` for ``content``,\nelse guessed from ``file_name`` (``application/octet-stream``\nwhen unguessable)."
      • removedInput schema / properties / content_type / type
        Removed value: -"string"
      • addedInput schema / properties / file_path
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Path to a file the server reads directly from disk."
        +}
      • addedInput schema / properties / parent_folder_uri
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Target folder URI (``/folders/folders/{id}``);\nget one from list_files or the Folders service."
        +}
      • addedInput schema / properties / url
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "HTTP(S) URL the server fetches the file from."
        +}
      • changedInput schema / required
        Previous value: -[
        -  "file_name",
        -  "content"
        -]New value: +[
        +  "file_name"
        +]
  3. 23 tool updatesv1.5.0
    • Addedcreate_business_rule
    • Addedcreate_business_ruleset
    • Addedcreate_decision_flow
    • Addeddelete_business_rule
    • Addeddelete_business_ruleset
    • Addeddelete_decision_flow
    • Addedget_business_rule
    • Addedget_business_ruleset
    • Addedget_decision_flow
    • Addedget_decision_flow_code
    • Addedget_decision_flow_revision
    • Addedget_mas_module_step_signature
    • Addedlist_business_rules
    • Addedlist_business_ruleset_revisions
    • Addedlist_business_rulesets
    • Addedlist_decision_flow_revisions
    • Addedlist_decision_flows
    • Addedlock_business_ruleset_revision
    • Addedlock_decision_flow_revision
    • Addedpublish_decision_flow
    • Addedupdate_business_rule
    • Addedupdate_business_ruleset
    • Addedupdate_decision_flow
  4. 16 tool updatesv1.2.1
    • Addedcatalog_download_table_profile
    • Addedcatalog_find_instance
    • Addedcatalog_get_adhoc_analysis
    • Addedcatalog_get_agent_history
    • Addedcatalog_list_agents
    • Addedcatalog_run_adhoc_analysis
    • Addedcatalog_run_agent
    • Addedcatalog_search
    • Addedcatalog_search_helper
    • Addedexport_report
    • Removedget_report_image
    • Addedlist_publishing_destinations
    • Addedpublish_ml_champion_model
    • Addedregister_ml_champion_model
    • Changedupload_data7 fields changed
      • addedInput schema / properties / contains_header_row
        Added value: +{
        +  "default": true,
        +  "description": "Whether the first row holds column names — applies\nto csv/tsv/Excel (default True).",
        +  "type": "boolean"
        +}
      • removedInput schema / properties / csv_data
        Removed value: -{
        -  "description": "CSV-formatted data string (including header row).",
        -  "type": "string"
        -}
      • addedInput schema / properties / data_format
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Override format detection. One of csv, tsv, xls, xlsx,\nsas7bdat, sashdat (aliases: excel→xlsx, tab→tsv, sas→sas7bdat)."
        +}
      • addedInput schema / properties / file_path
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "Path to a data file the server reads directly from disk."
        +}
      • addedInput schema / properties / sheet_name
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "For Excel sources, the worksheet to import (first sheet by default)."
        +}
      • addedInput schema / properties / url
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "description": "HTTP(S) URL the server fetches the file from."
        +}
      • changedInput schema / required
        Previous value: -[
        -  "server_id",
        -  "caslib_name",
        -  "table_name",
        -  "csv_data"
        -]New value: +[
        +  "server_id",
        +  "caslib_name",
        +  "table_name"
        +]
    • Addedupload_inline_data
  5. 19 tool updatesv1.2.0
    • Changedcreate_ml_project5 fields changed
      • addedInput schema / properties / caslib_name
        Added value: +{
        +  "description": "Caslib containing the training table.",
        +  "type": "string"
        +}
      • removedInput schema / properties / data_table_uri
        Removed value: -{
        -  "description": "URI of the training data table (e.g. '/dataTables/dataSources/cas~fs~cas-shared-default~fs~Public/tables/HMEQ').",
        -  "type": "string"
        -}
      • addedInput schema / properties / server_id
        Added value: +{
        +  "default": "cas-shared-default",
        +  "description": "CAS server name or ID (default 'cas-shared-default').",
        +  "type": "string"
        +}
      • addedInput schema / properties / table_name
        Added value: +{
        +  "description": "Name of the (loaded, global) training table.",
        +  "type": "string"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "project_name",
        -  "data_table_uri",
        -  "target_variable"
        -]New value: +[
        +  "project_name",
        +  "caslib_name",
        +  "table_name",
        +  "target_variable"
        +]
    • Changedexecute_sas_code1 field changed
      • changedOutput schema / (root)
        Previous value: -nullNew value: +{
        +  "additionalProperties": {
        +    "type": "string"
        +  },
        +  "type": "object"
        +}
    • Changedget_castable_columns2 fields changed
      • addedOutput schema / properties / result / items / additionalProperties
        Added value: +true
      • addedOutput schema / properties / result / items / type
        Added value: +"object"
    • Changedlist_cas_servers2 fields changed
      • addedOutput schema / properties / result / items / additionalProperties
        Added value: +true
      • addedOutput schema / properties / result / items / type
        Added value: +"object"
    • Changedlist_caslibs2 fields changed
      • addedOutput schema / properties / result / items / additionalProperties
        Added value: +true
      • addedOutput schema / properties / result / items / type
        Added value: +"object"
    • Changedlist_castables2 fields changed
      • addedOutput schema / properties / result / items / additionalProperties
        Added value: +true
      • addedOutput schema / properties / result / items / type
        Added value: +"object"
    • Addedlist_compute_columns
    • Addedlist_compute_contexts
    • Addedlist_compute_libraries
    • Addedlist_compute_tables
    • Changedlist_files2 fields changed
      • addedOutput schema / properties / result / items / additionalProperties
        Added value: +true
      • addedOutput schema / properties / result / items / type
        Added value: +"object"
    • Changedlist_jobs2 fields changed
      • addedOutput schema / properties / result / items / additionalProperties
        Added value: +true
      • addedOutput schema / properties / result / items / type
        Added value: +"object"
    • Changedlist_ml_projects2 fields changed
      • addedOutput schema / properties / result / items / additionalProperties
        Added value: +true
      • addedOutput schema / properties / result / items / type
        Added value: +"object"
    • Changedlist_models_and_decisions2 fields changed
      • addedOutput schema / properties / result / items / additionalProperties
        Added value: +true
      • addedOutput schema / properties / result / items / type
        Added value: +"object"
    • Changedlist_registered_models2 fields changed
      • addedOutput schema / properties / result / items / additionalProperties
        Added value: +true
      • addedOutput schema / properties / result / items / type
        Added value: +"object"
    • Changedlist_reports2 fields changed
      • addedOutput schema / properties / result / items / additionalProperties
        Added value: +true
      • addedOutput schema / properties / result / items / type
        Added value: +"object"
    • Addedlist_source_tables
    • Changedpromote_table_to_memory1 field changed
      • changedInput schema / properties / table_name / description
        Previous value: -"Table to promote."New value: +"Table to load and promote."
    • Addedreset_compute_session
  6. 26 tool updatesv0.1.0
    • First observedcancel_job
    • First observedcreate_ml_project
    • First observeddownload_file
    • First observedexecute_sas_code
    • First observedget_castable_columns
    • First observedget_castable_data
    • First observedget_castable_info
    • First observedget_job_log
    • First observedget_job_status
    • First observedget_report
    • First observedget_report_image
    • First observedlist_cas_servers
    • First observedlist_caslibs
    • First observedlist_castables
    • First observedlist_files
    • First observedlist_jobs
    • First observedlist_ml_projects
    • First observedlist_models_and_decisions
    • First observedlist_registered_models
    • First observedlist_reports
    • First observedpromote_table_to_memory
    • First observedrun_ml_project
    • First observedscore_data
    • First observedsubmit_batch_job
    • First observedupload_data
    • First observedupload_file

TDQS

A3.6/5.0
Disambiguation5/5

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.

Naming Consistency5/5

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.

Tool Count2/5

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.

Completeness4/5

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

ActivityActive
ResponsivenessSlow

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

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Enables secure cloud-based execution of code across 14+ programming languages within a sandboxed environment. It supports file management, standard input/output handling, and automatic generation of visual artifacts like plots and charts.
    MIT
  • A
    license
    Not graded
    quality
    A
    maintenance
    Enables secure remote command execution and bidirectional file transfers on SSH servers through the Model Context Protocol. It features robust security controls including command whitelisting, credential isolation, and support for multiple SSH connection profiles.
    1,321
    830
    ISC

Latest Blog Posts

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