Skip to main content
Glama

met-museum-mcp-server

Get Met Objects

met_get_object
Read-onlyIdempotent

Fetch full records for one or more Met Museum object IDs. Accepts up to 20 IDs per call and returns partial success — a single 404 does not fail the whole batch; per-ID failures are reported separately. Object IDs come from met_search_collections. Non-public-domain objects return empty image URLs. The constituents array is null for anonymous or unattributed works; tags and measurements are null when the Met records none. Records are returned whole and never truncated, so a batch of unusually large records may return fewer than requested — any that did not fit are listed in deferred[] with their sizes, to be re-requested in a follow-up call.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
objectIDsYesOne or more Met object IDs to fetch. Maximum 20 per call. IDs come from met_search_collections. A repeated ID is fetched and returned once, at its first position. Partial failures are reported per ID rather than failing the whole batch.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
errorNoPresent when the call failed. Absent on success.
failedNoObject IDs that failed to fetch with per-ID error context.
noticeNoHow to retrieve the deferred records, with the budget applied. Present only when the batch byte budget deferred a record.
objectsNoSuccessfully fetched objects.
deferredNoRecords that were fetched but did not fit the call’s cumulative budget on serialized structuredContent bytes, in request order. Re-call met_get_object with these IDs to retrieve them. Absent when every fetched record fit.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed6 schema fields changed
    • changedInput schema / properties / objectIDs / description
      Previous value: -"One or more Met object IDs to fetch. Maximum 20 per call. IDs come from met_search_collections. Partial failures are reported per ID rather than failing the whole batch."New value: +"One or more Met object IDs to fetch. Maximum 20 per call. IDs come from met_search_collections. A repeated ID is fetched and returned once, at its first position. Partial failures are reported per ID rather than failing the whole batch."
    • addedOutput schema / properties / deferred
      Added value: +{
      +  "description": "Records that were fetched but did not fit the call’s cumulative budget on serialized structuredContent bytes, in request order. Re-call met_get_object with these IDs to retrieve them. Absent when every fetched record fit.",
      +  "items": {
      +    "additionalProperties": false,
      +    "description": "A record fetched successfully but withheld to keep the response bounded.",
      +    "properties": {
      +      "bytes": {
      +        "description": "Serialized structuredContent size of the withheld record — the same scale the budget is measured on — so a follow-up batch can be sized before it is requested.",
      +        "maximum": 9007199254740991,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "objectID": {
      +        "description": "Object ID whose record was fetched but withheld from this response.",
      +        "maximum": 9007199254740991,
      +        "minimum": -9007199254740991,
      +        "type": "integer"
      +      }
      +    },
      +    "required": [
      +      "objectID",
      +      "bytes"
      +    ],
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / notice
      Added value: +{
      +  "description": "How to retrieve the deferred records, with the budget applied. Present only when the batch byte budget deferred a record.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / objects / items / properties / geography
      Added value: +{
      +  "additionalProperties": false,
      +  "description": "Findspot detail beyond the top-level country and region, which are not repeated here. Every field is an empty string when the Met records nothing; population concentrates in the archaeological departments.",
      +  "properties": {
      +    "city": {
      +      "description": "City of origin or findspot (e.g., \"Damascus\", \"Constantinople (?)\", \"Springfield\"). The most widely populated field of this block outside the archaeological departments; empty when the Met records no city.",
      +      "type": "string"
      +    },
      +    "county": {
      +      "description": "County of origin. Empty on nearly every record.",
      +      "type": "string"
      +    },
      +    "excavation": {
      +      "description": "Excavation that recovered the object (e.g., \"MMA excavations, 1928-29\"). Excavated objects only.",
      +      "type": "string"
      +    },
      +    "geographyType": {
      +      "description": "How the object relates to the place (e.g., \"From\", \"Original\", \"Probably originally from\"). Empty when the Met records no findspot.",
      +      "type": "string"
      +    },
      +    "locale": {
      +      "description": "Named place within the site (e.g., \"Late Period cemetery, Tomb of Harkhebit\"). Excavated objects only.",
      +      "type": "string"
      +    },
      +    "locus": {
      +      "description": "Specific findspot within the locale (e.g., \"burial chamber\"). Excavated objects only.",
      +      "type": "string"
      +    },
      +    "river": {
      +      "description": "Associated river. Empty on nearly every record.",
      +      "type": "string"
      +    },
      +    "state": {
      +      "description": "State or province of origin (e.g., \"Massachusetts\"). Sparse, and concentrated in departments that catalogue a manufacturing place. Empty when the Met records none.",
      +      "type": "string"
      +    },
      +    "subregion": {
      +      "description": "Sub-region or site within the region (e.g., \"Saqqara\", \"Deir el-Bahri\"). Commonly populated for archaeological departments, empty elsewhere.",
      +      "type": "string"
      +    }
      +  },
      +  "required": [
      +    "geographyType",
      +    "city",
      +    "state",
      +    "county",
      +    "subregion",
      +    "locale",
      +    "locus",
      +    "excavation",
      +    "river"
      +  ],
      +  "type": "object"
      +}
    • addedOutput schema / properties / objects / items / properties / measurements
      Added value: +{
      +  "anyOf": [
      +    {
      +      "items": {
      +        "additionalProperties": false,
      +        "description": "One measured element of the object.",
      +        "properties": {
      +          "elementDescription": {
      +            "description": "Qualifier distinguishing this element from a sibling with the same name (e.g., \"Print\" vs \"Negativ\"). Empty when the Met records none.",
      +            "type": "string"
      +          },
      +          "elementMeasurements": {
      +            "additionalProperties": {
      +              "description": "Measured value — centimeters for spatial axes, kilograms for weight.",
      +              "type": "number"
      +            },
      +            "description": "Measured axes for this element. Which keys are present varies element to element, so read the keys rather than assuming a fixed set. Empty object when the Met records no values.",
      +            "propertyNames": {
      +              "description": "Measurement axis (e.g., \"Height\", \"Width\", \"Depth\", \"Length\").",
      +              "type": "string"
      +            },
      +            "type": "object"
      +          },
      +          "elementName": {
      +            "description": "Which part of the object was measured (e.g., \"Overall\", \"Other\", \"Length\").",
      +            "type": "string"
      +          }
      +        },
      +        "required": [
      +          "elementName",
      +          "elementDescription",
      +          "elementMeasurements"
      +        ],
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    {
      +      "type": "null"
      +    }
      +  ],
      +  "description": "Structured element measurements — the numeric counterpart to the formatted dimensions string. Null when the Met records none."
      +}
    • changedOutput schema / properties / objects / items / required
      Previous value: -[
      -  "objectID",
      -  "title",
      -  "isPublicDomain",
      -  "hasCC0Image",
      -  "primaryImage",
      -  "primaryImageSmall",
      -  "additionalImages",
      -  "objectURL",
      -  "department",
      -  "objectName",
      -  "classification",
      -  "isHighlight",
      -  "isTimelineWork",
      -  "artistDisplayName",
      -  "artistDisplayBio",
      -  "artistNationality",
      -  "artistBeginDate",
      -  "artistEndDate",
      -  "constituents",
      -  "objectDate",
      -  "objectBeginDate",
      -  "objectEndDate",
      -  "medium",
      -  "dimensions",
      -  "culture",
      -  "period",
      -  "dynasty",
      -  "accessionNumber",
      -  "creditLine",
      -  "country",
      -  "region",
      -  "tags",
      -  "objectWikidata_URL",
      -  "GalleryNumber"
      -]New value: +[
      +  "objectID",
      +  "title",
      +  "isPublicDomain",
      +  "hasCC0Image",
      +  "primaryImage",
      +  "primaryImageSmall",
      +  "additionalImages",
      +  "objectURL",
      +  "department",
      +  "objectName",
      +  "classification",
      +  "isHighlight",
      +  "isTimelineWork",
      +  "artistDisplayName",
      +  "artistDisplayBio",
      +  "artistNationality",
      +  "artistBeginDate",
      +  "artistEndDate",
      +  "constituents",
      +  "objectDate",
      +  "objectBeginDate",
      +  "objectEndDate",
      +  "medium",
      +  "dimensions",
      +  "culture",
      +  "period",
      +  "dynasty",
      +  "accessionNumber",
      +  "creditLine",
      +  "country",
      +  "region",
      +  "geography",
      +  "measurements",
      +  "tags",
      +  "objectWikidata_URL",
      +  "GalleryNumber"
      +]
  2. Changed10 schema fields changed
    • addedOutput schema / properties / objects / items / properties / objectBeginDate / anyOf
      Added value: +[
      +  {
      +    "maximum": 9007199254740991,
      +    "minimum": -9007199254740991,
      +    "type": "integer"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / properties / objects / items / properties / objectBeginDate / description
      Previous value: -"Earliest date as an integer year (negative = BCE)."New value: +"Earliest date as an integer year (negative = BCE). Null when the Met has no machine-readable date for the work — read objectDate for what is known instead, and do not treat null as year zero or substitute a default."
    • removedOutput schema / properties / objects / items / properties / objectBeginDate / maximum
      Removed value: -9007199254740991
    • removedOutput schema / properties / objects / items / properties / objectBeginDate / minimum
      Removed value: --9007199254740991
    • removedOutput schema / properties / objects / items / properties / objectBeginDate / type
      Removed value: -"integer"
    • addedOutput schema / properties / objects / items / properties / objectEndDate / anyOf
      Added value: +[
      +  {
      +    "maximum": 9007199254740991,
      +    "minimum": -9007199254740991,
      +    "type": "integer"
      +  },
      +  {
      +    "type": "null"
      +  }
      +]
    • changedOutput schema / properties / objects / items / properties / objectEndDate / description
      Previous value: -"Latest date as an integer year (negative = BCE)."New value: +"Latest date as an integer year (negative = BCE). Null under the same condition as objectBeginDate — the two are null together."
    • removedOutput schema / properties / objects / items / properties / objectEndDate / maximum
      Removed value: -9007199254740991
    • removedOutput schema / properties / objects / items / properties / objectEndDate / minimum
      Removed value: --9007199254740991
    • removedOutput schema / properties / objects / items / properties / objectEndDate / type
      Removed value: -"integer"
  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": [
      +      "objects",
      +      "failed"
      +    ]
      +  },
      +  {
      +    "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: `all_not_found`: Every requested objectID returned a 404 — all IDs are stale or invalid. `all_failed`: Every requested objectID failed due to network errors or API downtime. Other values are possible when a failure originates below the handler.",
      +          "examples": [
      +            "all_not_found",
      +            "all_failed"
      +          ],
      +          "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: -[
      -  "objects",
      -  "failed"
      -]
  4. Changed2 schema fields changed
    • changedInput schema / properties / objectIDs / description
      Previous value: -"One or more Met object IDs to fetch. Maximum 20 per call. IDs come from met_search_collections. Fetches run in parallel (concurrency-limited); partial failures are reported per ID rather than failing the whole batch."New value: +"One or more Met object IDs to fetch. Maximum 20 per call. IDs come from met_search_collections. Partial failures are reported per ID rather than failing the whole batch."
    • changedOutput schema / properties / objects / items / properties / objectBeginDate / description
      Previous value: -"Earliest date as an integer year (negative = BCE). Use for date range comparisons."New value: +"Earliest date as an integer year (negative = BCE)."
  5. Changed3 schema fields changed
    • changedInput schema / properties / objectIDs / description
      Previous value: -"One or more Met object IDs to fetch. Maximum 20 per call. IDs come from met_search. Fetches run in parallel (concurrency-limited); partial failures are reported per ID rather than failing the whole batch."New value: +"One or more Met object IDs to fetch. Maximum 20 per call. IDs come from met_search_collections. Fetches run in parallel (concurrency-limited); partial failures are reported per ID rather than failing the whole batch."
    • changedInput schema / properties / objectIDs / items / description
      Previous value: -"A Met object ID from met_search."New value: +"A Met object ID from met_search_collections."
    • changedOutput schema / properties / objects / items / properties / hasCC0Image / description
      Previous value: -"True when a CC0 open-access image URL is available (primaryImage is non-empty). Distinct from met_search's hasImages filter, which matches objects that have any image including copyrighted works."New value: +"True when a CC0 open-access image URL is available (primaryImage is non-empty). Distinct from met_search_collections's hasImages filter, which matches objects that have any image including copyrighted works."
  6. Changed3 schema fields changed
    • addedOutput schema / properties / objects / items / properties / hasCC0Image
      Added value: +{
      +  "description": "True when a CC0 open-access image URL is available (primaryImage is non-empty). Distinct from met_search's hasImages filter, which matches objects that have any image including copyrighted works.",
      +  "type": "boolean"
      +}
    • removedOutput schema / properties / objects / items / properties / hasImages
      Removed value: -{
      -  "description": "True when primaryImage is non-empty.",
      -  "type": "boolean"
      -}
    • changedOutput schema / properties / objects / items / required
      Previous value: -[
      -  "objectID",
      -  "title",
      -  "isPublicDomain",
      -  "hasImages",
      -  "primaryImage",
      -  "primaryImageSmall",
      -  "additionalImages",
      -  "objectURL",
      -  "department",
      -  "objectName",
      -  "classification",
      -  "isHighlight",
      -  "isTimelineWork",
      -  "artistDisplayName",
      -  "artistDisplayBio",
      -  "artistNationality",
      -  "artistBeginDate",
      -  "artistEndDate",
      -  "constituents",
      -  "objectDate",
      -  "objectBeginDate",
      -  "objectEndDate",
      -  "medium",
      -  "dimensions",
      -  "culture",
      -  "period",
      -  "dynasty",
      -  "accessionNumber",
      -  "creditLine",
      -  "country",
      -  "region",
      -  "tags",
      -  "objectWikidata_URL",
      -  "GalleryNumber"
      -]New value: +[
      +  "objectID",
      +  "title",
      +  "isPublicDomain",
      +  "hasCC0Image",
      +  "primaryImage",
      +  "primaryImageSmall",
      +  "additionalImages",
      +  "objectURL",
      +  "department",
      +  "objectName",
      +  "classification",
      +  "isHighlight",
      +  "isTimelineWork",
      +  "artistDisplayName",
      +  "artistDisplayBio",
      +  "artistNationality",
      +  "artistBeginDate",
      +  "artistEndDate",
      +  "constituents",
      +  "objectDate",
      +  "objectBeginDate",
      +  "objectEndDate",
      +  "medium",
      +  "dimensions",
      +  "culture",
      +  "period",
      +  "dynasty",
      +  "accessionNumber",
      +  "creditLine",
      +  "country",
      +  "region",
      +  "tags",
      +  "objectWikidata_URL",
      +  "GalleryNumber"
      +]
  7. First observed

TDQS

A4.8/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true and idempotentHint=true, but the description goes well beyond them: it discloses partial success (404 does not fail the whole batch), per-ID failure reporting, empty image URLs for non-public-domain objects, null constituents for anonymous works, null tags/measurements when absent, no truncation of records, and deferred[] handling for oversized batches. These are all behavioral traits that an agent must know to interpret responses correctly. No contradiction with annotations.

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 dense but every sentence adds value: it starts with the primary action, then covers batching limits, partial success, source of IDs, null-field semantics, and the deferred[] mechanism. No filler or redundancy. It is appropriately sized for the tool's complexity.

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?

For a batch retrieval tool with partial success and deferred handling, the description covers all critical aspects an agent needs: input constraints, failure semantics, null fields, truncation behavior, and how to follow up. The existence of an output schema means return-value details are handled separately. Nothing essential is missing.

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?

Schema coverage is 100%, so the schema already documents the objectIDs parameter thoroughly, including max items, source, and partial-failure behavior. The description adds further context: repeated IDs are fetched once at first position, and the parameter accepts up to 20 IDs. It also ties the parameter to the return behavior (deferred[]). This is meaningful addition beyond the schema, not mere repetition.

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 opens with a specific verb and resource: 'Fetch full records for one or more Met Museum object IDs.' It clearly distinguishes itself from siblings (met_list_departments and met_search_collections) by focusing on retrieval of records by ID rather than discovery or enumeration. The scope and behavior are unambiguous.

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 explicitly states that object IDs come from met_search_collections, which guides the agent on where to source inputs. It does not explicitly say 'use this when you have IDs' but that is strongly implied by the purpose. It also explains partial success and deferred[] re-request behavior, which helps the agent decide on follow-up calls. Missing a direct 'when not to use' statement, but the sibling tools are distinct enough that confusion is unlikely.

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.