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.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "field": "<field>"
    },
    "name": "smithsonian_list_terms"
  }
}

Input Schema

NameRequiredDescriptionDefault
rowsNoNumber of terms to return per page (default 50). A value above 40000 is served at 40000 with a notice.
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

NameRequiredDescriptionDefault
capNoThe page size served: rows as requested, or its cap when rows exceeded it.
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. Opens with the page size served when rows exceeded its cap.
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.

  1. Changed5 schema fields changed
    • changedInput schema / properties / rows / description
      Previous value: -"Number of terms to return per page (default 50, max 100)."New value: +"Number of terms to return per page (default 50). A value above 40000 is served at 40000 with a notice."
    • removedInput schema / properties / rows / maximum
      Removed value: -100
    • addedInput schema / properties / rows / multipleOf
      Added value: +1
    • changedOutput schema / properties / cap / description
      Previous value: -"The rows cap that was applied."New value: +"The page size served: rows as requested, or its cap when rows exceeded it."
    • changedOutput schema / properties / notice / description
      Previous value: -"Guidance naming the input that retrieves the terms this page omitted, or how to broaden a contains filter that matched nothing."New value: +"Guidance naming the input that retrieves the terms this page omitted, or how to broaden a contains filter that matched nothing. Opens with the page size served when rows exceeded its cap."
  2. Changed1 schema field changed
    • changedOutput schema / properties / terms / items / description
      Previous value: -"A term value — pass directly as the filter value in smithsonian_search_objects or smithsonian_browse_category."New value: +"A term value for the corresponding smithsonian_search_objects filter. online_media_type values feed search only; browse_category supports museum (unit_code), culture, period (date), medium (object_type), and topic, with no media-type or place mode."
  3. 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"
      -]
  4. 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"
      +]
  5. 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"
      +}
  6. 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."
  7. 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."
  8. 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."
  9. 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"
      +]
  10. 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"
      +]
  11. Added

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already establish read-only, idempotent, open-world reads. Beyond those, the description discloses paging behavior, the practical 40k cap notice, and the non-obvious unit_code side effect where contains also matches museum names and each code is returned with its name. That last point is genuinely useful behavior not inferable from 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?

Four tight sentences, front-loaded with what is enumerated and the failure mode it prevents, then field-specific and paging notes. Slightly dense but every sentence contributes; nothing is padded.

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?

An output schema exists, so return-value explanation is unnecessary. The description covers the controlled-vocabulary gotcha, field scope, pagination, and the unit_code name-resolution behavior — everything an agent needs to call this correctly and interpret results.

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 all four parameters are already documented, including the enum choices and the contains substring semantics. The description reinforces the plural/qualified vocabulary quirk and paging pattern but adds little syntactic detail beyond what the schema states, so the baseline 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?

States a specific verb+resource: 'Enumerate the valid term vocabulary for an indexed Smithsonian filter field', and names all six fields. An agent can distinguish this from smithsonian_search_objects at a glance — this resolves vocabulary, that searches records.

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?

Gives a clear motivating condition ('guessed filter values tend to return nothing') and practical routing within the tool (pair topic with contains; page large vocabularies via start/rows; use unit_code to resolve a museum name to a code). It does not explicitly name smithsonian_search_objects as the downstream consumer, leaving the workflow link to inference.

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.