Skip to main content
Glama
kintopp

rijksmuseum-mcp+

by kintopp

Search Artwork

search_artwork
Read-onlyIdempotent

Search the Rijksmuseum collection for artworks that match all specified filters, including subject, material, technique, date, place, and person.

Instructions

Structured filter search — artworks matching ALL given filters. Filters cover subject, material, technique, date, place, person. Returns artwork summaries with titles, creators, and dates; every response includes totalResults (exact match count, not just the returned page). Not for free-text concept queries — use semantic_search for those. Not for artwork-to-artwork similarity — use find_similar with an objectNumber. For demographic person queries (gender, born/died, profession, birth/death place), use search_persons first to get a vocabId, then pass it as creator here. For provenance text and ownership history, use search_provenance. For aggregate counts and distributions, prefer collection_stats — one call vs compact=true loops.

Ranking: relevance (BM25) when text search (description, title, etc.) or geographic proximity is used; otherwise importance (image availability, curatorial attention, metadata richness). For concept-ranked results, use semantic_search.

At least one filter is required. There is no full-text search across all metadata. For concept or thematic searches (e.g. 'winter landscape', 'smell', 'crucifixion'), subject has the highest recall — it searches the large majority of the collection via structured Iconclass vocabulary. Use description for cataloguer observations (compositional details, specific motifs); use curatorialNarrative for curatorial interpretation and art-historical context. These three corpora can return complementary results. For broader concept discovery beyond structured vocabulary, use semantic_search — but combine it with search_artwork(type: 'painting', …) for painting queries since paintings are underrepresented there.

Array values are AND-combined (e.g. subject: ['landscape', 'seascape'] finds artworks with both). If many results share an object-number prefix (e.g. multiple folios of one sketchbook), a warnings note flags it; narrow with type/material filters or treat the shared prefix as the unit. Each result carries an objectNumber for follow-up calls to get_artwork_details (full metadata) or get_artwork_image (deep-zoom viewer for the user).

Input Schema

NameRequiredDescriptionDefault
sortNoOrder results by a column (with optional direction). Forms: 'height', 'height:desc' (default), 'dateEarliest:asc'. Overrides BM25 (text-match) and geo-proximity ordering when set. Cannot be used alone — needs at least one substantive filter. Columns: 'height' / 'width' (cm — 95% / 94% coverage; 0.0 sentinels are folded to NULL and ordered last), 'dateEarliest' / 'dateLatest' (year — 99.9% coverage; bracket the dating range, useful for hedged datings like 'c. 1660–1665'), 'recordModified' (ISO date — 62% coverage; ~7 implausibly future-dated rows lead a 'desc' sort, ~2K pre-1990 rows lead an 'asc' sort). Direction defaults to 'desc'. NULLs always sort last regardless of direction. Examples: largest paintings → 'height:desc'; earliest works → 'dateEarliest:asc'; most recently catalogued → 'recordModified:desc'.
typeNoFilter by object type: 'painting', 'print', 'drawing', etc.
queryNoSearch by artwork title — matches against all title variants (brief, full, former × EN/NL). Note: fewer than one artwork in twenty has an English title. For non-title text, use the specific field parameters (description, inscription, curatorialNarrative, creator, subject, etc.).
facetsNoFacet dimensions to compute when results are truncated. Pass an array of dimension names (e.g. ["theme", "rights"]) to compute only those, or true for all dimensions. Available: type, material, technique, century, rights, imageAvailable, creator, depictedPerson, depictedPlace, productionPlace, theme, sourceType. Dimensions already filtered on are excluded automatically and reported in `warnings`.
offsetNoSkip this many results (for pagination). Use with maxResults.
compactNoIf true, returns only total count and IDs without resolving details (faster).
creatorNoSearch by artist name (e.g. 'Rembrandt van Rijn'), or pass a vocabId from search_persons (e.g. '210169673') for an exact match to that one person — preferred over the name when you have it, since shared names can match multiple distinct artists.
groupByNoCollapse component records under their parent (sketchbook folios, album pages, print-series leaves). When 'parent' is set, any child record that appears in the result alongside its parent is dropped, and the parent gains a `groupedChildCount`. Only collapses when both child and parent match the query — children whose parent isn't a hit remain in the result. Applied after the BM25 page is selected, so a parent that ranks below the maxResults cutoff won't pull its children in.
materialNoFilter by material: 'canvas', 'paper', 'wood', etc.
dateMatchNoHow creationDate matches artwork date ranges. "overlaps" (default): artwork range overlaps query range — inclusive, but objects with broad ranges appear in multiple bins. "within": artwork range falls entirely within query range — exclusive bins, but drops broadly-dated objects (~43% of collection spans >1 decade). "midpoint": assigns each artwork to one bin by midpoint of its date range — every object counted exactly once with no data loss. Best for statistical comparisons and charts.
techniqueNoFilter by technique: 'oil painting', 'etching', etc.
aboutActorNoSearch for artworks about a person, matching person labels in both the subject and creator vocabularies (substring match). E.g. 'Willem van Oranje'. Broader than depictedPerson, which is the better first choice for 'works depicting X': for an artist, aboutActor also returns the works they made. Combinable with all other filters.
facetLimitNoMaximum entries per facet dimension (1–50, default 5).
maxResultsNoMaximum results to return (1-50, default 25). All results include full metadata.
descriptionNoFull-text search on artwork descriptions (~510K artworks, 61% coverage). Cataloguer observations including compositional details, motifs, physical condition, and attribution remarks. Exact word matching, no stemming.
creationDateNoFilter by creation date. Exact year ('1642') or wildcard ('16*' for 1600s, '164*' for 1640s).
objectNumberNoFilter by object number. Exact match by default (e.g. 'SK-C-5' for The Night Watch). Supports wildcards: '*' matches any run of characters, '?' matches a single character — e.g. 'SK-C-5*' for the Night Watch group, 'RP-P-1906-*' for a print-acquisition series, 'BK-NM-*'. Case-sensitive (object numbers are predominantly uppercase). A wildcard pattern needs at least 2 literal characters.
hasProvenanceNoIf true, only return artworks that have parsed provenance records — roughly 48K, about 6% of the collection. Combine with other filters for cross-domain queries (e.g. type='painting' + hasProvenance=true). Cannot be used alone — combine with at least one other filter.
imageAvailableNoFilter by digitisation: true = only artworks with a digital image, false = only artworks lacking one (e.g. un-photographed works on paper). Cannot be used alone — combine with at least one other filter.

Output Schema

NameRequiredDescriptionDefault
idsNoObject numbers (compact mode).
errorNo
facetsNoCounts per dimension (configurable via facetLimit, default top-5). Computed when results are truncated and facets is set.
sourceNo
resultsNoArtwork summaries. Absent when compact=true.
warningsNo
totalResultsNoTotal matching artworks (always present when vocabulary DB is available). Use with compact=true for efficient counting.
referencePlaceNo

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changedv0.90.3
    • changedInput schema / properties / aboutActor / description
      Previous value: -"Search for artworks depicting or about a person (not the creator). E.g. 'Willem van Oranje'. Broader recall than depictedPerson — searches both subject and creator vocabulary, tolerant of cross-language name forms (e.g. 'Louis XIV' finds 'Lodewijk XIV'). Combinable with all other filters. depictedPerson is usually the better first choice (precise, depicted persons only); use aboutActor for broader person matching across depicted persons and creators."New value: +"Search for artworks about a person, matching person labels in both the subject and creator vocabularies (substring match). E.g. 'Willem van Oranje'. Broader than depictedPerson, which is the better first choice for 'works depicting X': for an artist, aboutActor also returns the works they made. Combinable with all other filters."
  2. Changed2 schema fields changedv0.90.2
    • changedInput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • changedOutput schema / $schema
      Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
  3. Changed3 schema fields changedv0.90.1
    • changedInput schema / properties / groupBy / description
      Previous value: -"Collapse component records under their parent (sketchbook folios, album pages, print-series leaves). When 'parent' is set, any child record that appears in the result alongside its parent is dropped, and the parent gains a `groupedChildCount`. Only collapses when both child and parent match the query — children whose parent isn't a hit remain in the result. Applied after the BM25 page is selected, so a parent that ranks below the maxResults cutoff won't pull its children in. Closes #28."New value: +"Collapse component records under their parent (sketchbook folios, album pages, print-series leaves). When 'parent' is set, any child record that appears in the result alongside its parent is dropped, and the parent gains a `groupedChildCount`. Only collapses when both child and parent match the query — children whose parent isn't a hit remain in the result. Applied after the BM25 page is selected, so a parent that ranks below the maxResults cutoff won't pull its children in."
    • changedInput schema / properties / hasProvenance / description
      Previous value: -"If true, only return artworks that have parsed provenance records (~48K of 832K). Combine with other filters for cross-domain queries (e.g. type='painting' + hasProvenance=true). Cannot be used alone — combine with at least one other filter."New value: +"If true, only return artworks that have parsed provenance records — roughly 48K, about 6% of the collection. Combine with other filters for cross-domain queries (e.g. type='painting' + hasProvenance=true). Cannot be used alone — combine with at least one other filter."
    • changedInput schema / properties / query / description
      Previous value: -"Search by artwork title — matches against all title variants (brief, full, former × EN/NL). Note: only ~4% of artworks have an English title (~35K of 833K). For non-title text, use the specific field parameters (description, inscription, curatorialNarrative, creator, subject, etc.)."New value: +"Search by artwork title — matches against all title variants (brief, full, former × EN/NL). Note: fewer than one artwork in twenty has an English title. For non-title text, use the specific field parameters (description, inscription, curatorialNarrative, creator, subject, etc.)."
  4. First observedv0.90.0

TDQS

A4.1/5.0
Behavior3/5

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

Annotations already declare this a safe, idempotent, read-only, closed-world read, so the safety bar is low. The description adds real behavioral context beyond them: the BM25-vs-importance ranking rule, AND-combination of array values, the `warnings` note about shared object-number prefixes, totalResults being an exact count, and the 'at least one filter required' constraint. However, that last claim conflicts with the schema, which marks zero required parameters, so the constraint is stated as an absolute rule the tool may not actually enforce.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose sentence is front-loaded, followed by routing, then ranking, then edge cases, so the structure is easy to scan even at length. Given 19 parameters and multiple alternative tools, most sentences carry weight, though the routing and corpus-selection passages overlap enough that some trimming is possible.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return-value explanation is not owed, and the description still adds useful response details (totalResults exactness, objectNumber for follow-up calls, warnings). Its gaps are the phantom filter names and the required-filter claim that the schema contradicts; otherwise it covers the complexity of a wide multi-filter search tool well.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the structured fields already document sort, dateMatch, groupBy, facets, compact, wildcard objectNumber, etc., setting the baseline at 3. The description does add semantic layering (array AND-combination, sort overriding relevance/geo ordering), but it also directs the agent to parameters that do not exist in the schema — subject, curatorialNarrative, inscription, depictedPerson — under `additionalProperties: false`, which would actively mislead an invocation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening clause states a specific verb and resource with scope ('Structured filter search — artworks matching ALL given filters') and immediately delimits which fields the filters cover. It is easy to tell apart from semantic_search, find_similar, search_persons, search_provenance and collection_stats, all named as distinct alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit routing rules for every adjacent tool: not for free-text concepts (semantic_search), not for similarity (find_similar), demographics via search_persons first, provenance via search_provenance, aggregates via collection_stats. It also gives positive guidance on which corpus to pick (subject vs description vs curatorialNarrative) and notes paintings are underrepresented in semantic_search.

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