{"name":"io.github.cyanheads/met-museum-mcp-server","slug":"cyanheads-met-museum-mcp-server","title":null,"description":"MET Museum collection via MCP — 500K+ artworks, metadata, provenance, open-access images.","url":"https://mcp.market/server/cyanheads-met-museum-mcp-server","rating":null,"grade":"A","score":93,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":39,"stars":4,"forks":0,"downloads_week":296,"last_push_at":"2026-09-13T23:33:12.000Z","license":"Apache-2.0"},"uptime":null,"claimed":false,"transport":"mixed","callable_via_gateway":true,"default_price_micros":0,"repository":"https://github.com/cyanheads/met-museum-mcp-server","website":null,"version":"0.5.2","remotes":[{"type":"streamable-http","url":"https://met-museum.caseyjhand.com/mcp"}],"packages":[{"registryType":"npm","registryBaseUrl":"https://registry.npmjs.org","identifier":"@cyanheads/met-museum-mcp-server","version":"0.5.2","runtimeHint":"bun","transport":{"type":"stdio"},"packageArguments":[{"value":"run","type":"positional"},{"value":"start:stdio","type":"positional"}],"environmentVariables":[{"description":"Sets the minimum log level for output (e.g., 'debug', 'info', 'warn').","format":"string","default":"info","name":"MCP_LOG_LEVEL"}]},{"registryType":"npm","registryBaseUrl":"https://registry.npmjs.org","identifier":"@cyanheads/met-museum-mcp-server","version":"0.5.2","runtimeHint":"bun","transport":{"type":"streamable-http","url":"http://localhost:3010/mcp"},"packageArguments":[{"value":"run","type":"positional"},{"value":"start:http","type":"positional"}],"environmentVariables":[{"description":"The hostname for the HTTP server.","format":"string","default":"127.0.0.1","name":"MCP_HTTP_HOST"},{"description":"The port to run the HTTP server on.","format":"string","default":"3010","name":"MCP_HTTP_PORT"},{"description":"The endpoint path for the MCP server.","format":"string","default":"/mcp","name":"MCP_HTTP_ENDPOINT_PATH"},{"description":"HTTP session mode: auto, stateful, or stateless. This server explicitly sets stateless; the framework schema default is auto.","format":"string","default":"stateless","name":"MCP_SESSION_MODE"},{"description":"Authentication mode to use: 'none', 'jwt', or 'oauth'.","format":"string","default":"none","name":"MCP_AUTH_MODE"},{"description":"Sets the minimum log level for output (e.g., 'debug', 'info', 'warn').","format":"string","default":"info","name":"MCP_LOG_LEVEL"}]}],"tools":[{"name":"met_get_object","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. 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.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"objectIDs":{"minItems":1,"maxItems":20,"type":"array","items":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"A Met object ID from met_search_collections."},"description":"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."}},"required":["objectIDs"],"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false}},{"name":"met_list_departments","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 met_search_collections departmentId filter.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{},"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false}},{"name":"met_search_collections","description":"Search the Metropolitan Museum of Art collection by keyword and optional filters. Returns the total match count and a 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. The medium parameter maps to the classification field (pass \"Paintings\", \"Drawings\", etc., not material descriptions like \"Oil on canvas\"). Every filter draws on a partial upstream index, so a filtered search omits some objects whose own record satisfies the filter — the results are not exhaustive, and dropping the filter is what widens them. A filtered search is checked against the same query run unfiltered, so its results match the keyword; when that check is too costly to complete the page is returned unchecked and the response says so in its notice. isPublicDomain selects CC0-licensed images; hasImages also includes copyrighted works. isPublicDomain and isHighlight are opt-in filters that accept true only; the upstream index is unsound on the false arm. isOnView restricts results to works currently on display in a Met gallery.","write_action":false,"price_micros":0,"input_schema":{"type":"object","properties":{"q":{"type":"string","minLength":1,"description":"Keyword query, matched across title, artist name, culture, medium, tags, and other text fields. Broad terms return large ID sets."},"hasImages":{"description":"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.","type":"boolean"},"isPublicDomain":{"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","const":true},"isHighlight":{"description":"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.","type":"boolean","const":true},"isOnView":{"description":"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.","type":"boolean"},"medium":{"description":"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.","type":"string"},"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 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.","type":"integer","minimum":1,"maximum":9007199254740991},"geoLocation":{"description":"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.","type":"array","items":{"type":"string","description":"A country, region, or city (e.g., \"France\", \"Egypt\", \"New York\")."}},"dateBegin":{"description":"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.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"dateEnd":{"description":"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.","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"limit":{"default":20,"description":"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.","type":"integer","minimum":1,"maximum":500},"offset":{"default":0,"description":"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.","type":"integer","minimum":0,"maximum":9007199254740991}},"required":["q"],"$schema":"https://json-schema.org/draft/2020-12/schema","additionalProperties":false}}],"scan":{"score":93,"grade":"A","scanned_at":"2026-09-19T15:59:38.159Z","report":{"scannerVersion":"0.1.3","scannedAt":"2026-09-19T15:59:38.202Z","components":{"code":{"score":25,"max":25,"notes":["18 source files scanned","18 source files scanned"]},"reliability":{"score":20,"max":20,"notes":["remote reachable in 366ms"]},"poisoning":{"score":15,"max":15,"notes":["3 tool descriptions checked"]},"auth":{"score":10,"max":15,"notes":["open endpoint, read-only tools"]},"maintenance":{"score":15,"max":15,"notes":["last push 6 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[],"inputs":{"probes":[{"url":"https://met-museum.caseyjhand.com/mcp","reachable":true,"authRequired":false,"latencyMs":366,"serverInfo":{"name":"met-museum-mcp-server","version":"0.5.2"}}],"packages":[{"registryType":"npm","identifier":"@cyanheads/met-museum-mcp-server","version":"0.5.2","found":true,"license":"Apache-2.0","hasInstallScripts":false,"dependencyCount":3,"publishedAt":"2026-09-13T23:33:19.979Z","repositoryUrl":"git+https://github.com/cyanheads/met-museum-mcp-server.git","weeklyDownloads":296},{"registryType":"npm","identifier":"@cyanheads/met-museum-mcp-server","version":"0.5.2","found":true,"license":"Apache-2.0","hasInstallScripts":false,"dependencyCount":3,"publishedAt":"2026-09-13T23:33:19.979Z","repositoryUrl":"git+https://github.com/cyanheads/met-museum-mcp-server.git"}],"repo":{"found":true,"owner":"cyanheads","repo":"met-museum-mcp-server","archived":false,"pushedAt":"2026-09-13T23:33:12Z","stars":4,"forks":0,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/10339515?v=4","ownerCreatedAt":"2014-12-29T13:01:12Z","license":"Apache-2.0"},"icon":{"url":"https://avatars.githubusercontent.com/u/10339515?v=4&s=128","source":"github"},"presence":{"stars":4,"forks":0,"downloadsWeek":296,"license":"Apache-2.0","lastPushAt":"2026-09-13T23:33:12.000Z","score":39}}}},"grade_history":[],"reviews":[]}