Skip to main content
Glama

smithsonian-mcp-server

List Valid Filter Terms

smithsonian_list_terms
Read-onlyIdempotent

Enumerate the valid term vocabulary for an indexed Smithsonian filter field (unit_code, culture, place, date, online_media_type, topic). Terms are a controlled vocabulary — often plural or qualified (e.g. "Paintings", not "Painting") — so guessed filter values tend to return nothing. Returns a page of the field's distinct term values; large vocabularies (topic has 133k terms, place 114k) page via start and rows. For unit_code, each code is returned with its museum name and contains matches the name as well as the code, so a museum name resolves to its code in one call.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
rowsNoNumber of terms to return per page (default 50, max 100).
fieldYesIndexed field to enumerate. Choices: unit_code (museum codes like "NASM"), culture (e.g. "Aztecs"), place (geographic terms), date (decade/era values like "1920s"), online_media_type (media formats like "Images", "3D Models"), topic (subject terms like "Quilts" — 133k terms, so pair it with contains).
startNoPagination offset (0-indexed). Use with rows to page through large vocabularies.
containsNoCase-insensitive substring filter on the term vocabulary — resolve a filter value (e.g. "greek") to its exact controlled-vocabulary term(s). For unit_code the substring also matches each code's museum name, so "National Air and Space" resolves to "NASM".

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
capNoThe rows cap that was applied.
errorNoPresent when the call failed. Absent on success.
fieldNoThe enumerated field, as provided in the request.
shownNoNumber of terms returned in this page.
termsNoThe field's distinct term values for this page, in the Smithsonian index's native order. No per-term object counts are available upstream.
totalNoTotal number of distinct terms for this field (the full vocabulary size; terms is one page of it).
labelsNoMuseum name for each unit_code on this page that has one — present only when field is "unit_code". A few rarely-indexed archive sub-unit codes have no mapped name and are absent from this map; their term is still returned in terms.
noticeNoGuidance naming the input that retrieves the terms this page omitted, or how to broaden a contains filter that matched nothing.
truncatedNoTrue when matching terms remain past this page. False on a terminal or past-the-end page, where nothing is being withheld.
truncationCeilingNoDistinct terms available for this query (the full vocabulary, or the contains-match count) — upper bound for omitted items.

Schema Changelog

Changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. Changed6 schema fields changed
    • changedInput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • addedInput schema / additionalProperties
      Added value: +false
    • changedOutput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • addedOutput schema / anyOf
      Added value: +[
      +  {
      +    "not": {
      +      "required": [
      +        "error"
      +      ]
      +    },
      +    "required": [
      +      "field",
      +      "terms",
      +      "total"
      +    ]
      +  },
      +  {
      +    "required": [
      +      "error"
      +    ]
      +  }
      +]
    • addedOutput schema / properties / error
      Added value: +{
      +  "additionalProperties": {},
      +  "description": "Present when the call failed. Absent on success.",
      +  "properties": {
      +    "code": {
      +      "description": "JSON-RPC error code for this failure.",
      +      "maximum": 9007199254740991,
      +      "minimum": -9007199254740991,
      +      "type": "integer"
      +    },
      +    "data": {
      +      "additionalProperties": {},
      +      "properties": {
      +        "reason": {
      +          "description": "Machine-readable failure mode. Declared by this tool: `no_terms`: The field returned no indexed terms. Other values are possible when a failure originates below the handler.",
      +          "examples": [
      +            "no_terms"
      +          ],
      +          "type": "string"
      +        },
      +        "recovery": {
      +          "additionalProperties": {},
      +          "description": "Actionable next step for the caller.",
      +          "properties": {
      +            "hint": {
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "hint"
      +          ],
      +          "type": "object"
      +        },
      +        "retryable": {
      +          "description": "Whether retrying may succeed.",
      +          "type": "boolean"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "message": {
      +      "description": "Human-readable description of what went wrong.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "code",
      +    "message"
      +  ],
      +  "type": "object"
      +}
    • removedOutput schema / required
      Removed value: -[
      -  "field",
      -  "terms",
      -  "total"
      -]
  2. Changed2 schema fields changed
    • changedInput schema / properties / field / description
      Previous value: -"Indexed field to enumerate. Choices: unit_code (museum codes like \"NASM\"), culture (e.g. \"Aztecs\"), place (geographic terms), date (decade/era values like \"1920s\"), online_media_type (media formats like \"Images\", \"3D Models\")."New value: +"Indexed field to enumerate. Choices: unit_code (museum codes like \"NASM\"), culture (e.g. \"Aztecs\"), place (geographic terms), date (decade/era values like \"1920s\"), online_media_type (media formats like \"Images\", \"3D Models\"), topic (subject terms like \"Quilts\" — 133k terms, so pair it with contains)."
    • changedInput schema / properties / field / enum
      Previous value: -[
      -  "unit_code",
      -  "culture",
      -  "place",
      -  "date",
      -  "online_media_type"
      -]New value: +[
      +  "unit_code",
      +  "culture",
      +  "place",
      +  "date",
      +  "online_media_type",
      +  "topic"
      +]
  3. Changed2 schema fields changed
    • changedInput schema / properties / contains / description
      Previous value: -"Case-insensitive substring filter on the term vocabulary — resolve a filter value (e.g. \"greek\") to its exact controlled-vocabulary term(s)."New value: +"Case-insensitive substring filter on the term vocabulary — resolve a filter value (e.g. \"greek\") to its exact controlled-vocabulary term(s). For unit_code the substring also matches each code's museum name, so \"National Air and Space\" resolves to \"NASM\"."
    • addedOutput schema / properties / labels
      Added value: +{
      +  "additionalProperties": {
      +    "type": "string"
      +  },
      +  "description": "Museum name for each unit_code on this page that has one — present only when field is \"unit_code\". A few rarely-indexed archive sub-unit codes have no mapped name and are absent from this map; their term is still returned in terms.",
      +  "propertyNames": {
      +    "type": "string"
      +  },
      +  "type": "object"
      +}
  4. Changed1 schema field changed
    • changedOutput schema / properties / terms / items / description
      Previous value: -"A term value — pass directly as the filter value in smithsonian_search or smithsonian_explore."New value: +"A term value — pass directly as the filter value in smithsonian_search_objects or smithsonian_browse_category."
  5. Changed2 schema fields changed
    • changedOutput schema / properties / notice / description
      Previous value: -"Guidance when a contains filter matched no terms — how to broaden or drop the filter."New value: +"Guidance naming the input that retrieves the terms this page omitted, or how to broaden a contains filter that matched nothing."
    • changedOutput schema / properties / truncated / description
      Previous value: -"True when the term list was capped by the rows parameter."New value: +"True when matching terms remain past this page. False on a terminal or past-the-end page, where nothing is being withheld."
  6. Changed3 schema fields changed
    • addedInput schema / properties / contains
      Added value: +{
      +  "description": "Case-insensitive substring filter on the term vocabulary — resolve a filter value (e.g. \"greek\") to its exact controlled-vocabulary term(s).",
      +  "type": "string"
      +}
    • addedOutput schema / properties / notice
      Added value: +{
      +  "description": "Guidance when a contains filter matched no terms — how to broaden or drop the filter.",
      +  "type": "string"
      +}
    • changedOutput schema / properties / truncationCeiling / description
      Previous value: -"Total distinct terms for the field (upper bound for omitted items)."New value: +"Distinct terms available for this query (the full vocabulary, or the contains-match count) — upper bound for omitted items."
  7. Changed10 schema fields changed
    • changedInput schema / properties / field / description
      Previous value: -"Indexed field to enumerate. Common choices: unit_code (museum codes like \"NASM\"), object_type (artifact categories like \"Aircraft\"), culture (e.g. \"Aztec\"), place (geographic terms), date (decade values like \"1920s\")."New value: +"Indexed field to enumerate. Choices: unit_code (museum codes like \"NASM\"), culture (e.g. \"Aztecs\"), place (geographic terms), date (decade/era values like \"1920s\"), online_media_type (media formats like \"Images\", \"3D Models\")."
    • changedInput schema / properties / field / enum
      Previous value: -[
      -  "unit_code",
      -  "object_type",
      -  "culture",
      -  "place",
      -  "date",
      -  "media_usage",
      -  "online_media_type"
      -]New value: +[
      +  "unit_code",
      +  "culture",
      +  "place",
      +  "date",
      +  "online_media_type"
      +]
    • changedOutput schema / properties / terms / description
      Previous value: -"Valid term vocabulary for the field, sorted by count descending."New value: +"The field's distinct term values for this page, in the Smithsonian index's native order. No per-term object counts are available upstream."
    • removedOutput schema / properties / terms / items / additionalProperties
      Removed value: -false
    • changedOutput schema / properties / terms / items / description
      Previous value: -"A single term entry with its object count."New value: +"A term value — pass directly as the filter value in smithsonian_search or smithsonian_explore."
    • removedOutput schema / properties / terms / items / properties
      Removed value: -{
      -  "count": {
      -    "description": "Number of Smithsonian objects indexed under this term.",
      -    "type": "number"
      -  },
      -  "value": {
      -    "description": "Term string — pass directly as the filter value in smithsonian_search or smithsonian_explore.",
      -    "type": "string"
      -  }
      -}
    • removedOutput schema / properties / terms / items / required
      Removed value: -[
      -  "value",
      -  "count"
      -]
    • changedOutput schema / properties / terms / items / type
      Previous value: -"object"New value: +"string"
    • changedOutput schema / properties / total / description
      Previous value: -"Total number of distinct terms for this field in the Smithsonian index."New value: +"Total number of distinct terms for this field (the full vocabulary size; terms is one page of it)."
    • changedOutput schema / required
      Previous value: -[
      -  "field",
      -  "terms",
      -  "total",
      -  "truncated",
      -  "shown",
      -  "cap"
      -]New value: +[
      +  "field",
      +  "terms",
      +  "total"
      +]
  8. Changed5 schema fields changed
    • addedOutput schema / properties / cap
      Added value: +{
      +  "description": "The rows cap that was applied.",
      +  "type": "number"
      +}
    • addedOutput schema / properties / shown
      Added value: +{
      +  "description": "Number of terms returned in this page.",
      +  "type": "number"
      +}
    • addedOutput schema / properties / truncated
      Added value: +{
      +  "description": "True when the term list was capped by the rows parameter.",
      +  "type": "boolean"
      +}
    • addedOutput schema / properties / truncationCeiling
      Added value: +{
      +  "description": "Total distinct terms for the field (upper bound for omitted items).",
      +  "type": "number"
      +}
    • changedOutput schema / required
      Previous value: -[
      -  "field",
      -  "terms",
      -  "total"
      -]New value: +[
      +  "field",
      +  "terms",
      +  "total",
      +  "truncated",
      +  "shown",
      +  "cap"
      +]
  9. Added

TDQS

A4.3/5.0
Behavior4/5

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

Annotations already declare readOnlyHint, openWorldHint, and idempotentHint, so the description is not burdened with the basic safety profile. It adds valuable behavioral details: pagination through large vocabularies (topic 133k, place 114k), and the special unit_code behavior (returning museum names and matching on them). This goes beyond the schema and annotations, giving the agent a realistic expectation of output and quirks.

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 detailed but every sentence contributes. The purpose is front-loaded, and the vocabulary-size caveat is strategically placed. While it runs longer than typical, the complexity of the tool (multiple fields, pagination, contains behavior) justifies the length. No filler or 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?

Given the tool's complexity and that an output schema exists (so return format is covered), the description is thorough. It explains the controlled-vocabulary caveat, pagination needs, and the special unit_code behavior. One minor gap: it does not mention whether results are sorted or whether there are any rate limits, but these are not critical for correct invocation. Overall, complete enough for an agent to use effectively.

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. The description enriches the parameters with concrete examples for each field enum (e.g., unit_code 'NASM', topic 'Quilts'), explains the 'contains' parameter's substring behavior including case-insensitivity and unit_code name matching, and clarifies pagination with start/rows. This adds practical value beyond the schema's bare definitions.

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 'Enumerate' and the resource 'valid term vocabulary for an indexed Smithsonian filter field', listing the specific fields. This unambiguously distinguishes it from the sibling tools like search_objects or browse_category, which handle different operations. The purpose is specific and actionable.

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 why this tool is needed (controlled vocabulary means guessed filters often fail) and implies when to use it (before constructing filter queries). It does not explicitly name alternatives or exclusion conditions, but the context is clear enough that an agent would know to use this to resolve valid filter values. Slight deduction for not explicitly contrasting with siblings.

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

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

TDQS

A4.6/5.0
Disambiguation5/5

Each tool has a clearly distinct role: browsing an exact category, searching free-text, retrieving object metadata, fetching media, listing vocabulary, and finding related objects. Overlaps like browse_category vs search_objects are well-explained with explicit guidance on when to use each, eliminating ambiguity.

Naming Consistency5/5

All tools follow the same pattern: 'smithsonian_' prefix with lowercase snake_case verb_noun names (e.g., browse_category, get_media, list_terms). The naming is perfectly uniform and intuitive.

Tool Count5/5

Six tools cover the full spectrum of Smithsonian discovery and retrieval without bloat. Each tool addresses a distinct need, and the count is well-scoped for a read-only museum API.

Completeness5/5

The surface covers search, exact-category browsing, term vocabulary enumeration, object metadata retrieval, media access, and related-object discovery. There are no obvious dead ends—record IDs flow from search to other tools, and gaps like non-CC0 media are explicitly handled.