whitney-museum-mcp-server
whitney-mcp-ts
Un servidor MCP para la API pública del Whitney Museum. Busca en la colección, artistas, exposiciones, eventos y guías de audio desde Claude Desktop o cualquier cliente MCP.
TypeScript, solo stdio, parámetros amigables mapeados a la sintaxis Ransack de la API, incluye atribución y respuestas recortadas para mantenerlas manejables en el contexto de un modelo.
La API del Whitney es abierta y no requiere autenticación; no se necesita clave de API.
Instalación
npx whitney-mcp-tsO desde el código fuente:
git clone https://github.com/mildlydiverting/whitney-mcp-ts.git
cd whitney-mcp-ts
npm install
npm run buildNode 20 o superior.
Related MCP server: Wikipedia MCP Server
Claude Desktop
Añade a claude_desktop_config.json:
{
"mcpServers": {
"whitney": {
"command": "npx",
"args": ["-y", "whitney-mcp-ts"]
}
}
}Desde el código fuente, apunta a la compilación en su lugar:
{
"mcpServers": {
"whitney": {
"command": "node",
"args": ["/absolute/path/to/whitney-mcp-ts/dist/index.js"]
}
}
}Sal y vuelve a abrir Claude Desktop. La configuración no expande ~, así que usa una ruta completa.
Herramientas
Herramienta | Qué hace |
| Busca más de 27.000 obras por título, artista, clasificación, técnica, fecha y estado de exposición |
| Registro completo de una obra — dimensiones, línea de crédito, descripción, URLs de imagen |
| Busca más de 7.000 artistas; filtra por colección, Bienal, en exposición |
| Registro completo del artista, incluida la biografía, los IDs de Getty ULAN y Wikidata |
| Obras de un artista determinado |
| Exposiciones que presentan a un artista determinado |
| Exposiciones desde 1931 en adelante, con filtrado por fecha |
| Un registro de exposición |
| Charlas, visitas y programas desde 2008 en adelante |
| Guías de audio publicadas desde 2009 |
| Cualquier endpoint, con predicados Ransack sin procesar |
Qué esperar
Las búsquedas devuelven registros escuetos.
Los registros del Whitney llevan descripciones HTML largas y biografías, así que la búsqueda te da lo básico y whitney_get_* te lo da todo. La prosa se trunca a 2.000 caracteres y las respuestas completas a 25.000.
La paginación es de 30 por página.
Ese es el tamaño de página de la API. page selecciona la página, limit la recorta aún más: el valor predeterminado de 10 evita que una búsqueda amplia inunde tu contexto.
La sintaxis de búsqueda es Ransack
Los predicados se anidan bajo q (_eq, _cont, _cont_all_split, _gteq y compañía), y la ordenación bajo q[s]. Las herramientas tipadas mapean argumentos amigables a estos. whitney_query los expone sin procesar, para cualquier cosa que las herramientas tipadas no cubran.
Los campos de artista y obra se mapean explícitamente.
Las exposiciones, eventos, guías y páginas pasan por un resumidor genérico: se elimina el HTML, las marcas de tiempo se acortan a fechas, las URLs relativas se vuelven absolutas y se descartan las claves foráneas internas. El Museo dice que su conjunto de campos puede cambiar, así que nada está codificado de forma fija si no es necesario. Ejecuta una búsqueda con limit: 1 para ver los nombres de campo reales y luego usa filters para algo específico.
Atribución
Cada respuesta termina con una línea de fuente que nombra al Museo y enlaza sus términos. Los registros de detalle también llevan dos campos de atribución:
rights— el aviso de copyright, extraído del propio texto de descripción del Whitneycitation— una línea de markdown ya preparada, p. ej.:
Edward Hopper, Early Sunday Morning, 1930. Whitney Museum of American Art, © Heirs of Josephine N. Hopper/Licensed by Artists Rights Society (ARS), New York.
Ten en cuenta que el titular de los derechos normalmente no es el artista. En una muestra de diez obras, nueve diferían — herencias, fundaciones y sociedades de derechos como ARS y VAGA. Así que vale la pena leer rights en lugar de asumir; es el aviso que los términos del Whitney piden que conserves.
Las obras sin aviso de copyright — material más antiguo, sobre todo — reciben una cita que termina después del enlace al Museo.
Datos masivos
Para cualquier cosa a gran escala, no recorras la API página a página. El Whitney publica archivos CSV de artistas y obras en https://github.com/whitneymuseum/open-access, liberados bajo CC0.
Peculiaridades conocidas de la API
sort: "random"no aleatoriza de forma fiable. Pedir tres obras aleatorias devolvió tres números de ingreso consecutivos del mismo artista. Si necesitas aleatoriedad genuina, solicita un número de página aleatorio en su lugar.display_dateen las obras es texto libre — "1915–1931, printed 1976–1977" — así que los rangos de fechas no funcionan ahí. Las exposiciones y eventos tienen marcas de tiempo reales, ystarts_on_or_after/starts_on_or_beforefiltran por esas.Los artistas vivos tienen
death_year: "0". No hagas aritmética con ello.Ransack ignora los predicados que no reconoce en lugar de dar error, así que un campo mal escrito devuelve silenciosamente todo. Comprueba el recuento de tus resultados.
Seguridad
La API del Whitney no necesita clave, así que no hay credenciales, nada que filtrar y nada que configurar.
Cada herramienta es de solo lectura. El servidor hace peticiones GET a whitney.org y nada más — sin acceso al sistema de archivos, sin shell, sin escrituras. Los nombres de los endpoints provienen de una lista fija, los IDs de registro están codificados en URL y los parámetros de filtro pasan por URLSearchParams.
Una limitación conocida: la conversión de HTML a markdown usa expresiones regulares con cuantificadores anidados, que podrían sufrir un retroceso catastrófico ante una entrada deliberadamente malformada. La entrada proviene del propio CMS del Whitney y no de los usuarios, así que si esto ocurre, algo ha ido muy mal en NYC y probablemente no sea culpa mía.
Si encuentras algo, abre un issue.
Desarrollo
npm test # unit tests, offline
npm run test:canary # live checks against the Whitney API
npm run inspect # MCP Inspector against the built serverLa suite canary se ejecuta mensualmente en CI. Existe para detectar si el Whitney cambia el nombre de un campo — el modo de fallo que las pruebas unitarias no pueden ver, ya que se ejecutan contra fixtures guardados.
Licencias
Código: Licencia MIT.
El Whitney proporciona la API con la siguiente nota:
Los datos a los que se accede a través de esta API pueden estar protegidos por derechos de autor y otras restricciones del Whitney Museum of American Art y de terceros. Puedes usar estos datos para uso educativo y personal no comercial y para "uso justo" según lo autorizado por la ley, siempre que también conserves todos los avisos de derechos de autor y demás avisos de propiedad contenidos en los materiales y cites al autor y la fuente de los materiales.
Lee sus términos en https://whitney.org/about/website/api antes de construir nada público sobre ella.
Ten en cuenta que los conjuntos de datos CSV enlazados arriba son CC0, que puede ser más permisivo que los términos de la API.
No está afiliado al Whitney Museum of American Art. Se trata de un envoltorio de terceros sobre su API pública, documentada en https://whitney.org/about/website/api.
Agradecimientos
Ver también el whitney-museum-mcp de Sam Parsons — un servidor Python/FastMCP sobre la misma API, con transporte Docker y HTTP.
Al equipo digital del Whitney por el simple hecho de publicar una API y por documentarla como es debido. Y por escribir buenos artículos de blog que dicen explícitamente que usan claude code, porque eso me hace sentir menos culpable por hacer vibe coding de todo este tinglado.
Available Tools
11 toolswhitney_artist_artworksList an artist's artworksARead-onlyIdempotent
List the collection works by one artist.
Args:
id (string): artist ID
page (number, default 1), limit (number, 1-30, default 10)
response_format ('markdown' | 'json', default 'markdown')
Returns: { total, count, page, has_more, next_page?, results[] } with slim artwork records.
Use this rather than whitney_search_artworks with an artist name — it matches on the artist record rather than the credit line, so collaborative and attributed works are handled correctly.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Artist ID — a TMS ID like '962', or an internal reference prefixed with 'T' | |
| page | No | 1-based page number; the API returns 30 records per page | |
| limit | No | Maximum records to return from the fetched page (1-30). Keep this low unless you need the detail — Whitney records are verbose. | |
| response_format | No | Output format: 'markdown' for reading, 'json' for machine processing | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | Advisory note about trimming or pagination |
| page | Yes | Page that was fetched |
| count | Yes | Records returned in this response |
| total | Yes | Total matching records across all pages |
| source | Yes | Attribution for the data, as the Whitney's terms ask for |
| results | Yes | The records |
| has_more | Yes | Whether further pages exist |
| next_page | No | Page number to request next |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint=false, so the safety profile is covered. The description adds the return shape (total, count, page, has_more, next_page?, results[]) and mentions 'slim artwork records', which provides useful behavioral context beyond the annotations. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and front-loaded with the core purpose. It includes an args summary and a returns line, and the usage guidance is appended at the end. While the args section duplicates schema info, the overall structure is efficient and free of fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only list operation with rich annotations, the description covers the core need: it states what it returns, how pagination works, when to use it over a sibling, and parameter defaults. It lacks explicit error-handling or rate-limit notes, but these are not essential here. It is sufficiently complete for an agent to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and each parameter already has a detailed description in the schema. The description's 'Args:' section simply repeats the parameter names and defaults without adding new meaning. The only addition, the limit hint about verbose records, is already present in the schema. Hence baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb 'List' and the resource 'collection works by one artist', and explicitly differentiates from the sibling whitney_search_artworks by explaining the matching mechanism. This gives an agent a precise understanding of what the tool does and how it differs from alternatives.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says 'Use this rather than whitney_search_artworks with an artist name' and spells out the reason (matches on artist record vs credit line) and the benefit (handles collaborative and attributed works correctly). This is a clear, actionable usage guideline with an alternative and a scenario.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whitney_artist_exhibitionsList an artist's exhibitionsARead-onlyIdempotent
List Whitney exhibitions featuring one artist.
Args:
id (string): artist ID
page (number, default 1), limit (number, 1-30, default 10)
response_format ('markdown' | 'json', default 'markdown')
Returns: { total, count, page, has_more, next_page?, results[] }.
Exhibition fields are passed through generically (HTML stripped, long prose truncated), because the Museum documents these fields as subject to change. Coverage is fuller for recent decades than for the Museum's early history.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Artist ID — a TMS ID like '962', or an internal reference prefixed with 'T' | |
| page | No | 1-based page number; the API returns 30 records per page | |
| limit | No | Maximum records to return from the fetched page (1-30). Keep this low unless you need the detail — Whitney records are verbose. | |
| response_format | No | Output format: 'markdown' for reading, 'json' for machine processing | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | Advisory note about trimming or pagination |
| page | Yes | Page that was fetched |
| count | Yes | Records returned in this response |
| total | Yes | Total matching records across all pages |
| source | Yes | Attribution for the data, as the Whitney's terms ask for |
| results | Yes | The records |
| has_more | Yes | Whether further pages exist |
| next_page | No | Page number to request next |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the read-only/idempotent annotations, it discloses the exact return envelope, generic pass-through of exhibition fields, HTML stripping, prose truncation, and uneven historical coverage. This is substantial behavioral context that the annotations do not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose is front-loaded, followed by a compact Args/Returns structure. The caveat sentence about generic fields and patchy coverage is dense but valuable; no words are wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With a rich schema, annotations, and the return envelope in the description, an agent has everything needed to call the tool correctly. The coverage caveat also sets expectations about data completeness, which is important for agent decision-making.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema coverage is 100% and the schema already documents id formats, page semantics, limit bounds, and response_format. The description's Args list adds no new meaning, so it gets the baseline score rather than higher.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first line names the exact operation ('List Whitney exhibitions featuring one artist') with a specific verb, resource, and scope. The 'artist ID' argument makes clear this is artist-centric, distinguishing it from the search/get exhibition siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes the intended use clear: pass an artist ID to get that artist's exhibitions, with pagination and format options. It doesn't explicitly call out alternatives or exclusion cases, but the artist-relationship is stated upfront so there is little ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whitney_get_artistGet a Whitney artistARead-onlyIdempotent
Fetch one artist's full record, including their biography where the Museum has published one.
Args:
id (string): TMS ID or 'T'-prefixed reference
response_format ('markdown' | 'json', default 'markdown')
Returns: { record: { id, name, sort_name, dates, birth_year, death_year, in_collection, in_biennial, in_artport, on_view, ulan_id, wikidata_id, biography, page_url } }
The biography is stripped of HTML and truncated. ulan_id (Getty ULAN) and wikidata_id are useful for cross-referencing other sources.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Artist ID — a TMS ID like '962', or an internal reference prefixed with 'T' | |
| response_format | No | Output format: 'markdown' for reading, 'json' for machine processing | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| record | Yes | The full record |
| source | Yes | Attribution for the data, as the Whitney's terms ask for |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint false, so the safety profile is known. The description adds valuable behavioral detail: the biography is stripped of HTML and truncated, and it clarifies that ulan_id and wikidata_id are useful for cross-referencing. This goes beyond what annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with an 'Args' and 'Returns' section, front-loading the core purpose in the first sentence. Every sentence earns its place, and it avoids redundant filler. The length is appropriate for the tool's complexity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, and the description complements it with clarification on biography formatting and cross-referencing utility. For a read-only get-by-id operation, nothing essential is missing. The agent has enough to invoke it correctly without further investigation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description restates the id format ('TMS ID or 'T'-prefixed reference') and the response_format defaults, which match the schema. It does not add new semantic detail about parameters beyond what the schema already specifies, so it neither compensates nor falls short.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action ('Fetch one artist's full record') on a precise resource, and the subject matter (Whitney artist) distinguishes it from sibling tools like whitney_get_artwork or whitney_get_exhibition. It also mentions the biography inclusion, which sets expectations. This is far beyond a tautology.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes clear it is for retrieving a single artist by ID, which implies it should not be used for searching (where whitney_search_artists would be appropriate). It does not explicitly name alternatives or state when not to use it, but the context is unambiguous enough for an agent to choose correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whitney_get_artworkGet a Whitney artworkARead-onlyIdempotent
Fetch one artwork's full record by ID.
Args:
id (string): the artwork's TMS ID, as returned by whitney_search_artworks
response_format ('markdown' | 'json', default 'markdown')
Returns: { record: { id, title, artist, artist_ids[], date, medium, dimensions, classification, department, accession_number, credit_line, on_view, description, object_label, visual_description, alt_text, images[], page_url } }
Fields are omitted when empty. Alt text is human-written where available and AI-generated otherwise; alt_text_is_ai_generated flags which.
Errors: returns a 404 message if the ID does not exist.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Artwork ID (the TMS ID, e.g. '38804') | |
| response_format | No | Output format: 'markdown' for reading, 'json' for machine processing | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| record | Yes | The full record |
| source | Yes | Attribution for the data, as the Whitney's terms ask for |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false. The description goes beyond annotations by detailing that fields are omitted when empty, that alt_text may be AI-generated and flagged by alt_text_is_ai_generated, and that a 404 message is returned for invalid IDs. This provides valuable behavioral context not covered by the annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured: a one‑line purpose statement, concise args list, return structure, and error note. It may be slightly long due to listing the return fields (which might also be in the output schema), but every section adds useful information—args, behavior, and errors—so it remains efficient and front-loaded with the core purpose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple get‑by‑ID tool with strong annotations and an existing output schema, the description covers everything an agent needs: how to obtain the ID, the optional response format, the structure and omission behavior of the return, and error handling. No critical information is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for both parameters, so the baseline is 3. The description adds value by clarifying that the id is 'the TMS ID, as returned by whitney_search_artworks'—linking it to the search tool and confirming the ID source. It also gives context for response_format ('for reading' vs 'for machine processing'), which is not fully captured by the schema's enum description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Fetch') and resource ('one artwork's full record') with the retrieval method ('by ID'). It also explicitly references the sibling tool 'whitney_search_artworks' as the source of the ID, which distinguishes it from other get/search tools without ambiguity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly indicates when to use this tool: when you already have an artwork ID from 'whitney_search_artworks'. It also explains the optional response_format parameter ('markdown' for reading, 'json' for machine processing), and notes the error behavior for a non-existent ID. This gives explicit context for selection and invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whitney_get_exhibitionGet a Whitney exhibitionARead-onlyIdempotent
Fetch one exhibition record by ID.
Args:
id (string): exhibition ID, as returned by whitney_search_exhibitions
response_format ('markdown' | 'json', default 'markdown')
Returns: { record: {...} } — fields as published by the API, HTML stripped.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Record ID | |
| response_format | No | Output format: 'markdown' for reading, 'json' for machine processing | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| record | Yes | The full record |
| source | Yes | Attribution for the data, as the Whitney's terms ask for |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already disclose read-only, idempotent, and non-destructive behavior. The description adds valuable context about the return shape ({ record: {...} }) and states that HTML is stripped, which is not covered by annotations. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Extremely concise and well-structured: a one-sentence purpose, a short args list, and a return statement. No filler or redundancy; every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple two-parameter read operation with an output schema, the description provides everything needed: the ID source, response_format with default, and a high-level return shape. The existence of an output schema means returndetails need not be spelled out further.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for both id and response_format, so the schema already documents the parameters. The description adds provenance ('as returned by whitney_search_exhibitions') for id, which is helpful but not essential. Baseline 3 is appropriate given the full schema coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States the specific action 'Fetch one exhibition record by ID' and clearly identifies the resource and retrieval method. Distinguishes itself from search tools by requiring an ID, and references whitney_search_exhibitions as the source of that ID, making its role unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs that the ID comes from whitney_search_exhibitions, implying this tool is used after a search. It does not list alternatives or state when not to use it, but the ID-based requirement and sibling names make the intended use clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whitney_queryRaw Whitney API queryARead-onlyIdempotent
Escape hatch for queries the typed tools do not cover. Hits any endpoint with arbitrary Ransack predicates.
Args:
endpoint ('artists' | 'artworks' | 'exhibitions' | 'events' | 'guides' | 'pages')
id (string, optional): fetch a single record instead of a list
filters (object, optional): raw predicates, e.g. { "medium_cont_all_split": "graphite paper" }
sort (string, optional): e.g. 'popularity desc'
page (number, default 1), limit (number, 1-30, default 10)
response_format ('markdown' | 'json', default 'markdown')
Returns: a list result, or { record: {...} } when 'id' is supplied.
Prefer the typed tools where they fit — they return tidier records. Use this to discover field names, combine unusual predicates, or reach the 'pages' endpoint. Note that 'pages' mirrors the Museum's CMS structure and is rarely useful outside it.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Fetch one record by ID instead of listing | |
| page | No | 1-based page number; the API returns 30 records per page | |
| sort | No | Ransack sort string | |
| limit | No | Maximum records to return from the fetched page (1-30). Keep this low unless you need the detail — Whitney records are verbose. | |
| filters | No | Raw Ransack predicates, e.g. { "title_cont": "moon", "classification_eq": "Paintings" }. Matchers: _eq, _not_eq, _cont, _not_cont, _cont_all_split, _true, _false, _gt, _gteq, _lt, _lteq. | |
| endpoint | Yes | Which API endpoint to query | |
| response_format | No | Output format: 'markdown' for reading, 'json' for machine processing | markdown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare read-only, idempotent, non-destructive behavior, and the description adds meaningful context: it returns a list or a single-record object when 'id' is supplied, accepts raw predicates, and warns that 'pages' mirrors the Museum's CMS structure and is rarely useful. This goes well beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-organized: a one-line purpose statement, a compact Args list, return behavior, and usage guidance. Every sentence earns its place, and the most important scoping information is front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a raw query tool with no output schema, the description provides enough to call it correctly: endpoint options, parameter roles, default values, return shape, and guidance on when to use alternatives. The absence of output schema is compensated by the explicit 'Returns' line.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is met; the description adds value with a sort example ('popularity desc'), a filters example with a real predicate, and a compact summary of endpoint, id, limit, and response_format semantics. It mostly restates the schema, but the examples and use-case framing give extra orientation.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly identifies this as an 'escape hatch' for queries the typed tools do not cover, with a specific verb ('Hits') and resource (any of six named API endpoints). It also distinguishes itself from the typed sibling tools by promising arbitrary Ransack predicates and raw API access.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says to 'prefer the typed tools where they fit' and names concrete scenarios for using this tool: discovering field names, combining unusual predicates, and reaching the 'pages' endpoint. The 'pages' caveat also tells the agent when the endpoint is not useful.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whitney_search_artistsSearch Whitney artistsARead-onlyIdempotent
Search the 7,000+ artists listed by the Whitney — those with work in the collection and those who have appeared in Museum exhibitions.
Returns slim records (id, name, dates, in_collection, in_biennial, on_view). Call whitney_get_artist for the biography and authority IDs.
Args:
name (string, optional): substring match on the display name
in_collection, in_biennial, on_view (boolean, optional)
sort ('default' | 'name_asc' | 'name_desc' | 'most_viewed' | 'random')
page (number, default 1), limit (number, 1-30, default 10)
response_format ('markdown' | 'json', default 'markdown')
Returns: { total, count, page, has_more, next_page?, results[], note? }
Example: "which O'Keeffes are in the collection?" -> search name="O'Keeffe", then whitney_artist_artworks with the returned id.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Words appearing in the artist's display name | |
| page | No | 1-based page number; the API returns 30 records per page | |
| sort | No | Result ordering | default |
| limit | No | Maximum records to return from the fetched page (1-30). Keep this low unless you need the detail — Whitney records are verbose. | |
| on_view | No | Restrict to artists with work currently on view | |
| in_biennial | No | Restrict to artists who have shown in a Whitney Biennial | |
| in_collection | No | Restrict to artists with work in the collection | |
| response_format | No | Output format: 'markdown' for reading, 'json' for machine processing | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | Advisory note about trimming or pagination |
| page | Yes | Page that was fetched |
| count | Yes | Records returned in this response |
| total | Yes | Total matching records across all pages |
| source | Yes | Attribution for the data, as the Whitney's terms ask for |
| results | Yes | The records |
| has_more | Yes | Whether further pages exist |
| next_page | No | Page number to request next |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, and non-destructive behavior. The description adds useful context on the return shape (slim records, total/count/page/has_more/next_page) and scope, which goes beyond the annotations without repeating them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured and front-loaded: purpose, return shape, parameters, return object, and example. Some redundancy exists with the schema in the Args list, but the example and explicit alternatives earn their place, keeping the overall size reasonable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a search tool with 8 optional parameters and an output schema, the description is complete: it lists all parameters, describes the return object, provides a realistic example, and directs to related tools. No critical information for invoking the tool correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the input schema fully documents each parameter. The description's Args section largely restates the schema but adds a bit of usage context in the example and mentions the record structure. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches 7,000+ Whitney artists with a specific scope (collection and exhibitions) and distinguishes itself from related tools by mentioning slim records versus the biography-focused whitney_get_artist. The verb 'Search' and resource 'artists' are immediately clear.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly routes to whitney_get_artist for biography and authority IDs, and the example provides a concrete workflow of when to search artists and then call whitney_artist_artworks. This gives clear guidance on alternatives and next steps.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whitney_search_artworksSearch Whitney artworksARead-onlyIdempotent
Search the Whitney Museum's online collection of 27,000+ works.
Returns slim records (id, title, artist, date, medium, classification, on view, first image URL). Call whitney_get_artwork for the full record including dimensions, credit line, description and all images.
Args:
title, artist, medium, date (string, optional): substring matches
classification (string, optional): exact match, e.g. "Drawings"
department ('collection' | 'artport' | 'special', optional)
on_view (boolean, optional)
sort ('default' | 'title_asc' | 'title_desc' | 'most_viewed' | 'random')
page (number, default 1), limit (number, 1-30, default 10)
response_format ('markdown' | 'json', default 'markdown')
Returns: { total, count, page, has_more, next_page?, results[], note? }
Examples:
"watercolours with flowers in the title" -> title="flower", classification="Drawings", medium="watercolor"
"show me something at random from the collection" -> sort="random", limit=3
Notes:
Medium spellings follow US usage ("watercolor", "color").
Date is free text ("1915-1931, printed 1976-1977"), so filter loosely and check results.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Words in the display date, e.g. '1977'. This is a free-text field, not a number, so ranges are unreliable | |
| page | No | 1-based page number; the API returns 30 records per page | |
| sort | No | Result ordering; 'most_viewed' ranks by views over the last 30 days | default |
| limit | No | Maximum records to return from the fetched page (1-30). Keep this low unless you need the detail — Whitney records are verbose. | |
| title | No | Words appearing in the title (substring match) | |
| artist | No | Words appearing in the artist credit line, e.g. 'Divola' | |
| medium | No | Words appearing in the medium, e.g. 'watercolour', 'lithograph' | |
| on_view | No | Restrict to works currently on view | |
| department | No | Which collection the work belongs to | |
| classification | No | Exact classification; casing matters. Common values: Paintings, Drawings, Prints, Photographs, Sculpture, Installations, Film and Video, Time-based Media | |
| response_format | No | Output format: 'markdown' for reading, 'json' for machine processing | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | Advisory note about trimming or pagination |
| page | Yes | Page that was fetched |
| count | Yes | Records returned in this response |
| total | Yes | Total matching records across all pages |
| source | Yes | Attribution for the data, as the Whitney's terms ask for |
| results | Yes | The records |
| has_more | Yes | Whether further pages exist |
| next_page | No | Page number to request next |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint/idempotentHint annotations, the description discloses return shape (slim records, total/count/page/has_more), pagination behavior, US spelling conventions, free-text date caveats, and exact-match behavior for classification. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with Args, Returns, Examples, and Notes sections, and the key summary is front-loaded. The Args block partly duplicates the already-complete input schema, which prevents a perfect 5, but the added examples and usage notes are otherwise tightly written.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 11-parameter search tool with an output schema and safety annotations, the description is surprisingly complete. It covers return fields, pagination, parameter semantics, edge cases (free-text date, US spelling), and response format selection, so an agent can call it correctly without further inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds extra semantic value by mapping natural-language examples to parameters (e.g., 'watercolours with flowers' -> title, classification, medium) and by warning about date free-text and US medium spellings. This goes beyond the schema's per-field descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Search the Whitney Museum's online collection of 27,000+ works.' It distinguishes itself from sibling tools by explicitly noting that whitney_get_artwork is for full records, and the title clearly signals this is the artworks search tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives explicit routing guidance: 'Call whitney_get_artwork for the full record including dimensions, credit line, description and all images.' It also provides concrete query examples that show how to translate user requests into parameter values, making when-to-use practical rather than abstract.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whitney_search_eventsSearch Whitney eventsARead-onlyIdempotent
Search Museum events — talks, tours, public programmes and so on — going back to 2008. This list is largely comprehensive.
Args:
title (string, optional): substring match
filters (object, optional): raw Ransack predicates
sort (string, optional): e.g. 'start_time desc'
starts_on_or_after / starts_on_or_before (string, optional): ISO dates (YYYY-MM-DD) filtering on start_time
page (number, default 1), limit (number, 1-30, default 10)
response_format ('markdown' | 'json', default 'markdown')
Returns: { total, count, page, has_more, next_page?, results[] }
As with exhibitions, fields are passed through generically. Sort by 'start_time desc' for the most recent programming.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number; the API returns 30 records per page | |
| sort | No | Ransack sort string, e.g. 'start_time desc', 'title asc', or 'random' | |
| limit | No | Maximum records to return from the fetched page (1-30). Keep this low unless you need the detail — Whitney records are verbose. | |
| title | No | Words appearing in the title | |
| filters | No | Raw Ransack predicates, e.g. { "title_cont": "moon", "classification_eq": "Paintings" }. Matchers: _eq, _not_eq, _cont, _not_cont, _cont_all_split, _true, _false, _gt, _gteq, _lt, _lteq. | |
| response_format | No | Output format: 'markdown' for reading, 'json' for machine processing | markdown |
| starts_on_or_after | No | ISO date (YYYY-MM-DD); keep records starting on or after this date | |
| starts_on_or_before | No | ISO date (YYYY-MM-DD); keep records starting on or before this date |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | Advisory note about trimming or pagination |
| page | Yes | Page that was fetched |
| count | Yes | Records returned in this response |
| total | Yes | Total matching records across all pages |
| source | Yes | Attribution for the data, as the Whitney's terms ask for |
| results | Yes | The records |
| has_more | Yes | Whether further pages exist |
| next_page | No | Page number to request next |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish read-only, idempotent, non-destructive behavior, so the bar is lower. The description adds meaningful behavioral context: coverage back to 2008, generic field passthrough ('As with exhibitions'), pagination semantics via the Returns block, and the effect of response_format. It does not contradict the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is about 120 words and front-loads the core purpose in the first sentence. The Args and Returns blocks are compact and avoid redundancy, though the phrase 'As with exhibitions' is a reference that may require cross-tool knowledge. Overall it is appropriately sized for an 8-parameter tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only search tool with an output schema, full parameter descriptions, and strong annotations, the description is nearly complete: it states the resource, temporal coverage, filtering dimensions, pagination fields, and a sorting recommendation. The only gap is reliance on an unspecified sibling ('As with exhibitions') and absence of explicit use-case boundaries, but these are minor against the schema and output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%: every parameter already has a precise description, defaults, and constraints in the input schema. The description's Args section mostly restates these (e.g., 'ISO dates (YYYY-MM-DD)', '1-30, default 10') with only small additions like 'substring match' for title. Therefore it adds marginal value beyond the schema, warranting the baseline 3.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description opens with 'Search Museum events' — a specific verb and resource — and elaborates with examples ('talks, tours, public programmes') and temporal scope ('going back to 2008'). This clearly distinguishes it from sibling tools like whitney_search_exhibitions and whitney_search_artworks, which target different resources. The resource and purpose are unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives operational advice ('Sort by start_time desc for the most recent programming') and notes the list is 'largely comprehensive', but it does not explicitly say when to choose events over exhibitions, artworks, or guides, nor when not to use it. Alternative tools are only implied via 'As with exhibitions'. No exclusionary usage guidance is provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whitney_search_exhibitionsSearch Whitney exhibitionsARead-onlyIdempotent
Search exhibitions mounted by the Whitney, going back to 1931. Records are fuller for recent decades and sparse for the Museum's early history.
Args:
title (string, optional): substring match
filters (object, optional): raw Ransack predicates for fields this tool does not expose
sort (string, optional): e.g. 'start_time desc', 'random'
starts_on_or_after / starts_on_or_before (string, optional): ISO dates (YYYY-MM-DD) filtering on start_time
page (number, default 1), limit (number, 1-30, default 10)
response_format ('markdown' | 'json', default 'markdown')
Returns: { total, count, page, has_more, next_page?, results[] }
Exhibition fields are passed through generically — the Museum documents its field set as subject to change, so this tool keeps whatever scalar fields the API returns, strips HTML, shortens timestamps to dates and drops internal IDs. Known fields include title, start_time, end_time, date_override, url, primary_text, press_highlights and popularity. Run one search with limit=1 to confirm before writing a 'filters' query.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number; the API returns 30 records per page | |
| sort | No | Ransack sort string, e.g. 'start_time desc', 'title asc', or 'random' | |
| limit | No | Maximum records to return from the fetched page (1-30). Keep this low unless you need the detail — Whitney records are verbose. | |
| title | No | Words appearing in the title | |
| filters | No | Raw Ransack predicates, e.g. { "title_cont": "moon", "classification_eq": "Paintings" }. Matchers: _eq, _not_eq, _cont, _not_cont, _cont_all_split, _true, _false, _gt, _gteq, _lt, _lteq. | |
| response_format | No | Output format: 'markdown' for reading, 'json' for machine processing | markdown |
| starts_on_or_after | No | ISO date (YYYY-MM-DD); keep records starting on or after this date | |
| starts_on_or_before | No | ISO date (YYYY-MM-DD); keep records starting on or before this date |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | Advisory note about trimming or pagination |
| page | Yes | Page that was fetched |
| count | Yes | Records returned in this response |
| total | Yes | Total matching records across all pages |
| source | Yes | Attribution for the data, as the Whitney's terms ask for |
| results | Yes | The records |
| has_more | Yes | Whether further pages exist |
| next_page | No | Page number to request next |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, openWorldHint, idempotentHint, and destructiveHint false. The description adds substantial behavioral disclosure beyond that: the tool strips HTML, shortens timestamps to dates, drops internal IDs, passes through fields generically because the museum's field set is subject to change, and warns about sparse early records. This fully covers the behavioral profile.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is organized into clear sections — overview, args, returns, field behavior, and a practical preflight instruction. Every paragraph earns its place; nothing is filler. It is appropriately detailed for an 8-parameter tool and remains scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present and annotations covering safety, the description still completes the picture: it documents return shape, pagination page and limit, filter preflight, data-quality caveats, and field volatility. An agent has enough context to call the tool correctly and interpret results.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Even though schema coverage is 100%, the description adds key semantics: title is a substring match, filters are raw Ransack predicates for fields not exposed by the tool, date filters are ISO format, limit controls verbose record fetch size, and response_format distinguishes reading vs machine processing. It also explains that exhibition fields are passed through generically, which clarifies why no fixed field parameters exist.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool searches exhibitions mounted by the Whitney, going back to 1931, which is a specific verb+resource combination. It does not explicitly name or differentiate from sibling tools like whitney_search_artworks or whitney_artist_exhibitions, so it stops short of full sibling distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives strong contextual guidance: records are fuller for recent decades and sparse for early history, and it instructs users to run a limit=1 search before writing raw filters queries. It does not explicitly state when to use this tool over alternatives or when not to use it, but the context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
whitney_search_guidesSearch Whitney audio guidesARead-onlyIdempotent
Search audio guides published since 2009. Fetching an individual guide also returns its stops.
Args:
title (string, optional), filters (object, optional), sort (string, optional)
page (number, default 1), limit (number, 1-30, default 10)
response_format ('markdown' | 'json', default 'markdown')
Returns: { total, count, page, has_more, next_page?, results[] }
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number; the API returns 30 records per page | |
| sort | No | Ransack sort string, e.g. 'start_time desc', 'title asc', or 'random' | |
| limit | No | Maximum records to return from the fetched page (1-30). Keep this low unless you need the detail — Whitney records are verbose. | |
| title | No | Words appearing in the title | |
| filters | No | Raw Ransack predicates, e.g. { "title_cont": "moon", "classification_eq": "Paintings" }. Matchers: _eq, _not_eq, _cont, _not_cont, _cont_all_split, _true, _false, _gt, _gteq, _lt, _lteq. | |
| response_format | No | Output format: 'markdown' for reading, 'json' for machine processing | markdown |
Output Schema
| Name | Required | Description |
|---|---|---|
| note | No | Advisory note about trimming or pagination |
| page | Yes | Page that was fetched |
| count | Yes | Records returned in this response |
| total | Yes | Total matching records across all pages |
| source | Yes | Attribution for the data, as the Whitney's terms ask for |
| results | Yes | The records |
| has_more | Yes | Whether further pages exist |
| next_page | No | Page number to request next |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only, idempotent, and non-destructive behavior. The description adds useful context beyond those annotations: guides are limited to those published since 2009, and fetching an individual guide also returns its stops. This gives the agent concrete expectations about scope and result contents.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is compact and well-structured, with the core purpose stated first. The Args and Returns summaries are concise and easy to scan, with no filler or repetition of the schema's full descriptions.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers the resource, temporal scope, result shape, pagination fields, and parameter defaults, which is sufficient for most search calls. It falls slightly short only on explicit guidance about choosing this tool over sibling searches.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all six parameters thoroughly, including defaults, ranges, and Ransack syntax. The description's Args list is a useful summary but adds no new semantic information beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: 'Search audio guides', and adds a meaningful scope constraint ('published since 2009'). It is clearly distinguishable from sibling search tools (events, artworks, artists, exhibitions) because the resource type is explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description makes it clear this tool is for searching audio guides, but it does not explicitly explain when to prefer this over sibling tools like whitney_search_artworks or whitney_query. There are no excluded cases or alternative tool recommendations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
11 tool updates
v0.1.0- First observed
whitney_artist_artworks - First observed
whitney_artist_exhibitions - First observed
whitney_get_artist - First observed
whitney_get_artwork - First observed
whitney_get_exhibition - First observed
whitney_query - First observed
whitney_search_artists - First observed
whitney_search_artworks - First observed
whitney_search_events - First observed
whitney_search_exhibitions - First observed
whitney_search_guides
TDQS
Scored across 11 tools
Each resource has a clear search/get or relationship tool, and the overlap between whitney_artist_artworks and whitney_search_artworks is explicitly resolved in the descriptions. whitney_query is positioned as an escape hatch for unsupported queries, not as a competing primary tool.
The whitney_ prefix with search_/get_ resource names forms a clear pattern for most tools. The exceptions are whitney_artist_artworks and whitney_artist_exhibitions, which use a possessive noun style rather than a verb_noun style, and whitney_query, which is a one-off.
11 tools is well-scoped for a museum API covering artists, artworks, exhibitions, events, and guides, plus relationship helpers and a query escape hatch. Each tool has a distinct job and none feel redundant.
Core read-only workflows are covered: search and detail retrieval exist for artworks, artists, and exhibitions, and searches exist for events and guides. The main gap is the lack of typed getters for individual events and guides, which the guide description implies should exist; whitney_query can work around this but it is less discoverable.
Maintenance
Related MCP Connectors
Art Institute of Chicago MCP — wraps the ARTIC public API (free, no auth)
Victoria and Albert Museum (V&A) Collections MCP. Keyless. Wraps the V&A Collections API v2.
Unlock a world of art with the Met Museum MCP! Use the 'search_artworks' API to find stunning
MCP server for searching Airweave collections with natural language queries.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceInteract with the Cooper Hewitt API with MCP.2MIT
- AlicenseNot gradedqualityDmaintenanceProvides structured access to Wikipedia content including search, summaries, images, links, and more via MCP tools.6Apache 2.0
- AlicenseNot gradedqualityBmaintenanceEnables searching and retrieving details from the Harvard Art Museums collection.497 npm2MIT
- 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.410 npm2MIT