met-museum-mcp-server

v0.2.5 pre-1.0

Search the Metropolitan Museum of Art collection, fetch full artwork records and open-access images via MCP. STDIO or Streamable HTTP.

met-museum.caseyjhand.com/mcp
claude mcp add --transport http met-museum-mcp-server https://met-museum.caseyjhand.com/mcp
codex mcp add met-museum-mcp-server --url https://met-museum.caseyjhand.com/mcp
{
  "mcpServers": {
    "met-museum-mcp-server": {
      "url": "https://met-museum.caseyjhand.com/mcp"
    }
  }
}
gemini mcp add --transport http met-museum-mcp-server https://met-museum.caseyjhand.com/mcp
{
  "mcpServers": {
    "met-museum-mcp-server": {
      "command": "bunx",
      "args": [
        "mcp-remote",
        "https://met-museum.caseyjhand.com/mcp"
      ]
    }
  }
}
{
  "mcpServers": {
    "met-museum-mcp-server": {
      "type": "http",
      "url": "https://met-museum.caseyjhand.com/mcp"
    }
  }
}
curl -X POST https://met-museum.caseyjhand.com/mcp \
  -H "Content-Type: application/json" \
  -H "MCP-Protocol-Version: 2025-11-25" \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-11-25","capabilities":{},"clientInfo":{"name":"curl","version":"1.0.0"}}}'

Tools

3

met_list_departments

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.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "met_list_departments",
    "arguments": {}
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
view source ↗

met_search_collections

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"). isPublicDomain guarantees CC0-licensed images; hasImages also includes copyrighted works. isOnView restricts results to works currently on display in a Met gallery.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "met_search_collections",
    "arguments": {
      "q": "<q>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/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. isPublicDomain is the filter for freely reusable CC0 images.",
      "type": "boolean"
    },
    "isPublicDomain": {
      "description": "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.",
      "type": "boolean"
    },
    "isHighlight": {
      "description": "When true, restricts to 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. 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\".",
      "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. 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. 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.",
      "type": "integer",
      "minimum": -9007199254740991,
      "maximum": 9007199254740991
    },
    "dateEnd": {
      "description": "Latest object date (year, inclusive). Negative integers for BCE. Requires dateBegin.",
      "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",
    "limit",
    "offset"
  ],
  "additionalProperties": false
}
view source ↗

met_get_object

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 is null for untagged objects.

read
invocation
{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "met_get_object",
    "arguments": {
      "objectIDs": "<objectIDs>"
    }
  }
}
schema
{
  "$schema": "https://json-schema.org/draft/2020-12/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. Partial failures are reported per ID rather than failing the whole batch."
    }
  },
  "required": [
    "objectIDs"
  ],
  "additionalProperties": false
}
view source ↗