Skip to main content
Glama
sassoftware

SAS MCP Server

Official
by sassoftware

Import Glossary Terms

import_glossary_terms
Destructive

Create many business terms and their hierarchy in one call, resolving parents by name and validating before import. Reports per-row success or failure.

Instructions

Create many business terms, and their hierarchy, in one call.

Building a hierarchy one term at a time means a call per term and a wait between levels, because a child needs the parent's id from the previous response. This uses the glossary's own bulk import instead: one request for the whole tree, with parents resolved by name rather than by id, so nothing has to be threaded through.

Give each row a name and, for a child, a parent — the name of another row in the same batch, or the path of a term that already exists (levels separated by a backslash). Rows may be given in any order; they are sorted so every parent is created before its children.

Attribute values take the same forms as create_glossary_termTrue/False for a boolean, a list for a multi-select — and are validated here, per term type, before anything is sent. So are the term type's required attributes: a row missing one fails inside the job with a message naming only the field, so the batch is refused here instead, before any of it is committed.

The import runs as a job and reports rows individually. A row can fail while the rest succeed, so the result carries created, failed and a failures list naming each bad row and why. Treat a non-empty failures as a partial import: the successful rows are already committed.

The result names the term each row became. terms carries {name, path, term_id, existed} per row, so the next step — assigning an asset, re-parenting, reading one back — needs no lookup. This costs one filtered request per 40 distinct names, not one per term.

Two things the import does that a per-term create does not:

  • A row is written whole. With update_existing the term at that path is replaced, so an attribute the row omits is reset — not left as it was. Without it the existing term is left alone. Either way the job counts the row as successful, so created counts rows the job accepted; new is the count of terms that did not exist before, with already_existed the rest and existed saying which is which per row.

  • Omitted attributes take the term type's default, on new rows as well as replaced ones — the same as creating a term through the API.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
termsYesThe rows to create. Each is ``{"name": ..., "parent": ..., "definition": ..., "description": ..., "attributes": {...}}``; ``term_type`` may be given per row to mix types in one batch.
dry_runNoValidate and show what *would* be imported without importing anything: the rows in the order they would be sent, each with its resolved parent path and encoded attributes. Use it to let the person confirm a batch first — in a client that renders interactive views the preview appears as a table with an Import button; elsewhere, call again with ``dry_run=false`` once they agree.
term_typeNoThe term type for rows that do not name one.
timeout_secondsNoHow long to wait for the import job (default 600).
update_existingNoReplace a term that already exists at the same path (default false, which leaves it untouched).

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault

No arguments

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changedv1.15.0
    • addedInput schema / properties / dry_run
      Added value: +{
      +  "default": false,
      +  "description": "Validate and show what *would* be imported without\nimporting anything: the rows in the order they would be sent,\neach with its resolved parent path and encoded attributes.\nUse it to let the person confirm a batch first — in a client\nthat renders interactive views the preview appears as a table\nwith an Import button; elsewhere, call again with\n``dry_run=false`` once they agree.",
      +  "type": "boolean"
      +}
  2. Addedv1.14.0

TDQS

A5/5.0
Behavior5/5

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

The description goes far beyond the annotations, disclosing job-based execution, per-row successes and failures, partial-commit semantics, whole-row replacement with update_existing, attribute reset behavior, and defaults for omitted attributes. This is consistent with destructiveHint=true and adds substantial practical context.

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

Conciseness5/5

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

The description is long but every sentence earns its place, with clear section breaks, bolded key behaviors, and a bulleted list for edge cases. It front-loads the core purpose and then systematically covers execution, results, and update semantics without repetition.

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

Completeness5/5

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

Given the tool's complexity, the description covers the full call flow: parent resolution, ordering, validation, job execution, partial failures, result fields, update behavior, and defaults. The output schema exists to enumerate return shapes, and the description complements it with the semantic details an agent needs to invoke and interpret results correctly.

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

Parameters5/5

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

Even though the schema has 100% coverage, the description enriches parameters meaningfully: parent resolution by name, attribute value forms, per-row term_type overrides, dry_run preview behavior, and update_existing replacement semantics. It clearly explains how the terms array and update_existing behave, which the schema alone would not fully convey.

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

Purpose5/5

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

The opening line 'Create many business terms, and their hierarchy, in one call' states a specific verb, resource, and scope. The description immediately contrasts this with per-term creation via create_glossary_term, making the tool's distinct purpose unmistakable.

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

Usage Guidelines5/5

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

It explicitly explains when to prefer this tool: when building a hierarchy requires multiple calls and waiting for parent IDs. It also describes the alternative workflow and gives concrete guidance for using dry_run to confirm a batch before committing.

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

Deploy Server

Other Tools