met-museum-mcp-server
Server Details
Search the Met collection, browse by department or update date, fetch full records and CC0 images.
- Status
- Healthy
- Uptime
- 99.9% over 60 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
Scored across 4 tools
Each tool targets a distinct operation: retrieval by ID (met_get_object), keyword search (met_search_collections), non-keyword browsing (met_list_objects), and a reference lookup (met_list_departments). The descriptions explicitly cross-reference each other and state when to use search vs. browse, leaving little room for misselection.
All four tools follow a uniform met_verb_noun pattern (met_get_object, met_list_departments, met_list_objects, met_search_collections). The convention is fully predictable throughout.
Four tools is on the lean side, but it cleanly mirrors the Met's public read-only API (object, objects, search, departments). Each tool earns its place with no redundancy, though the surface is small enough to feel slightly thin.
The read-only surface is well covered: retrieval, keyword search, filtered browsing, department reference, and pagination are all present. Only minor gaps exist, such as no random-object convenience call, but nothing that would block core browse-and-fetch workflows.
Available Tools
4 toolsmet_get_objectGet Met ObjectsRead-onlyIdempotentInspect
Fetch full records for one or more Met Museum object IDs. Fetches up to 20 distinct IDs per call; a list of up to 500 (a full search or list page) is accepted, and the distinct IDs past the first 20 come back unrequested in remainingIDs for a follow-up call. 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 (keyword search) or met_list_objects (browse by department or update date). 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. Set includeImages to also receive the CC0 images of up to 3 returned records as image content a vision-capable model can look at.
| Name | Required | Description | Default |
|---|---|---|---|
| objectIDs | Yes | One or more Met object IDs to fetch, up to 500 — a full met_search_collections or met_list_objects page. A repeated ID is fetched and returned once, at its first position. The first 20 distinct IDs are fetched; the rest come back unrequested in remainingIDs. Partial failures are reported per ID rather than failing the whole batch. | |
| includeImages | No | Also attach the web-display image (primaryImageSmall, about 600 px on the long edge) of the first 3 returned records that have hasCC0Image true, in request order, as image blocks in content[], each after a caption naming its objectID. images[] reports what happened for every returned record. The image bytes ride content[] only, so a client that hands the model only structuredContent will not show the images. Default false: no image is fetched. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| failed | No | Object IDs that failed to fetch with per-ID error context. |
| images | No | Image outcome for each record in objects[], in request order; deferred, failed, and remainingIDs get no entry. Present only when includeImages is true. |
| notice | No | Present when the call held more than 20 distinct object IDs, or when the batch byte budget deferred a record; both apply as one string, the remainingIDs sentence first. Past the cap it says how many IDs were requested and that the rest are in remainingIDs; for deferred records, how to retrieve them, with the budget applied. |
| objects | No | Successfully fetched objects. |
| deferred | No | 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. |
| remainingIDs | No | The distinct object IDs past the first 20, in request order. These were not requested, unlike deferred[] (fetched, withheld by the byte budget) and the failed[] entries an upstream block, throttle, or outage left unrequested. Re-call met_get_object with them. Absent when the call held 20 or fewer distinct IDs. |
met_list_departmentsList Met DepartmentsRead-onlyIdempotentInspect
Return the 19 curatorial departments at The Metropolitan Museum of Art, each with its numeric departmentId and display name — the valid values for the departmentId filter on met_search_collections and met_list_objects.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| departments | No | All 19 curatorial departments at The Metropolitan Museum of Art. |
met_list_objectsList Met ObjectsRead-onlyIdempotentInspect
Browse the Metropolitan Museum of Art collection without a keyword: every object ID in one curatorial department, every object whose record was created or revised on or after a date, or both together. Returns the total count and one page of IDs in ascending order, which met_get_object resolves to full records. With no filter the list is the whole collection (over 500,000 IDs). departmentId takes an ID from met_list_departments; updatedSince takes a YYYY-MM-DD date and answers "what has the Met added or revised since this day". Paging has no depth limit — pass nextOffset to continue. For keyword, classification, place, or object-date filters use met_search_collections instead. A list is cached for up to an hour, so a record revised within the last hour may not appear yet.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of object IDs to return in this page. A page holds at most 500 IDs: a larger value, up to 10,000, reads a 500-ID page and the notice says so — continue from nextOffset. | |
| offset | No | Zero-based index of the first ID to return (default 0); pass the nextOffset from a previous response to continue paging. IDs are in ascending order and every one is reachable; an offset at or past total returns an empty page rather than an error. | |
| departmentId | No | Restrict the list 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 answered with an empty list. | |
| updatedSince | No | List only objects whose record was created or revised on or after this date, the day itself included, as YYYY-MM-DD (e.g., "2026-09-01") — no time part and no other date format. It compares the UTC date of each record's metadataDate, which met_get_object returns. A date later than the newest update returns an empty list, not an error. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| total | No | Total number of objects matching the filters. Paging reaches every one of them — there is no 10,000 window here. |
| notice | No | Present when total is 0: names the filters that matched nothing and how to widen the list. Also present when a limit above 500 was read as a 500-ID page with IDs still remaining: says the page was read with limit 500 and to continue from nextOffset. |
| offset | No | The resolved offset this page was read from — the offset input after its default of 0. When it is at or beyond a nonzero total, the page is empty because the offset ran past the list, not because nothing matched. |
| returned | No | Count of object IDs in this page. |
| objectIDs | No | Object IDs for this page in ascending order, up to `limit` results and never more than 500. |
| remaining | No | Count of IDs after this page: total minus (offset + returned), floored at 0. 0 means no further page exists. |
| truncated | No | True when IDs remain after this page (offset + returned < total); false when this page ends the list. |
| nextOffset | No | The offset to pass on the next call to continue paging, or null when this page ends the list (truncated is false). |
| effectiveQuery | No | The filters as applied, as name=value pairs with JSON-encoded values — an updatedSince before 1753-01-01 shows as 1753-01-01, the date sent — or "no filter (whole collection)". limit and offset are left out. |
met_search_collectionsSearch Met CollectionRead-onlyIdempotentInspect
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.
| Name | Required | Description | Default |
|---|---|---|---|
| q | Yes | Keyword query, matched across title, artist name, culture, medium, tags, and other text fields; matchField narrows the match to titles or tags. Broad terms return large ID sets. "*" matches every object, for a search narrowed by filters alone; paging still reaches only the first 10,000 matches. An accession number (e.g., "29.100.5") ranks its object first, with near-numbered objects after it — confirm the match from accessionNumber on met_get_object. | |
| limit | No | Maximum number of object IDs to return in this page. A page holds at most 500 IDs, the Met search maximum: a larger value, up to 10,000, reads a 500-ID page and the notice says so — continue from nextOffset. Paging reaches only the first 10,000 matches, so a page that would cross 10,000 is cut short there. | |
| medium | No | 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. | |
| offset | No | 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 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. | |
| dateEnd | No | Latest object date (year, inclusive). Negative integers for BCE. Requires dateBegin. | |
| isOnView | No | 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. | |
| dateBegin | No | Earliest object date (year, inclusive). Negative integers for BCE (e.g., -500 for 500 BCE). Requires dateEnd. | |
| hasImages | No | 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. | |
| matchField | No | Restrict the keyword match to one field: "title" matches object titles only, "tags" matches subject tags only. Omit it to match across all text fields. Combines with every filter. Has no effect when q is "*". | |
| geoLocation | No | 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. | |
| isHighlight | No | 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. | |
| departmentId | No | 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. The Met searches 7 (The Cloisters) and 17 (Medieval Art) as one combined result set: for either, objectIDs keeps only the requested department's matches while total and paging count both, so a page can hold fewer than limit IDs while more remain. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| total | No | Total number of objects in the Met collection matching the search. Can exceed 10,000, the most that paging reaches. |
| notice | No | Present when total is 0, when total exceeds 10,000, when a limit above 500 was read as a 500-ID page with matches still remaining, or when departmentId is 7 or 17; several apply as one string. For a limit above 500 it says the page was read with limit 500 and to continue from nextOffset. With total 0 it says whether the keyword matches nothing or the filters removed every match, naming the filters to correct or drop. Above 10,000 it 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. For departmentId 7 or 17 it states that total counts both departments and a page can hold fewer than limit IDs, or that the department filter could not be applied to this page. |
| offset | No | The resolved offset this page was read from — the offset input after its default of 0. When it is nonzero and 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. |
| returned | No | Count of object IDs in this page. |
| objectIDs | No | Object IDs for this page, up to `limit` results and never more than 500. For departmentId 7 or 17, only the requested department's matches among the positions this page read, so it can hold fewer than `limit`, or none, while more remain. |
| remaining | No | Count of reachable matches after this page: the smaller of total and 10,000, minus (offset + the positions this page read), floored at 0 — positions read as described under truncated. An empty page reports 0. 0 means no further page exists. |
| truncated | No | True when reachable matches remain after this page (offset + the positions this page read < the smaller of total and 10,000); false when this page is the last one paging reaches. The positions read equal returned, except for departmentId 7 or 17, where they also count the matches the department filter left out. An empty page reports false: it ends paging even inside that window. |
| nextOffset | No | The offset to pass on the next call to continue paging, or null when no further page is reachable (truncated is false): offset plus the positions this page read, which for departmentId 7 or 17 can exceed returned. |
| effectiveQuery | No | The search as applied: q and each filter set, as name=value pairs with JSON-encoded values in parameter order, without limit or offset. |
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
4 tool updates
- Changed
met_get_object10 fields changed- changed
Input schema / properties / objectIDs / descriptionPrevious value: -"One or more Met object IDs to fetch. Maximum 20 per call. IDs come from met_search_collections or met_list_objects. A repeated ID is fetched and returned once, at its first position. Partial failures are reported per ID rather than failing the whole batch."New value: +"One or more Met object IDs to fetch, up to 500 — a full met_search_collections or met_list_objects page. A repeated ID is fetched and returned once, at its first position. The first 20 distinct IDs are fetched; the rest come back unrequested in remainingIDs. Partial failures are reported per ID rather than failing the whole batch." - changed
Input schema / properties / objectIDs / maxItemsPrevious value: -20New value: +500 - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"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`: No object was fetched, no failure was a firewall block or a 500/502/503/504 outage, and the failures were neither all 404s nor all time-budget expiries — network errors, other HTTP errors, or 404s beside expiries. `upstream_blocked`: No object was fetched and the Met API's firewall refused requests with HTTP 403 — it blocks this server's address, not one object. `upstream_unavailable`: No object was fetched and a fetch exhausted its retries on HTTP 500, 502, 503, or 504 — an outage on the Met API's side, not a problem with the IDs. `retry_deadline_exceeded`: No object was fetched and every fetch ran out of the call's time budget, retries and backoff included — an ID whose fetch would have started after the budget was spent counts too. Other values are possible when a failure originates below the handler."New value: +"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`: No object was fetched, no failure was a firewall block, an HTTP 429 rate limit, or a 500/502/503/504 outage, and the failures were neither all 404s nor all time-budget expiries — network errors, other HTTP errors, or 404s beside expiries. `upstream_blocked`: No object was fetched and the Met API's firewall refused requests with HTTP 403 — it blocks this server's address, not one object. `upstream_rate_limited`: No object was fetched and the Met API answered HTTP 429 until a fetch's retries ran out, or asked for a wait longer than the retries or the call's time budget allow — it throttles this server's address, not one object. `upstream_unavailable`: No object was fetched and a fetch exhausted its retries on HTTP 500, 502, 503, or 504 — an outage on the Met API's side, not a problem with the IDs. `retry_deadline_exceeded`: No object was fetched and every fetch ran out of the call's time budget, retries and backoff included — an ID whose fetch would have started after the budget was spent counts too. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "all_not_found", - "all_failed", - "upstream_blocked", - "upstream_unavailable", - "retry_deadline_exceeded" -]New value: +[ + "all_not_found", + "all_failed", + "upstream_blocked", + "upstream_rate_limited", + "upstream_unavailable", + "retry_deadline_exceeded" +] - changed
Output schema / properties / images / descriptionPrevious value: -"Image outcome for each record in objects[], in request order; deferred and failed IDs get no entry. Present only when includeImages is true."New value: +"Image outcome for each record in objects[], in request order; deferred, failed, and remainingIDs get no entry. Present only when includeImages is true." - changed
Output schema / properties / notice / descriptionPrevious value: -"How to retrieve the deferred records, with the budget applied. Present only when the batch byte budget deferred a record."New value: +"Present when the call held more than 20 distinct object IDs, or when the batch byte budget deferred a record; both apply as one string, the remainingIDs sentence first. Past the cap it says how many IDs were requested and that the rest are in remainingIDs; for deferred records, how to retrieve them, with the budget applied." - added
Output schema / properties / objects / items / properties / portfolioAdded value: +{ + "description": "Print series or portfolio the object belongs to, with its plate or number (e.g., \"Birds of America, plate LXXI\"). Often empty.", + "type": "string" +} - added
Output schema / properties / objects / items / properties / reignAdded value: +{ + "description": "Reign the object dates to, for applicable cultures (e.g., \"Joint reign of Hatshepsut and Thutmose III\"). Often empty.", + "type": "string" +} - changed
Output schema / properties / objects / items / requiredPrevious value: -[ - "objectID", - "title", - "isPublicDomain", - "hasCC0Image", - "primaryImage", - "primaryImageSmall", - "additionalImages", - "objectURL", - "department", - "departmentId", - "objectName", - "classification", - "isHighlight", - "isTimelineWork", - "artistPrefix", - "artistDisplayName", - "artistSuffix", - "artistRole", - "artistDisplayBio", - "artistNationality", - "artistBeginDate", - "artistEndDate", - "constituents", - "objectDate", - "objectBeginDate", - "objectEndDate", - "medium", - "dimensions", - "culture", - "period", - "dynasty", - "accessionNumber", - "accessionYear", - "creditLine", - "rightsAndReproduction", - "country", - "region", - "geography", - "measurements", - "tags", - "objectWikidata_URL", - "GalleryNumber", - "metadataDate" -]New value: +[ + "objectID", + "title", + "isPublicDomain", + "hasCC0Image", + "primaryImage", + "primaryImageSmall", + "additionalImages", + "objectURL", + "department", + "departmentId", + "objectName", + "classification", + "isHighlight", + "isTimelineWork", + "artistPrefix", + "artistDisplayName", + "artistSuffix", + "artistRole", + "artistDisplayBio", + "artistNationality", + "artistBeginDate", + "artistEndDate", + "constituents", + "objectDate", + "objectBeginDate", + "objectEndDate", + "medium", + "dimensions", + "culture", + "period", + "dynasty", + "reign", + "portfolio", + "accessionNumber", + "accessionYear", + "creditLine", + "rightsAndReproduction", + "country", + "region", + "geography", + "measurements", + "tags", + "objectWikidata_URL", + "GalleryNumber", + "metadataDate" +] - added
Output schema / properties / remainingIDsAdded value: +{ + "description": "The distinct object IDs past the first 20, in request order. These were not requested, unlike deferred[] (fetched, withheld by the byte budget) and the failed[] entries an upstream block, throttle, or outage left unrequested. Re-call met_get_object with them. Absent when the call held 20 or fewer distinct IDs.", + "items": { + "description": "A distinct object ID past the per-call cap.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "type": "array" +}
- Changed
met_list_departments2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `upstream_blocked`: The Met API's firewall refused the request with HTTP 403 — it blocks this server's address, not one endpoint. `upstream_unavailable`: The Met API answered HTTP 500, 502, 503, or 504 until the retry ladder ran out — an outage on its side. `retry_deadline_exceeded`: The call's time budget ran out, retries and backoff included, before the Met API returned a successful response. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `upstream_blocked`: The Met API's firewall refused the request with HTTP 403 — it blocks this server's address, not one endpoint. `upstream_unavailable`: The Met API answered HTTP 500, 502, 503, or 504 until the retry ladder ran out — an outage on its side. `upstream_rate_limited`: The Met API answered HTTP 429 until the retry ladder ran out, or asked for a wait longer than the ladder or the call's time budget allows — it throttles this server's address, not one endpoint. `retry_deadline_exceeded`: The call's time budget ran out, retries and backoff included, before the Met API returned a successful response. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "upstream_blocked", - "upstream_unavailable", - "retry_deadline_exceeded" -]New value: +[ + "upstream_blocked", + "upstream_unavailable", + "upstream_rate_limited", + "retry_deadline_exceeded" +]
- Changed
met_list_objects6 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of object IDs to return in this page."New value: +"Maximum number of object IDs to return in this page. A page holds at most 500 IDs: a larger value, up to 10,000, reads a 500-ID page and the notice says so — continue from nextOffset." - changed
Input schema / properties / limit / maximumPrevious value: -500New value: +10000 - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `invalid_department`: departmentId is provided but is not one of the Met department IDs. `invalid_date`: updatedSince has the YYYY-MM-DD shape but names no calendar day, such as 2026-02-30. `upstream_blocked`: The Met API's firewall refused the request with HTTP 403 — it blocks this server's address, not one endpoint. `upstream_unavailable`: The Met API answered HTTP 500, 502, 503, or 504 to the department lookup or the ID list until the retry ladder ran out — an outage on its side. `retry_deadline_exceeded`: The call's time budget ran out, retries and backoff included, before the Met API returned a successful response to the department lookup or the ID list. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_department`: departmentId is provided but is not one of the Met department IDs. `invalid_date`: updatedSince has the YYYY-MM-DD shape but names no calendar day, such as 2026-02-30. `upstream_blocked`: The Met API's firewall refused the request with HTTP 403 — it blocks this server's address, not one endpoint. `upstream_unavailable`: The Met API answered HTTP 500, 502, 503, or 504 to the department lookup or the ID list until the retry ladder ran out — an outage on its side. `upstream_rate_limited`: The Met API answered HTTP 429 to the department lookup or the ID list until the retry ladder ran out, or asked for a wait longer than the ladder or the call's time budget allows — it throttles this server's address, not one filter. `retry_deadline_exceeded`: The call's time budget ran out, retries and backoff included, before the Met API returned a successful response to the department lookup or the ID list. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "invalid_department", - "invalid_date", - "upstream_blocked", - "upstream_unavailable", - "retry_deadline_exceeded" -]New value: +[ + "invalid_department", + "invalid_date", + "upstream_blocked", + "upstream_unavailable", + "upstream_rate_limited", + "retry_deadline_exceeded" +] - changed
Output schema / properties / notice / descriptionPrevious value: -"Present only when total is 0: names the filters that matched nothing and how to widen the list."New value: +"Present when total is 0: names the filters that matched nothing and how to widen the list. Also present when a limit above 500 was read as a 500-ID page with IDs still remaining: says the page was read with limit 500 and to continue from nextOffset." - changed
Output schema / properties / objectIDs / descriptionPrevious value: -"Object IDs for this page in ascending order, up to `limit` results."New value: +"Object IDs for this page in ascending order, up to `limit` results and never more than 500."
- Changed
met_search_collections6 fields changed- changed
Input schema / properties / limit / descriptionPrevious 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."New value: +"Maximum number of object IDs to return in this page. A page holds at most 500 IDs, the Met search maximum: a larger value, up to 10,000, reads a 500-ID page and the notice says so — continue from nextOffset. Paging reaches only the first 10,000 matches, so a page that would cross 10,000 is cut short there." - changed
Input schema / properties / limit / maximumPrevious value: -500New value: +10000 - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `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. `upstream_blocked`: The Met API's firewall refused the request with HTTP 403 — it blocks this server's address, not one endpoint. `upstream_unavailable`: The Met API answered HTTP 500, 502, 503, or 504 to the department lookup or the search until the retry ladder ran out — an outage on its side. `retry_deadline_exceeded`: The call's time budget ran out, retries and backoff included, before the Met API returned a successful response to the department lookup or the search. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `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. `upstream_blocked`: The Met API's firewall refused the request with HTTP 403 — it blocks this server's address, not one endpoint. `upstream_unavailable`: The Met API answered HTTP 500, 502, 503, or 504 to the department lookup or the search until the retry ladder ran out — an outage on its side. `upstream_rate_limited`: The Met API answered HTTP 429 to the department lookup or the search until the retry ladder ran out, or asked for a wait longer than the ladder or the call's time budget allows — it throttles this server's address, not one query. `retry_deadline_exceeded`: The call's time budget ran out, retries and backoff included, before the Met API returned a successful response to the department lookup or the search. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "invalid_date_range", - "invalid_filter", - "invalid_department", - "upstream_blocked", - "upstream_unavailable", - "retry_deadline_exceeded" -]New value: +[ + "invalid_date_range", + "invalid_filter", + "invalid_department", + "upstream_blocked", + "upstream_unavailable", + "upstream_rate_limited", + "retry_deadline_exceeded" +] - changed
Output schema / properties / notice / descriptionPrevious value: -"Present when total is 0, when total exceeds 10,000, or when departmentId is 7 or 17; several apply as one string. With total 0 it says whether the keyword matches nothing or the filters removed every match, naming the filters to correct or drop. Above 10,000 it 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. For departmentId 7 or 17 it states that total counts both departments and a page can hold fewer than limit IDs, or that the department filter could not be applied to this page."New value: +"Present when total is 0, when total exceeds 10,000, when a limit above 500 was read as a 500-ID page with matches still remaining, or when departmentId is 7 or 17; several apply as one string. For a limit above 500 it says the page was read with limit 500 and to continue from nextOffset. With total 0 it says whether the keyword matches nothing or the filters removed every match, naming the filters to correct or drop. Above 10,000 it 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. For departmentId 7 or 17 it states that total counts both departments and a page can hold fewer than limit IDs, or that the department filter could not be applied to this page." - changed
Output schema / properties / objectIDs / descriptionPrevious value: -"Object IDs for this page, up to `limit` results. For departmentId 7 or 17, only the requested department's matches among the positions this page read, so it can hold fewer than `limit`, or none, while more remain."New value: +"Object IDs for this page, up to `limit` results and never more than 500. For departmentId 7 or 17, only the requested department's matches among the positions this page read, so it can hold fewer than `limit`, or none, while more remain."
4 tool updates
- Changed
met_get_object17 fields changed- added
Input schema / properties / includeImagesAdded value: +{ + "default": false, + "description": "Also attach the web-display image (primaryImageSmall, about 600 px on the long edge) of the first 3 returned records that have hasCC0Image true, in request order, as image blocks in content[], each after a caption naming its objectID. images[] reports what happened for every returned record. The image bytes ride content[] only, so a client that hands the model only structuredContent will not show the images. Default false: no image is fetched.", + "type": "boolean" +} - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"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. `upstream_blocked`: No object was fetched and the Met API's firewall refused requests with HTTP 403 — it blocks this server's address, not one object. `retry_deadline_exceeded`: No object was fetched and every fetch ran out of the call's time budget, retries and backoff included — an ID whose fetch would have started after the budget was spent counts too. Other values are possible when a failure originates below the handler."New value: +"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`: No object was fetched, no failure was a firewall block or a 500/502/503/504 outage, and the failures were neither all 404s nor all time-budget expiries — network errors, other HTTP errors, or 404s beside expiries. `upstream_blocked`: No object was fetched and the Met API's firewall refused requests with HTTP 403 — it blocks this server's address, not one object. `upstream_unavailable`: No object was fetched and a fetch exhausted its retries on HTTP 500, 502, 503, or 504 — an outage on the Met API's side, not a problem with the IDs. `retry_deadline_exceeded`: No object was fetched and every fetch ran out of the call's time budget, retries and backoff included — an ID whose fetch would have started after the budget was spent counts too. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "all_not_found", - "all_failed", - "upstream_blocked", - "retry_deadline_exceeded" -]New value: +[ + "all_not_found", + "all_failed", + "upstream_blocked", + "upstream_unavailable", + "retry_deadline_exceeded" +] - added
Output schema / properties / imagesAdded value: +{ + "description": "Image outcome for each record in objects[], in request order; deferred and failed IDs get no entry. Present only when includeImages is true.", + "items": { + "additionalProperties": false, + "description": "A returned record's image outcome.", + "properties": { + "objectID": { + "description": "Object ID of a returned record.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "status": { + "description": "attached: the image rides content[], after a caption naming the objectID. no_cc0_image: the record has no CC0 image, so nothing was fetched. over_cap: 3 earlier CC0 records took the image slots — request this ID among the first 3 CC0 records of another call to see its image. unavailable: the image host returned no image in time, or the URL was not on the Met image host.", + "enum": [ + "attached", + "no_cc0_image", + "over_cap", + "unavailable" + ], + "type": "string" + } + }, + "required": [ + "objectID", + "status" + ], + "type": "object" + }, + "type": "array" +} - added
Output schema / properties / objects / items / properties / accessionYearAdded value: +{ + "description": "Year the Met acquired the object, as sent (e.g., \"1960\") — occasionally a full date (e.g., \"2005-02-15\"). Can differ from the year in creditLine. Empty when the Met records none.", + "type": "string" +} - changed
Output schema / properties / objects / items / properties / artistBeginDate / descriptionPrevious value: -"Artist birth year, or a firm's founding year, as a string (e.g., \"1853\"). Occasionally a full date (e.g., \"1928-01-10\"). Empty for anonymous works."New value: +"Birth year of the person artistDisplayName names, or a firm's founding year, as a string (e.g., \"1853\") — that person's even when artistPrefix qualifies the attribution. Occasionally a full date (e.g., \"1928-01-10\"). Empty for anonymous works." - changed
Output schema / properties / objects / items / properties / artistDisplayName / descriptionPrevious value: -"Primary artist name as displayed (e.g., \"Vincent van Gogh\"). Empty for anonymous or unknown works."New value: +"Name of the person or firm the attribution names (e.g., \"Vincent van Gogh\"), without the qualifier in artistPrefix or the text in artistSuffix — read those and artistRole with it. Empty for anonymous or unknown works." - changed
Output schema / properties / objects / items / properties / artistEndDate / descriptionPrevious value: -"Artist death year, or a firm's closing year, as a string (e.g., \"1890\"). Occasionally a full date (e.g., \"1928-01-10\"). Empty for a living artist, a firm still active, or an anonymous work."New value: +"Death year of the person artistDisplayName names, or a firm's closing year, as a string (e.g., \"1890\") — that person's even when artistPrefix qualifies the attribution. Occasionally a full date (e.g., \"1928-01-10\"). Empty for a living artist, a firm still active, or an anonymous work." - added
Output schema / properties / objects / items / properties / artistPrefixAdded value: +{ + "description": "Qualifier the Met places before artistDisplayName (e.g., \"Style of\", \"Workshop of\", \"Attributed to\", \"Published by\"). Read the two together: \"Style of\" with \"Rembrandt\" is a work in Rembrandt's style, not one by him. Empty when the attribution is unqualified.", + "type": "string" +} - added
Output schema / properties / objects / items / properties / artistRoleAdded value: +{ + "description": "The named person's role for this object (e.g., \"Artist\", \"Maker\", \"Publisher\", \"Patron\") — a patron or publisher is not the maker. Empty when the record names no one.", + "type": "string" +} - added
Output schema / properties / objects / items / properties / artistSuffixAdded value: +{ + "description": "Text the Met places after artistDisplayName (e.g., \"(r. 1876–1909)\", \", Paris\", \"(?)\"). Empty when the Met records none.", + "type": "string" +} - changed
Output schema / properties / objects / items / properties / department / descriptionPrevious value: -"Curatorial department (e.g., \"European Paintings\", \"Egyptian Art\")."New value: +"Curatorial department as the record names it (e.g., \"European Paintings\", \"Egyptian Art\"). Five departments carry a different name on their records than in met_list_departments — \"The American Wing\", \"The Michael C. Rockefeller Wing\", \"Costume Institute\", \"Robert Lehman Collection\", \"Modern and Contemporary Art\" — so match departments by departmentId, not by name." - added
Output schema / properties / objects / items / properties / departmentIdAdded value: +{ + "anyOf": [ + { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + { + "type": "null" + } + ], + "description": "The department's numeric ID, resolved from department, for the departmentId filter of met_list_objects and met_search_collections. Null when the record's department name was not recognized — never a guess." +} - added
Output schema / properties / objects / items / properties / metadataDateAdded value: +{ + "description": "When the Met last created or revised this record: an ISO 8601 UTC timestamp, as sent (e.g., \"2026-10-01T04:59:29.693Z\"; fractional seconds run from none to three digits). Its UTC date is what met_list_objects updatedSince compares, that day included. Empty when the Met sends none.", + "type": "string" +} - changed
Output schema / properties / objects / items / properties / primaryImageSmall / descriptionPrevious value: -"Web-display image URL (~800px; CC0 objects only; empty string for non-public-domain works)."New value: +"Web-display image URL (about 600 px on the long edge; CC0 objects only; empty string for non-public-domain works)." - added
Output schema / properties / objects / items / properties / rightsAndReproductionAdded value: +{ + "description": "Rights holder and reproduction notice (e.g., \"© 2026 Pollock-Krasner Foundation / Artists Rights Society (ARS), New York\"). Most copyrighted records carry none, so an empty value does not make a work free to reuse — isPublicDomain decides that.", + "type": "string" +} - changed
Output schema / properties / objects / items / requiredPrevious 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" -]New value: +[ + "objectID", + "title", + "isPublicDomain", + "hasCC0Image", + "primaryImage", + "primaryImageSmall", + "additionalImages", + "objectURL", + "department", + "departmentId", + "objectName", + "classification", + "isHighlight", + "isTimelineWork", + "artistPrefix", + "artistDisplayName", + "artistSuffix", + "artistRole", + "artistDisplayBio", + "artistNationality", + "artistBeginDate", + "artistEndDate", + "constituents", + "objectDate", + "objectBeginDate", + "objectEndDate", + "medium", + "dimensions", + "culture", + "period", + "dynasty", + "accessionNumber", + "accessionYear", + "creditLine", + "rightsAndReproduction", + "country", + "region", + "geography", + "measurements", + "tags", + "objectWikidata_URL", + "GalleryNumber", + "metadataDate" +]
- Changed
met_list_departments2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `upstream_blocked`: The Met API's firewall refused the request with HTTP 403 — it blocks this server's address, not one endpoint. `retry_deadline_exceeded`: The call's time budget ran out, retries and backoff included, before the Met API returned a successful response. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `upstream_blocked`: The Met API's firewall refused the request with HTTP 403 — it blocks this server's address, not one endpoint. `upstream_unavailable`: The Met API answered HTTP 500, 502, 503, or 504 until the retry ladder ran out — an outage on its side. `retry_deadline_exceeded`: The call's time budget ran out, retries and backoff included, before the Met API returned a successful response. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "upstream_blocked", - "retry_deadline_exceeded" -]New value: +[ + "upstream_blocked", + "upstream_unavailable", + "retry_deadline_exceeded" +]
- Changed
met_list_objects4 fields changed- changed
Input schema / properties / updatedSince / descriptionPrevious value: -"List only objects whose record was created or revised on or after this date, the day itself included, as YYYY-MM-DD (e.g., \"2026-09-01\") — no time part and no other date format. A date later than the newest update returns an empty list, not an error."New value: +"List only objects whose record was created or revised on or after this date, the day itself included, as YYYY-MM-DD (e.g., \"2026-09-01\") — no time part and no other date format. It compares the UTC date of each record's metadataDate, which met_get_object returns. A date later than the newest update returns an empty list, not an error." - added
Output schema / properties / effectiveQueryAdded value: +{ + "description": "The filters as applied, as name=value pairs with JSON-encoded values — an updatedSince before 1753-01-01 shows as 1753-01-01, the date sent — or \"no filter (whole collection)\". limit and offset are left out.", + "type": "string" +} - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `invalid_department`: departmentId is provided but is not one of the Met department IDs. `invalid_date`: updatedSince has the YYYY-MM-DD shape but names no calendar day, such as 2026-02-30. `upstream_blocked`: The Met API's firewall refused the request with HTTP 403 — it blocks this server's address, not one endpoint. `retry_deadline_exceeded`: The call's time budget ran out, retries and backoff included, before the Met API returned a successful response to the department lookup or the ID list. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `invalid_department`: departmentId is provided but is not one of the Met department IDs. `invalid_date`: updatedSince has the YYYY-MM-DD shape but names no calendar day, such as 2026-02-30. `upstream_blocked`: The Met API's firewall refused the request with HTTP 403 — it blocks this server's address, not one endpoint. `upstream_unavailable`: The Met API answered HTTP 500, 502, 503, or 504 to the department lookup or the ID list until the retry ladder ran out — an outage on its side. `retry_deadline_exceeded`: The call's time budget ran out, retries and backoff included, before the Met API returned a successful response to the department lookup or the ID list. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "invalid_department", - "invalid_date", - "upstream_blocked", - "retry_deadline_exceeded" -]New value: +[ + "invalid_department", + "invalid_date", + "upstream_blocked", + "upstream_unavailable", + "retry_deadline_exceeded" +]
- Changed
met_search_collections13 fields changed- changed
Input schema / properties / departmentId / descriptionPrevious 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."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. The Met searches 7 (The Cloisters) and 17 (Medieval Art) as one combined result set: for either, objectIDs keeps only the requested department's matches while total and paging count both, so a page can hold fewer than limit IDs while more remain." - added
Input schema / properties / matchFieldAdded value: +{ + "description": "Restrict the keyword match to one field: \"title\" matches object titles only, \"tags\" matches subject tags only. Omit it to match across all text fields. Combines with every filter. Has no effect when q is \"*\".", + "enum": [ + "title", + "tags" + ], + "type": "string" +} - changed
Input schema / properties / offset / descriptionPrevious 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."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 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." - changed
Input schema / properties / q / descriptionPrevious value: -"Keyword query, matched across title, artist name, culture, medium, tags, and other text fields. Broad terms return large ID sets."New value: +"Keyword query, matched across title, artist name, culture, medium, tags, and other text fields; matchField narrows the match to titles or tags. Broad terms return large ID sets. \"*\" matches every object, for a search narrowed by filters alone; paging still reaches only the first 10,000 matches. An accession number (e.g., \"29.100.5\") ranks its object first, with near-numbered objects after it — confirm the match from accessionNumber on met_get_object." - added
Output schema / properties / effectiveQueryAdded value: +{ + "description": "The search as applied: q and each filter set, as name=value pairs with JSON-encoded values in parameter order, without limit or offset.", + "type": "string" +} - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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. `upstream_blocked`: The Met API's firewall refused the request with HTTP 403 — it blocks this server's address, not one endpoint. `retry_deadline_exceeded`: The call's time budget ran out, retries and backoff included, before the Met API returned a successful response to the department lookup or the search. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `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. `upstream_blocked`: The Met API's firewall refused the request with HTTP 403 — it blocks this server's address, not one endpoint. `upstream_unavailable`: The Met API answered HTTP 500, 502, 503, or 504 to the department lookup or the search until the retry ladder ran out — an outage on its side. `retry_deadline_exceeded`: The call's time budget ran out, retries and backoff included, before the Met API returned a successful response to the department lookup or the search. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "no_results", - "invalid_date_range", - "invalid_filter", - "invalid_department", - "upstream_blocked", - "retry_deadline_exceeded" -]New value: +[ + "invalid_date_range", + "invalid_filter", + "invalid_department", + "upstream_blocked", + "upstream_unavailable", + "retry_deadline_exceeded" +] - changed
Output schema / properties / nextOffset / descriptionPrevious value: -"The offset to pass on the next call to continue paging, or null when no further page is reachable (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): offset plus the positions this page read, which for departmentId 7 or 17 can exceed returned." - changed
Output schema / properties / notice / descriptionPrevious 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."New value: +"Present when total is 0, when total exceeds 10,000, or when departmentId is 7 or 17; several apply as one string. With total 0 it says whether the keyword matches nothing or the filters removed every match, naming the filters to correct or drop. Above 10,000 it 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. For departmentId 7 or 17 it states that total counts both departments and a page can hold fewer than limit IDs, or that the department filter could not be applied to this page." - changed
Output schema / properties / objectIDs / descriptionPrevious value: -"Object IDs for this page, up to `limit` results."New value: +"Object IDs for this page, up to `limit` results. For departmentId 7 or 17, only the requested department's matches among the positions this page read, so it can hold fewer than `limit`, or none, while more remain." - changed
Output schema / properties / offset / descriptionPrevious 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."New value: +"The resolved offset this page was read from — the offset input after its default of 0. When it is nonzero and 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." - changed
Output schema / properties / remaining / descriptionPrevious 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."New value: +"Count of reachable matches after this page: the smaller of total and 10,000, minus (offset + the positions this page read), floored at 0 — positions read as described under truncated. An empty page reports 0. 0 means no further page exists." - changed
Output schema / properties / truncated / descriptionPrevious 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."New value: +"True when reachable matches remain after this page (offset + the positions this page read < the smaller of total and 10,000); false when this page is the last one paging reaches. The positions read equal returned, except for departmentId 7 or 17, where they also count the matches the department filter left out. An empty page reports false: it ends paging even inside that window."
4 tool updates
- Changed
met_get_object6 fields changed- changed
Input schema / properties / objectIDs / descriptionPrevious 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."New value: +"One or more Met object IDs to fetch. Maximum 20 per call. IDs come from met_search_collections or met_list_objects. A repeated ID is fetched and returned once, at its first position. Partial failures are reported per ID rather than failing the whole batch." - changed
Input schema / properties / objectIDs / items / descriptionPrevious value: -"A Met object ID from met_search_collections."New value: +"A Met object ID from met_search_collections or met_list_objects." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"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."New value: +"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. `upstream_blocked`: No object was fetched and the Met API's firewall refused requests with HTTP 403 — it blocks this server's address, not one object. `retry_deadline_exceeded`: No object was fetched and every fetch ran out of the call's time budget, retries and backoff included — an ID whose fetch would have started after the budget was spent counts too. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "all_not_found", - "all_failed" -]New value: +[ + "all_not_found", + "all_failed", + "upstream_blocked", + "retry_deadline_exceeded" +] - changed
Output schema / properties / objects / items / properties / artistBeginDate / descriptionPrevious value: -"Artist birth year as a string (e.g., \"1853\"). Empty for anonymous works."New value: +"Artist birth year, or a firm's founding year, as a string (e.g., \"1853\"). Occasionally a full date (e.g., \"1928-01-10\"). Empty for anonymous works." - changed
Output schema / properties / objects / items / properties / artistEndDate / descriptionPrevious value: -"Artist death year as a string. Empty for living or anonymous."New value: +"Artist death year, or a firm's closing year, as a string (e.g., \"1890\"). Occasionally a full date (e.g., \"1928-01-10\"). Empty for a living artist, a firm still active, or an anonymous work."
- Changed
met_list_departments3 fields changed- changed
Output schema / properties / departments / items / properties / departmentId / descriptionPrevious value: -"Numeric department ID for use in the met_search_collections departmentId parameter."New value: +"Numeric department ID for the departmentId parameter of met_search_collections and met_list_objects." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode."New value: +"Machine-readable failure mode. Declared by this tool: `upstream_blocked`: The Met API's firewall refused the request with HTTP 403 — it blocks this server's address, not one endpoint. `retry_deadline_exceeded`: The call's time budget ran out, retries and backoff included, before the Met API returned a successful response. Other values are possible when a failure originates below the handler." - added
Output schema / properties / error / properties / data / properties / reason / examplesAdded value: +[ + "upstream_blocked", + "retry_deadline_exceeded" +]
- Added
met_list_objects - Changed
met_search_collections2 fields changed- changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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."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. `upstream_blocked`: The Met API's firewall refused the request with HTTP 403 — it blocks this server's address, not one endpoint. `retry_deadline_exceeded`: The call's time budget ran out, retries and backoff included, before the Met API returned a successful response to the department lookup or the search. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "no_results", - "invalid_date_range", - "invalid_filter", - "invalid_department" -]New value: +[ + "no_results", + "invalid_date_range", + "invalid_filter", + "invalid_department", + "upstream_blocked", + "retry_deadline_exceeded" +]
1 tool update
- Changed
met_search_collections21 fields changed- changed
Input schema / properties / dateBegin / descriptionPrevious 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." - changed
Input schema / properties / dateEnd / descriptionPrevious 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." - changed
Input schema / properties / departmentId / descriptionPrevious 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." - changed
Input schema / properties / geoLocation / descriptionPrevious 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." - added
Input schema / properties / geoLocation / maxItemsAdded value: +1 - changed
Input schema / properties / hasImages / descriptionPrevious 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." - changed
Input schema / properties / isHighlight / descriptionPrevious 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." - changed
Input schema / properties / isOnView / descriptionPrevious 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." - removed
Input schema / properties / isPublicDomainRemoved 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" -} - changed
Input schema / properties / limit / descriptionPrevious 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." - changed
Input schema / properties / medium / descriptionPrevious 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." - changed
Input schema / properties / offset / descriptionPrevious 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." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "no_results", - "invalid_date_range", - "invalid_filter", - "invalid_department", - "search_timeout" -]New value: +[ + "no_results", + "invalid_date_range", + "invalid_filter", + "invalid_department" +] - changed
Output schema / properties / nextOffset / descriptionPrevious 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)." - changed
Output schema / properties / notice / descriptionPrevious 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." - changed
Output schema / properties / offset / descriptionPrevious 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." - changed
Output schema / properties / remaining / descriptionPrevious 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." - changed
Output schema / properties / returned / descriptionPrevious 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." - changed
Output schema / properties / total / descriptionPrevious 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." - changed
Output schema / properties / truncated / descriptionPrevious 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."
1 tool update
- Changed
met_search_collections11 fields changed- changed
Input schema / properties / dateBegin / descriptionPrevious 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." - changed
Input schema / properties / dateEnd / descriptionPrevious 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." - changed
Input schema / properties / departmentId / descriptionPrevious 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." - changed
Input schema / properties / geoLocation / descriptionPrevious 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." - changed
Input schema / properties / hasImages / descriptionPrevious 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." - changed
Input schema / properties / isHighlight / descriptionPrevious 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." - changed
Input schema / properties / isOnView / descriptionPrevious 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." - changed
Input schema / properties / isPublicDomain / descriptionPrevious 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." - changed
Input schema / properties / medium / descriptionPrevious 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." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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." - added
Output schema / properties / noticeAdded 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" +}
1 tool update
- Changed
met_get_object6 fields changed- changed
Input schema / properties / objectIDs / descriptionPrevious 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." - added
Output schema / properties / deferredAdded 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" +} - added
Output schema / properties / noticeAdded value: +{ + "description": "How to retrieve the deferred records, with the budget applied. Present only when the batch byte budget deferred a record.", + "type": "string" +} - added
Output schema / properties / objects / items / properties / geographyAdded 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" +} - added
Output schema / properties / objects / items / properties / measurementsAdded 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." +} - changed
Output schema / properties / objects / items / requiredPrevious 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" +]
1 tool update
- Changed
met_get_object10 fields changed- added
Output schema / properties / objects / items / properties / objectBeginDate / anyOfAdded value: +[ + { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + { + "type": "null" + } +] - changed
Output schema / properties / objects / items / properties / objectBeginDate / descriptionPrevious 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." - removed
Output schema / properties / objects / items / properties / objectBeginDate / maximumRemoved value: -9007199254740991 - removed
Output schema / properties / objects / items / properties / objectBeginDate / minimumRemoved value: --9007199254740991 - removed
Output schema / properties / objects / items / properties / objectBeginDate / typeRemoved value: -"integer" - added
Output schema / properties / objects / items / properties / objectEndDate / anyOfAdded value: +[ + { + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + { + "type": "null" + } +] - changed
Output schema / properties / objects / items / properties / objectEndDate / descriptionPrevious 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." - removed
Output schema / properties / objects / items / properties / objectEndDate / maximumRemoved value: -9007199254740991 - removed
Output schema / properties / objects / items / properties / objectEndDate / minimumRemoved value: --9007199254740991 - removed
Output schema / properties / objects / items / properties / objectEndDate / typeRemoved value: -"integer"
1 tool update
- Changed
met_search_collections9 fields changed- changed
Input schema / properties / hasImages / descriptionPrevious 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." - added
Input schema / properties / isHighlight / constAdded value: +true - changed
Input schema / properties / isHighlight / descriptionPrevious 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." - added
Input schema / properties / isPublicDomain / constAdded value: +true - changed
Input schema / properties / isPublicDomain / descriptionPrevious 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." - changed
Output schema / anyOfPrevious 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" + ] + } +] - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious 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." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "no_results", - "invalid_date_range", - "invalid_department", - "search_timeout" -]New value: +[ + "no_results", + "invalid_date_range", + "invalid_filter", + "invalid_department", + "search_timeout" +] - added
Output schema / properties / offsetAdded 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" +}
3 tool updates
- Changed
met_get_object6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "objects", + "failed" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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" +} - removed
Output schema / requiredRemoved value: -[ - "objects", - "failed" -]
- Changed
met_list_departments6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "departments" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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" +} - removed
Output schema / requiredRemoved value: -[ - "departments" -]
- Changed
met_search_collections7 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "total", + "objectIDs", + "returned", + "truncated", + "remaining", + "nextOffset" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded 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" +} - changed
Output schema / properties / objectIDs / descriptionPrevious value: -"Object IDs for the first `limit` results."New value: +"Object IDs for this page, up to `limit` results." - removed
Output schema / requiredRemoved value: -[ - "total", - "objectIDs", - "returned", - "truncated", - "remaining", - "nextOffset" -]
2 tool updates
- Changed
met_get_object2 fields changed- changed
Input schema / properties / objectIDs / descriptionPrevious 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." - changed
Output schema / properties / objects / items / properties / objectBeginDate / descriptionPrevious value: -"Earliest date as an integer year (negative = BCE). Use for date range comparisons."New value: +"Earliest date as an integer year (negative = BCE)."
- Changed
met_search_collections12 fields changed- changed
Input schema / properties / departmentId / descriptionPrevious 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." - changed
Input schema / properties / geoLocation / descriptionPrevious 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." - changed
Input schema / properties / hasImages / descriptionPrevious 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." - changed
Input schema / properties / isHighlight / descriptionPrevious 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." - changed
Input schema / properties / isOnView / descriptionPrevious 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." - changed
Input schema / properties / isPublicDomain / descriptionPrevious 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." - changed
Input schema / properties / limit / descriptionPrevious 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." - changed
Input schema / properties / offset / descriptionPrevious 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." - changed
Input schema / properties / q / descriptionPrevious 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." - changed
Output schema / properties / objectIDs / descriptionPrevious 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." - changed
Output schema / properties / objectIDs / items / descriptionPrevious value: -"A Met object ID. Pass to met_get_object to retrieve the full record."New value: +"A Met object ID." - changed
Output schema / properties / truncated / descriptionPrevious 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."
1 tool update
- Changed
met_search_collections6 fields changed- changed
Input schema / properties / departmentId / descriptionPrevious 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." - added
Input schema / properties / offsetAdded 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" +} - added
Output schema / properties / nextOffsetAdded 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)." +} - added
Output schema / properties / remainingAdded 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" +} - changed
Output schema / properties / truncated / descriptionPrevious 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." - changed
Output schema / requiredPrevious value: -[ - "total", - "objectIDs", - "returned", - "truncated" -]New value: +[ + "total", + "objectIDs", + "returned", + "truncated", + "remaining", + "nextOffset" +]
4 tool updates
- Changed
met_get_object3 fields changed- changed
Input schema / properties / objectIDs / descriptionPrevious 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." - changed
Input schema / properties / objectIDs / items / descriptionPrevious value: -"A Met object ID from met_search."New value: +"A Met object ID from met_search_collections." - changed
Output schema / properties / objects / items / properties / hasCC0Image / descriptionPrevious 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."
- Changed
met_list_departments1 field changed- changed
Output schema / properties / departments / items / properties / departmentId / descriptionPrevious 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."
- Removed
met_search - Added
met_search_collections
1 tool update
- Changed
met_get_object3 fields changed- added
Output schema / properties / objects / items / properties / hasCC0ImageAdded 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" +} - removed
Output schema / properties / objects / items / properties / hasImagesRemoved value: -{ - "description": "True when primaryImage is non-empty.", - "type": "boolean" -} - changed
Output schema / properties / objects / items / requiredPrevious 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" +]
3 tool updates
- First observed
met_get_object - First observed
met_list_departments - First observed
met_search
Related MCP Connectors
Art MCP — Metropolitan Museum of Art Collection API (free, no auth)
Search 14.5M Smithsonian Open Access objects, get CC0 images, find cross-collection connections.
Unlock a world of art with the Met Museum MCP! Use the 'search_artworks' API to find stunning
Art Institute of Chicago MCP — wraps the ARTIC public API (free, no auth)
Related MCP Servers
- AlicenseNot gradedqualityBmaintenanceEnables searching the Metropolitan Museum of Art collection by subject, artist, or keyword, retrieving detailed artwork information, and listing curatorial departments via natural language.22 npm1MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI agents to search The Met's open-access collection by keyword with filters for images, on-view status, medium, and year range, and to fetch rich object details such as artist bio, dimensions, department, and gallery number. Also lists the museum's curatorial departments so searches can be scoped, all without an API key.14 npm1MIT
- AlicenseNot gradedqualityBmaintenanceEnables searching and retrieving details from the Harvard Art Museums collection.19 npm2MIT
- AlicenseNot gradedqualityBmaintenanceEnables searching and retrieving detailed information about items from the Smithsonian Open Access collection, including metadata and images.30 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.