Skip to main content
Glama

smithsonian-mcp-server

Browse Smithsonian by Category

smithsonian_browse_category
Read-onlyIdempotent

Browse Smithsonian objects within one exact category — a single museum (mode "museum"), culture, indexed date term (mode "period"), object type (mode "medium"), or subject term (mode "topic"). The value must be an exact indexed category term, not free text: resolve museum, culture, period, and topic vocabulary with smithsonian_list_terms first (object_type is not enumerable there — harvest it from smithsonian_search_objects results, and treat each casing as its own category, since a harvested object_type covers only the casing it was written in). Returns the category total count, a page of matching objects, and a museum breakdown of that page; page the full category with start and rows. For open-ended or topic discovery, start with smithsonian_search_objects instead.

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": {
      "mode": "<mode>",
      "value": "<value>"
    },
    "name": "smithsonian_browse_category"
  }
}

Input Schema

NameRequiredDescriptionDefault
modeYesBrowse dimension: "museum" (by unit code), "culture" (by culture term), "period" (by indexed date term like "1940s" or "500-1500"), "medium" (by object type like "Paintings"), "topic" (by subject term like "Quilts").
rowsNoNumber of sample objects to return (default 10). A value above 1000 is served at 1000 with a notice.
startNoPagination offset — 0-indexed. Page contiguously by advancing start by the number of objects returned; a truncated page names the next start in its notice.
valueYesCategory value appropriate to the mode. museum: a unit code like "NASM", "SAAM", or "NMNHBIRDS", matched literally and case-sensitively — not a museum name. culture: term, often plural or qualified ("Aztecs", "Plains Indian"). period: an indexed date term — commonly a decade ("1940s", "1860s"), but year ranges ("500-1500"), century terms ("21st century"), and BCE forms ("-2500", "BCE 1000s") are indexed too. medium: object type, usually plural ("Paintings", "Aircraft"). topic: subject term ("Quilts", "Aviation"). Smithsonian uses a controlled vocabulary — for museum (unit_code), culture, period (date), and topic, call smithsonian_list_terms to find exact terms; medium (object_type) is not enumerable there, so harvest it from smithsonian_search_objects results. Every mode matches its value exactly and case-sensitively, and for medium that split is load-bearing: casing variants are indexed as SEPARATE categories, each reporting its own total_count ("button" and "Button" are different categories, and neither casing is reliably the larger), so browse the variants of a harvested value rather than assuming one covers the concept.

Output Schema

NameRequiredDescriptionDefault
capNoThe page size served: rows as requested, or its cap when rows exceeded it.
modeNoBrowse dimension used for this request (one of "museum", "culture", "period", "medium", "topic").
errorNoPresent when the call failed. Absent on success.
shownNoNumber of sample objects returned.
valueNoCategory value queried, as provided in the request.
noticeNoGuidance naming the input that retrieves the objects this page omitted. Opens with the page size served when rows exceeded its cap.
sourcesNoWhere this answer came from. A page served from oa_mirror lists its rows in mirror order, not the live API's, and its notice names the snapshot date. Present only on a server that keeps a mirror.
truncatedNoTrue when matching objects remain past this page. False on a terminal or past-the-end page, where nothing is being withheld.
total_countNoTotal number of Smithsonian objects matching this category.
sample_objectsNoThe requested page of objects matching the category, in upstream order, or in mirror order when sources names oa_mirror. Empty when start is past the end of the category.
mirror_snapshotNoPublication time (ISO 8601) of the Open Access snapshot the mirror held; what came from oa_mirror reflects the catalog as of then. Present when part of this answer came from oa_mirror.
museum_breakdownNoWhen mode is not "museum": top contributing museums from the sample, helping plan museum-focused follow-up searches.
truncationCeilingNoTotal matching objects (upper bound for omitted items).

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed9 schema fields changed
    • changedInput schema / properties / rows / description
      Previous value: -"Number of sample objects to return (default 10, max 50)."New value: +"Number of sample objects to return (default 10). A value above 1000 is served at 1000 with a notice."
    • removedInput schema / properties / rows / maximum
      Removed value: -50
    • addedInput schema / properties / rows / multipleOf
      Added value: +1
    • changedInput schema / properties / start / description
      Previous value: -"Pagination offset — 0-indexed. Page contiguously with start = page × rows."New value: +"Pagination offset — 0-indexed. Page contiguously by advancing start by the number of objects returned; a truncated page names the next start in its notice."
    • 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."
    • addedOutput schema / properties / mirror_snapshot
      Added value: +{
      +  "description": "Publication time (ISO 8601) of the Open Access snapshot the mirror held; what came from oa_mirror reflects the catalog as of then. Present when part of this answer came from oa_mirror.",
      +  "type": "string"
      +}
    • changedOutput schema / properties / notice / description
      Previous value: -"Guidance naming the input that retrieves the objects this page omitted."New value: +"Guidance naming the input that retrieves the objects this page omitted. Opens with the page size served when rows exceeded its cap."
    • changedOutput schema / properties / sample_objects / description
      Previous value: -"The requested page of objects matching the category, in upstream order. Empty when start is past the end of the category."New value: +"The requested page of objects matching the category, in upstream order, or in mirror order when sources names oa_mirror. Empty when start is past the end of the category."
    • addedOutput schema / properties / sources
      Added value: +{
      +  "description": "Where this answer came from. A page served from oa_mirror lists its rows in mirror order, not the live API's, and its notice names the snapshot date. Present only on a server that keeps a mirror.",
      +  "items": {
      +    "description": "oa_mirror: the server's local copy of the Smithsonian Open Access bulk metadata. edan_api: the live Smithsonian API.",
      +    "enum": [
      +      "oa_mirror",
      +      "edan_api"
      +    ],
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
  2. 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": [
      +      "mode",
      +      "value",
      +      "total_count",
      +      "sample_objects",
      +      "museum_breakdown"
      +    ]
      +  },
      +  {
      +    "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: `invalid_category`: The category value matched no objects — a browse category is an exact indexed facet, so a zero match means the value did not resolve to retrievable objects. Other values are possible when a failure originates below the handler.",
      +          "examples": [
      +            "invalid_category"
      +          ],
      +          "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: -[
      -  "mode",
      -  "value",
      -  "total_count",
      -  "sample_objects",
      -  "museum_breakdown"
      -]
  3. Changed1 schema field changed
    • changedInput schema / properties / value / description
      Previous value: -"Category value appropriate to the mode. museum: a unit code like \"NASM\", \"SAAM\", or \"NMNHBIRDS\", matched literally and case-sensitively — not a museum name. culture: term, often plural or qualified (\"Aztecs\", \"Plains Indian\"). period: an indexed date term — commonly a decade (\"1940s\", \"1860s\"), but year ranges (\"500-1500\"), century terms (\"21st century\"), and BCE forms (\"-2500\", \"BCE 1000s\") are indexed too. medium: object type, usually plural (\"Paintings\", \"Aircraft\"). topic: subject term (\"Quilts\", \"Aviation\"). Smithsonian uses a controlled vocabulary — for museum (unit_code), culture, period (date), and topic, call smithsonian_list_terms to find exact terms; medium (object_type) is not enumerable there, so harvest it from smithsonian_search_objects results."New value: +"Category value appropriate to the mode. museum: a unit code like \"NASM\", \"SAAM\", or \"NMNHBIRDS\", matched literally and case-sensitively — not a museum name. culture: term, often plural or qualified (\"Aztecs\", \"Plains Indian\"). period: an indexed date term — commonly a decade (\"1940s\", \"1860s\"), but year ranges (\"500-1500\"), century terms (\"21st century\"), and BCE forms (\"-2500\", \"BCE 1000s\") are indexed too. medium: object type, usually plural (\"Paintings\", \"Aircraft\"). topic: subject term (\"Quilts\", \"Aviation\"). Smithsonian uses a controlled vocabulary — for museum (unit_code), culture, period (date), and topic, call smithsonian_list_terms to find exact terms; medium (object_type) is not enumerable there, so harvest it from smithsonian_search_objects results. Every mode matches its value exactly and case-sensitively, and for medium that split is load-bearing: casing variants are indexed as SEPARATE categories, each reporting its own total_count (\"button\" and \"Button\" are different categories, and neither casing is reliably the larger), so browse the variants of a harvested value rather than assuming one covers the concept."
  4. Changed4 schema fields changed
    • changedInput schema / properties / mode / description
      Previous value: -"Browse dimension: \"museum\" (by unit code), \"culture\" (by culture term), \"period\" (by indexed date term like \"1940s\" or \"500-1500\"), \"medium\" (by object type like \"Paintings\")."New value: +"Browse dimension: \"museum\" (by unit code), \"culture\" (by culture term), \"period\" (by indexed date term like \"1940s\" or \"500-1500\"), \"medium\" (by object type like \"Paintings\"), \"topic\" (by subject term like \"Quilts\")."
    • changedInput schema / properties / mode / enum
      Previous value: -[
      -  "museum",
      -  "culture",
      -  "period",
      -  "medium"
      -]New value: +[
      +  "museum",
      +  "culture",
      +  "period",
      +  "medium",
      +  "topic"
      +]
    • changedInput schema / properties / value / description
      Previous value: -"Category value appropriate to the mode. museum: a unit code like \"NASM\", \"SAAM\", or \"NMNHBIRDS\", matched literally and case-sensitively — not a museum name. culture: term, often plural or qualified (\"Aztecs\", \"Plains Indian\"). period: an indexed date term — commonly a decade (\"1940s\", \"1860s\"), but year ranges (\"500-1500\"), century terms (\"21st century\"), and BCE forms (\"-2500\", \"BCE 1000s\") are indexed too. medium: object type, usually plural (\"Paintings\", \"Aircraft\"). Smithsonian uses a controlled vocabulary — for museum (unit_code), culture, and period (date), call smithsonian_list_terms to find exact terms; medium (object_type) is not enumerable there, so harvest it from smithsonian_search_objects results."New value: +"Category value appropriate to the mode. museum: a unit code like \"NASM\", \"SAAM\", or \"NMNHBIRDS\", matched literally and case-sensitively — not a museum name. culture: term, often plural or qualified (\"Aztecs\", \"Plains Indian\"). period: an indexed date term — commonly a decade (\"1940s\", \"1860s\"), but year ranges (\"500-1500\"), century terms (\"21st century\"), and BCE forms (\"-2500\", \"BCE 1000s\") are indexed too. medium: object type, usually plural (\"Paintings\", \"Aircraft\"). topic: subject term (\"Quilts\", \"Aviation\"). Smithsonian uses a controlled vocabulary — for museum (unit_code), culture, period (date), and topic, call smithsonian_list_terms to find exact terms; medium (object_type) is not enumerable there, so harvest it from smithsonian_search_objects results."
    • changedOutput schema / properties / mode / description
      Previous value: -"Browse dimension used for this request (one of \"museum\", \"culture\", \"period\", \"medium\")."New value: +"Browse dimension used for this request (one of \"museum\", \"culture\", \"period\", \"medium\", \"topic\")."
  5. Changed3 schema fields changed
    • changedInput schema / properties / mode / description
      Previous value: -"Browse dimension: \"museum\" (by unit code), \"culture\" (by culture term), \"period\" (by decade like \"1940s\"), \"medium\" (by object type like \"Paintings\")."New value: +"Browse dimension: \"museum\" (by unit code), \"culture\" (by culture term), \"period\" (by indexed date term like \"1940s\" or \"500-1500\"), \"medium\" (by object type like \"Paintings\")."
    • changedInput schema / properties / value / description
      Previous value: -"Category value appropriate to the mode. museum: a unit code like \"NASM\", \"SAAM\", or \"NMNHBIRDS\", matched literally and case-sensitively — not a museum name. culture: term, often plural or qualified (\"Aztecs\", \"Plains Indian\"). period: a decade in \"NNNNs\" form (\"1940s\", \"1860s\"), required for that mode. medium: object type, usually plural (\"Paintings\", \"Aircraft\"). Smithsonian uses a controlled vocabulary — for museum (unit_code), culture, and period (date), call smithsonian_list_terms to find exact terms; medium (object_type) is not enumerable there, so harvest it from smithsonian_search_objects results."New value: +"Category value appropriate to the mode. museum: a unit code like \"NASM\", \"SAAM\", or \"NMNHBIRDS\", matched literally and case-sensitively — not a museum name. culture: term, often plural or qualified (\"Aztecs\", \"Plains Indian\"). period: an indexed date term — commonly a decade (\"1940s\", \"1860s\"), but year ranges (\"500-1500\"), century terms (\"21st century\"), and BCE forms (\"-2500\", \"BCE 1000s\") are indexed too. medium: object type, usually plural (\"Paintings\", \"Aircraft\"). Smithsonian uses a controlled vocabulary — for museum (unit_code), culture, and period (date), call smithsonian_list_terms to find exact terms; medium (object_type) is not enumerable there, so harvest it from smithsonian_search_objects results."
    • changedOutput schema / properties / sample_objects / items / properties / is_cc0 / description
      Previous value: -"True when the object is CC0 open access."New value: +"True when the object metadata is CC0 (open access). The Smithsonian Open Access corpus is CC0 throughout, so this flag rarely varies and cannot gate an image download — read thumbnail_url for that."
  6. Added

TDQS

A4.6/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/openWorld, so safety is covered. The description adds real behavioral context annotations cannot: rows above 1000 are served at 1000 with a notice, a truncated page names the next start, and the response contains a total count plus a museum breakdown of the page. It stops short of describing error behavior for an unmatched exact term, which is the one notable gap.

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?

Front-loaded with purpose and mode list, then vocabulary resolution, then return/pagination notes. It is dense and includes parenthetical material that duplicates the schema, but no sentence is filler — the casing warning and the alternative-tool pointer both change agent behavior.

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 values need no explanation, and all four parameters are documented in schema. For a read-only browse tool the description supplies everything needed to call it correctly: vocabulary sourcing per mode, exact-match rules, and pagination mechanics.

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 3 is the baseline. The description earns above baseline by stressing that every mode matches exactly and case-sensitively and that casing variants of medium are separate categories with distinct totals — a semantic trap not obvious from the enum alone, even though the value field text overlaps.

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 (browse) and resource (Smithsonian objects) and immediately enumerates the five exact-category modes with the vocabulary each expects. An agent can distinguish this from smithsonian_search_objects without opening any schema.

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 names prerequisites (resolve museum/culture/period/topic via smithsonian_list_terms first, harvest medium from smithsonian_search_objects) and names the alternative for open-ended discovery (start with smithsonian_search_objects instead). When-to-use vs when-not is fully covered.

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.