whitney-museum-mcp-server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@whitney-museum-mcp-serversearch for artworks by Alexander Calder"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
whitney-mcp-ts
An MCP server for the Whitney Museum's public API. Search the collection, artists, exhibitions, events and audio guides from Claude Desktop or any MCP client.
TypeScript, stdio only, friendly parameters mapped onto the API's Ransack syntax, travels with attribution, and responses trimmed to keep them manageable in a model's context.
The Whitney's API is open and unauthenticated; no API key needed.
Install
npx whitney-mcp-tsOr from source:
git clone https://github.com/mildlydiverting/whitney-mcp-ts.git
cd whitney-mcp-ts
npm install
npm run buildNode 20 or newer.
Related MCP server: Smithsonian MCP Server
Claude Desktop
Add to claude_desktop_config.json:
{
"mcpServers": {
"whitney": {
"command": "npx",
"args": ["-y", "whitney-mcp-ts"]
}
}
}From source, point at the build instead:
{
"mcpServers": {
"whitney": {
"command": "node",
"args": ["/absolute/path/to/whitney-mcp-ts/dist/index.js"]
}
}
}Quit and reopen Claude Desktop. The config doesn't expand ~, so use a full path.
Tools
Tool | What it does |
| Search 27,000+ works by title, artist, classification, medium, date, on-view status |
| Full record for one work — dimensions, credit line, description, image URLs |
| Search 7,000+ artists; filter by collection, Biennial, on view |
| Full artist record, including biography, Getty ULAN and Wikidata IDs |
| Works by a given artist |
| Exhibitions featuring a given artist |
| Exhibitions from 1931 onwards, with date filtering |
| One exhibition record |
| Talks, tours and programmes from 2008 onwards |
| Audio guides published since 2009 |
| Any endpoint, with raw Ransack predicates |
What to expect
Search returns slim records.
Whitney records carry long HTML descriptions and biographies, so search gives you the basics and whitney_get_* gives you everything. Prose is truncated at 2,000 characters, whole responses at 25,000.
Pagination is 30 per page.
That's the API's page size. page picks the page, limit trims it further — the default of 10 stops a broad search flooding your context.
Search syntax is Ransack
Predicates nest under q (_eq, _cont, _cont_all_split, _gteq and friends), sorting under q[s]. The typed tools map friendly arguments onto these. whitney_query exposes them raw, for anything the typed tools don't reach.
Artist and artwork fields are mapped explicitly.
Exhibitions, events, guides and pages go through a generic summariser instead: HTML stripped, timestamps shortened to dates, relative URLs made absolute, internal foreign keys dropped. The Museum says its field set may change, so nothing is hard-coded that doesn't need to be. Run a search with limit: 1 to see the real field names, then use filters for anything specific.
Attribution
Every response ends with a source line naming the Museum and linking their terms. Detail records also carry two attribution fields:
rights— the copyright notice, extracted from the Whitney's own description textcitation— a ready-made markdown line, eg:
Edward Hopper, Early Sunday Morning, 1930. Whitney Museum of American Art, © Heirs of Josephine N. Hopper/Licensed by Artists Rights Society (ARS), New York.
Note the rightsholder is usually not the artist. In a sample of ten works,
nine differed — estates, foundations, and rights societies like ARS and VAGA.
So rights is worth reading rather than assuming; it's the notice the
Whitney's terms ask you to keep.
Works with no copyright notice — older material, mostly — get a citation ending after the Museum link.
Bulk Data
For anything at scale, don't page through the API. The Whitney publishes artist and artwork CSVs at https://github.com/whitneymuseum/open-access, released under CC0.
Known API quirks
sort: "random"doesn't reliably randomise. Asking for three random works returned three consecutive accession numbers by the same artist. If you need genuine randomness, request a random page number instead.display_dateon artworks is free text — "1915–1931, printed 1976–1977" — so date ranges don't work there. Exhibitions and events have real timestamps, andstarts_on_or_after/starts_on_or_beforefilter on those.Living artists have
death_year: "0". Don't do arithmetic on it.Ransack ignores predicates it doesn't recognise rather than erroring, so a misspelled field silently returns everything. Check your result counts.
Security
The Whitney's API needs no key, so there's no credentials, nothing to leak and nothing to configure.
Every tool is read-only. The server makes GET requests to whitney.org and nothing else — no filesystem access, no shell, no writes. Endpoint names come from a fixed list, record IDs are URL-encoded, and filter parameters go through URLSearchParams.
One known limitation: the HTML-to-markdown conversion uses regular expressions with nested quantifiers, which could backtrack badly on deliberately malformed input. The input comes from the Whitney's own CMS rather than from users, so if this happens, something has gone very wrong in NYC and it's probably not my fault.
If you find something, open an issue.
Development
npm test # unit tests, offline
npm run test:canary # live checks against the Whitney API
npm run inspect # MCP Inspector against the built serverThe canary suite runs monthly in CI. It exists to catch the Whitney changing a field name — the failure mode that unit tests can't see, since they run against saved fixtures.
Licences
Code: MIT License.
The Whitney provides the API with the following note:
The data accessed through this API may be protected by copyright, and other restrictions, of the Whitney Museum of American Art and third parties. You may use this data for noncommercial educational and personal use and for "fair use" as authorized under law, provided that you also retain all copyright and other proprietary notices contained on the materials and cite the author and source of the materials.
Read their terms at https://whitney.org/about/website/api before you build anything public on it.
Note the CSV datasets linked above are CC0, which may be more permissive than the API terms.
Not affiliated with the Whitney Museum of American Art. This is a third-party wrapper around their public API, which is documented at https://whitney.org/about/website/api.
Thanks
See also Sam Parsons' whitney-museum-mcp — a Python/FastMCP server over the same API, with Docker and HTTP transport.
To the Whitney's digital team for publishing an API at all, and for documenting it properly. And for writing nice blog posts that explicitly say they use claude code, because that makes me feel less guilty for vibe coding this whole shebang.
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)
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.
Search events, conference weeks, cities, venues and artist schedules via remote MCP.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceInteract with the Cooper Hewitt API with MCP.2MIT
- AlicenseNot gradedqualityDmaintenanceEnables searching and exploring millions of items from the Smithsonian Institution's collections including artifacts, artworks, specimens, photographs, and more, using the Smithsonian Open Access API.3MIT
- AlicenseNot gradedqualityDmaintenanceProvides structured access to Wikipedia content including search, summaries, images, links, and more via MCP tools.6Apache 2.0
- AlicenseNot gradedqualityCmaintenanceEnables searching and retrieving details from the Harvard Art Museums collection.6 npm2MIT