Skip to main content
Glama

met-museum-mcp-server

Server Details

MET Museum collection via MCP — 500K+ artworks, metadata, provenance, open-access images.

If you are the author of this connector, you can claim ownership with GitHub, an HTTP challenge, or a DNS record. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Uptime
100.0% over 40 days
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL
Repository
cyanheads/met-museum-mcp-server
GitHub Stars
4
Server Listing
@cyanheads/met-museum-mcp-server

TDQS

A4.7/5.0

Scored across 3 tools

Disambiguation5/5

Each tool targets a distinct operation: searching collections, fetching object records, and listing departments. There is no overlap or ambiguity about which tool to use for a given task.

Naming Consistency5/5

All tool names follow the same met_verb_noun pattern: met_get_object, met_list_departments, and met_search_collections. The naming is uniform, predictable, and clearly communicates each tool's action.

Tool Count5/5

Three tools is a well-scoped set for a read-only museum collection API: search, retrieve, and reference data. Each tool has a clear purpose and none are redundant.

Completeness5/5

The tool surface covers the core workflow of searching the collection, filtering by department, and fetching full object records. There are no obvious dead ends for the stated domain, and the batch retrieval with deferred results addresses practical scalability.

Available Tools

3 tools
met_get_objectGet Met ObjectsA
Read-onlyIdempotent
Inspect

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.

ParametersJSON 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

ParametersJSON Schema
NameRequiredDescription
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.

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.

met_list_departmentsList Met DepartmentsA
Read-onlyIdempotent
Inspect

Return the 19 curatorial departments at The Metropolitan Museum of Art, each with its numeric departmentId and display name — the valid values for the met_search_collections departmentId filter.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
departmentsNoAll 19 curatorial departments at The Metropolitan Museum of Art.

TDQS

A4.4/5.0
Behavior3/5

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

The annotations already declare readOnlyHint=true and idempotentHint=true, so the agent knows this is a safe, repeatable read operation. The description adds only the count (19) and the format (id + name) but doesn't disclose whether results are sorted, which is minor. It doesn't contradict annotations, and the added context is useful but minimal beyond what annotations provide.

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 a single compact sentence that front-loads the purpose and output format, and immediately connects to the sibling tool's usage. No wasted words; every clause earns its place.

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 is parameterless and has an output schema, there is very little the description must cover. It fully explains the purpose, the data returned, and how the data is used in relation to a sibling. It could mention sorting or that it's a static list, but that is a minor gap; the description is complete for practical agent use.

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?

The tool has 0 parameters, so there is nothing to document. The description adds clarity about what the return data is (id and display name) even though no parameters exist. This gives the agent confidence about the output shape, which is valuable since the schema for parameters is empty.

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 states a specific verb ('Return'), a specific resource ('19 curatorial departments'), and the exact output ('numeric departmentId and display name'). It also distinguishes itself from siblings by noting these are the valid values for the met_search_collections departmentId filter, making it clear this is a reference/enumeration tool, not a search or retrieval tool.

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?

The description explicitly says the output provides valid values for the met_search_collections departmentId filter, which tells the agent when to use this tool: when it needs to know allowed department IDs for filtering. It implies this is a preliminary lookup step before using search. It also indirectly contrasts with the siblings (get for single objects, search for queries).

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

met_search_collectionsSearch Met CollectionA
Read-onlyIdempotent
Inspect

Search the Metropolitan Museum of Art collection by keyword and optional filters. Returns the total match count and one page of matching object IDs, which met_get_object resolves to full records. Relevance is keyword-based, not semantic; department and geographic filters narrow results more than a longer query. Paging reaches only the first 10,000 matches of any search, so narrow a larger one with filters. The medium parameter takes an object classification as the Met spells it ("Paintings", "Sculpture"), not a material like "Oil on canvas". hasImages also includes copyrighted works; CC0 status is per object, from the isPublicDomain and hasCC0Image fields on met_get_object. isHighlight accepts true only. isOnView restricts results to works currently on display in a Met gallery.

ParametersJSON Schema
NameRequiredDescriptionDefault
qYesKeyword query, matched across title, artist name, culture, medium, tags, and other text fields. Broad terms return large ID sets.
limitNoMaximum number of object IDs to return in this page. Paging reaches only the first 10,000 matches, so a page that would cross 10,000 is cut short there.
mediumNoFilter by object classification, case-sensitive and spelled as the Met spells it (e.g., "Paintings", "Drawings", "Prints", "Ceramics", "Sculpture", "Photographs", "Textiles") — "paintings" or "Painting" matches nothing. Maps to the classification field on the object, not the materials text, so a material description like "Oil on canvas" matches nothing either; met_get_object returns an object’s classification.
offsetNoZero-based index of the first match to return (default 0); pass the nextOffset from a previous response to continue paging. Only the first 10,000 matches are reachable, so an offset at or beyond 10,000, or at or beyond a nonzero total, returns an empty page rather than an error. Matches with tied relevance can change order between requests, so an ID can occasionally repeat or be skipped at a page boundary.
dateEndNoLatest object date (year, inclusive). Negative integers for BCE. Requires dateBegin.
isOnViewNoWhen true, restricts results to objects currently on display in a Met gallery; false restricts them to objects not on view. The GalleryNumber field on the met_get_object record identifies the specific gallery.
dateBeginNoEarliest object date (year, inclusive). Negative integers for BCE (e.g., -500 for 500 BCE). Requires dateEnd.
hasImagesNoWhen true, restricts results to objects that have at least one associated image, including copyrighted works whose images cannot be reproduced; false restricts them to objects with none. For freely reusable CC0 images, confirm per object from the isPublicDomain and hasCC0Image fields on met_get_object.
geoLocationNoFilter by geographic origin: one country, region, or city, as a one-element array (e.g., ["France"]). The value is matched broadly against geography fields and artist nationality. Works best with the Egyptian Art, Greek and Roman Art, and similar departments that have well-populated geography fields.
isHighlightNoOpt-in filter, true only — omit it rather than passing false, which the search ignores. Selects objects the Met has designated as highlights — major works central to the collection.
departmentIdNoRestrict results to one curatorial department. Valid IDs come from met_list_departments — the Met exposes a sparse set (roughly 1–21, with gaps); an unrecognized ID is rejected with an invalid_department error rather than silently widening the search. Can be combined with other filters.

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorNoPresent when the call failed. Absent on success.
totalNoTotal number of objects in the Met collection matching the search. Can exceed 10,000, the most that paging reaches.
noticeNoPresent only when total exceeds 10,000: states that only the first 10,000 matches are reachable by paging, and that filters or a more specific keyword bring the rest into reach.
offsetNoThe resolved offset this page was read from — the offset input after its default of 0. When it is at or beyond the smaller of total and 10,000, the page is empty because the offset ran past what paging reaches, not because the search found nothing.
returnedNoCount of object IDs in this page.
objectIDsNoObject IDs for this page, up to `limit` results.
remainingNoCount of reachable matches after this page: the smaller of total and 10,000, minus (offset + returned), floored at 0. 0 means no further page exists.
truncatedNoTrue when reachable matches remain after this page (offset + returned < the smaller of total and 10,000); false when this page is the last one paging reaches.
nextOffsetNoThe offset to pass on the next call to continue paging, or null when no further page is reachable (truncated is false).

TDQS

A5/5.0
Behavior5/5

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

Even though the annotations already mark the tool as readOnly and idempotent, the description adds substantial behavioral detail: relevance ordering instability, the 10,000-match paging cap, that hasImages includes copyrighted works, that isHighlight accepts only true, that isOnView restricts to on-display works, and that medium expects classification rather than material. 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 long but every sentence earns its place by clarifying behavior or a pitfall. It is front-loaded with the core purpose and then systematically addresses the most error-prone parameters. No redundant or filler content, and it does not merely repeat schema text.

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 tool with 11 parameters, an output schema, and two siblings, the description covers all essential aspects: what the tool returns, pagination and ordering caveats, filter semantics, and how to get full records and valid department IDs. It is fully self-sufficient for an agent to call the tool correctly.

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?

The schema already describes every parameter (100% coverage), but the description goes further to explain nuances: the medium parameter gives specific examples and warns about case sensitivity, hasImages clarifies the copyright implication, geoLocation specifies the one-element array format, and isHighlight notes the opt-in true-only behavior. This adds real meaning beyond the schema.

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 states a specific verb ('Search') and resource ('the Metropolitan Museum of Art collection'), and immediately distinguishes it from the sibling tool met_get_object by noting that this search returns object IDs that met_get_object resolves to full records. This tells an agent exactly what the tool does and where it fits in the workflow.

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?

It gives explicit guidance on when to use the tool, how to narrow searches, and when to rely on siblings: it says relevance is keyword-based and that department/geographic filters narrow more than longer queries, and points to met_list_departments for valid department IDs and met_get_object for full records. It also warns about pagination limits, which advises against overly broad queries.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 1 tool update
    • Changedmet_search_collections21 fields changed
      • changedInput schema / properties / dateBegin / description
        Previous value: -"Earliest object date (year, inclusive). Negative integers for BCE (e.g., -500 for 500 BCE). Requires dateEnd. The range is a partial index like the other filters: it omits some objects whose own record dates them inside it."New value: +"Earliest object date (year, inclusive). Negative integers for BCE (e.g., -500 for 500 BCE). Requires dateEnd."
      • changedInput schema / properties / dateEnd / description
        Previous value: -"Latest object date (year, inclusive). Negative integers for BCE. Requires dateBegin. The range is a partial index like the other filters: it omits some objects whose own record dates them inside it."New value: +"Latest object date (year, inclusive). Negative integers for BCE. Requires dateBegin."
      • changedInput schema / properties / departmentId / description
        Previous value: -"Restrict results to one curatorial department. Valid IDs come from met_list_departments — the Met exposes a sparse set (roughly 1–21, with gaps); an unrecognized ID is rejected with an invalid_department error rather than silently returning no matches. A partial index like the other filters: it omits some objects whose own record names the department. Can be combined with other filters; combining with isPublicDomain works but returns far fewer results than expected."New value: +"Restrict results to one curatorial department. Valid IDs come from met_list_departments — the Met exposes a sparse set (roughly 1–21, with gaps); an unrecognized ID is rejected with an invalid_department error rather than silently widening the search. Can be combined with other filters."
      • changedInput schema / properties / geoLocation / description
        Previous value: -"Filter by geographic origin. Each value is matched broadly against geography fields and artist nationality. Multiple values are AND-combined — [\"France\", \"Egypt\"] returns objects associated with both, not either, so more values narrow the result set. A partial index like the other filters: it omits some objects whose own geography fields name the location. Works best with the Egyptian Art, Greek and Roman Art, and similar departments that have well-populated geography fields."New value: +"Filter by geographic origin: one country, region, or city, as a one-element array (e.g., [\"France\"]). The value is matched broadly against geography fields and artist nationality. Works best with the Egyptian Art, Greek and Roman Art, and similar departments that have well-populated geography fields."
      • addedInput schema / properties / geoLocation / maxItems
        Added value: +1
      • changedInput schema / properties / hasImages / description
        Previous value: -"When true, restricts results to objects that have at least one associated image, including copyrighted works whose images cannot be reproduced. A partial index like every filter here: it omits some objects that do have images, so absence from the results is not evidence an object has none. isPublicDomain is the nearest filter for freely reusable CC0 images — confirm per object from the isPublicDomain and hasCC0Image fields on met_get_object."New value: +"When true, restricts results to objects that have at least one associated image, including copyrighted works whose images cannot be reproduced; false restricts them to objects with none. For freely reusable CC0 images, confirm per object from the isPublicDomain and hasCC0Image fields on met_get_object."
      • changedInput schema / properties / isHighlight / description
        Previous value: -"Opt-in filter, true only — omit it rather than passing false, which the upstream index answers unsoundly. Selects objects the Met has designated as highlights — major works central to the collection. A partial index like isPublicDomain: it omits objects whose own record reports isHighlight true, so absence from the results is not evidence a work is not a highlight."New value: +"Opt-in filter, true only — omit it rather than passing false, which the search ignores. Selects objects the Met has designated as highlights — major works central to the collection."
      • changedInput schema / properties / isOnView / description
        Previous value: -"When true, restricts results to objects currently on display in a Met gallery. A partial index like the other filters — it omits some objects that are on view, so absence from the results is not evidence a work is off display. The GalleryNumber field on the met_get_object record identifies the specific gallery."New value: +"When true, restricts results to objects currently on display in a Met gallery; false restricts them to objects not on view. The GalleryNumber field on the met_get_object record identifies the specific gallery."
      • removedInput schema / properties / isPublicDomain
        Removed value: -{
        -  "const": true,
        -  "description": "Opt-in filter, true only — omit it rather than passing false, which the upstream index answers unsoundly. Selects objects released under CC0 open access, which return direct high-resolution image URLs in met_get_object. A partial index, not exhaustive coverage: it omits objects whose own record reports isPublicDomain true — object 436580 matches the query \"sunflower\" and is public domain, yet the filtered search does not return it — so absence from the results is not evidence an object lacks CC0 status. Combining it with departmentId narrows it further; when a search returns nothing, retry without the filter.",
        -  "type": "boolean"
        -}
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of object IDs to return from the full result set. The Met search returns every match (up to tens of thousands); this caps how many IDs are returned."New value: +"Maximum number of object IDs to return in this page. Paging reaches only the first 10,000 matches, so a page that would cross 10,000 is cut short there."
      • changedInput schema / properties / medium / description
        Previous value: -"Filter by object classification (e.g., \"Paintings\", \"Drawings\", \"Prints\", \"Ceramics\", \"Sculpture\", \"Photographs\", \"Textiles\"). Maps to the classification field on the object, not the materials/medium text field — pass a classification category name, not a material description like \"Oil on canvas\". A partial index like the other filters: it omits some objects that carry the classification on their own record."New value: +"Filter by object classification, case-sensitive and spelled as the Met spells it (e.g., \"Paintings\", \"Drawings\", \"Prints\", \"Ceramics\", \"Sculpture\", \"Photographs\", \"Textiles\") — \"paintings\" or \"Painting\" matches nothing. Maps to the classification field on the object, not the materials text, so a material description like \"Oil on canvas\" matches nothing either; met_get_object returns an object’s classification."
      • changedInput schema / properties / offset / description
        Previous value: -"Zero-based index into the full result set to start from (default 0). The nextOffset from a previous response is the value to pass here for the next page; a broad query carries the same timeout risk on every page, so narrow it with filters if paging times out. An offset at or beyond total returns an empty page, not an error."New value: +"Zero-based index of the first match to return (default 0); pass the nextOffset from a previous response to continue paging. Only the first 10,000 matches are reachable, so an offset at or beyond 10,000, or at or beyond a nonzero total, returns an empty page rather than an error. Matches with tied relevance can change order between requests, so an ID can occasionally repeat or be skipped at a page boundary."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `no_results`: total is 0 — the API returned null objectIDs for the query, or nothing the filters returned also matched the query. `invalid_date_range`: dateBegin or dateEnd is provided without the other, or dateBegin > dateEnd. `invalid_filter`: q is whitespace-only, or medium or geoLocation was supplied blank — an empty array, or an entry with no non-whitespace characters. `invalid_department`: departmentId is provided but is not one of the Met department IDs. `search_timeout`: The keyword+filter result set is too large to download within the request timeout — a broad query with few or no filters. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_results`: total is 0 — no object matches the keyword, or none of its matches survives the filters. `invalid_date_range`: dateBegin or dateEnd is provided without the other, or dateBegin > dateEnd. `invalid_filter`: q is whitespace-only, or medium or geoLocation was supplied blank — an empty array, or an entry with no non-whitespace characters. `invalid_department`: departmentId is provided but is not one of the Met department IDs. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "no_results",
        -  "invalid_date_range",
        -  "invalid_filter",
        -  "invalid_department",
        -  "search_timeout"
        -]New value: +[
        +  "no_results",
        +  "invalid_date_range",
        +  "invalid_filter",
        +  "invalid_department"
        +]
      • changedOutput schema / properties / nextOffset / description
        Previous value: -"The offset to pass on the next call to continue paging, or null when the result set is exhausted (truncated is false)."New value: +"The offset to pass on the next call to continue paging, or null when no further page is reachable (truncated is false)."
      • changedOutput schema / properties / notice / description
        Previous value: -"Present only when a filtered search could not be checked against the unfiltered query. That check is best-effort; when it does not complete the page is returned uncorrected and may contain objects unrelated to the keyword."New value: +"Present only when total exceeds 10,000: states that only the first 10,000 matches are reachable by paging, and that filters or a more specific keyword bring the rest into reach."
      • changedOutput schema / properties / offset / description
        Previous value: -"The resolved offset this page was read from — the offset input after its default of 0. Compare it against total: when offset is greater than or equal to total the page is empty because the offset ran past the end of the result set, not because the query has nothing left to return."New value: +"The resolved offset this page was read from — the offset input after its default of 0. When it is at or beyond the smaller of total and 10,000, the page is empty because the offset ran past what paging reaches, not because the search found nothing."
      • changedOutput schema / properties / remaining / description
        Previous value: -"Count of matching object IDs after this page: total − (offset + returned), floored at 0. 0 means this is the last page."New value: +"Count of reachable matches after this page: the smaller of total and 10,000, minus (offset + returned), floored at 0. 0 means no further page exists."
      • changedOutput schema / properties / returned / description
        Previous value: -"Count of object IDs in this response — may be less than `total` when the full result set was truncated by `limit`."New value: +"Count of object IDs in this page."
      • changedOutput schema / properties / total / description
        Previous value: -"Total number of matching objects in the Met collection (may far exceed the returned IDs)."New value: +"Total number of objects in the Met collection matching the search. Can exceed 10,000, the most that paging reaches."
      • changedOutput schema / properties / truncated / description
        Previous value: -"True when matching IDs remain beyond this page (offset + returned < total); false when this page is the last."New value: +"True when reachable matches remain after this page (offset + returned < the smaller of total and 10,000); false when this page is the last one paging reaches."
  2. 1 tool update
    • Changedmet_search_collections11 fields changed
      • changedInput schema / properties / dateBegin / description
        Previous value: -"Earliest object date (year, inclusive). Negative integers for BCE (e.g., -500 for 500 BCE). Requires dateEnd."New value: +"Earliest object date (year, inclusive). Negative integers for BCE (e.g., -500 for 500 BCE). Requires dateEnd. The range is a partial index like the other filters: it omits some objects whose own record dates them inside it."
      • changedInput schema / properties / dateEnd / description
        Previous value: -"Latest object date (year, inclusive). Negative integers for BCE. Requires dateBegin."New value: +"Latest object date (year, inclusive). Negative integers for BCE. Requires dateBegin. The range is a partial index like the other filters: it omits some objects whose own record dates them inside it."
      • changedInput schema / properties / departmentId / description
        Previous value: -"Restrict results to one curatorial department. Valid IDs come from met_list_departments — the Met exposes a sparse set (roughly 1–21, with gaps); an unrecognized ID is rejected with an invalid_department error rather than silently returning no matches. Can be combined with other filters; combining with isPublicDomain works but returns far fewer results than expected."New value: +"Restrict results to one curatorial department. Valid IDs come from met_list_departments — the Met exposes a sparse set (roughly 1–21, with gaps); an unrecognized ID is rejected with an invalid_department error rather than silently returning no matches. A partial index like the other filters: it omits some objects whose own record names the department. Can be combined with other filters; combining with isPublicDomain works but returns far fewer results than expected."
      • changedInput schema / properties / geoLocation / description
        Previous value: -"Filter by geographic origin. Each value is matched broadly against geography fields and artist nationality. Multiple values are AND-combined — [\"France\", \"Egypt\"] returns objects associated with both, not either, so more values narrow the result set. Works best with the Egyptian Art, Greek and Roman Art, and similar departments that have well-populated geography fields."New value: +"Filter by geographic origin. Each value is matched broadly against geography fields and artist nationality. Multiple values are AND-combined — [\"France\", \"Egypt\"] returns objects associated with both, not either, so more values narrow the result set. A partial index like the other filters: it omits some objects whose own geography fields name the location. Works best with the Egyptian Art, Greek and Roman Art, and similar departments that have well-populated geography fields."
      • changedInput schema / properties / hasImages / description
        Previous value: -"When true, restricts results to objects that have at least one associated image, including copyrighted works whose images cannot be reproduced. isPublicDomain is the nearest filter for freely reusable CC0 images, but it is partial — confirm per object from the isPublicDomain and hasCC0Image fields on met_get_object."New value: +"When true, restricts results to objects that have at least one associated image, including copyrighted works whose images cannot be reproduced. A partial index like every filter here: it omits some objects that do have images, so absence from the results is not evidence an object has none. isPublicDomain is the nearest filter for freely reusable CC0 images — confirm per object from the isPublicDomain and hasCC0Image fields on met_get_object."
      • changedInput schema / properties / isHighlight / description
        Previous value: -"Opt-in filter, true only — omit it rather than passing false, which the upstream index answers unsoundly. Selects objects the Met has designated as highlights — major works central to the collection. Like isPublicDomain its results are not a subset of the unfiltered search: it omits objects whose own record reports isHighlight true, and adds a few highlights that do not match the query."New value: +"Opt-in filter, true only — omit it rather than passing false, which the upstream index answers unsoundly. Selects objects the Met has designated as highlights — major works central to the collection. A partial index like isPublicDomain: it omits objects whose own record reports isHighlight true, so absence from the results is not evidence a work is not a highlight."
      • changedInput schema / properties / isOnView / description
        Previous value: -"When true, restricts results to objects currently on display in a Met gallery. The GalleryNumber field on the met_get_object record identifies the specific gallery."New value: +"When true, restricts results to objects currently on display in a Met gallery. A partial index like the other filters — it omits some objects that are on view, so absence from the results is not evidence a work is off display. The GalleryNumber field on the met_get_object record identifies the specific gallery."
      • changedInput schema / properties / isPublicDomain / description
        Previous value: -"Opt-in filter, true only — omit it rather than passing false, which the upstream index answers unsoundly. Selects objects released under CC0 open access, which return direct high-resolution image URLs in met_get_object. Its results are not a subset of the same search run without it: it omits objects whose own record reports isPublicDomain true, and adds a few CC0 objects that do not match the query at all — check each returned record against the query before presenting it. Combining it with departmentId narrows it further; when a search returns nothing, retry without the filter."New value: +"Opt-in filter, true only — omit it rather than passing false, which the upstream index answers unsoundly. Selects objects released under CC0 open access, which return direct high-resolution image URLs in met_get_object. A partial index, not exhaustive coverage: it omits objects whose own record reports isPublicDomain true — object 436580 matches the query \"sunflower\" and is public domain, yet the filtered search does not return it — so absence from the results is not evidence an object lacks CC0 status. Combining it with departmentId narrows it further; when a search returns nothing, retry without the filter."
      • changedInput schema / properties / medium / description
        Previous value: -"Filter by object classification (e.g., \"Paintings\", \"Drawings\", \"Prints\", \"Ceramics\", \"Sculpture\", \"Photographs\", \"Textiles\"). Maps to the classification field on the object, not the materials/medium text field — pass a classification category name, not a material description like \"Oil on canvas\"."New value: +"Filter by object classification (e.g., \"Paintings\", \"Drawings\", \"Prints\", \"Ceramics\", \"Sculpture\", \"Photographs\", \"Textiles\"). Maps to the classification field on the object, not the materials/medium text field — pass a classification category name, not a material description like \"Oil on canvas\". A partial index like the other filters: it omits some objects that carry the classification on their own record."
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `no_results`: total is 0 — the API returned null objectIDs for this query+filter combination. `invalid_date_range`: dateBegin or dateEnd is provided without the other, or dateBegin > dateEnd. `invalid_filter`: q is whitespace-only, or medium or geoLocation was supplied blank — an empty array, or an entry with no non-whitespace characters. `invalid_department`: departmentId is provided but is not one of the Met department IDs. `search_timeout`: The result set is too large to download within the request timeout — a broad, unfiltered query. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_results`: total is 0 — the API returned null objectIDs for the query, or nothing the filters returned also matched the query. `invalid_date_range`: dateBegin or dateEnd is provided without the other, or dateBegin > dateEnd. `invalid_filter`: q is whitespace-only, or medium or geoLocation was supplied blank — an empty array, or an entry with no non-whitespace characters. `invalid_department`: departmentId is provided but is not one of the Met department IDs. `search_timeout`: The keyword+filter result set is too large to download within the request timeout — a broad query with few or no filters. Other values are possible when a failure originates below the handler."
      • addedOutput schema / properties / notice
        Added value: +{
        +  "description": "Present only when a filtered search could not be checked against the unfiltered query. That check is best-effort; when it does not complete the page is returned uncorrected and may contain objects unrelated to the keyword.",
        +  "type": "string"
        +}
  3. 1 tool update
    • Changedmet_get_object6 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"
        +]
  4. 1 tool update
    • Changedmet_get_object10 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"
  5. 1 tool update
    • Changedmet_search_collections9 fields changed
      • changedInput schema / properties / hasImages / description
        Previous value: -"When true, restricts results to objects that have at least one associated image, including copyrighted works whose images cannot be reproduced. isPublicDomain is the filter for freely reusable CC0 images."New value: +"When true, restricts results to objects that have at least one associated image, including copyrighted works whose images cannot be reproduced. isPublicDomain is the nearest filter for freely reusable CC0 images, but it is partial — confirm per object from the isPublicDomain and hasCC0Image fields on met_get_object."
      • addedInput schema / properties / isHighlight / const
        Added value: +true
      • changedInput schema / properties / isHighlight / description
        Previous value: -"When true, restricts to objects the Met has designated as highlights — major works central to the collection."New value: +"Opt-in filter, true only — omit it rather than passing false, which the upstream index answers unsoundly. Selects objects the Met has designated as highlights — major works central to the collection. Like isPublicDomain its results are not a subset of the unfiltered search: it omits objects whose own record reports isHighlight true, and adds a few highlights that do not match the query."
      • addedInput schema / properties / isPublicDomain / const
        Added value: +true
      • changedInput schema / properties / isPublicDomain / description
        Previous value: -"When true, restricts results to objects released under CC0 open access — free to use without permission or attribution. These objects return direct high-resolution image URLs in met_get_object. Combining with departmentId works but returns far fewer results, since the search index covers only a subset of public-domain objects per department."New value: +"Opt-in filter, true only — omit it rather than passing false, which the upstream index answers unsoundly. Selects objects released under CC0 open access, which return direct high-resolution image URLs in met_get_object. Its results are not a subset of the same search run without it: it omits objects whose own record reports isPublicDomain true, and adds a few CC0 objects that do not match the query at all — check each returned record against the query before presenting it. Combining it with departmentId narrows it further; when a search returns nothing, retry without the filter."
      • changedOutput schema / anyOf
        Previous value: -[
        -  {
        -    "not": {
        -      "required": [
        -        "error"
        -      ]
        -    },
        -    "required": [
        -      "total",
        -      "objectIDs",
        -      "returned",
        -      "truncated",
        -      "remaining",
        -      "nextOffset"
        -    ]
        -  },
        -  {
        -    "required": [
        -      "error"
        -    ]
        -  }
        -]New value: +[
        +  {
        +    "not": {
        +      "required": [
        +        "error"
        +      ]
        +    },
        +    "required": [
        +      "total",
        +      "objectIDs",
        +      "returned",
        +      "truncated",
        +      "remaining",
        +      "nextOffset",
        +      "offset"
        +    ]
        +  },
        +  {
        +    "required": [
        +      "error"
        +    ]
        +  }
        +]
      • changedOutput schema / properties / error / properties / data / properties / reason / description
        Previous value: -"Machine-readable failure mode. Declared by this tool: `no_results`: total is 0 — the API returned null objectIDs for this query+filter combination. `invalid_date_range`: dateBegin or dateEnd is provided without the other, or dateBegin > dateEnd. `invalid_department`: departmentId is provided but is not one of the Met department IDs. `search_timeout`: The result set is too large to download within the request timeout — a broad, unfiltered query. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_results`: total is 0 — the API returned null objectIDs for this query+filter combination. `invalid_date_range`: dateBegin or dateEnd is provided without the other, or dateBegin > dateEnd. `invalid_filter`: q is whitespace-only, or medium or geoLocation was supplied blank — an empty array, or an entry with no non-whitespace characters. `invalid_department`: departmentId is provided but is not one of the Met department IDs. `search_timeout`: The result set is too large to download within the request timeout — a broad, unfiltered query. Other values are possible when a failure originates below the handler."
      • changedOutput schema / properties / error / properties / data / properties / reason / examples
        Previous value: -[
        -  "no_results",
        -  "invalid_date_range",
        -  "invalid_department",
        -  "search_timeout"
        -]New value: +[
        +  "no_results",
        +  "invalid_date_range",
        +  "invalid_filter",
        +  "invalid_department",
        +  "search_timeout"
        +]
      • addedOutput schema / properties / offset
        Added value: +{
        +  "description": "The resolved offset this page was read from — the offset input after its default of 0. Compare it against total: when offset is greater than or equal to total the page is empty because the offset ran past the end of the result set, not because the query has nothing left to return.",
        +  "maximum": 9007199254740991,
        +  "minimum": -9007199254740991,
        +  "type": "integer"
        +}
  6. 3 tool updates
    • Changedmet_get_object6 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"
        -]
    • Changedmet_list_departments6 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": [
        +      "departments"
        +    ]
        +  },
        +  {
        +    "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.",
        +          "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: -[
        -  "departments"
        -]
    • Changedmet_search_collections7 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": [
        +      "total",
        +      "objectIDs",
        +      "returned",
        +      "truncated",
        +      "remaining",
        +      "nextOffset"
        +    ]
        +  },
        +  {
        +    "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_results`: total is 0 — the API returned null objectIDs for this query+filter combination. `invalid_date_range`: dateBegin or dateEnd is provided without the other, or dateBegin > dateEnd. `invalid_department`: departmentId is provided but is not one of the Met department IDs. `search_timeout`: The result set is too large to download within the request timeout — a broad, unfiltered query. Other values are possible when a failure originates below the handler.",
        +          "examples": [
        +            "no_results",
        +            "invalid_date_range",
        +            "invalid_department",
        +            "search_timeout"
        +          ],
        +          "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"
        +}
      • changedOutput schema / properties / objectIDs / description
        Previous value: -"Object IDs for the first `limit` results."New value: +"Object IDs for this page, up to `limit` results."
      • removedOutput schema / required
        Removed value: -[
        -  "total",
        -  "objectIDs",
        -  "returned",
        -  "truncated",
        -  "remaining",
        -  "nextOffset"
        -]
  7. 2 tool updates
    • Changedmet_get_object2 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)."
    • Changedmet_search_collections12 fields changed
      • changedInput schema / properties / departmentId / description
        Previous value: -"Restrict results to one curatorial department. Call met_list_departments to get valid IDs — the Met exposes a sparse set (roughly 1–21, with gaps), and an unrecognized ID is rejected with an invalid_department error rather than silently returning no matches. Can be combined with other filters; combining with isPublicDomain works but returns far fewer results than expected — use isPublicDomain alone when CC0 coverage is the goal."New value: +"Restrict results to one curatorial department. Valid IDs come from met_list_departments — the Met exposes a sparse set (roughly 1–21, with gaps); an unrecognized ID is rejected with an invalid_department error rather than silently returning no matches. Can be combined with other filters; combining with isPublicDomain works but returns far fewer results than expected."
      • changedInput schema / properties / geoLocation / description
        Previous value: -"Filter by geographic origin. Each value is matched broadly against geography fields and artist nationality. Multiple values are AND-combined — [\"France\", \"Egypt\"] returns objects associated with both, not either; use a single value for broader results. Works best with the Egyptian Art, Greek and Roman Art, and similar departments that have well-populated geography fields."New value: +"Filter by geographic origin. Each value is matched broadly against geography fields and artist nationality. Multiple values are AND-combined — [\"France\", \"Egypt\"] returns objects associated with both, not either, so more values narrow the result set. Works best with the Egyptian Art, Greek and Roman Art, and similar departments that have well-populated geography fields."
      • changedInput schema / properties / hasImages / description
        Previous value: -"When true, restricts results to objects that have at least one associated image. For freely reusable CC0 images, use isPublicDomain instead — hasImages includes copyrighted works whose images cannot be reproduced."New value: +"When true, restricts results to objects that have at least one associated image, including copyrighted works whose images cannot be reproduced. isPublicDomain is the filter for freely reusable CC0 images."
      • changedInput schema / properties / isHighlight / description
        Previous value: -"When true, restricts to objects the Met has designated as highlights — major works central to the collection. Use to surface iconic pieces rather than browsing the full corpus."New value: +"When true, restricts to objects the Met has designated as highlights — major works central to the collection."
      • changedInput schema / properties / isOnView / description
        Previous value: -"When true, restricts results to objects currently on display in a Met gallery. The GalleryNumber field on the met_get_object record identifies the specific gallery. Combine with a keyword to answer \"what is on display right now?\" — pairs well with isHighlight for must-see works."New value: +"When true, restricts results to objects currently on display in a Met gallery. The GalleryNumber field on the met_get_object record identifies the specific gallery."
      • changedInput schema / properties / isPublicDomain / description
        Previous value: -"When true, restricts results to objects released under CC0 open access — free to use without permission or attribution. These objects return direct high-resolution image URLs in met_get_object. Can be combined with departmentId but severely restricts results (the search index only indexes a subset of public-domain objects per department); prefer using isPublicDomain alone and filtering by department from the returned object records."New value: +"When true, restricts results to objects released under CC0 open access — free to use without permission or attribution. These objects return direct high-resolution image URLs in met_get_object. Combining with departmentId works but returns far fewer results, since the search index covers only a subset of public-domain objects per department."
      • changedInput schema / properties / limit / description
        Previous value: -"Maximum number of object IDs to return from the full result set. The API returns all matches (up to tens of thousands) — this caps what is handed back. Chain the returned IDs to met_get_object in batches of up to 20."New value: +"Maximum number of object IDs to return from the full result set. The Met search returns every match (up to tens of thousands); this caps how many IDs are returned."
      • changedInput schema / properties / offset / description
        Previous value: -"Zero-based index into the full result set to start from (default 0). Paginate by passing the nextOffset returned by a previous call; each page re-runs the upstream search and applies the offset locally, so a broad query carries the same timeout risk on every page — narrow it with filters if paging times out. An offset at or beyond total returns an empty page, not an error."New value: +"Zero-based index into the full result set to start from (default 0). The nextOffset from a previous response is the value to pass here for the next page; a broad query carries the same timeout risk on every page, so narrow it with filters if paging times out. An offset at or beyond total returns an empty page, not an error."
      • changedInput schema / properties / q / description
        Previous value: -"Keyword query. Searched across title, artist name, culture, medium, tags, and other text fields. Use concise, specific terms — broad queries return large ID sets. Tip: departmentId and geoLocation sharpen results far more than a longer query string."New value: +"Keyword query, matched across title, artist name, culture, medium, tags, and other text fields. Broad terms return large ID sets."
      • changedOutput schema / properties / objectIDs / description
        Previous value: -"Object IDs for the first `limit` results. Pass to met_get_object (up to 20 at a time) to retrieve full records."New value: +"Object IDs for the first `limit` results."
      • changedOutput schema / properties / objectIDs / items / description
        Previous value: -"A Met object ID. Pass to met_get_object to retrieve the full record."New value: +"A Met object ID."
      • changedOutput schema / properties / truncated / description
        Previous value: -"True when matching IDs remain beyond this page (offset + returned < total). Pass nextOffset as offset to fetch the next page, increase limit, or refine filters to narrow results."New value: +"True when matching IDs remain beyond this page (offset + returned < total); false when this page is the last."
  8. 1 tool update
    • Changedmet_search_collections6 fields changed
      • changedInput schema / properties / departmentId / description
        Previous value: -"Restrict results to one curatorial department. Use met_list_departments to get valid IDs (1–21, not all integers are valid). Can be combined with other filters; combining with isPublicDomain works but returns far fewer results than expected — use isPublicDomain alone when CC0 coverage is the goal."New value: +"Restrict results to one curatorial department. Call met_list_departments to get valid IDs — the Met exposes a sparse set (roughly 1–21, with gaps), and an unrecognized ID is rejected with an invalid_department error rather than silently returning no matches. Can be combined with other filters; combining with isPublicDomain works but returns far fewer results than expected — use isPublicDomain alone when CC0 coverage is the goal."
      • addedInput schema / properties / offset
        Added value: +{
        +  "default": 0,
        +  "description": "Zero-based index into the full result set to start from (default 0). Paginate by passing the nextOffset returned by a previous call; each page re-runs the upstream search and applies the offset locally, so a broad query carries the same timeout risk on every page — narrow it with filters if paging times out. An offset at or beyond total returns an empty page, not an error.",
        +  "maximum": 9007199254740991,
        +  "minimum": 0,
        +  "type": "integer"
        +}
      • addedOutput schema / properties / nextOffset
        Added value: +{
        +  "anyOf": [
        +    {
        +      "maximum": 9007199254740991,
        +      "minimum": -9007199254740991,
        +      "type": "integer"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "description": "The offset to pass on the next call to continue paging, or null when the result set is exhausted (truncated is false)."
        +}
      • addedOutput schema / properties / remaining
        Added value: +{
        +  "description": "Count of matching object IDs after this page: total − (offset + returned), floored at 0. 0 means this is the last page.",
        +  "maximum": 9007199254740991,
        +  "minimum": -9007199254740991,
        +  "type": "integer"
        +}
      • changedOutput schema / properties / truncated / description
        Previous value: -"True when total > returned. Increase `limit`, refine filters, or add keywords to narrow results."New value: +"True when matching IDs remain beyond this page (offset + returned < total). Pass nextOffset as offset to fetch the next page, increase limit, or refine filters to narrow results."
      • changedOutput schema / required
        Previous value: -[
        -  "total",
        -  "objectIDs",
        -  "returned",
        -  "truncated"
        -]New value: +[
        +  "total",
        +  "objectIDs",
        +  "returned",
        +  "truncated",
        +  "remaining",
        +  "nextOffset"
        +]
  9. 4 tool updates
    • Changedmet_get_object3 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."
    • Changedmet_list_departments1 field changed
      • changedOutput schema / properties / departments / items / properties / departmentId / description
        Previous value: -"Numeric department ID for use in the met_search departmentId parameter."New value: +"Numeric department ID for use in the met_search_collections departmentId parameter."
    • Removedmet_search
    • Addedmet_search_collections
  10. 1 tool update
    • Changedmet_get_object3 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"
        +]
  11. 3 tool updates
    • First observedmet_get_object
    • First observedmet_list_departments
    • First observedmet_search

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    Federated, license-verified search across open-access museum collections — currently The Met, Cleveland, AIC, Wikimedia Commons, and Europeana, with more being added. Strict-default-deny rights gate accepts only CC0 / Public Domain Mark, returning reuse-safe artwork with citations in three styles.
    5
    117 npm
    13
    MIT
  • A
    license
    A
    quality
    D
    maintenance
    MCP server for searching museum collections and viewing artwork images and metadata from multiple museums, including the Met, Art Institute of Chicago, Rijksmuseum, and more.
    2
    4
    7 npm
    2
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    A MCP Server that lets user ask AI models to discover the collection of the Metropolitan Museum of Art. Adds the discovered art works as Resources on the server.
    4
    242 npm
    35
    MIT
  • F
    license
    A
    quality
    C
    maintenance
    This server enables AI models to access the Städel Museum's digital collection via OAI-PMH, allowing harvesting of records, retrieval of multilingual metadata, and fetching of high-resolution images.
    4
    2
    -
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.