Skip to main content
Glama

smithsonian-mcp-server

Get Smithsonian Object

smithsonian_get_object
Read-onlyIdempotent

Fetch a normalized catalog metadata projection for a Smithsonian object by its record_id (from smithsonian_search_objects results). Returns title, dates, description, labeled notes, makers, materials, dimensions, places, cultures, topics, exhibitions, credit line, identifiers, rights, and a media summary. Natural-history records can include scientific_names, taxonomy, and collection coordinates without inferred precision. The media summary counts the media and links every non-image item (3D models, scanned books, documents); full image URLs come from smithsonian_get_media.

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": {
      "id": "<id>"
    },
    "name": "smithsonian_get_object"
  }
}

Input Schema

NameRequiredDescriptionDefault
idYesObject record_id from smithsonian_search_objects results (e.g. "nasm_A19670093000").

Output Schema

NameRequiredDescriptionDefault
datesNoAll date fields in the catalog record.
errorNoPresent when the call failed. Absent on success.
notesNoAll nonempty catalog notes in source order, including repeated labels.
placeNoGeographic place associations.
titleNoObject title.
is_cc0NoTrue when the object metadata is CC0 (open access). The Smithsonian Open Access corpus is CC0 throughout, so this flag rarely varies — read media_summary.has_cc0_images to predict whether smithsonian_get_media returns images.
makersNoAll named parties associated with this object.
topicsNoSubject and topic terms.
cultureNoCulture associations.
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.
taxonomyNoReported taxonomic ranks; absent ranks remain omitted.
materialsNoPhysical material descriptions.
record_idNoUnique object identifier.
unit_codeNoMuseum unit code the object is indexed under — the value a unit_code filter matches.
dimensionsNoDimension and measurement strings.
coordinatesNoCollection points without inferred precision or geocoding; empty when no valid decimal pairs exist.
credit_lineNoAttribution or credit string.
descriptionNoBest available prose description from Summary, Physical Description, Brief Description, Description, Description (Brief), or Citation notes. Absent when only administrative notes exist.
exhibitionsNoExhibition history.
identifiersNoAll accession and catalog identifiers.
museum_nameNoFull museum name. A few rarely-indexed archive sub-unit codes have no mapped name and fall back to the raw unit code.
record_linkNoCanonical Smithsonian Institution URL for this object.
media_summaryNoMedia availability summary, with a link to each non-image item. Call smithsonian_get_media for full image URLs.
object_rightsNoRights statement from the catalog.
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.
scientific_namesNoAll reported scientific names in source order; no accepted-name inference.
holding_museum_nameNoThe unit that holds the object, from the record's own data source, when it differs from the unit that indexes it (unit_code). Absent otherwise.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed7 schema fields changed
    • addedOutput schema / properties / holding_museum_name
      Added value: +{
      +  "description": "The unit that holds the object, from the record's own data source, when it differs from the unit that indexes it (unit_code). Absent otherwise.",
      +  "type": "string"
      +}
    • changedOutput schema / properties / media_summary / description
      Previous value: -"Media availability summary. Call smithsonian_get_media for full image URLs."New value: +"Media availability summary, with a link to each non-image item. Call smithsonian_get_media for full image URLs."
    • addedOutput schema / properties / media_summary / properties / non_image_media
      Added value: +{
      +  "description": "Every media item smithsonian_get_media does not deliver — each item typed as something other than Images — in catalog order. Empty when there are none.",
      +  "items": {
      +    "additionalProperties": false,
      +    "description": "A non-image media item.",
      +    "properties": {
      +      "is_cc0": {
      +        "description": "True when this item is CC0 open access.",
      +        "type": "boolean"
      +      },
      +      "type": {
      +        "description": "Upstream media type, e.g. \"3d_voyager\", \"Scanned books\", \"slideshowXML\", \"Electronic resource\".",
      +        "type": "string"
      +      },
      +      "url": {
      +        "description": "The item's link — a 3D viewer, a scanned book, a document viewer, or a PDF. Absent when the catalog gives none.",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "type",
      +      "is_cc0"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • changedOutput schema / properties / media_summary / required
      Previous value: -[
      -  "count",
      -  "cc0_image_count",
      -  "has_cc0_images"
      -]New value: +[
      +  "count",
      +  "cc0_image_count",
      +  "has_cc0_images",
      +  "non_image_media"
      +]
    • 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"
      +}
    • 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"
      +}
    • changedOutput schema / properties / unit_code / description
      Previous value: -"Museum unit code."New value: +"Museum unit code the object is indexed under — the value a unit_code filter matches."
  2. Changed6 schema fields changed
    • changedOutput schema / anyOf
      Previous value: -[
      -  {
      -    "not": {
      -      "required": [
      -        "error"
      -      ]
      -    },
      -    "required": [
      -      "record_id",
      -      "title",
      -      "unit_code",
      -      "museum_name",
      -      "dates",
      -      "makers",
      -      "materials",
      -      "dimensions",
      -      "place",
      -      "culture",
      -      "topics",
      -      "exhibitions",
      -      "identifiers",
      -      "is_cc0",
      -      "media_summary"
      -    ]
      -  },
      -  {
      -    "required": [
      -      "error"
      -    ]
      -  }
      -]New value: +[
      +  {
      +    "not": {
      +      "required": [
      +        "error"
      +      ]
      +    },
      +    "required": [
      +      "record_id",
      +      "title",
      +      "unit_code",
      +      "museum_name",
      +      "dates",
      +      "notes",
      +      "scientific_names",
      +      "coordinates",
      +      "makers",
      +      "materials",
      +      "dimensions",
      +      "place",
      +      "culture",
      +      "topics",
      +      "exhibitions",
      +      "identifiers",
      +      "is_cc0",
      +      "media_summary"
      +    ]
      +  },
      +  {
      +    "required": [
      +      "error"
      +    ]
      +  }
      +]
    • addedOutput schema / properties / coordinates
      Added value: +{
      +  "description": "Collection points without inferred precision or geocoding; empty when no valid decimal pairs exist.",
      +  "items": {
      +    "additionalProperties": false,
      +    "description": "A valid reported decimal coordinate pair.",
      +    "properties": {
      +      "latitude": {
      +        "description": "Reported decimal latitude in degrees.",
      +        "type": "number"
      +      },
      +      "locality": {
      +        "description": "Locality reported alongside this point.",
      +        "type": "string"
      +      },
      +      "longitude": {
      +        "description": "Reported decimal longitude in degrees.",
      +        "type": "number"
      +      }
      +    },
      +    "required": [
      +      "latitude",
      +      "longitude"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • changedOutput schema / properties / description / description
      Previous value: -"Best available prose description (Summary, Physical Description, or Brief Description notes)."New value: +"Best available prose description from Summary, Physical Description, Brief Description, Description, Description (Brief), or Citation notes. Absent when only administrative notes exist."
    • addedOutput schema / properties / notes
      Added value: +{
      +  "description": "All nonempty catalog notes in source order, including repeated labels.",
      +  "items": {
      +    "additionalProperties": false,
      +    "description": "A labeled catalog note.",
      +    "properties": {
      +      "content": {
      +        "description": "Plain-text note content.",
      +        "type": "string"
      +      },
      +      "label": {
      +        "description": "Catalog note label, or Note when absent.",
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "label",
      +      "content"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / scientific_names
      Added value: +{
      +  "description": "All reported scientific names in source order; no accepted-name inference.",
      +  "items": {
      +    "description": "A catalog-reported scientific name.",
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / taxonomy
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Reported taxonomic ranks; absent ranks remain omitted.",
      +  "properties": {
      +    "class": {
      +      "description": "Reported class values.",
      +      "items": {
      +        "description": "A class value.",
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "family": {
      +      "description": "Reported family values.",
      +      "items": {
      +        "description": "A family value.",
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "kingdom": {
      +      "description": "Reported kingdom values.",
      +      "items": {
      +        "description": "A kingdom value.",
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "order": {
      +      "description": "Reported order values.",
      +      "items": {
      +        "description": "An order value.",
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "phylum": {
      +      "description": "Reported phylum values.",
      +      "items": {
      +        "description": "A phylum value.",
      +        "type": "string"
      +      },
      +      "type": "array"
      +    }
      +  },
      +  "type": "object"
      +}
  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": [
      +      "record_id",
      +      "title",
      +      "unit_code",
      +      "museum_name",
      +      "dates",
      +      "makers",
      +      "materials",
      +      "dimensions",
      +      "place",
      +      "culture",
      +      "topics",
      +      "exhibitions",
      +      "identifiers",
      +      "is_cc0",
      +      "media_summary"
      +    ]
      +  },
      +  {
      +    "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: `not_found`: No object with the given ID exists in the Smithsonian catalog. `invalid_id`: The ID format is clearly malformed (empty string, whitespace only). Other values are possible when a failure originates below the handler.",
      +          "examples": [
      +            "not_found",
      +            "invalid_id"
      +          ],
      +          "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: -[
      -  "record_id",
      -  "title",
      -  "unit_code",
      -  "museum_name",
      -  "dates",
      -  "makers",
      -  "materials",
      -  "dimensions",
      -  "place",
      -  "culture",
      -  "topics",
      -  "exhibitions",
      -  "identifiers",
      -  "is_cc0",
      -  "media_summary"
      -]
  4. Changed1 schema field changed
    • changedOutput schema / properties / is_cc0 / description
      Previous value: -"True when the object metadata is CC0 (open access). Call smithsonian_get_media to get images."New value: +"True when the object metadata is CC0 (open access). The Smithsonian Open Access corpus is CC0 throughout, so this flag rarely varies — read media_summary.has_cc0_images to predict whether smithsonian_get_media returns images."
  5. Changed1 schema field changed
    • changedInput schema / properties / id / description
      Previous value: -"Object record_id from smithsonian_search results (e.g. \"nasm_A19670093000\")."New value: +"Object record_id from smithsonian_search_objects results (e.g. \"nasm_A19670093000\")."
  6. Changed1 schema field changed
    • changedOutput schema / properties / museum_name / description
      Previous value: -"Full museum name."New value: +"Full museum name. A few rarely-indexed archive sub-unit codes have no mapped name and fall back to the raw unit code."
  7. Changed4 schema fields changed
    • addedOutput schema / properties / media_summary / properties / cc0_image_count
      Added value: +{
      +  "description": "Number of CC0 images smithsonian_get_media returns for this object. Lower than count when the object has non-image media (e.g. 3D models) or non-CC0 images.",
      +  "type": "number"
      +}
    • changedOutput schema / properties / media_summary / properties / count / description
      Previous value: -"Total number of online media items."New value: +"Total number of online media items, across all types (includes non-image media such as 3D models)."
    • changedOutput schema / properties / media_summary / properties / has_cc0_images / description
      Previous value: -"True when at least one image is CC0."New value: +"True when at least one CC0 image is available (cc0_image_count > 0)."
    • changedOutput schema / properties / media_summary / required
      Previous value: -[
      -  "count",
      -  "has_cc0_images"
      -]New value: +[
      +  "count",
      +  "cc0_image_count",
      +  "has_cc0_images"
      +]
  8. First observed

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 safety is covered. The description adds useful behavior beyond annotations: the normalized projection contents, natural-history record behavior, and that the media summary counts and links non-image items while full image URLs come from a sibling tool.

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 front-loaded with the core action and input source, then summarizes return contents and relevant edge cases. It is appropriately sized and contains no obvious filler.

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 output schema, annotations, and fully documented single parameter, the description provides enough context for correct invocation. It also clarifies the relationship to smithsonian_search_objects and smithsonian_get_media, covering the key integration points an agent needs.

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?

There is one parameter with 100% schema description coverage, and the schema already documents that id is the object record_id from smithsonian_search_objects. The description reinforces the same source but adds no syntax or format detail beyond the schema, so the baseline of 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 and resource: fetch a normalized catalog metadata projection for a Smithsonian object by record_id. It clearly distinguishes the tool from smithsonian_search_objects (source of the id) and smithsonian_get_media (full image URLs).

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?

Explains that the id comes from smithsonian_search_objects results and that full image URLs require smithsonian_get_media. This gives clear usage context and an alternative for media, though it does not state explicit when-not-to-use conditions.

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.