Atlas / MCP servers / sassoftware / SAS

SASBLOCK

mcp/sassoftware/sas

A self-hosted Model Context Protocol (MCP) server that connects to your SAS Viya environment and provides tools across the analytics lifecycle.

Verdict
BLOCK
Grade
D
Trust score
61 /100
Exposed tools
93 56r · 28w · 9d
Transport
stdio · streamable-http
License
Apache-2.0
Stars
64
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

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

Features

  • 92 tools across 10 selectable tiers, spanning the Analytics Life Cycle on SAS Viya
  • Interactive views (MCP Apps) for data, SAS logs and glossary editing in clients that render them — Claude, ChatGPT, Microsoft 365 Copilot, VS Code, Cursor
  • Prompt Templates for improving your SAS Code
  • OAuth2 authentication with PKCE flow
  • HTTP-based MCP server compatible with MCP clients

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:

Read from source at commit ebc75b95cb95OBSERVED · 2026-10-09
Advertisement
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control. Replace the environment placeholders with a token scoped to the least it needs.

claude-code (oci)
claude mcp add sas-mcp-server:1.9.1 -- docker run -i --rm ghcr.io/sassoftware/sas-mcp-server:1.9.1:None app-stdio
03

Exposed tools (93)

56 read · 28 write · 9 destructive. Blast radius: 9 tools can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.

ToolRiskDescription
apply_report_operationswriteApply an ordered batch of operations to a report — the authoring workhorse.
assign_glossary_termreadAssign a business term to a table column — the step that makes a term govern data.
cancel_jobreadCancel a running job.
catalog_download_table_profilereadDownload a catalog table
catalog_find_instancereadResolve the catalog instance for a source-asset URI.
catalog_get_adhoc_analysisreadGet the status of an ad-hoc analysis job, and whether its profile is ready.
catalog_get_agent_historyreadGet the execution history of a catalog agent
catalog_list_agentsreadList SAS Data Governance discovery agents.
catalog_run_adhoc_analysiswriteSubmit an ad-hoc analysis (profiling) job for a table in the catalog.
catalog_run_agentwriteStart a catalog discovery agent run (asynchronous).
catalog_searchreadSearch the SAS Data Governance catalog for assets (tables, columns, reports, ...).
catalog_search_helperreadDiscover how to search the catalog: list facets, or values for one facet.
copy_reportreadCopy a Visual Analytics report to a new report, returning the copy
create_business_rulewriteCreate a new rule inside an existing SAS Business Rules rule set.
create_business_rulesetwriteCreate a new SAS Business Rules rule set.
create_decision_flowwriteCreate a new SAS Intelligent Decisioning flow chaining rule set steps.
create_glossary_termwriteCreate a business term in the SAS Business Glossary.
create_glossary_term_typewriteCreate a term type — the template that fixes what a term must carry.
create_ml_projectwriteCreate a new AutoML pipeline automation project from a CAS table.
create_reportwriteCreate a Visual Analytics report and return its id for further edits.
delete_business_ruledestructivePermanently delete a rule from a SAS Business Rules rule set.
delete_business_rulesetdestructivePermanently delete a SAS Business Rules rule set.
delete_decision_flowdestructivePermanently delete a SAS Intelligent Decisioning flow.
delete_glossary_termdestructivePermanently delete a business term.
delete_glossary_term_typedestructiveDelete a term type.
delete_reportdestructiveDelete a Visual Analytics report and its content.
describe_report_objectsreadDiscover what a Visual Analytics report can contain — operations and objects.
download_filereadDownload file content from the Viya Files Service.
echoreadbox[
execute_sas_codewrite
export_reportreadExport a Visual Analytics report (or specific report objects) in any
get_business_rulereadFetch a single rule
get_business_rulesetwriteFetch a single SAS Business Rules rule set by ID.
get_castable_columnsreadGet column metadata for a CAS table (names, types, labels, formats).
get_castable_datareadFetch rows from a CAS table with column names.
get_castable_inforeadGet metadata for a CAS table (row count, column count, size, etc.).
get_compute_table_datareadFetch rows from a table in a SAS library, with column names.
get_decision_flowreadFetch the current state of a SAS Intelligent Decisioning flow.
get_decision_flow_codereadRetrieve the generated DS2 execution code for a decision flow.
get_decision_flow_revisionreadFetch the content of a specific locked decision revision.
get_glossary_termreadGet one business term in full, with its custom attributes named rather than hashed.
get_glossary_term_typereadGet a term type and the attribute contract its terms must satisfy.
get_job_logreadRetrieve the log of a completed job.
get_job_statusreadCheck the status of a submitted job.
get_mas_module_step_signaturereadFetch a MAS module step
get_reportreadGet a Visual Analytics report
get_report_outlinereadRead a report
import_glossary_termswriteCreate many business terms, and their hierarchy, in one call.
list_business_ruleswriteList all rules inside a SAS Business Rules rule set.
list_business_ruleset_revisionswriteList all locked revisions of a rule set.
list_business_rulesetsreadList SAS Business Rules rule sets, optionally filtered by name substring.
list_cas_serversreadList available CAS servers on the Viya environment.
list_caslibsreadList CAS libraries (caslibs) available on a CAS server.
list_castablesreadList tables in a CAS library.
list_compute_columnsreadList the columns of a table in a SAS library within a compute context.
list_compute_contextsreadList available compute contexts on the Viya environment.
list_compute_librariesreadList the SAS libraries (librefs) assigned in a compute context.
list_compute_tablesreadList the tables in a SAS library within a compute context.
list_decision_flow_revisionsreadList all locked revisions of a decision flow.
list_decision_flowsreadList SAS Intelligent Decisioning flows, optionally filtered by name substring.
list_filesreadList files in the Viya Files Service.
list_glossary_term_typesreadList the term types defined in the SAS Business Glossary.
list_glossary_termsreadList glossary terms by structure — term type, parent, or name fragment.
list_jobsreadList recent jobs from the Job Execution service.
list_mas_modulesreadList published scoring models and decisions (MAS modules).
list_ml_projectsreadList AutoML pipeline automation projects.
list_publishing_destinationsreadList available publishing destinations.
list_registered_modelsreadList models in the Model Repository.
list_reportsreadList Visual Analytics reports.
list_source_tablesreadList source tables that are NOT yet loaded into memory in a CAS library.
list_table_termsreadList the business terms assigned to a table
list_term_assetsreadList the data assets a business term is attached to — the columns that mean it.
lock_business_ruleset_revisionwriteLock the current state of a rule set as an immutable revision.
lock_decision_flow_revisionreadLock the current state of a decision flow as an immutable revision.
promote_table_to_memoryreadLoad a source table into CAS memory at global scope (visible to all sessions).
publish_decision_flowwritePublish a locked decision revision to a Micro Analytic Score (MAS) destination.
publish_ml_champion_modelwritePublish the champion model from an AutoML pipeline automation project to the Model Repository.
query_datawriteRun a FedSQL SELECT against CAS or compute data and return the rows.
register_ml_champion_modelreadRegister the champion model from an AutoML pipeline automation project to the Model Repository.
reset_compute_sessiondestructiveReset (delete) the cached compute session for a compute context.
run_ml_projectwriteRun an AutoML pipeline automation project.
score_datareadScore data against a published model or decision (MAS module).
search_glossary_termsreadFree-text search of the business glossary — the way in when you know a word, not an id.
submit_batch_jobwriteSubmit a SAS job for asynchronous execution via the Job Execution service.
unassign_glossary_termdestructiveRemove a business term
update_business_rulewriteUpdate an existing rule inside a SAS Business Rules rule set.
update_business_rulesetwriteUpdate an existing SAS Business Rules rule set
update_decision_flowwriteUpdate an existing SAS Intelligent Decisioning flow.
update_glossary_termwriteUpdate a business term
update_glossary_term_typedestructiveChange a term type: rename it, or add, edit and remove its attributes.
upload_datawriteUpload a data file into a CAS table — read **by the server**, not the model.
upload_filewriteUpload a file to the Viya Files Service, optionally into a Content folder.
upload_inline_datawriteCreate a small CAS table from inline delimited text passed as a string.
04

Trust audit

BLOCKgrade D · trust 61/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfaceWARN
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (2 observation(s))
Network
declared (4 observation(s))
Shell
declared (1 observation(s))
Dependencies
pinned
Secrets in source
found

Findings (25)

CRITICALObfuscation / stealth · obf.decode_then_exec · CWE-506, CWE-94
src/sas_mcp_server/ui/vendor/ext-apps.js:4
atob( ... new Function(
Why it matters. decodes a payload and executes it
HIGHNetwork egress · net.tls_off · CWE-200, CWE-319
deploy/k8s/sas-mcp-server-contour.yaml:61
# Self-signed Viya certificate (matches SSL_VERIFY=false in the local .env).
Why it matters. certificate verification is disabled
Fix. leave verification on
HIGHNetwork egress · net.tls_off · CWE-200, CWE-319
deploy/k8s/sas-mcp-server.yaml:42
# Self-signed Viya certificate (matches SSL_VERIFY=false in the local .env).
Why it matters. certificate verification is disabled
Fix. leave verification on
HIGHNetwork egress · net.tls_off · CWE-200, CWE-319
src/sas_mcp_server/auth_login.py:195
"--insecure",
Why it matters. certificate verification is disabled
Fix. leave verification on
HIGHNetwork egress · net.tls_off · CWE-200, CWE-319
src/sas_mcp_server/ssl_patch.py:87
"SSL_VERIFY=false: TLS certificate verification is DISABLED for %s. "
Why it matters. certificate verification is disabled
Fix. leave verification on
MEDIUMCode injection · code.dynamic_import · CWE-78, CWE-94, CWE-95
src/sas_mcp_server/ssl_patch.py:74
module = importlib.import_module(module_name)
MEDIUMInformation disclosure · disclose.log_secret · CWE-209, CWE-532
src/sas_mcp_server/viya_utils.py:476
logger.info("Running snippet (token length: %d)", len(token))
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
tests/conftest.py:143
mock_info.token = "mock-viya-access-token"
MEDIUMFilesystem / path · mcp.destructive_tools · CWE-22, CWE-59
delete_business_rule, delete_business_ruleset, delete_decision_flow, delete_glossary_term, delete_glossary_term_type, delete_report, reset_compute_session, unassign_glossary_term, update_glossary_term
Why it matters. 9 tool(s) can delete or overwrite
Fix. prefer a read-only mode or scoped tokens; the page states the blast radius
LOWInventory / provenance · inv.hidden_file · CWE-1104
.env.sample
.env.sample
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInventory / provenance · inv.hidden_file · CWE-1104
deploy/helm/sas-mcp-server/.helmignore
.helmignore
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWInsecure crypto · crypto.weak_hash · CWE-327, CWE-338
src/sas_mcp_server/ui/__init__.py:147
digest = hashlib.sha1()
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
CHANGELOG.md:60
- **Signing in from GitHub Copilot CLI failed before Viya was ever contacted.** (#58) The callback was refused with `Redirect URI 'http://127.0.0.1:52505/' does not match CIMD redirect_uris`. An MCP c
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
TROUBLESHOOTING.md:82
'mcpserver-http://127.0.0.1:8134%',
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
TROUBLESHOOTING.md:84
'http://127.0.0.1:8134%-mcpserver-usages',
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
tests/test_config_oauth.py:125
redirect_uris=[AnyUrl("http://127.0.0.1:8080/")],
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
tests/test_config_oauth.py:134
assert stored.validate_redirect_uri(AnyUrl("http://127.0.0.1:52505/"))
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
src/sas_mcp_server/ui/vendor/ext-apps.js:7
`))}}var Ct;var et=S(()=>{Ct={major:4,minor:3,patch:5}});function Dg(r){if(r==="")return!0;if(r.length%4!==0)return!1;try{return atob(r),!0}catch{return!1}}function $_(r){if(!Fv.test(r))return!1;let i
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
tests/test_integration.py:38
return len(base64.b64decode(block.resource.blob))
LOWObfuscation / stealth · obf.decode_call · CWE-506, CWE-94
tests/test_integration.py:633
assert len(base64.b64decode(png.content[0].data)) > 0
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
CHANGELOG.md:6
- **The server log names the SAS Viya user behind every tool call.** (#65) A shared HTTP deployment serves many people through one process, and its log said which tool ran but not for whom, so a field
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
CHANGELOG.md:167
- **Opening the MCP endpoint in a browser now shows a landing page instead of a bare `401`** (#46). A person handed `https://<host>/mcp` and curious enough to paste it into a browser used to get FastM
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
CHANGELOG.md:172
- **The server-side upload sources are no longer unbounded — `MAX_UPLOAD_BYTES`, default 100 MiB** (#44, lint follow-up #45). `upload_data` and `upload_file` with `file_path`/`url` buffer the entire s
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
CHANGELOG.md:204
- **Kubernetes deployment artifacts** (#41) — a sample manifest (`deploy/k8s/sas-mcp-server.yaml`) and a Helm chart (`deploy/helm/sas-mcp-server/`) that serve the MCP endpoint at `https://<viya-host>/
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine
LOWPrompt injection · prompt.transfer_instruction · CWE-94, CWE-1427
CHANGELOG.md:205
- **Hardened for a shared endpoint:** `ALLOW_LOCAL_FILE_UPLOAD=false` (the application defaults it *on*, and in a container the `file_path` upload source can only read the pod's own filesystem — inclu
Why it matters. an instruction to move sensitive data to an outside destination
Fix. remove; a skill never needs the user's secrets off the machine

Gates applied: critical_finding, no_behavioural_pass.

Audited 2026-10-09 · audit v0.4.1 · source sha ebc75b95cb95full audit observations/trust-audit/mcp-server/sassoftware__sas.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-09ebc75b95cb95BLOCKD61first audit
06

Questions

What is the SAS MCP server?

A self-hosted Model Context Protocol (MCP) server that connects to your SAS Viya environment and provides tools across the analytics lifecycle.

What tools does SAS expose?

93 in total: 56 read-only, 28 that write, and 9 that can delete or overwrite (delete_business_rule, delete_business_ruleset, delete_decision_flow, delete_glossary_term, delete_glossary_term_type). Every one is listed on this page with its risk.

Is SAS safe to connect to an agent?

No — not without reading the findings first. The audit graded it D (61/100) and found 5 critical or high issues in the source. Each one is listed on this page with the file and line it is on. Separately from the audit: 9 of its tools can destroy data, so scope the token you give it to what you actually need.

What credentials does SAS need?

It reads AUTH_HELPER_CLIENT_ID, MCP_SIGNING_KEY and VIYA_PASSWORD from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How does SAS run?

It speaks stdio and streamable-http, so it runs as a local process your client starts. It is published on PyPI as sas-mcp-server.

How current is this page?

The grade is for one exact copy of the source (ebc75b95cb95), read on 2026-10-09. The repository is watched and re-audited when it changes.

Advertisement