Endpoints: 28,729MCP servers: 18,413Payout addresses: 2,071Paid calls: 1,549Letters: 14Defects: 1,324counted just now
teppi

Server definition

Hash
sha256:8342fb1eddea7713e2a48c05bafaabec06e0e906d1dfcd36263916e944220312
What it is
What a remote MCP server returned when asked what it offers: 4 tools

The blob, as servednamed by its sha256

{ "instructions": "The Metropolitan Museum of Art Collection API — over 500,000 artworks spanning 5,000 years.\nTypical workflow: met_list_departments → met_search_collections (returns IDs) → met_get_object (full records, up to 20 per call).\nTo browse without a keyword, met_list_objects lists every object ID in one department (departmentId), every object created or revised on or after a date (updatedSince, YYYY-MM-DD), or both — in ascending ID order, with no paging depth limit.\nmet_search_collections pages through at most the first 10,000 matches of a search; narrow a larger one with filters. q \"*\" matches every object, for a search narrowed by filters alone — paging still reaches only its first 10,000 matches. An accession number as q ranks its object first, with near-numbered objects after it; confirm the match from accessionNumber on met_get_object. CC0 status is per object, from the isPublicDomain field on met_get_object — hasImages=true includes copyrighted works without usable image URLs. isHighlight accepts true only.\nThe medium filter takes a case-sensitive classification as the Met spells it (\"Paintings\", \"Sculpture\") — not a material description.", "tools": [ { "description": "Fetch full records for one or more Met Museum object IDs. Accepts up to 20 IDs per call and returns partial success — a single 404 does not fail the whole batch; per-ID failures are reported separately. Object IDs come from met_search_collections (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.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "includeImages": { "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" }, "objectIDs": { "description": "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.", "items": { "description": "A Met object ID from met_search_collections or met_list_objects.", "exclusiveMinimum": 0, "maximum": 9007199254740991, "type": "integer" }, "maxItems": 20, "minItems": 1, "type": "array" } }, "required": [ "objectIDs" ], "type": "object" }, "name": "met_get_object", "outputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "anyOf": [ { "not": { "required": [ "error" ] }, "required": [ "objects", "failed" ] }, { "required": [ "error" ] } ], "properties": { "deferred": { "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" }, "error": { "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`: 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.", "examples": [ "all_not_found", "all_failed", "upstream_blocked", "upstream_unavailable", "retry_deadline_exceeded" ], "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" }, "failed": { "description": "Object IDs that failed to fetch with per-ID error context.", "items": { "additionalProperties": false, "description": "A per-ID fetch failure.", "properties": { "error": { "description": "Error detail and suggested recovery action.", "type": "string" }, "objectID": { "description": "Object ID that could not be fetched.", "maximum": 9007199254740991, "minimum": -9007199254740991, "type": "integer" } }, "required": [ "objectID", "error" ], "type": "object" }, "type": "array" }, "images": { "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" }, "notice": { "description": "How to retrieve the deferred records, with the budget applied. Present only when the batch byte budget deferred a record.", "type": "string" }, "objects": { "description": "Successfully fetched objects.", "items": { "additionalProperties": false, "description": "A fully fetched Met Museum object record.", "properties": { "GalleryNumber": { "description": "Gallery room number at the museum. Empty string for objects not currently on display.", "type": "string" }, "accessionNumber": { "description": "The Met's accession number for the object.", "type": "string" }, "accessionYear": { "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" }, "additionalImages": { "description": "Additional image URLs (detail shots, alternate views). CC0 objects only.", "items": { "description": "An additional image URL (detail shot or alternate view).", "type": "string" }, "type": "array" }, "artistBeginDate": { "description": "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.", "type": "string" }, "artistDisplayBio": { "description": "Artist biographical summary including nationality, birth/death place and year (e.g., \"Dutch, Zundert 1853–1890 Auvers-sur-Oise\"). Empty for anonymous works.", "type": "string" }, "artistDisplayName": { "description": "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.", "type": "string" }, "artistEndDate": { "description": "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.", "type": "string" }, "artistNationality": { "description": "Artist's nationality (e.g., \"Dutch\", \"French\"). Empty for anonymous works.", "type": "string" }, "artistPrefix": { "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" }, "artistRole": { "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" }, "artistSuffix": { "description": "Text the Met places after artistDisplayName (e.g., \"(r. 1876–1909)\", \", Paris\", \"(?)\"). Empty when the Met records none.", "type": "string" }, "classification": { "description": "Broad classification category (e.g., \"Paintings\", \"Ceramics\").", "type": "string" }, "constituents": { "anyOf": [ { "items": { "additionalProperties": false, "description": "A person associated with the object.", "properties": { "constituentID": { "description": "Constituent identifier for cross-referencing.", "maximum": 9007199254740991, "minimum": -9007199254740991, "type": "integer" }, "constituentULAN_URL": { "description": "Getty ULAN (Union List of Artist Names) URL for the constituent. Empty when no ULAN record exists.", "type": "string" }, "constituentWikidata_URL": { "description": "Wikidata entity URL for the constituent. Useful for enrichment via wikidata-mcp-server. Empty when no Wikidata record exists.", "type": "string" }, "gender": { "description": "Gender of the constituent. Usually empty string — sparsely populated in the Met catalogue.", "type": "string" }, "name": { "description": "Constituent display name.", "type": "string" }, "role": { "description": "Role in relation to the object (e.g., \"Artist\", \"Maker\", \"Designer\").", "type": "string" } }, "required": [ "constituentID", "role", "name", "constituentULAN_URL", "constituentWikidata_URL", "gender" ], "type": "object" }, "type": "array" }, { "type": "null" } ], "description": "All persons associated with the object. Null for anonymous or unknown attribution." }, "country": { "description": "Country of origin. Often empty.", "type": "string" }, "creditLine": { "description": "Provenance and gift/bequest attribution.", "type": "string" }, "culture": { "description": "Cultural origin when not attributed to an individual (e.g., \"Japanese\", \"Roman\"). Often empty for Western art with named artists.", "type": "string" }, "department": { "description": "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.", "type": "string" }, "departmentId": { "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." }, "dimensions": { "description": "Dimensions as a formatted string (e.g., \"16 x 12 1/2 in. (40.6 x 31.8 cm)\").", "type": "string" }, "dynasty": { "description": "Dynasty for applicable cultures (e.g., \"Dynasty 19\"). Often empty.", "type": "string" }, "geography": { "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" }, "hasCC0Image": { "description": "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.", "type": "boolean" }, "isHighlight": { "description": "True when the Met designates this a collection highlight.", "type": "boolean" }, "isPublicDomain": { "description": "True when the object is released under CC0 open access. Only true objects return usable image URLs.", "type": "boolean" }, "isTimelineWork": { "description": "True when the work appears in the Met's art timeline.", "type": "boolean" }, "measurements": { "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." }, "medium": { "description": "Materials and techniques (e.g., \"Oil on canvas\", \"Bronze\", \"Limestone\").", "type": "string" }, "metadataDate": { "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" }, "objectBeginDate": { "anyOf": [ { "maximum": 9007199254740991, "minimum": -9007199254740991, "type": "integer" }, { "type": "null" } ], "description": "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." }, "objectDate": { "description": "Human-readable date string (e.g., \"1887\", \"ca. 1295–1294 B.C.\", \"1700–1800\").", "type": "string" }, "objectEndDate": { "anyOf": [ { "maximum": 9007199254740991, "minimum": -9007199254740991, "type": "integer" }, { "type": "null" } ], "description": "Latest date as an integer year (negative = BCE). Null under the same condition as objectBeginDate — the two are null together." }, "objectID": { "description": "Unique Met object identifier.", "maximum": 9007199254740991, "minimum": -9007199254740991, "type": "integer" }, "objectName": { "description": "Object type or classification name (e.g., \"Painting\", \"Statuette\").", "type": "string" }, "objectURL": { "description": "Canonical metmuseum.org page URL for human follow-up.", "type": "string" }, "objectWikidata_URL": { "description": "Wikidata entity URL for the object itself. Enables enrichment via wikidata-mcp-server.", "type": "string" }, "period": { "description": "Historical period (e.g., \"New Kingdom, Ramesside\", \"Meiji period\"). Often empty.", "type": "string" }, "primaryImage": { "description": "Full-resolution image URL (CC0 objects only; empty string for non-public-domain works).", "type": "string" }, "primaryImageSmall": { "description": "Web-display image URL (about 600 px on the long edge; CC0 objects only; empty string for non-public-domain works).", "type": "string" }, "region": { "description": "Geographic region of origin. Often empty.", "type": "string" }, "rightsAndReproduction": { "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" }, "tags": { "anyOf": [ { "items": { "additionalProperties": false, "description": "A controlled vocabulary tag applied to the object.", "properties": { "AAT_URL": { "description": "Getty Art & Architecture Thesaurus URL for the term.", "type": "string" }, "Wikidata_URL": { "description": "Wikidata entity URL for the term. Useful for enrichment.", "type": "string" }, "term": { "description": "Tag label (e.g., \"Men\", \"Self-portraits\", \"Flowers\").", "type": "string" } }, "required": [ "term", "AAT_URL", "Wikidata_URL" ], "type": "object" }, "type": "array" }, { "type": "null" } ], "description": "Controlled vocabulary tags applied to the object. Null when no tags assigned." }, "title": { "description": "Object title as catalogued.", "type": "string" } }, "required": [ "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" ], "type": "object" }, "type": "array" } }, "type": "object" } }, { "description": "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.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": {}, "type": "object" }, "name": "met_list_departments", "outputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "anyOf": [ { "not": { "required": [ "error" ] }, "required": [ "departments" ] }, { "required": [ "error" ] } ], "properties": { "departments": { "description": "All 19 curatorial departments at The Metropolitan Museum of Art.", "items": { "additionalProperties": false, "description": "A Met curatorial department.", "properties": { "departmentId": { "description": "Numeric department ID for the departmentId parameter of met_search_collections and met_list_objects.", "maximum": 9007199254740991, "minimum": -9007199254740991, "type": "integer" }, "displayName": { "description": "Human-readable department name (e.g., \"European Paintings\", \"Egyptian Art\", \"Arms and Armor\").", "type": "string" } }, "required": [ "departmentId", "displayName" ], "type": "object" }, "type": "array" }, "error": { "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: `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.", "examples": [ "upstream_blocked", "upstream_unavailable", "retry_deadline_exceeded" ], "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" } }, "type": "object" } }, { "description": "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.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "departmentId": { "description": "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.", "maximum": 9007199254740991, "minimum": 1, "type": "integer" }, "limit": { "default": 20, "description": "Maximum number of object IDs to return in this page.", "maximum": 500, "minimum": 1, "type": "integer" }, "offset": { "default": 0, "description": "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.", "maximum": 9007199254740991, "minimum": 0, "type": "integer" }, "updatedSince": { "description": "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.", "pattern": "^\\d{4}-\\d{2}-\\d{2}$", "type": "string" } }, "type": "object" }, "name": "met_list_objects", "outputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "anyOf": [ { "not": { "required": [ "error" ] }, "required": [ "total", "objectIDs", "returned", "offset", "remaining", "truncated", "nextOffset" ] }, { "required": [ "error" ] } ], "properties": { "effectiveQuery": { "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" }, "error": { "additionalProperties": {}, "description": "Present when the call failed. Absent on success.", "properties": { "code": { "description": "JSON-RPC error code for this failure.", "maximum": 9007199254740991, "minimum": -9007199254740991, "type": "integer" }, "data": { "additionalProperties": {}, "properties": { "reason": { "description": "Machine-readable failure mode. Declared by this tool: `invalid_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.", "examples": [ "invalid_department", "invalid_date", "upstream_blocked", "upstream_unavailable", "retry_deadline_exceeded" ], "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" }, "nextOffset": { "anyOf": [ { "maximum": 9007199254740991, "minimum": -9007199254740991, "type": "integer" }, { "type": "null" } ], "description": "The offset to pass on the next call to continue paging, or null when this page ends the list (truncated is false)." }, "notice": { "description": "Present only when total is 0: names the filters that matched nothing and how to widen the list.", "type": "string" }, "objectIDs": { "description": "Object IDs for this page in ascending order, up to `limit` results.", "items": { "description": "A Met object ID.", "maximum": 9007199254740991, "minimum": -9007199254740991, "type": "integer" }, "type": "array" }, "offset": { "description": "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.", "maximum": 9007199254740991, "minimum": -9007199254740991, "type": "integer" }, "remaining": { "description": "Count of IDs after this page: total minus (offset + returned), floored at 0. 0 means no further page exists.", "maximum": 9007199254740991, "minimum": -9007199254740991, "type": "integer" }, "returned": { "description": "Count of object IDs in this page.", "maximum": 9007199254740991, "minimum": -9007199254740991, "type": "integer" }, "total": { "description": "Total number of objects matching the filters. Paging reaches every one of them — there is no 10,000 window here.", "maximum": 9007199254740991, "minimum": -9007199254740991, "type": "integer" }, "truncated": { "description": "True when IDs remain after this page (offset + returned < total); false when this page ends the list.", "type": "boolean" } }, "type": "object" } }, { "description": "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.", "inputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "properties": { "dateBegin": { "description": "Earliest object date (year, inclusive). Negative integers for BCE (e.g., -500 for 500 BCE). Requires dateEnd.", "maximum": 9007199254740991, "minimum": -9007199254740991, "type": "integer" }, "dateEnd": { "description": "Latest object date (year, inclusive). Negative integers for BCE. Requires dateBegin.", "maximum": 9007199254740991, "minimum": -9007199254740991, "type": "integer" }, "departmentId": { "description": "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.", "maximum": 9007199254740991, "minimum": 1, "type": "integer" }, "geoLocation": { "description": "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.", "items": { "description": "A country, region, or city (e.g., \"France\", \"Egypt\", \"New York\").", "type": "string" }, "maxItems": 1, "type": "array" }, "hasImages": { "description": "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.", "type": "boolean" }, "isHighlight": { "const": true, "description": "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.", "type": "boolean" }, "isOnView": { "description": "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.", "type": "boolean" }, "limit": { "default": 20, "description": "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.", "maximum": 500, "minimum": 1, "type": "integer" }, "matchField": { "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" }, "medium": { "description": "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.", "type": "string" }, "offset": { "default": 0, "description": "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.", "maximum": 9007199254740991, "minimum": 0, "type": "integer" }, "q": { "description": "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.", "minLength": 1, "type": "string" } }, "required": [ "q" ], "type": "object" }, "name": "met_search_collections", "outputSchema": { "$schema": "https://json-schema.org/draft/2020-12/schema", "additionalProperties": false, "anyOf": [ { "not": { "required": [ "error" ] }, "required": [ "total", "objectIDs", "returned", "truncated", "remaining", "nextOffset", "offset" ] }, { "required": [ "error" ] } ], "properties": { "effectiveQuery": { "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" }, "error": { "additionalProperties": {}, "description": "Present when the call failed. Absent on success.", "properties": { "code": { "description": "JSON-RPC error code for this failure.", "maximum": 9007199254740991, "minimum": -9007199254740991, "type": "integer" }, "data": { "additionalProperties": {}, "properties": { "reason": { "description": "Machine-readable failure mode. Declared by this tool: `invalid_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.", "examples": [ "invalid_date_range", "invalid_filter", "invalid_department", "upstream_blocked", "upstream_unavailable", "retry_deadline_exceeded" ], "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" }, "nextOffset": { "anyOf": [ { "maximum": 9007199254740991, "minimum": -9007199254740991, "type": "integer" }, { "type": "null" } ], "description": "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." }, "notice": { "description": "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.", "type": "string" }, "objectIDs": { "description": "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.", "items": { "description": "A Met object ID.", "maximum": 9007199254740991, "minimum": -9007199254740991, "type": "integer" }, "type": "array" }, "offset": { "description": "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.", "maximum": 9007199254740991, "minimum": -9007199254740991, "type": "integer" }, "remaining": { "description": "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.", "maximum": 9007199254740991, "minimum": -9007199254740991, "type": "integer" }, "returned": { "description": "Count of object IDs in this page.", "maximum": 9007199254740991, "minimum": -9007199254740991, "type": "integer" }, "total": { "description": "Total number of objects in the Met collection matching the search. Can exceed 10,000, the most that paging reaches.", "maximum": 9007199254740991, "minimum": -9007199254740991, "type": "integer" }, "truncated": { "description": "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.", "type": "boolean" } }, "type": "object" } } ] }
Verify it yourselfcurl -s https://api.teppi.xyz/v1/evidence/sha256:8342fb1eddea7713e2a48c05bafaabec06e0e906d1dfcd36263916e944220312 | sha256sum